Name: series-workflowzxspf Phase: Succeeded StartedAt: 2026-09-11 02:27:26 +0000 UTC FinishedAt: 2026-09-11 07:02:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[0] Phase: Succeeded StartedAt: 2026-09-11 02:27:26 +0000 UTC FinishedAt: 2026-09-11 03:16:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[0].run-triage Phase: Succeeded StartedAt: 2026-09-11 02:27:26 +0000 UTC FinishedAt: 2026-09-11 03:16:06 +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": "af0b84a9215d951d16f26b7ee34353b970cf5d4e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "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": "af0b84a9215d951d16f26b7ee34353b970cf5d4e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "series_id": "1abb9a8a-0600-40ab-a2ba-9c7fae077cb0" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim" ], "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+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIG5ldyBzbGVlcGFibGUgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKWAgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBCUEYgc2VsZnRlc3RzLiBUaGUga2Z1bmMgYWNjZXB0cyBwcmltaXRpdmUgc2NhbGFyIGFyZ3VtZW50cyAoYG1lbWNnYCwgYHNpemVgLCBgc3dhcHBpbmVzc2ApLCB2YWxpZGF0ZXMgdGhlIHBhcmFtZXRlcnMsIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIGV4aXN0aW5nIGtlcm5lbCByZWNsYWltIGluZnJhc3RydWN0dXJlIHZpYSBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYC4gXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zIG9uIHN0YWNrIG9yIGhlYXAgYXJlIGludHJvZHVjZWQgb3IgcmVhZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyBhcmUgc2NhbGFyIHR5cGVzIGluaXRpYWxpemVkIHByaW9yIHRvIHVzZS5cbjIuIE5vIGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciBmaWVsZHMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGV4cG9zZWQgdmlhIGlvY3Rscy9zeXNmcy9uZXRsaW5rL0JQRiBidWZmZXJzLlxuMy4gUG90ZW50aWFsIGNvbmN1cnJlbmN5LCBsb2NraW5nLCBvciBtZW1vcnktc2FmZXR5IGJ1Z3MgKGUuZy4gc2xlZXBhYmxlIGtmdW5jIGNvbnRleHQgcmVxdWlyZW1lbnRzLCBjZ3JvdXAgcG9pbnRlciB2YWxpZGl0eSwgbG9ja2luZyBkZWFkbG9ja3MpIGFyZSBtb25pdG9yZWQgYnkgc3RhbmRhcmQgZGVidWdnaW5nIGZhY2lsaXRpZXMgKEtBU0FOLCBMT0NLREVQLCBQUk9WRV9MT0NLSU5HKS5cblxuVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGluIG1tL2JwZl9tZW1jb250cm9sLmMsIGV4cG9zaW5nIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gZnVuY3Rpb25hbGl0eSB0byBzbGVlcGFibGUgQlBGIHN5c2NhbGwgcHJvZ3JhbXMuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBsb2dpYyBhbmQgaXMgcmVhY2hhYmxlIHZpYSBCUEYgcHJvZ3JhbSBleGVjdXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjZWM4NTM5YjhlMjEzYWY2ZjI1YjhlZGZmZjdjNjI4Y2VmYzY3MDc3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDM6MTQ6NDQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtOCw2ICYjNDM7OCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aW50ZXJuYWwuaFwmIzM0O1xuJiM0MztcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4gXG4gLyoqXG5AQCAtMTU5LDYgJiM0MzsxNjEsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuJiM0MzsgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4mIzQzOyAqIEBzd2FwcGluZXNzOiB0aGUgcmVjbGFpbSBzd2FwcGluZXNzLCBpbiB0aGUgcmFuZ2VcbiYjNDM7ICogICAgICAgICBbTUlOX1NXQVBQSU5FU1MsIFNXQVBQSU5FU1NfQU5PTl9PTkxZXSwgd2hlcmVcbiYjNDM7ICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXG4mIzQzOyAqICAgICAgICAgdGhlIG1lbWNnJiMzOTtzIG93biBzd2FwcGluZXNzXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE9ubHkgdGhlIHJlY2xhaW0gdGFyZ2V0IGlzIGNhcHBlZDogQHNpemUgaXMgY2xhbXBlZCB0b1xuJiM0MzsgKiBNRU1DR19DSEFSR0VfQkFUQ0gsIGZvbGxvd2luZyB0aGUgcHJlY2VkZW50IG9mIGhpZ2hfd29ya19mdW5jKCksXG4mIzQzOyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2ssIHdoaWNoIGJvdW5kcyBlYWNoIHJlY2xhaW1cbiYjNDM7ICogcmVxdWVzdCB0aGUgc2FtZSB3YXkuIFRoZSBhY3R1YWwgc2Nhbm5pbmcgd29yayBhbmQgaXRzIGR1cmF0aW9uXG4mIzQzOyAqIGFyZSBub3QgYm91bmRlZC4gVG8gcmVjbGFpbSBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseVxuJiM0MzsgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBrZnVuYyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gYSBCUEZfUFJPR19UWVBFX1NZU0NBTExcbiYjNDM7ICogcHJvZ3JhbSwgc3luY2hyb25vdXNseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlXG4mIzQzOyAqIHByb2dyYW0sIG9yIGZyb20gdGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyBvZiBhIFNZU0NBTExcbiYjNDM7ICogcHJvZ3JhbSwgd2hpY2ggcnVuIGluIHByb2Nlc3MgY29udGV4dCBhbmQga2VlcCB0aGUgU1lTQ0FMTCBwcm9ncmFtXG4mIzQzOyAqIHR5cGUuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBvbmx5LCBiZWNhdXNlXG4mIzQzOyAqIGdlbmVyaWMgc2xlZXBhYmxlIHByb2dyYW1zIG1heSBydW4gd2l0aCBmaWxlc3lzdGVtIGxvY2tzIGhlbGQgb3JcbiYjNDM7ICogaW4gTk9GUy9OT0lPIGNvbnRleHRzLCB3aGVyZSB0aGUgcmVjbGFpbSBwYXRoIGNvdWxkIGRlYWRsb2NrIG9uXG4mIzQzOyAqIHRob3NlIGxvY2tzIHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbiYjNDM7ICpcbiYjNDM7ICogRm9yIGFzeW5jaHJvbm91cyByZWNsYWltIG9mIG1vcmUgdGhhbiBvbmUgYmF0Y2gsIGRyaXZpbmcgdGhlXG4mIzQzOyAqIHJlY2xhaW0gZnJvbSBhIGJwZl93cSBjYWxsYmFjayBpcyByZWNvbW1lbmRlZDogY2FsbCB0aGlzIGtmdW5jXG4mIzQzOyAqIG9uY2UgcGVyIGNhbGxiYWNrIGFuZCByZXF1ZXVlIHRoZSBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHRcbiYjNDM7ICogYmF0Y2gsIGluc3RlYWQgb2YgbG9vcGluZyBpbnNpZGUgdGhlIGNhbGxiYWNrIGFuZCBtb25vcG9saXppbmcgYVxuJiM0MzsgKiB3b3JrcXVldWUgd29ya2VyLCBhbmQgZ2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIHdvcmsgaXRlbSxcbiYjNDM7ICogYXMgaGlnaF93b3JrX2Z1bmMoKSBkb2VzIHdpdGggb25lIHdvcmsgaXRlbSBwZXIgbWVtY2cuIFdoZXRoZXJcbiYjNDM7ICogdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYgcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3BcbiYjNDM7ICogYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpc1xuJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlLCBvciAodW5zaWduZWQgbG9uZyktMSBpZiBAc3dhcHBpbmVzcyBpcyBvdXQgb2ZcbiYjNDM7ICogcmFuZ2UuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdFx0aW50IHN3YXBwaW5lc3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzO1xuJiM0MztcbiYjNDM7XHRpZiAoc3dhcHBpbmVzcyBcdTAwM2MgLTEgfHwgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXG4mIzQzO1x0XHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7XG4mIzQzO1xuJiM0MztcdGlmIChzaXplIFx1MDAzYyBQQUdFX1NJWkUpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbiYjNDM7XG4mIzQzO1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4mIzQzO1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIHN3YXBwaW5lc3MgPT0gLTEgPyBOVUxMIDpcbiYjNDM7XHRcdFx0XHRcdFx0XHRcdCAgICAgICBcdTAwMjZzd2FwcGluZXNzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbiYjNDM7fVxuJiM0MztcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3NCwxOSAmIzQzOzI0NCwzNSBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4mIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXG4mIzQzO1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG4gXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbiBcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcbiB9O1xuIFxuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCAgICAgICAgICAgID0gXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXG4mIzQzO307XG4mIzQzO1xuIHN0YXRpYyBpbnQgX19pbml0IGJwZl9tZW1jb250cm9sX2luaXQodm9pZClcbiB7XG4gXHRpbnQgZXJyO1xuIFxuIFx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbiBcdFx0XHRcdFx0XHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTtcbi1cdGlmIChlcnIpXG4mIzQzO1x0aWYgKGVycikge1xuIFx0XHRwcl93YXJuKFwmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcJiMzNDssIGVycik7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHByX3dhcm4oXCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwmIzM0OywgZXJyKTtcbiBcbiBcdHJldHVybiBlcnI7XG4gfVxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXG5pbmRleCAzOGIxMTY1MjEyYzk0Li40NGU5NWU4N2UzY2Q5IDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTc0LDExICYjNDM7NzQsMTMgQEAgdW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSxcbiBcbiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgKDEgXHUwMDNjXHUwMDNjIDEpXG4gI2RlZmluZSBNRU1DR19SRUNMQUlNX1BST0FDVElWRSAoMSBcdTAwM2NcdTAwM2MgMilcbi0jZGVmaW5lIE1JTl9TV0FQUElORVNTIDBcbi0jZGVmaW5lIE1BWF9TV0FQUElORVNTIDIwMFxuJiM0MztlbnVtIHtcbiYjNDM7XHRNSU5fU1dBUFBJTkVTUyA9IDAsXG4mIzQzO1x0TUFYX1NXQVBQSU5FU1MgPSAyMDAsXG4gXG4tLyogSnVzdCByZWNsYWltIGZyb20gYW5vbiBmb2xpb3MgaW4gcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltICovXG4tI2RlZmluZSBTV0FQUElORVNTX0FOT05fT05MWSAoTUFYX1NXQVBQSU5FU1MgJiM0MzsgMSlcbiYjNDM7XHQvKiBKdXN0IHJlY2xhaW0gZnJvbSBhbm9uIGZvbGlvcyBpbiBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gKi9cbiYjNDM7XHRTV0FQUElORVNTX0FOT05fT05MWSA9IE1BWF9TV0FQUElORVNTICYjNDM7IDEsXG4mIzQzO307XG4gXG4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43YzdkMjk5YjNiMjhhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDc3OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKlxuJiM0MzsgKiBTZXR0aW5nIFRFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSD0xIGFkZHMgYSBiYXNlbGluZSBydW4gb2YgdGhlXG4mIzQzOyAqIHdvcmtsb2FkIHdpdGhvdXQgdGhlIEJQRiBwcm9ncmFtIHRvIG1lbWNnX2FzeW5jX3JlY2xhaW0sIGFuZCBwcmludHNcbiYjNDM7ICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxuJiM0MzsgKiBjZ3JvdXAsIHRvIHN0ZG91dC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy92ZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGltZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqL1xuJiM0MztlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XG4mIzQzO1x0UkVDTEFJTV9PVVRDT01FX0NBTExFRCxcbiYjNDM7XHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcbiYjNDM7XHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XG4mIzQzO1x0dTY0IG91dGNvbWU7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0dfRElSIFwmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwmIzM0Oy9oaWdoXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCYjMzQ7L2xvd1wmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBDR19EWUlOR19ESVIgXCYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmdcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXCYjMzQ7L3RyaWdnZXJcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiBcJiMzNDsvdGFyZ2V0XCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlXG4mIzQzOyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZFxuJiM0MzsgKiB0byBoaXQgdGhlIHJlbW92ZWQgdGFyZ2V0LiBUaGUga2VlcGFsaXZlIHJlYWRlciBrZWVwcyB0aGUgdHJpZ2dlclxuJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvXG4mIzQzOyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEZcbiYjNDM7ICogcHJvZ3JhbSByZXBvcnRzIGV2ZXJ5IHJlY2xhaW0gb3V0Y29tZSB0aHJvdWdoIHRoZSByaW5nYnVmLCBzbyB0aGVcbiYjNDM7ICogd2FpdHMganVzdCBwb2xsIGl0IHdpdGggYSB0aW1lb3V0LlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBEWUlOR19TRVRUTEVfVVMgKDIwMCAqIDEwMDApXG4mIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9USU1FT1VUX01TICgxMDApXG4mIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4mIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuJiM0MztcbiYjNDM7XHRpZiAoIXN0YXRmcyhcJiMzNDsvdG1wXCYjMzQ7LCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuXCYjMzQ7O1xuJiM0MztcdHJldHVybiBcJiMzNDsvdG1wXCYjMzQ7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4mIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4mIzQzO1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4mIzQzO1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbiYjNDM7XHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGNvZGUpIHtcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfT0s6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7c3VjY2Vzc1wmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7am9pbiBjZ3JvdXBcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7cmVhZCBkYXRhIGZpbGVcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt3cml0ZSB0aW1lIGZpbGVcJiMzNDs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwmIzM0O21lbW9yeVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtlbmFibGVfY29udHJvbGxlcnNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcJiMzNDslbHVcJiMzNDssIENHX0xJTUlUKTtcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5tYXhcJiMzNDssIGxpbWl0X2J1Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbiYjNDM7XHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuJiM0MztcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7L3Byb2Mvc3dhcHNcJiMzNDssIEZfT0spKSB7XG4mIzQzO1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5zd2FwLm1heFwmIzM0OywgXCYjMzQ7MFwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0hJR0hfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0xPV19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzXG4mIzQzOyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4mIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuJiM0MzsgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJiMzOTtzXG4mIzQzOyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4mIzQzO1xuJiM0MztcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0RZSU5HX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2VuYWJsZV9jb250cm9sbGVyc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwmIzM0OyVsdVwmIzM0OywgQ0dfTElNSVQpO1xuJiM0MztcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5Lm1heFwmIzM0OywgbGltaXRfYnVmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi9cbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgRl9PSykpIHtcbiYjNDM7XHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5LnN3YXAubWF4XCYjMzQ7LCBcJiMzNDswXCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0YXJnZXRfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbiYjNDM7XHRcdFx0KHZvaWQpdjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7XG4mIzQzO1x0ZG91YmxlIGVsYXBzZWQ7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4mIzQzO1xuJiM0MztcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4mIzQzO1xuJiM0MztcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNmVuZCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX09LO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JS42ZlwmIzM0OywgZWxhcHNlZCk7XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcdGNoYXIgYnVmWzY0XTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcJiMzNDtmZ2V0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzc2NhbmYoYnVmLCBcJiMzNDslbGZcJiMzNDssIHRpbWUpICE9IDEpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7c3NjYW5mICVzXCYjMzQ7LCBidWYpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuJiM0MztcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbiYjNDM7XHRwaWRfdCB3YWl0X3JldDtcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGxvd19waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCYjMzQ7Zm9yayBsb3dcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChsb3dfcGlkID09IDApXG4mIzQzO1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGhpZ2hfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcJiMzNDtmb3JrIGhpZ2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChoaWdoX3BpZCA9PSAwKVxuJiM0MztcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXG4mIzQzO1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4mIzQzO1x0ICovXG4mIzQzO1x0bG93X3BpZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4mIzQzO1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcJiMzNDtoaWdoIHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuJiM0MztcdGhpZ2hfcGlkID0gLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7aGlnaCBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuJiM0MztcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAobG93X3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbiYjNDM7XHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuJiM0MztcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuJiM0MztcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4mIzQzO1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuJiM0MztcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuJiM0MztcdH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuJiM0MztcdFx0LmN0eF9pbiA9IFx1MDAyNmFyZ3MsXG4mIzQzO1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuJiM0MztcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCYjMzQ7cHJvZ19pbml0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XG4mIzQzO1x0KnNrZWxfcHRyID0gc2tlbDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2Vycm9yX291dDpcbiYjNDM7XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxuJiM0MzsgKiB0ZXN0IGZhaWxzLCBzbyBiZW5jaG1hcmsgbnVtYmVycyBnbyBzdHJhaWdodCB0byB0aGUgcmVhbCBzdGRvdXQgdG9cbiYjNDM7ICoga2VlcCB0aGVtIGZyb20gZHJvd25pbmcgaW4gQVNTRVJUIG91dHB1dC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGJlbmNoX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLilcbiYjNDM7e1xuJiM0MztcdHZhX2xpc3QgYXA7XG4mIzQzO1xuJiM0MztcdHZhX3N0YXJ0KGFwLCBmbXQpO1xuJiM0MztcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcbiYjNDM7XHR2YV9lbmQoYXApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuJiM0MztcdGRvdWJsZSBiYXNlX2hpZ2hfdGltZSA9IDAuMCwgYmFzZV9sb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0aW50IGVyciwgYmVuY2g7XG4mIzQzO1xuJiM0MztcdGJlbmNoID0gISFnZXRlbnYoXCYjMzQ7VEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE9wdGlvbmFsIGJhc2VsaW5lIGZvciB0aGUgYmVuY2htYXJrIG51bWJlcnMgYmVsb3c6IHJ1biB0aGVcbiYjNDM7XHQgKiBzYW1lIHdvcmtsb2FkIG9uY2Ugd2l0aG91dCB0aGUgQlBGIHByb2dyYW0sIHNvIHRoZSBsb2cgY2FuXG4mIzQzO1x0ICogcmVwb3J0IGhvdyBtdWNoIGFzeW5jIHJlY2xhaW0gaW1wcm92ZWQgdGhlIHByZXNzdXJlZCBjZ3JvdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGJlbmNoKSB7XG4mIzQzO1x0XHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2YmFzZV9oaWdoX3RpbWUsIFx1MDAyNmJhc2VfbG93X3RpbWUsXG4mIzQzO1x0XHRcdFx0XHQgICAgUkVBRF9USU1FUyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCBiYXNlbGluZVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2JwZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbiYjNDM7XHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbiYjNDM7XHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwmIzM0O3JlY2xhaW1lZF9ieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJXG4mIzQzO1x0ICogcnVucywgc28gaXQgb25seSBsb2dzIHRoZSBudW1iZXJzOyB0aGUgY291bnRlcnMgYWJvdmUgYWxyZWFkeVxuJiM0MztcdCAqIHByb3ZlZCB0aGF0IHRoZSBCUEYgcHJvZ3JhbSByZWNsYWltZWQgbWVtb3J5LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChiZW5jaClcbiYjNDM7XHRcdGJlbmNoX3ByaW50ZihcJiMzNDttZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7cmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICBiYXNlX2hpZ2hfdGltZSwgYmFzZV9sb3dfdGltZSwgaGlnaF90aW1lLCBsb3dfdGltZSxcbiYjNDM7XHRcdFx0ICAgICAxMDAuMCAqIChiYXNlX2hpZ2hfdGltZSAtIGhpZ2hfdGltZSkgLyBiYXNlX2hpZ2hfdGltZSk7XG4mIzQzO1x0ZWxzZSBpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoc2tlbClcbiYjNDM7XHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzXG4mIzQzOyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuJiM0MzsgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHlcbiYjNDM7ICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4mIzQzO3tcbiYjNDM7XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4mIzQzO1xuJiM0MztcdGlmIChwaWQgIT0gMClcbiYjNDM7XHRcdHJldHVybiBwaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0X2V4aXQoQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCk7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbiYjNDM7XHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuJiM0MztcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIG9ic2VydmVkIHNvIGZhciwgdGFsbGllZCBmcm9tIHJpbmdidWYgZXZlbnRzLiAqL1xuJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7XG4mIzQzO1x0aW50IGNhbGxlZDtcbiYjNDM7XHRpbnQgc2tpcHBlZF9keWluZztcbiYjNDM7XHRpbnQgdGFyZ2V0X2dvbmU7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiAqc2VlbiA9IGN0eDtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoc3ogXHUwMDNjIHNpemVvZigqZXYpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAoZXYtXHUwMDNlb3V0Y29tZSkge1xuJiM0MztcdGNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDpcbiYjNDM7XHRcdHNlZW4tXHUwMDNlY2FsbGVkJiM0MzsmIzQzOztcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkc6XG4mIzQzO1x0XHRzZWVuLVx1MDAzZXNraXBwZWRfZHlpbmcmIzQzOyYjNDM7O1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkU6XG4mIzQzO1x0XHRzZWVuLVx1MDAzZXRhcmdldF9nb25lJiM0MzsmIzQzOztcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXG4mIzQzOyAqIHZlcmlmeSB0aGF0IHJlY2xhaW0gc3RvcHMgb24gdGhlIGR5aW5nL3JlbW92ZWQgY2dyb3VwIGluc3RlYWQgb2ZcbiYjNDM7ICogcmVjbGFpbWluZyBmcm9tIGl0LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgdGFyZ2V0IHN0YXlzIGVtcHR5OyB0aGUgd29ya2xvYWQgbGl2ZXMgaW4gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZFxuJiM0MzsgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxuJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxuJiM0MzsgKiB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmNcbiYjNDM7ICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kXG4mIzQzOyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcbiYjNDM7ICogU0tJUFBFRF9EWUlORyBvciBUQVJHRVRfR09ORSBldmVudHMgd2hpbGUgcmVjbGFpbV9jYWxscyBhbmRcbiYjNDM7ICogcmVjbGFpbWVkX2J5dGVzIHN0YXkgZnJvemVuLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgY2FsbHNfYmVmb3JlLCBieXRlc19iZWZvcmU7XG4mIzQzO1x0Y2hhciBkYXRhX2ZpbGVbUEFUSF9NQVhdID0gXCYjMzQ7XCYjMzQ7O1xuJiM0MztcdHN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHNlZW4gPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4mIzQzO1x0cGlkX3QgcmVhZGVyX3BpZCA9IC0xO1xuJiM0MztcdGludCBlcnIsIGZkLCBpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9keWluZ19jZ3JvdXBzKFx1MDAyNnRyaWdnZXJfY2dyb3VwX2lkLCBcdTAwMjZ0YXJnZXRfY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2R5aW5nX2Nncm91cHNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcoYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJlY2xhaW1fZXZlbnRzKSxcbiYjNDM7XHRcdFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXHUwMDI2c2VlbiwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJiLCBcJiMzNDtyaW5nX2J1ZmZlcl9fbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwmIzM0Oywgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuJiM0MztcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcJiMzNDtmb3JrIGtlZXBhbGl2ZSByZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2ICFzZWVuLmNhbGxlZDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR0UoZXJyLCAwLCBcJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgXCYjMzQ7cmVjbGFpbSBldmVudHNcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4mIzQzO1xuJiM0MztcdC8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovXG4mIzQzO1x0dXNsZWVwKERZSU5HX1NFVFRMRV9VUyk7XG4mIzQzO1xuJiM0MztcdGNhbGxzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHM7XG4mIzQzO1x0Ynl0ZXNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbWVkX2J5dGVzO1xuJiM0MztcbiYjNDM7XHQvKiBXYWl0IGZvciBhIHJlY2xhaW0gcm91bmQgdG8gaGl0IHRoZSByZW1vdmVkIGNncm91cC4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBFVkVOVF9QT0xMX1JPVU5EUyBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAhc2Vlbi5za2lwcGVkX2R5aW5nIFx1MDAyNlx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR0UoZXJyLCAwLCBcJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFzZWVuLnNraXBwZWRfZHlpbmcgXHUwMDI2XHUwMDI2ICFzZWVuLnRhcmdldF9nb25lKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O25vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHNraXBwZWRfZHlpbmcgZXZlbnRzIHNob3cgdGhhdCB0aGUgQ1NTX0RZSU5HL0NTU19PTkxJTkUgY2hlY2tcbiYjNDM7XHQgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgdGhleSBoYXBwZW4gaXMgdGltaW5nXG4mIzQzO1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4mIzQzO1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwcmludGYoXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWQsIGR5aW5nPSVkXFxuXCYjMzQ7LFxuJiM0MztcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuJiM0MztcbiYjNDM7XHQvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqL1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIGJ5dGVzX2JlZm9yZSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtyZWNsYWltZWRfYnl0ZXNcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHJlYWRlcl9waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHQodm9pZCl3YWl0cGlkKHJlYWRlcl9waWQsIE5VTEwsIDApO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZGF0YV9maWxlWzBdKVxuJiM0MztcdFx0dW5saW5rKGRhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKHJiKVxuJiM0MztcdFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuJiM0MztcdGlmIChza2VsKVxuJiM0MztcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jMThiZWI2NDE2ZDMwXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwyODggQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfZXhwZXJpbWVudGFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbiYjNDM7I2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4mIzQzOy8qXG4mIzQzOyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlXG4mIzQzOyAqIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBvbmUsIHNvIG5vIGNhbGxiYWNrIHJ1bnMgbG9uZ2VyIHRoYW4gb25lXG4mIzQzOyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4mIzQzO1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcbiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXG4mIzQzOyAqL1xuJiM0Mzt1NjQgcmVjbGFpbV9jYWxscztcbiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlcztcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE91dGNvbWUgb2YgYSBzaW5nbGUgcmVjbGFpbSBhdHRlbXB0LCByZXBvcnRlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaFxuJiM0MzsgKiB0aGUgcmVjbGFpbV9ldmVudHMgcmluZ2J1ZiBzbyB0ZXN0cyBjYW4gd2FpdCBmb3IgcmVjbGFpbSBldmVudHMgd2l0aFxuJiM0MzsgKiBhIHRpbWVvdXQgaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBjb3VudGVycyBhYm92ZS5cbiYjNDM7ICovXG4mIzQzO2VudW0gcmVjbGFpbV9vdXRjb21lIHtcbiYjNDM7XHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxuJiM0MztcdFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HLFxuJiM0MztcdFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50IHtcbiYjNDM7XHRfX3U2NCBvdXRjb21lO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSBcdTAwM2NcdTAwM2MgMTYpO1xuJiM0Mzt9IHJlY2xhaW1fZXZlbnRzIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXBvcnRzIGFyZSBiZXN0IGVmZm9ydDogd2hlbiB0aGUgcmluZ2J1ZiBpcyBmdWxsLCBmb3IgZXhhbXBsZSB3aGVuXG4mIzQzOyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGVtaXRfcmVjbGFpbV9ldmVudChlbnVtIHJlY2xhaW1fb3V0Y29tZSBvdXRjb21lKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2O1xuJiM0MztcbiYjNDM7XHRldiA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTtcbiYjNDM7XHRpZiAoIWV2KVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRldi1cdTAwM2VvdXRjb21lID0gb3V0Y29tZTtcbiYjNDM7XHRicGZfcmluZ2J1Zl9zdWJtaXQoZXYsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZWNncnApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuJiM0MztcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuJiM0MztcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4mIzQzO1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4mIzQzO1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4mIzQzO1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXG4mIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4mIzQzOyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbiYjNDM7ICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXG4mIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuJiM0MzsgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuJiM0MzsgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbiYjNDM7ICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcbiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzb1xuJiM0MzsgKiB0aGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggdGhlIHRhcmdldCBrZXJuZWwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChmbGFncyBcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFx1MDAyNiBDU1NfT05MSU5FKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4mIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbiYjNDM7ICogcmVjbGFpbWVkLiBFYWNoIGF0dGVtcHQgcmVwb3J0cyBpdHMgb3V0Y29tZSB0aHJvdWdoIHRoZVxuJiM0MzsgKiByZWNsYWltX2V2ZW50cyByaW5nYnVmLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1x0dTY0IG5yID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSkge1xuJiM0MztcdFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbiYjNDM7XHRcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyk7XG4mIzQzO1x0XHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmVjbGFpbV9jYWxscyYjNDM7JiM0Mzs7XG4mIzQzO1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUsIC0xKTtcbiYjNDM7XHRyZWNsYWltZWRfYnl0ZXMgJiM0Mzs9IG5yO1xuJiM0MztcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTtcbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBucjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RydWN0IHdxX2VsZW0ge1xuJiM0MztcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4mIzQzO1x0c3RydWN0IGJwZl93cSB3b3JrO1xuJiM0MztcdHU2NCBwcmV2X2V2ZW50O1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQnl0ZXMgc3RpbGwgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCByb3VuZCwgY2FycmllZCBhY3Jvc3NcbiYjNDM7XHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbiYjNDM7XHQgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3NcbiYjNDM7XHQgKiBhdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR1NjQgcmVtYWluaW5nO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdF9fdHlwZShrZXksIF9fdTMyKTtcbiYjNDM7XHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcbiYjNDM7fSB3cV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XHR1NjQgbnIsIHNpemU7XG4mIzQzO1xuJiM0MztcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaW1lci10cmlnZ2VyZWQgZW50cnk6IHN0YXJ0IGEgbmV3IHJvdW5kIG9ubHkgd2hlbiB0aGVcbiYjNDM7XHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbiYjNDM7XHRcdCAqIGNoZWNrIGFuZCBvbmx5IGxvb2sgYXQgcmVtYWluaW5nLCBzbyB0aGUgcmVmYXVsdCBkZWx0YVxuJiM0MztcdFx0ICogaXMgY29uc3VtZWQgb25jZSBwZXIgcm91bmQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmICghc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4mIzQzO1x0XHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSlcbiYjNDM7XHRcdFx0cmV0dXJuIDA7XG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IFJFQ0xBSU1fTUFYX0lURVIgKiBSRUNMQUlNX1NJWkU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBPbmUgYm91bmRlZCByZWNsYWltIHBhc3MgcGVyIGNhbGxiYWNrICovXG4mIzQzO1x0c2l6ZSA9IGVsZW0tXHUwMDNlcmVtYWluaW5nIFx1MDAzYyBSRUNMQUlNX1NJWkUgPyBlbGVtLVx1MDAzZXJlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTtcbiYjNDM7XHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuJiM0MztcdGlmICghbnIpIHtcbiYjNDM7XHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gMDtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbiYjNDM7XHRpZiAobnIgXHUwMDNlPSBlbGVtLVx1MDAzZXJlbWFpbmluZylcbiYjNDM7XHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gMDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyAtPSBucjtcbiYjNDM7XG4mIzQzO1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4mIzQzO1x0aWYgKGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuJiM0MztcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbiYjNDM7XHRfX3UzMiBrZXkgPSAwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbiYjNDM7XHRpZiAoIWVsZW0pXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4mIzQzO1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuJiM0MztcbiYjNDM7XHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7REVCVUdfSU5GT19CVEYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGNlYzg1MzliOGUyMTNhZjZmMjViOGVkZmZmN2M2MjhjZWZjNjcwNzcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAwMzoxNDo0NCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jCmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0Ci0tLSBhL21tL2JwZl9tZW1jb250cm9sLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vYnBmX21lbWNvbnRyb2wuYwpAQCAtOCw2ICYjNDM7OCw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwogCiYjNDM7I2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKJiM0MzsKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKIAogLyoqCkBAIC0xNTksNiAmIzQzOzE2MSw3NCBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIAltZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTsKIH0KIAomIzQzOy8qKgomIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnkKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXAKJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb20KJiM0MzsgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzLCBjbGFtcGVkIHRvCiYjNDM7ICogICAgICAgICBNRU1DR19DSEFSR0VfQkFUQ0ggKDY0IHBhZ2VzKQomIzQzOyAqIEBzd2FwcGluZXNzOiB0aGUgcmVjbGFpbSBzd2FwcGluZXNzLCBpbiB0aGUgcmFuZ2UKJiM0MzsgKiAgICAgICAgIFtNSU5fU1dBUFBJTkVTUywgU1dBUFBJTkVTU19BTk9OX09OTFldLCB3aGVyZQomIzQzOyAqICAgICAgICAgU1dBUFBJTkVTU19BTk9OX09OTFkgbWVhbnMgYW5vbi1vbmx5IHJlY2xhaW0sIG9yIC0xIHRvIHVzZQomIzQzOyAqICAgICAgICAgdGhlIG1lbWNnJiMzOTtzIG93biBzd2FwcGluZXNzCiYjNDM7ICoKJiM0MzsgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvCiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuCiYjNDM7ICoKJiM0MzsgKiBPbmx5IHRoZSByZWNsYWltIHRhcmdldCBpcyBjYXBwZWQ6IEBzaXplIGlzIGNsYW1wZWQgdG8KJiM0MzsgKiBNRU1DR19DSEFSR0VfQkFUQ0gsIGZvbGxvd2luZyB0aGUgcHJlY2VkZW50IG9mIGhpZ2hfd29ya19mdW5jKCksCiYjNDM7ICogdGhlIG1lbW9yeS5oaWdoIHdvcmtxdWV1ZSBmYWxsYmFjaywgd2hpY2ggYm91bmRzIGVhY2ggcmVjbGFpbQomIzQzOyAqIHJlcXVlc3QgdGhlIHNhbWUgd2F5LiBUaGUgYWN0dWFsIHNjYW5uaW5nIHdvcmsgYW5kIGl0cyBkdXJhdGlvbgomIzQzOyAqIGFyZSBub3QgYm91bmRlZC4gVG8gcmVjbGFpbSBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseQomIzQzOyAqIGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS4KJiM0MzsgKgomIzQzOyAqIFRoZSBrZnVuYyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gYSBCUEZfUFJPR19UWVBFX1NZU0NBTEwKJiM0MzsgKiBwcm9ncmFtLCBzeW5jaHJvbm91c2x5IGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQgcnVubmluZyB0aGUKJiM0MzsgKiBwcm9ncmFtLCBvciBmcm9tIHRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3Mgb2YgYSBTWVNDQUxMCiYjNDM7ICogcHJvZ3JhbSwgd2hpY2ggcnVuIGluIHByb2Nlc3MgY29udGV4dCBhbmQga2VlcCB0aGUgU1lTQ0FMTCBwcm9ncmFtCiYjNDM7ICogdHlwZS4gSXQgaXMgcmVnaXN0ZXJlZCBmb3IgQlBGX1BST0dfVFlQRV9TWVNDQUxMIG9ubHksIGJlY2F1c2UKJiM0MzsgKiBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyBtYXkgcnVuIHdpdGggZmlsZXN5c3RlbSBsb2NrcyBoZWxkIG9yCiYjNDM7ICogaW4gTk9GUy9OT0lPIGNvbnRleHRzLCB3aGVyZSB0aGUgcmVjbGFpbSBwYXRoIGNvdWxkIGRlYWRsb2NrIG9uCiYjNDM7ICogdGhvc2UgbG9ja3MgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLgomIzQzOyAqCiYjNDM7ICogRm9yIGFzeW5jaHJvbm91cyByZWNsYWltIG9mIG1vcmUgdGhhbiBvbmUgYmF0Y2gsIGRyaXZpbmcgdGhlCiYjNDM7ICogcmVjbGFpbSBmcm9tIGEgYnBmX3dxIGNhbGxiYWNrIGlzIHJlY29tbWVuZGVkOiBjYWxsIHRoaXMga2Z1bmMKJiM0MzsgKiBvbmNlIHBlciBjYWxsYmFjayBhbmQgcmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0CiYjNDM7ICogYmF0Y2gsIGluc3RlYWQgb2YgbG9vcGluZyBpbnNpZGUgdGhlIGNhbGxiYWNrIGFuZCBtb25vcG9saXppbmcgYQomIzQzOyAqIHdvcmtxdWV1ZSB3b3JrZXIsIGFuZCBnaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gd29yayBpdGVtLAomIzQzOyAqIGFzIGhpZ2hfd29ya19mdW5jKCkgZG9lcyB3aXRoIG9uZSB3b3JrIGl0ZW0gcGVyIG1lbWNnLiBXaGV0aGVyCiYjNDM7ICogdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYgcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3AKJiM0MzsgKiBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBkeWluZy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpcwomIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIG9yICh1bnNpZ25lZCBsb25nKS0xIGlmIEBzd2FwcGluZXNzIGlzIG91dCBvZgomIzQzOyAqIHJhbmdlLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKJiM0MzsJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkJCQkJaW50IHN3YXBwaW5lc3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKJiM0MzsKJiM0MzsJaWYgKHN3YXBwaW5lc3MgJmx0OyAtMSB8fCBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkpCiYjNDM7CQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiYjNDM7CiYjNDM7CWlmIChzaXplICZsdDsgUEFHRV9TSVpFKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BhZ2VzID0gbWluKHNpemUgLyBQQUdFX1NJWkUsICh1bnNpZ25lZCBsb25nKU1FTUNHX0NIQVJHRV9CQVRDSCk7CiYjNDM7CiYjNDM7CW5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLAomIzQzOwkJCQkJCSAgICBHRlBfS0VSTkVMLAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsCiYjNDM7CQkJCQkJICAgIHN3YXBwaW5lc3MgPT0gLTEgPyBOVUxMIDoKJiM0MzsJCQkJCQkJCSAgICAgICAmYW1wO3N3YXBwaW5lc3MpOwomIzQzOwomIzQzOwlyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTc0LDE5ICYjNDM7MjQ0LDM1IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKQogCiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpCiAKJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcykKJiM0MzsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7CiAJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLnNldCAgICAgICAgICAgID0gJmFtcDticGZfbWVtY29udHJvbF9rZnVuY3MsCiB9OwogCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCAgICAgICAgICAgID0gJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcywKJiM0Mzt9OwomIzQzOwogc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKIAllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLAogCQkJCQkmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7Ci0JaWYgKGVycikKJiM0MzsJaWYgKGVycikgewogCQlwcl93YXJuKCYjMzQ7ZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIG1lbWNvbnRyb2wga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwKJiM0MzsJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcHJfd2FybigmIzM0O2Vycm9yIHJlZ2lzdGVyaW5nIGJwZiByZWNsYWltIGtmdW5jczogJWQmIzM0OywgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCAzOGIxMTY1MjEyYzk0Li40NGU5NWU4N2UzY2Q5IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTc0LDExICYjNDM7NzQsMTMgQEAgdW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSwKIAogI2RlZmluZSBNRU1DR19SRUNMQUlNX01BWV9TV0FQICgxICZsdDsmbHQ7IDEpCiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFICgxICZsdDsmbHQ7IDIpCi0jZGVmaW5lIE1JTl9TV0FQUElORVNTIDAKLSNkZWZpbmUgTUFYX1NXQVBQSU5FU1MgMjAwCiYjNDM7ZW51bSB7CiYjNDM7CU1JTl9TV0FQUElORVNTID0gMCwKJiM0MzsJTUFYX1NXQVBQSU5FU1MgPSAyMDAsCiAKLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqLwotI2RlZmluZSBTV0FQUElORVNTX0FOT05fT05MWSAoTUFYX1NXQVBQSU5FU1MgJiM0MzsgMSkKJiM0MzsJLyogSnVzdCByZWNsYWltIGZyb20gYW5vbiBmb2xpb3MgaW4gcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltICovCiYjNDM7CVNXQVBQSU5FU1NfQU5PTl9PTkxZID0gTUFYX1NXQVBQSU5FU1MgJiM0MzsgMSwKJiM0Mzt9OwogCiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCQkgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjdjN2QyOTliM2IyOGEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsNzc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0CiYjNDM7ICoKJiM0MzsgKiBTZXR0aW5nIFRFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSD0xIGFkZHMgYSBiYXNlbGluZSBydW4gb2YgdGhlCiYjNDM7ICogd29ya2xvYWQgd2l0aG91dCB0aGUgQlBGIHByb2dyYW0gdG8gbWVtY2dfYXN5bmNfcmVjbGFpbSwgYW5kIHByaW50cwomIzQzOyAqIHRoZSBiYXNlbGluZSBhbmQgcmVjbGFpbSB0aW1pbmdzLCBwbHVzIHRoZSBzcGVlZHVwIG9mIHRoZSBwcmVzc3VyZWQKJiM0MzsgKiBjZ3JvdXAsIHRvIHN0ZG91dC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdmZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3NpZ25hbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt0aW1lLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbWl0cy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tYWdpYy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2hlbHBlcnMuaCYjMzQ7CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7LyogUmVjbGFpbSBvdXRjb21lcyByZXBvcnRlZCBieSB0aGUgQlBGIHByb2dyYW0gdGhyb3VnaCB0aGUgcmluZ2J1Zi4gKi8KJiM0MztlbnVtIHJlY2xhaW1fb3V0Y29tZSB7CiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsCiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HLAomIzQzOwlSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsCiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7CiYjNDM7CXU2NCBvdXRjb21lOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDR19EWUlOR19ESVIgJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyYjMzQ7CiYjNDM7I2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgJiMzNDsvdHJpZ2dlciYjMzQ7CiYjNDM7I2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90YXJnZXQmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpCiYjNDM7I2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZQomIzQzOyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZAomIzQzOyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyCiYjNDM7ICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzbwomIzQzOyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEYKJiM0MzsgKiBwcm9ncmFtIHJlcG9ydHMgZXZlcnkgcmVjbGFpbSBvdXRjb21lIHRocm91Z2ggdGhlIHJpbmdidWYsIHNvIHRoZQomIzQzOyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMCkKJiM0MzsjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKQomIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXAKJiM0MzsgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZAomIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWQKJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRQomIzQzOyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkKJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLgomIzQzOyAqLwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc3Q7CiYjNDM7CiYjNDM7CWlmICghc3RhdGZzKCYjMzQ7L3RtcCYjMzQ7LCAmYW1wO3N0KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuJiMzNDs7CiYjNDM7CXJldHVybiAmIzM0Oy90bXAmIzM0OzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvCiYjNDM7ICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZAomIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzCiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuCiYjNDM7ICovCiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUgewomIzQzOwlDSElMRF9FWElUX09LID0gMCwKJiM0MzsJQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCwKJiM0MzsJQ0hJTERfRVhJVF9XUklURV9GSUxFLAomIzQzOwlDSElMRF9FWElUX1JFQURfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9USU1FX0ZJTEUsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpCiYjNDM7ewomIzQzOwlzd2l0Y2ggKGNvZGUpIHsKJiM0MzsJY2FzZSBDSElMRF9FWElUX09LOgomIzQzOwkJcmV0dXJuICYjMzQ7c3VjY2VzcyYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6CiYjNDM7CQlyZXR1cm4gJiMzNDtqb2luIGNncm91cCYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7cmVhZCBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1RJTUVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIHRpbWUgZmlsZSYjMzQ7OwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuICYjMzQ7dW5rbm93biYjMzQ7OwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljaGFyIGxpbWl0X2J1ZlsyMF07CiYjNDM7CiYjNDM7CXJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwlyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCAmIzM0O21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2VuYWJsZV9jb250cm9sbGVycyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgJiMzNDslbHUmIzM0OywgQ0dfTElNSVQpOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5Lm1heCYjMzQ7LCBsaW1pdF9idWYpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlCiYjNDM7CSAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuCiYjNDM7CSAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy9wcm9jL3N3YXBzJiMzNDssIEZfT0spKSB7CiYjNDM7CQlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJCWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXgmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfSElHSF9ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19MT1dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzCiYjNDM7ICogcmVmYXVsdGluZyB3aGlsZSB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQsIHNvIHJlY2xhaW0gcm91bmRzIGtlZXAKJiM0MzsgKiBzdGFydGluZyBhbmQgcnVuIGludG8gdGhlIHJlbW92ZWQgdGFyZ2V0LiBUaGUgdHdvIGhhdmUgdG8gYmUgc2VwYXJhdGUKJiM0MzsgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJiMzOTtzCiYjNDM7ICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZgomIzQzOyAqIGFueSBwYXJlbnQgdGhhdCBoYXMgZG9tYWluIGNoaWxkcmVuLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljaGFyIGxpbWl0X2J1ZlsyMF07CiYjNDM7CiYjNDM7CXJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19EWUlOR19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwlyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2VuYWJsZV9jb250cm9sbGVycyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgJiMzNDslbHUmIzM0OywgQ0dfTElNSVQpOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5Lm1heCYjMzQ7LCBsaW1pdF9idWYpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19EWUlOR19UUklHR0VSX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqdHJpZ2dlcl9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RBUkdFVF9ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqdGFyZ2V0X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0YXJnZXRfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CiYjNDM7CWRvdWJsZSBlbGFwc2VkOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJaWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7c3RhcnQpOwomIzQzOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7CiYjNDM7CiYjNDM7CWlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7CiYjNDM7CiYjNDM7CWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYW1wO2VuZCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX09LOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTsKJiM0MzsJZnByaW50ZihmcCwgJiMzNDslLjZmJiMzNDssIGVsYXBzZWQpOwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwomIzQzOwlyZXR1cm4gQ0hJTERfRVhJVF9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwljaGFyIGJ1Zls2NF07CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgJiMzNDtmZ2V0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNzY2FuZihidWYsICYjMzQ7JWxmJiMzNDssIHRpbWUpICE9IDEpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtzc2NhbmYgJXMmIzM0OywgYnVmKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CWNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJcGlkX3Qgd2FpdF9yZXQ7CiYjNDM7CWludCBmZCwgc3RhdHVzOwomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlsb3dfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCAmIzM0O2ZvcmsgbG93JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAobG93X3BpZCA9PSAwKQomIzQzOwkJX2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJd2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7bG93IHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLAomIzQzOwkgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy4KJiM0MzsJICovCiYjNDM7CWxvd19waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKSYjMzQ7LAomIzQzOwkJCSAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLAomIzQzOwkJCSAgIFdFWElUU1RBVFVTKHN0YXR1cykpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgJiMzNDtoaWdoIHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqLwomIzQzOwloaWdoX3BpZCA9IC0xOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2hpZ2ggZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3MgYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YXJncywKJiM0MzsJCS5jdHhfc2l6ZV9pbiA9IHNpemVvZihhcmdzKSk7CiYjNDM7CWludCBwcm9nX2luaXRfZmQsIGVycjsKJiM0MzsKJiM0MzsJc2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLndxX3Byb2dfaW5pdCk7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCAmYW1wO3J1bl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCAmIzM0O3Byb2dfaW5pdCByZXR2YWwmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsKJiM0MzsJKnNrZWxfcHRyID0gc2tlbDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyb3Jfb3V0OgomIzQzOwltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZQomIzQzOyAqIHRlc3QgZmFpbHMsIHNvIGJlbmNobWFyayBudW1iZXJzIGdvIHN0cmFpZ2h0IHRvIHRoZSByZWFsIHN0ZG91dCB0bwomIzQzOyAqIGtlZXAgdGhlbSBmcm9tIGRyb3duaW5nIGluIEFTU0VSVCBvdXRwdXQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgYmVuY2hfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQomIzQzO3sKJiM0MzsJdmFfbGlzdCBhcDsKJiM0MzsKJiM0MzsJdmFfc3RhcnQoYXAsIGZtdCk7CiYjNDM7CXZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTsKJiM0MzsJdmFfZW5kKGFwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CWRvdWJsZSBiYXNlX2hpZ2hfdGltZSA9IDAuMCwgYmFzZV9sb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwlpbnQgZXJyLCBiZW5jaDsKJiM0MzsKJiM0MzsJYmVuY2ggPSAhIWdldGVudigmIzM0O1RFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSCYjMzQ7KTsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlCiYjNDM7CSAqIHNhbWUgd29ya2xvYWQgb25jZSB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSwgc28gdGhlIGxvZyBjYW4KJiM0MzsJICogcmVwb3J0IGhvdyBtdWNoIGFzeW5jIHJlY2xhaW0gaW1wcm92ZWQgdGhlIHByZXNzdXJlZCBjZ3JvdXAuCiYjNDM7CSAqLwomIzQzOwlpZiAoYmVuY2gpIHsKJiM0MzsJCWVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZCgmYW1wO2Jhc2VfaGlnaF90aW1lLCAmYW1wO2Jhc2VfbG93X3RpbWUsCiYjNDM7CQkJCQkgICAgUkVBRF9USU1FUyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJCiYjNDM7CSAqIHJ1bnMsIHNvIGl0IG9ubHkgbG9ncyB0aGUgbnVtYmVyczsgdGhlIGNvdW50ZXJzIGFib3ZlIGFscmVhZHkKJiM0MzsJICogcHJvdmVkIHRoYXQgdGhlIEJQRiBwcm9ncmFtIHJlY2xhaW1lZCBtZW1vcnkuCiYjNDM7CSAqLwomIzQzOwlpZiAoYmVuY2gpCiYjNDM7CQliZW5jaF9wcmludGYoJiMzNDttZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7cmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxuJiMzNDssCiYjNDM7CQkJICAgICBiYXNlX2hpZ2hfdGltZSwgYmFzZV9sb3dfdGltZSwgaGlnaF90aW1lLCBsb3dfdGltZSwKJiM0MzsJCQkgICAgIDEwMC4wICogKGJhc2VfaGlnaF90aW1lIC0gaGlnaF90aW1lKSAvIGJhc2VfaGlnaF90aW1lKTsKJiM0MzsJZWxzZSBpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJcHJpbnRmKCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxuJiMzNDssCiYjNDM7CQkgICAgICAgaGlnaF90aW1lLCBsb3dfdGltZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzCiYjNDM7ICoga2VlcCBiZWluZyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHRhcmdldCBjZ3JvdXAgaXMgYmVpbmcgcmVtb3ZlZC4gVGhlCiYjNDM7ICogY2hpbGQgam9pbnMgdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCB3cml0ZXMgdGhlIGRhdGEgZmlsZSB0aGVyZSwgc28KJiM0MzsgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHkKJiM0MzsgKiBjb21lIHVuZGVyIGl0cyBtZW1vcnkgbGltaXQ7IHRoZW4gaXQgcmUtcmVhZHMgdGhlIGZpbGUgaW4gYSBsb29wCiYjNDM7ICogdW50aWwgaXQgaXMga2lsbGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBwaWRfdCBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGNvbnN0IGNoYXIgKmRhdGFfZmlsZSkKJiM0Mzt7CiYjNDM7CXBpZF90IHBpZCA9IGZvcmsoKTsKJiM0MzsKJiM0MzsJaWYgKHBpZCAhPSAwKQomIzQzOwkJcmV0dXJuIHBpZDsKJiM0MzsKJiM0MzsJaWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpCiYjNDM7CQlfZXhpdChDSElMRF9FWElUX0pPSU5fQ0dST1VQKTsKJiM0MzsJaWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7CiYjNDM7CWZvciAoOzspIHsKJiM0MzsJCWlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSkKJiM0MzsJCQlfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVjbGFpbSBvdXRjb21lcyBvYnNlcnZlZCBzbyBmYXIsIHRhbGxpZWQgZnJvbSByaW5nYnVmIGV2ZW50cy4gKi8KJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7CiYjNDM7CWludCBjYWxsZWQ7CiYjNDM7CWludCBza2lwcGVkX2R5aW5nOwomIzQzOwlpbnQgdGFyZ2V0X2dvbmU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiAqc2VlbiA9IGN0eDsKJiM0MzsJY29uc3Qgc3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2ID0gZGF0YTsKJiM0MzsKJiM0MzsJaWYgKHN6ICZsdDsgc2l6ZW9mKCpldikpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJc3dpdGNoIChldi0mZ3Q7b3V0Y29tZSkgewomIzQzOwljYXNlIFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQ6CiYjNDM7CQlzZWVuLSZndDtjYWxsZWQmIzQzOyYjNDM7OwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkc6CiYjNDM7CQlzZWVuLSZndDtza2lwcGVkX2R5aW5nJiM0MzsmIzQzOzsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORToKJiM0MzsJCXNlZW4tJmd0O3RhcmdldF9nb25lJiM0MzsmIzQzOzsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kCiYjNDM7ICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZgomIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC4KJiM0MzsgKgomIzQzOyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kCiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZywKJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZQomIzQzOyAqIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuYwomIzQzOyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZAomIzQzOyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWEKJiM0MzsgKiBTS0lQUEVEX0RZSU5HIG9yIFRBUkdFVF9HT05FIGV2ZW50cyB3aGlsZSByZWNsYWltX2NhbGxzIGFuZAomIzQzOyAqIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi4KJiM0MzsgKi8KJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkOwomIzQzOwl1NjQgY2FsbHNfYmVmb3JlLCBieXRlc19iZWZvcmU7CiYjNDM7CWNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9ICYjMzQ7JiMzNDs7CiYjNDM7CXN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHNlZW4gPSB7fTsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDsKJiM0MzsJcGlkX3QgcmVhZGVyX3BpZCA9IC0xOwomIzQzOwlpbnQgZXJyLCBmZCwgaTsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcygmYW1wO3RyaWdnZXJfY2dyb3VwX2lkLCAmYW1wO3RhcmdldF9jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfZHlpbmdfY2dyb3VwcyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCAmYW1wO3NrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfYnBmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJiID0gcmluZ19idWZmZXJfX25ldyhicGZfbWFwX19mZChza2VsLSZndDttYXBzLnJlY2xhaW1fZXZlbnRzKSwKJiM0MzsJCQkgICAgICBvbl9yZWNsYWltX2V2ZW50LCAmYW1wO3NlZW4sIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocmIsICYjMzQ7cmluZ19idWZmZXJfX25ldyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfZHlpbmdfWFhYWFhYJiMzNDssIHdvcmtsb2FkX2ZpbGVzX2RpcigpKTsKJiM0MzsJZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlyZWFkZXJfcGlkID0gc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihkYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCAmIzM0O2Zvcmsga2VlcGFsaXZlIHJlYWRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRVZFTlRfUE9MTF9ST1VORFMgJmFtcDsmYW1wOyAhc2Vlbi5jYWxsZWQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQllcnIgPSByaW5nX2J1ZmZlcl9fcG9sbChyYiwgRVZFTlRfUE9MTF9USU1FT1VUX01TKTsKJiM0MzsJCWlmICghQVNTRVJUX0dFKGVyciwgMCwgJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgJiMzNDtyZWNsYWltIGV2ZW50cyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpOwomIzQzOwomIzQzOwkvKiBMZXQgcmVjbGFpbSBwYXNzZXMgdGhhdCB3ZXJlIGFscmVhZHkgaW4gZmxpZ2h0IGRyYWluLiAqLwomIzQzOwl1c2xlZXAoRFlJTkdfU0VUVExFX1VTKTsKJiM0MzsKJiM0MzsJY2FsbHNfYmVmb3JlID0gc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzOwomIzQzOwlieXRlc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9ieXRlczsKJiM0MzsKJiM0MzsJLyogV2FpdCBmb3IgYSByZWNsYWltIHJvdW5kIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBFVkVOVF9QT0xMX1JPVU5EUyAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIXNlZW4uc2tpcHBlZF9keWluZyAmYW1wOyZhbXA7ICFzZWVuLnRhcmdldF9nb25lOyBpJiM0MzsmIzQzOykgewomIzQzOwkJZXJyID0gcmluZ19idWZmZXJfX3BvbGwocmIsIEVWRU5UX1BPTExfVElNRU9VVF9NUyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9HRShlcnIsIDAsICYjMzQ7cmluZ19idWZmZXJfX3BvbGwmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFzZWVuLnNraXBwZWRfZHlpbmcgJmFtcDsmYW1wOyAhc2Vlbi50YXJnZXRfZ29uZSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O25vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpJiMzNDssCiYjNDM7CQkJICAgc2Vlbi50YXJnZXRfZ29uZSwgc2Vlbi5za2lwcGVkX2R5aW5nKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHNraXBwZWRfZHlpbmcgZXZlbnRzIHNob3cgdGhhdCB0aGUgQ1NTX0RZSU5HL0NTU19PTkxJTkUgY2hlY2sKJiM0MzsJICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIHRoZXkgaGFwcGVuIGlzIHRpbWluZwomIzQzOwkgKiBkZXBlbmRlbnQsIGJlY2F1c2UgdGhlIGNncm91cCBtYXkgYWxyZWFkeSBiZSBmdWxseSByZWxlYXNlZCwgc28KJiM0MzsJICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC4KJiM0MzsJICovCiYjNDM7CXByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVkLCBkeWluZz0lZFxuJiMzNDssCiYjNDM7CSAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpOwomIzQzOwomIzQzOwkvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqLwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCBieXRlc19iZWZvcmUsCiYjNDM7CQkgICAgICAgJiMzNDtyZWNsYWltZWRfYnl0ZXMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChyZWFkZXJfcGlkICZndDsgMCkgewomIzQzOwkJa2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCSh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7CiYjNDM7CX0KJiM0MzsJaWYgKGRhdGFfZmlsZVswXSkKJiM0MzsJCXVubGluayhkYXRhX2ZpbGUpOwomIzQzOwlpZiAocmIpCiYjNDM7CQlyaW5nX2J1ZmZlcl9fZnJlZShyYik7CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5jMThiZWI2NDE2ZDMwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwyODggQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOy8qCiYjNDM7ICogT25lIHJlY2xhaW0gcm91bmQgdGFyZ2V0cyBSRUNMQUlNX01BWF9JVEVSIGJhdGNoZXMgb2YgUkVDTEFJTV9TSVpFCiYjNDM7ICogZWFjaC4gRWFjaCBicGZfd3EgY2FsbGJhY2sgcmVjbGFpbXMgYSBzaW5nbGUgYmF0Y2ggYW5kIHJlcXVldWVzIHRoZQomIzQzOyAqIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBvbmUsIHNvIG5vIGNhbGxiYWNrIHJ1bnMgbG9uZ2VyIHRoYW4gb25lCiYjNDM7ICogYm91bmRlZCByZWNsYWltIHBhc3MuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkUJCSgzMiAqIFBBR0VfU0laRSkKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVIJMzIKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHsKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycDsKJiM0MzsJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDsKJiM0MztzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeQomIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLgomIzQzOyAqLwomIzQzO3U2NCByZWNsYWltX2NhbGxzOwomIzQzO3U2NCByZWNsYWltZWRfYnl0ZXM7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBPdXRjb21lIG9mIGEgc2luZ2xlIHJlY2xhaW0gYXR0ZW1wdCwgcmVwb3J0ZWQgdG8gdXNlcnNwYWNlIHRocm91Z2gKJiM0MzsgKiB0aGUgcmVjbGFpbV9ldmVudHMgcmluZ2J1ZiBzbyB0ZXN0cyBjYW4gd2FpdCBmb3IgcmVjbGFpbSBldmVudHMgd2l0aAomIzQzOyAqIGEgdGltZW91dCBpbnN0ZWFkIG9mIHBvbGxpbmcgdGhlIGNvdW50ZXJzIGFib3ZlLgomIzQzOyAqLwomIzQzO2VudW0gcmVjbGFpbV9vdXRjb21lIHsKJiM0MzsJUkVDTEFJTV9PVVRDT01FX0NBTExFRCwKJiM0MzsJUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsCiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50IHsKJiM0MzsJX191NjQgb3V0Y29tZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCB7CiYjNDM7CV9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSAmbHQ7Jmx0OyAxNik7CiYjNDM7fSByZWNsYWltX2V2ZW50cyBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcG9ydHMgYXJlIGJlc3QgZWZmb3J0OiB3aGVuIHRoZSByaW5nYnVmIGlzIGZ1bGwsIGZvciBleGFtcGxlIHdoZW4KJiM0MzsgKiB1c2Vyc3BhY2UgZG9lcyBub3QgY29uc3VtZSB0aGUgZXZlbnRzLCB0aGUgcmVwb3J0IGlzIGRyb3BwZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgZW1pdF9yZWNsYWltX2V2ZW50KGVudW0gcmVjbGFpbV9vdXRjb21lIG91dGNvbWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXY7CiYjNDM7CiYjNDM7CWV2ID0gYnBmX3JpbmdidWZfcmVzZXJ2ZSgmYW1wO3JlY2xhaW1fZXZlbnRzLCBzaXplb2YoKmV2KSwgMCk7CiYjNDM7CWlmICghZXYpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWV2LSZndDtvdXRjb21lID0gb3V0Y29tZTsKJiM0MzsJYnBmX3JpbmdidWZfc3VibWl0KGV2LCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwljbS0mZ3Q7Y2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpOwomIzQzOwlpZiAoIWNtLSZndDtjZ3JwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwljbS0mZ3Q7bWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoJmFtcDtjbS0mZ3Q7Y2dycC0mZ3Q7c2VsZik7CiYjNDM7CWlmICghY20tJmd0O21lbWNnKSB7CiYjNDM7CQlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJYnBmX3B1dF9tZW1fY2dyb3VwKGNtLSZndDttZW1jZyk7CiYjNDM7CWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpOwomIzQzOwkqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywKJiM0MzsJCWJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSwKJiM0MzsJCQkJICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbAomIzQzO3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpCiYjNDM7ewomIzQzOwl1NjQgY3VyLCBkZWx0YTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCAmYW1wO2N1cikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7CiYjNDM7CSpwcmV2X2V2ZW50ID0gY3VyOwomIzQzOwomIzQzOwlyZXR1cm4gZGVsdGEgJmd0Oz0gZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgY2dyb3VwIGlzIGR5aW5nIG9uY2UgaXQgaGFzIGJlZW4gb2ZmbGluZWQgKENTU19PTkxJTkUgY2xlYXJlZCkgb3IKJiM0MzsgKiBDU1NfRFlJTkcgaGFzIGJlZW4gcmFpc2VkLCBtaXJyb3JpbmcgY2dyb3VwX2lzX2RlYWQoKS9jc3NfaXNfZHlpbmcoKQomIzQzOyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2sKJiM0MzsgKiBzdWNoIGEgY2dyb3VwLCBiZWNhdXNlIGl0IG9ubHkgZmFpbHMgb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGJlZW4KJiM0MzsgKiBkcm9wcGVkLCBzbyByZWNsYWltIGhhcyB0byBjaGVjayB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24KJiM0MzsgKiB0aGUgbG9va3VwIGZhaWxpbmcuCiYjNDM7ICoKJiM0MzsgKiBDU1NfT05MSU5FIGFuZCBDU1NfRFlJTkcgY29tZSBmcm9tIHZtbGludXguaDogdGhlIGtlcm5lbCBkZWZpbmVzIHRoZW0KJiM0MzsgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG8KJiM0MzsgKiBiaW5kIHRvLCBhbmQgcmVkZWNsYXJpbmcgdGhlbSBsb2NhbGx5IHdvdWxkIGNsYXNoIHdpdGggdGhlIHZtbGludXguaAomIzQzOyAqIGVudW1lcmF0b3JzLiB2bWxpbnV4LmggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsJiMzOTtzIEJURiwgc28KJiM0MzsgKiB0aGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggdGhlIHRhcmdldCBrZXJuZWwuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgY2dyb3VwX2lzX2R5aW5nKHN0cnVjdCBjZ3JvdXAgKmNncnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjZ3JwLSZndDtzZWxmLmZsYWdzOwomIzQzOwomIzQzOwlyZXR1cm4gKGZsYWdzICZhbXA7IENTU19EWUlORykgfHwgIShmbGFncyAmYW1wOyBDU1NfT05MSU5FKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG9uZSBiYXRjaCBmcm9tIHRoZSB0YXJnZXQgY2dyb3VwLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKJiM0MzsgKiBieXRlcyByZWNsYWltZWQsIG9yIDAgaWYgdGhlIGNncm91cCBpcyBkeWluZyBvciBnb25lIG9yIG5vdGhpbmcgd2FzCiYjNDM7ICogcmVjbGFpbWVkLiBFYWNoIGF0dGVtcHQgcmVwb3J0cyBpdHMgb3V0Y29tZSB0aHJvdWdoIHRoZQomIzQzOyAqIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CXU2NCBuciA9IDA7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkgewomIzQzOwkJZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2dyb3VwX2lzX2R5aW5nKGNtLmNncnApKSB7CiYjNDM7CQllbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcpOwomIzQzOwkJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwluciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgc2l6ZSwgLTEpOwomIzQzOwlyZWNsYWltZWRfYnl0ZXMgJiM0Mzs9IG5yOwomIzQzOwllbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX0NBTExFRCk7CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7CS8qCiYjNDM7CSAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzCiYjNDM7CSAqIHJlcXVldWVzLiAwIG1lYW5zIG5vIHJvdW5kIGlzIGluIHByb2dyZXNzOyB0aGUgdGltZXIgcGF0aAomIzQzOwkgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3MKJiM0MzsJICogYXQgaXQuCiYjNDM7CSAqLwomIzQzOwl1NjQgcmVtYWluaW5nOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwl1NjQgbnIsIHNpemU7CiYjNDM7CiYjNDM7CWlmICghZWxlbS0mZ3Q7cmVtYWluaW5nKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlCiYjNDM7CQkgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzCiYjNDM7CQkgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGEKJiM0MzsJCSAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi8KJiM0MzsJc2l6ZSA9IGVsZW0tJmd0O3JlbWFpbmluZyAmbHQ7IFJFQ0xBSU1fU0laRSA/IGVsZW0tJmd0O3JlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTsKJiM0MzsJbnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTsKJiM0MzsJaWYgKCFucikgewomIzQzOwkJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovCiYjNDM7CWlmIChuciAmZ3Q7PSBlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwllbHNlCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgLT0gbnI7CiYjNDM7CiYjNDM7CS8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqLwomIzQzOwlpZiAoZWxlbS0mZ3Q7cmVtYWluaW5nKQomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzMDgKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA0MzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCUEYgUHJvYWN0aXZlIE1lbW9yeSBSZWNsYWltIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYSBuZXcgQlBGIGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgd2l0aGluIGEgbWVtY2cuIFNwZWNpZmljYWxseSwgSSBzZWUgaXQmIzM5O3MgYWRkZWQgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFuZCByZWdpc3RlcmVkIGZvciBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCB3aXRoIHRoZSBgS0ZfU0xFRVBBQkxFYCBmbGFnLiBUaGF0IG1lYW5zIHRoaXMgZnVuY3Rpb24gY2FuIHBvdGVudGlhbGx5IHNsZWVwLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8gbm90ZSBmb3IgQlBGIGNvbnRleHQuIFRoZSBjb2RlIHNlZW1zIHRvIGNhbGwgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLCB3aGljaCBpcyB0aGUgY29yZSBvZiB0aGUgcmVjbGFpbSBwcm9jZXNzLCBhbmQgaXQgbG9va3MgbGlrZSB3ZSBoYXZlIGNvbnRyb2wgb3ZlciB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIHJlY2xhaW0gYW5kIHRoZSBzd2FwcGluZXNzIHZhbHVlLiAgVGhlIGVudW0gY2hhbmdlIGluIGBtbS9pbnRlcm5hbC5oYCBpcyBhIG1pbm9yIGRldGFpbCwgbG9va3MgbGlrZSB0aGV5IGFyZSBzaW1wbHkgdXBkYXRpbmcgdGhlIHdheSB0aGF0IGNvbnN0YW50cyBhcmUgZGVmaW5lZC4gVGhlcmUgYXJlIGFsc28gYXNzb2NpYXRlZCBzZWxmdGVzdHMuCgpOb3csIGxldCYjMzk7cyBydW4gdGhyb3VnaCB0aGUgc2FuaXR5IGNoZWNrcy4gRmlyc3QsICpyZWFjaGFiaWxpdHkqLiBUaGlzIGlzIGEgQlBGIGtmdW5jLCBzbywgeWVzLCBpdCYjMzk7cyBkZWZpbml0ZWx5IHJlYWNoYWJsZS4gVXNlciBzcGFjZSBwcm9ncmFtcyBjYW4gbG9hZCBhbmQgZXhlY3V0ZSBCUEYgcHJvZ3JhbXMgdmlhIGBzeXNfYnBmYCBvciB3aXRoaW4gb3RoZXIgY29udGV4dHMgbGlrZSBgYnBmX3dxYC4gR29vZC4gU2Vjb25kLCAqY29yZSBzdWJzeXN0ZW0qLiBCUEYgKmFuZCogTWVtb3J5IE1hbmFnZW1lbnQgKG1lbWNnKSAtLSB0aGF0JiMzOTtzIGRlZmluaXRlbHkgYSBjb3JlIGFyZWEsIHNvIHdlJiMzOTtyZSBnb29kIHRoZXJlLiBUaGlyZCwgZG9lcyBpdCAqbW9kaWZ5KiBrZXJuZWwgZXhlY3V0YWJsZSBjb2RlPyAgWWVzLCBhZGRpbmcgYSBuZXcga2Z1bmMgKmRlZmluaXRlbHkqIG1vZGlmaWVzIGtlcm5lbCBjb2RlLgoKU28sIGl0JiMzOTtzICpyZWFjaGJsZSosIGl0cyBpbiBhICpjb3JlIHN1YnN5c3RlbSosIGFuZCBpdCAqbW9kaWZpZXMqIGV4ZWN1dGFibGUgY29kZS4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYS4KCkkgbmVlZCB0byBjb25maXJtIGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMsIG9yIG90aGVyIGltcG9ydGFudCBmaWxlcyBpbnZvbHZlZCB0byBjb21wbGV0ZSB0aGlzIGFuYWx5c2lzLiBUaW1lIHRvIGNoZWNrIGBncmVwcGVyYCwgYG1tL01ha2VmaWxlYCwgb3IgZGlyZWN0bHkgcmV2aWV3IGBtbS9icGZfbWVtY29udHJvbC5jYCBmb3IgYW55IHN1YnRsZSBjb25uZWN0aW9ucyBvciBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cy4gV2UgbmVlZCB0byBiZSB0aG9yb3VnaCB3aXRoIHBhdGNoZXMgdGhpcyBpbXBvcnRhbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX21lbWNvbnRyb2wmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmM9MjMyPV9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTIzMy1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjM0OkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yMzUtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDM9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG5tbS9icGZfbWVtY29udHJvbC5jLTI0NC1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ1OkJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ2LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDc6QlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ4LUJURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ5OkJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTAtXG5tbS9icGZfbWVtY29udHJvbC5jOjI1MTpzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNTItXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjUzOlx0LnNldCAgICAgICAgICAgID0gXHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNzLFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTQtfTtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU1LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTY6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0ge1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNTctXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjU4Olx0LnNldCAgICAgICAgICAgID0gXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXG5tbS9icGZfbWVtY29udHJvbC5jLTI1OS19O1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNjAtXG5tbS9icGZfbWVtY29udHJvbC5jOjI2MTpzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXG5tbS9icGZfbWVtY29udHJvbC5jLTI2Mi17XG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjUtXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNjY6XHRcdFx0XHRcdFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTI2Ny1cdGlmIChlcnIpIHtcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTI3Mi1cdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNzM6XHRcdFx0XHRcdFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0KTtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjc0LVx0aWYgKGVycilcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTI3OC19XG5tbS9icGZfbWVtY29udHJvbC5jOjI3OTpsYXRlX2luaXRjYWxsKGJwZl9tZW1jb250cm9sX2luaXQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MTY1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBicGZfbWVtY29udHJvbC5jJiMzOTtzIEtjb25maWcgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhlIEtjb25maWcgcmVxdWlyZW1lbnRzIGZvciBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIEZpcnN0LCBJJiMzOTtsbCBxdWlja2x5IGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgLiBSaWdodCwgaXQgbG9va3MgbGlrZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19NRU1DR2AgYXJlIHRoZSBjb3JlIGRlcGVuZGVuY2llcywgYW5kIHRoZXkgbXVzdCBib3RoIGJlIHNldC4gTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGBDT05GSUdfREVCVUdfSU5GT19CVEZgIGlzIGFsc28gZW5hYmxlZCwgc2luY2UgdGhhdCYjMzk7cyB1c3VhbGx5IHJlcXVpcmVkIGZvciBCVEYgcmVnaXN0cmF0aW9uLCBrZnVuYyByZXNvbHV0aW9uLCBhbmQgdGhlIHJlbGF0ZWQgcHJvY2Vzc2VzLgoKTm93LCBJJiMzOTtsbCB6ZXJvIGluIG9uIGByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0YC4gSSB3YW50IHRvIHZlcmlmeSB0aGF0IGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBpbmRlZWQgKnRoZSogbWFpbiBkcml2ZXJzLCBvciBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGludm9sdmVkIGhlcmUuIFNvLCBsZXQmIzM5O3MgdHJhY2sgZG93biB0aGUgZGVmaW5pdGlvbiBvZiBgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldGAgYW5kIHNlZSB3aGF0IGVsc2UgbWlnaHQgYmUgbHVya2luZyBpbiB0aGVyZS4gR290dGEgY292ZXIgYWxsIHRoZSBiYXNlcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9hcmVuYS5jPTExMzE9c3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxua2VybmVsL2JwZi9hcmVuYS5jLTExMzIte1xua2VybmVsL2JwZi9hcmVuYS5jOjExMzM6XHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXHUwMDI2Y29tbW9uX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2FyZW5hLmMtMTEzNC19XG4tLVxua2VybmVsL2JwZi9idGYuYz04OTQyPXN0YXRpYyBpbnQgYnRmX3BvcHVsYXRlX2tmdW5jX3NldChzdHJ1Y3QgYnRmICpidGYsIGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg5ODgtXHRzZXQgPSB0YWItXHUwMDNlc2V0c1tob29rXTtcbmtlcm5lbC9icGYvYnRmLmM6ODk4OTpcdC8qIFdhcm4gd2hlbiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0IGlzIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgaG9va1xua2VybmVsL2JwZi9idGYuYy04OTkwLVx0ICogZm9yIG1vZHVsZSBzZXRzLlxuLS1cbmtlcm5lbC9icGYvYnRmLmM9OTIxMz11MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjEtXG5rZXJuZWwvYnBmL2J0Zi5jOjkyMjI6c3RhdGljIGludCBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBidGZfa2Z1bmNfaG9vayBob29rLFxua2VybmVsL2JwZi9idGYuYy05MjIzLVx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtOTI0OC0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgaW52b2tlZCBvbmx5IGZyb20gaW5pdGNhbGxzL21vZHVsZSBpbml0IGZ1bmN0aW9ucyAqL1xua2VybmVsL2JwZi9idGYuYzo5MjQ5OmludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNTAtXHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXG4tLVxua2VybmVsL2JwZi9idGYuYy05MjYyLVx0aG9vayA9IGJwZl9wcm9nX3R5cGVfdG9fa2Z1bmNfaG9vayhwcm9nX3R5cGUpO1xua2VybmVsL2JwZi9idGYuYzo5MjYzOlx0cmV0dXJuIF9fcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChob29rLCBrc2V0KTtcbmtlcm5lbC9icGYvYnRmLmMtOTI2NC19XG5rZXJuZWwvYnBmL2J0Zi5jOjkyNjU6RVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjYtXG4tLVxua2VybmVsL2JwZi9idGYuYz05MjY4PWludCByZWdpc3Rlcl9idGZfZm1vZHJldF9pZF9zZXQoY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjkte1xua2VybmVsL2JwZi9idGYuYzo5MjcwOlx0cmV0dXJuIF9fcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCVEZfS0ZVTkNfSE9PS19GTU9EUkVULCBrc2V0KTtcbmtlcm5lbC9icGYvYnRmLmMtOTI3MS19XG4tLVxua2VybmVsL2JwZi9jcHVtYXNrLmM9NTE1PXN0YXRpYyBpbnQgX19pbml0IGNwdW1hc2tfa2Z1bmNfaW5pdCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyNS1cdHJldCA9IGJwZl9tZW1fYWxsb2NfaW5pdChcdTAwMjZicGZfY3B1bWFza19tYSwgc2l6ZW9mKHN0cnVjdCBicGZfY3B1bWFzayksIGZhbHNlKTtcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNjpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI3Olx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TVFJVQ1RfT1BTLCBcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1Mjg6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyOS1cdHJldHVybiAgcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhjcHVtYXNrX2R0b3JzLFxuLS1cbmtlcm5lbC9icGYvY3J5cHRvLmM9Mzc5PXN0YXRpYyBpbnQgX19pbml0IGNyeXB0b19rZnVuY19pbml0KHZvaWQpXG4tLVxua2VybmVsL2JwZi9jcnlwdG8uYy0zODgtXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM4OTpcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsIFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MDpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULCBcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcnlwdG8uYzozOTE6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1hEUCwgXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkyOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxua2VybmVsL2JwZi9jcnlwdG8uYy0zOTMtXHRcdFx0XHRcdCAgICAgICBcdTAwMjZjcnlwdF9pbml0X2tmdW5jX3NldCk7XG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDk4Mj1zdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDk5Ny1cbmtlcm5lbC9icGYvaGVscGVycy5jOjQ5OTg6XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NDk5OTpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAwOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDE6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDI6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDM6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDQtXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGdlbmVyaWNfZHRvcnMsXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwNi1cdFx0XHRcdFx0XHQgIFRISVNfTU9EVUxFKTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDc6XHRyZXR1cm4gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNmNvbW1vbl9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwOC19XG4tLVxua2VybmVsL2JwZi9tYXBfaXRlci5jPTIzMD1zdGF0aWMgaW50IGluaXRfc3Vic3lzdGVtKHZvaWQpXG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMxLXtcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYzoyMzI6XHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXHUwMDI2YnBmX21hcF9pdGVyX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMzLX1cbi0tXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYz03NTk9c3RhdGljIF9faW5pdCBpbnQgcnFzcGlubG9ja19yZWdpc3Rlcl9rZnVuY3Modm9pZClcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2MC17XG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYzo3NjE6XHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXHUwMDI2cnFzcGlubG9ja19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9ycXNwaW5sb2NrLmMtNzYyLX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDYyMwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4YW1pbmluZyB0aGUgQlBGIE1lbW9yeSBDb250cm9sIENvZGUqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgYG1tL2JwZl9tZW1jb250cm9sLmNgIGZpbGUuIE15IHByaW1hcnkgaW50ZXJlc3QgcmlnaHQgbm93IGlzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBzeW1ib2wuIEkmIzM5O20gbm90aW5nIHRoYXQgaXQmIzM5O3MgZGVmaW5lZCBhcyBhIGtmdW5jLCB3aGljaCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSB3aXRoaW4gdGhlIGtlcm5lbC4gQmVmb3JlIEkgZ2V0IHRvbyBkZWVwIGludG8gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiwgSSYjMzk7bGwgcXVpY2tseSBzY2FuIHRoZSByZXN0IG9mIHRoZSBmaWxlLiBJIHdhbnQgdG8gYnVpbGQgYSBtb3JlIGhvbGlzdGljIHBpY3R1cmUg4oCTIHNlZSB3aGF0IG90aGVyIGZ1bmN0aW9uYWxpdGllcyBhcmUgaW1wbGVtZW50ZWQgd2l0aGluIGBicGZfbWVtY29udHJvbC5jYCB0aGF0IG1pZ2h0IGludGVyYWN0IHdpdGgsIG9yIGJlIHJlbGF0ZWQgdG8sIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCYjMzk7cyBhbHdheXMgYmVuZWZpY2lhbCB0byBoYXZlIHRoYXQgY29udGV4dHVhbCBhd2FyZW5lc3MgYmVmb3JlIEkgc3RhcnQgZGlzc2VjdGluZyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9icGZfbWVtY29udHJvbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbiAgIDI6XHQvKlxuICAgMzpcdCAqIE1lbW9yeSBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGVcbiAgIDQ6XHQgKlxuICAgNTpcdCAqIEF1dGhvcjogUm9tYW4gR3VzaGNoaW4gXHUwMDNjcm9tYW4uZ3VzaGNoaW5AbGludXguZGV2XHUwMDNlXG4gICA2Olx0ICovXG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4gICA5Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiAgMTA6XHRcbiAgMTE6XHQjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gIDEyOlx0XG4gIDEzOlx0X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuICAxNDpcdFxuICAxNTpcdC8qKlxuICAxNjpcdCAqIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgbWVtb3J5IGNncm91cFxuICAxNzpcdCAqXG4gIDE4Olx0ICogVGhlIGZ1bmN0aW9uIGhhcyBLRl9BQ1FVSVJFIHNlbWFudGljcywgZXZlbiB0aG91Z2ggdGhlIHJvb3QgbWVtb3J5XG4gIDE5Olx0ICogY2dyb3VwIGlzIG5ldmVyIGRlc3Ryb3llZCBhZnRlciBiZWluZyBjcmVhdGVkIGFuZCBkb2VzbiYjMzk7dCByZXF1aXJlXG4gIDIwOlx0ICogcmVmZXJlbmNlIGNvdW50aW5nLiBBbmQgaXQmIzM5O3MgcGVyZmVjdGx5IHNhZmUgdG8gcGFzcyBpdCB0b1xuICAyMTpcdCAqIGJwZl9wdXRfbWVtX2Nncm91cCgpXG4gIDIyOlx0ICpcbiAgMjM6XHQgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBtZW1vcnkgY2dyb3VwLlxuICAyNDpcdCAqL1xuICAyNTpcdF9fYnBmX2tmdW5jIHN0cnVjdCBtZW1fY2dyb3VwICpicGZfZ2V0X3Jvb3RfbWVtX2Nncm91cCh2b2lkKVxuICAyNjpcdHtcbiAgMjc6XHRcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpXG4gIDI4Olx0XHRcdHJldHVybiBOVUxMO1xuICAyOTpcdFxuICAzMDpcdFx0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cbiAgMzE6XHRcdHJldHVybiByb290X21lbV9jZ3JvdXA7XG4gIDMyOlx0fVxuICAzMzpcdFxuICAzNDpcdC8qKlxuICAzNTpcdCAqIGJwZl9nZXRfbWVtX2Nncm91cCAtIEdldCBhIHJlZmVyZW5jZSB0byBhIG1lbW9yeSBjZ3JvdXBcbiAgMzY6XHQgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXG4gIDM3Olx0ICpcbiAgMzg6XHQgKiBJdCYjMzk7cyBmaW5lIHRvIHBhc3MgYSBjc3Mgd2hpY2ggYmVsb25ncyB0byBhbnkgY2dyb3VwIGNvbnRyb2xsZXIsXG4gIDM5Olx0ICogZS5nLiB1bmlmaWVkIGhpZXJhcmNoeSYjMzk7cyBtYWluIGNzcy5cbiAgNDA6XHQgKlxuICA0MTpcdCAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXG4gIDQyOlx0ICpcbiAgNDM6XHQgKiBSZXR1cm46IEEgcG9pbnRlciB0byBhIG1lbV9jZ3JvdXAgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmdcbiAgNDQ6XHQgKiB0aGUgY29ycmVzcG9uZGluZyBjc3MmIzM5O3MgcmVmZXJlbmNlIGNvdW50ZXIuXG4gIDQ1Olx0ICovXG4gIDQ2Olx0X19icGZfa2Z1bmMgc3RydWN0IG1lbV9jZ3JvdXAgKlxuICA0NzpcdGJwZl9nZXRfbWVtX2Nncm91cChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxuICA0ODpcdHtcbiAgNDk6XHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XG4gIDUwOlx0XHRib29sIHJjdV91bmxvY2sgPSBmYWxzZTtcbiAgNTE6XHRcbiAgNTI6XHRcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkgfHwgIXJvb3RfbWVtX2Nncm91cClcbiAgNTM6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDU0Olx0XG4gIDU1Olx0XHRpZiAocm9vdF9tZW1fY2dyb3VwLVx1MDAzZWNzcy5zcyAhPSBjc3MtXHUwMDNlc3MpIHtcbiAgNTY6XHRcdFx0c3RydWN0IGNncm91cCAqY2dyb3VwID0gY3NzLVx1MDAzZWNncm91cDtcbiAgNTc6XHRcdFx0aW50IHNzaWQgPSByb290X21lbV9jZ3JvdXAtXHUwMDNlY3NzLnNzLVx1MDAzZWlkO1xuICA1ODpcdFxuICA1OTpcdFx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gIDYwOlx0XHRcdHJjdV91bmxvY2sgPSB0cnVlO1xuICA2MTpcdFx0XHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNncm91cC1cdTAwM2VzdWJzeXNbc3NpZF0pO1xuICA2MjpcdFx0fVxuICA2MzpcdFxuICA2NDpcdFx0aWYgKGNzcyBcdTAwMjZcdTAwMjYgY3NzX3RyeWdldChjc3MpKVxuICA2NTpcdFx0XHRtZW1jZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCBtZW1fY2dyb3VwLCBjc3MpO1xuICA2NjpcdFxuICA2NzpcdFx0aWYgKHJjdV91bmxvY2spXG4gIDY4Olx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuICA2OTpcdFxuICA3MDpcdFx0cmV0dXJuIG1lbWNnO1xuICA3MTpcdH1cbiAgNzI6XHRcbiAgNzM6XHQvKipcbiAgNzQ6XHQgKiBicGZfcHV0X21lbV9jZ3JvdXAgLSBQdXQgYSByZWZlcmVuY2UgdG8gYSBtZW1vcnkgY2dyb3VwXG4gIDc1Olx0ICogQG1lbWNnOiBtZW1vcnkgY2dyb3VwIHRvIHJlbGVhc2VcbiAgNzY6XHQgKlxuICA3NzpcdCAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBhY3F1aXJlZCBtZW1jZyByZWZlcmVuY2UuXG4gIDc4Olx0ICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbiAgNzk6XHQgKi9cbiAgODA6XHRfX2JwZl9rZnVuYyB2b2lkIGJwZl9wdXRfbWVtX2Nncm91cChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE5NzQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBQcm9hY3RpdmUgUmVjbGFpbSBpbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AqKgoKQWxyaWdodCwgdGltZSB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgZGlnIGEgYml0IGRlZXBlciBpbnRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBhbmQgaG93IHByb2FjdGl2ZSByZWNsYWltIGludGVyYWN0cyB3aXRoIGl0LiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgc3lzdGVtIGlzICpyZWFsbHkqIHdvcmtpbmcsIG5vdCBqdXN0IHRoZSBzdXJmYWNlIGxldmVsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbnVhbmNlcyBvZiB0aGUgcHJvYWN0aXZlIHJlY2xhaW0gbG9naWMgd2l0aGluIHRoYXQgZnVuY3Rpb24sIGVzcGVjaWFsbHkgaW4gZGlmZmVyZW50IHNjZW5hcmlvcy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgaGV1cmlzdGljcyBpbnZvbHZlZCwgdGhlIHRyaWdnZXJpbmcgY29uZGl0aW9ucywgYW5kIHRoZSBhY3R1YWwgbWVjaGFuaXNtcyBpdCB1c2VzIHRvIGlkZW50aWZ5IGFuZCBmcmVlIHBhZ2VzLiBJJiMzOTttIGtlZW4gdG8gZXhhbWluZSBob3cgaXQgYmFsYW5jZXMgcmVjbGFpbSBlZmZvcnRzIGFjcm9zcyBkaWZmZXJlbnQgbWVtb3J5IGNncm91cHMsIGVzcGVjaWFsbHkgdW5kZXIgbWVtb3J5IHByZXNzdXJlLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiBob3cgaXQgcHJpb3JpdGl6ZXMgY2VydGFpbiB0eXBlcyBvZiByZWNsYWltIChlLmcuLCBwYWdlIGNhY2hlLCBhbm9ueW1vdXMgcGFnZXMpIGR1cmluZyBwcm9hY3RpdmUgcmVjbGFpbSB2ZXJzdXMgcmVhY3RpdmUgcmVjbGFpbS4gSSYjMzk7bGwgcHJvYmFibHkgbG9vayBhdCB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZ2xvYmFsIExSVSBsaXN0cyB0b28uIEkgc2hvdWxkIGFsc28gY2hlY2sgdGhlIGltcGFjdCBvZiB0aGluZ3MgbGlrZSBzd2FwIGFuZCBkaWZmZXJlbnQgbWVtb3J5IG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbnMgb24gdGhpcyByb3V0aW5lLiBVbHRpbWF0ZWx5LCBJJiMzOTttIGFpbWluZyBmb3IgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBlZmZpY2llbmN5IGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MgaW4gYSBoaWdoLWNvbnRlbnRpb24gbWVtb3J5IGVudmlyb25tZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2JwZl9tZW1jb250cm9sLmM9MjA3PV9fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMS1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjIyOlx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMy1cdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbi0tXG5tbS9pbnRlcm5hbC5oPTc3PWVudW0ge1xuLS1cbm1tL2ludGVybmFsLmgtODQtXG5tbS9pbnRlcm5hbC5oOjg1OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG5tbS9pbnRlcm5hbC5oLTg2LVx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0xNzcxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTgxNS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxODE2Olx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTgxNy1cdFx0XHRcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE4MzQ9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTg1MS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxODUyOlx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTg1My1cdFx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMzc4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC5jLTIzOTMtXHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xubW0vbWVtY29udHJvbC5jOjIzOTQ6XHRcdG5yX3JlY2xhaW1lZCAmIzQzOz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjM5NS1cdFx0XHRcdFx0XHRcdGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0yNjQ1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yNzE3LVx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjcxODpcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxubW0vbWVtY29udHJvbC5jLTI3MTktXHRcdFx0XHRcdFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00ODM4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDg3OS1cbm1tL21lbWNvbnRyb2wuYzo0ODgwOlx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXG5tbS9tZW1jb250cm9sLmMtNDg4MS1cdFx0XHRcdFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4OTc9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC5jLTQ5MzgtXHRcdGlmIChucl9yZWNsYWltcykge1xubW0vbWVtY29udHJvbC5jOjQ5Mzk6XHRcdFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcbm1tL21lbWNvbnRyb2wuYy00OTQwLVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcbi0tXG5tbS92bXNjYW4uYz02ODE1PXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vdm1zY2FuLmMtNjg1NC1cbm1tL3Ztc2Nhbi5jOjY4NTU6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3Ztc2Nhbi5jLTY4NTYtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vdm1zY2FuLmMtNjg5NS0jZWxzZVxubW0vdm1zY2FuLmM6Njg5Njp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjg5Ny1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYz03OTU4PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1Zixcbi0tXG5tbS92bXNjYW4uYy04MDI5LVx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xubW0vdm1zY2FuLmM6ODAzMDpcdFx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxubW0vdm1zY2FuLmMtODAzMS1cdFx0XHRcdFx0XHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNTU1CgkJCQkJCQlvdXRwdXQ6IDEyNwoJCQkJCQkJdGhvdWdodHM6IDM4OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBrZXJuZWwgY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIHBhdGNoIHJlbGllcyBvbi4gQmFzZWQgb24gdGhlIGluaXRpYWwgY2hlY2tzLCBpdCBsb29rcyBsaWtlIGBNRU1DR2AsIGBCUEZfU1lTQ0FMTGAsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBlc3NlbnRpYWwuIGBERUJVR19JTkZPX0JURmAgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBzaW5jZSBpdCYjMzk7cyByZXF1aXJlZCBmb3IgYm90aCBCVEYgYW5kIGtmdW5jcywgd2hpY2ggYXJlIGNlbnRyYWwgdG8gdGhpcyBwYXRjaC4KCk5leHQsIEkgbmVlZCB0byBwaW5wb2ludCB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcy4gVGhlIGZvY3VzIHNlZW1zIHRvIGJlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJIHNob3VsZCBkb3VibGUgY2hlY2sgaWYgYGJwZl9tZW1jb250cm9sX2luaXRgIGlzIGEgbGF0ZV9pbml0Y2FsbCwgYnV0IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGxvb2tzIHRvIGJlIHRoZSByZWFsIGtmdW5jIGVudHJ5cG9pbnQuCgpOb3csIGxldCYjMzk7cyBhc3Nlc3MgdGhlIGZ1enppbmcgcG90ZW50aWFsLiBUaGUgcGF0Y2ggdG91Y2hlcyBjcml0aWNhbCBzdWJzeXN0ZW1zOiBCUEYgYW5kIE1lbW9yeSBNYW5hZ2VtZW50LiBBIG5ldyBCUEYga2Z1bmMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLCBpcyBhZGRlZC4gQ3J1Y2lhbGx5LCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGNhbGxzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYW5kIHRoZSBhcmd1bWVudHMgKHNpemUsIHN3YXBwaW5lc3MpIHNlZW0gdXNlci1jb250cm9sbGFibGUuIFRoZSBwYXRjaCBhbHNvIHJlZ2lzdGVycyB0aGlzIGtmdW5jIGZvciBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCwgbWFraW5nIGl0IGRlZmluaXRlbHkgZXhlY3V0YWJsZSBjb2RlIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gVGhpcyBpcyAqZGVmaW5pdGVseSogd29ydGggZnV6emluZy4KClRvIHN1bW1hcml6ZSB0aGUgcmVxdWlyZW1lbnRzOiBXZSBuZWVkIGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgIGVuYWJsZWQuIFRoZSBtYWluIGZ1bmN0aW9uIHRvIGZvY3VzIG9uIGlzIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCYjMzk7cyBsb2NhdGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4KCk9rYXksIEkmIzM5O20gcmVhZHkgdG8gcHJlcGFyZSB0aGUgdG9vbCBjYWxsIG5vdy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBmb3JtYXQgaXMgY29ycmVjdDogVGhlIGVuYWJsZSBjb25maWd1cmF0aW9ucyBhcmUgc3RyaXBwZWQgb2YgdGhlIGBDT05GSUdfYCBwcmVmaXguIFRoZSBmb2N1cyBzeW1ib2wgaXMgdGhhdCBuZXcgZnVuY3Rpb24uIEkgaGF2ZSBhIGNvbmNpc2UgZXhwbGFuYXRpb24gZm9yIHRoZSByZWFzb25pbmcsIGFuZCB0aGUgYFdvcnRoRnV6emluZ2AgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gVGltZSB0byBhc3NlbWJsZSB0aGUgZGF0YSBhbmQgZ2V0IHRoaXMgaW50byB0aGUgZnV6emVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7REVCVUdfSU5GT19CVEYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7REVCVUdfSU5GT19CVEYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSBuZXcgc2xlZXBhYmxlIEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgQlBGIHNlbGZ0ZXN0cy4gVGhlIGtmdW5jIGFjY2VwdHMgcHJpbWl0aXZlIHNjYWxhciBhcmd1bWVudHMgKGBtZW1jZ2AsIGBzaXplYCwgYHN3YXBwaW5lc3NgKSwgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzLCBhbmQgZGVsZWdhdGVzIHRvIHRoZSBleGlzdGluZyBrZXJuZWwgcmVjbGFpbSBpbmZyYXN0cnVjdHVyZSB2aWEgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBzdGFjayBvciBoZWFwIGFyZSBpbnRyb2R1Y2VkIG9yIHJlYWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXJlIHNjYWxhciB0eXBlcyBpbml0aWFsaXplZCBwcmlvciB0byB1c2UuXG4yLiBObyBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgZmllbGRzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBleHBvc2VkIHZpYSBpb2N0bHMvc3lzZnMvbmV0bGluay9CUEYgYnVmZmVycy5cbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXG5cblRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3NwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgU2VwIDExIDAzOjE0OjQ0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uZDg4MjdiYzM4OGVmYyAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC04LDYgJiM0Mzs4LDggQEAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKJiM0MzsjaW5jbHVkZSAmIzM0O2ludGVybmFsLmgmIzM0OwomIzQzOwogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwogCiAvKioKQEAgLTE1OSw2ICYjNDM7MTYxLDc0IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMsIGNsYW1wZWQgdG8KJiM0MzsgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpCiYjNDM7ICogQHN3YXBwaW5lc3M6IHRoZSByZWNsYWltIHN3YXBwaW5lc3MsIGluIHRoZSByYW5nZQomIzQzOyAqICAgICAgICAgW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0sIHdoZXJlCiYjNDM7ICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlCiYjNDM7ICogICAgICAgICB0aGUgbWVtY2cmIzM5O3Mgb3duIHN3YXBwaW5lc3MKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKgomIzQzOyAqIE9ubHkgdGhlIHJlY2xhaW0gdGFyZ2V0IGlzIGNhcHBlZDogQHNpemUgaXMgY2xhbXBlZCB0bwomIzQzOyAqIE1FTUNHX0NIQVJHRV9CQVRDSCwgZm9sbG93aW5nIHRoZSBwcmVjZWRlbnQgb2YgaGlnaF93b3JrX2Z1bmMoKSwKJiM0MzsgKiB0aGUgbWVtb3J5LmhpZ2ggd29ya3F1ZXVlIGZhbGxiYWNrLCB3aGljaCBib3VuZHMgZWFjaCByZWNsYWltCiYjNDM7ICogcmVxdWVzdCB0aGUgc2FtZSB3YXkuIFRoZSBhY3R1YWwgc2Nhbm5pbmcgd29yayBhbmQgaXRzIGR1cmF0aW9uCiYjNDM7ICogYXJlIG5vdCBib3VuZGVkLiBUbyByZWNsYWltIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5CiYjNDM7ICogaW5zdGVhZCBvZiBwYXNzaW5nIGEgbGFyZ2VyIEBzaXplLgomIzQzOyAqCiYjNDM7ICogVGhlIGtmdW5jIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBhIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTAomIzQzOyAqIHByb2dyYW0sIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRocmVhZCBydW5uaW5nIHRoZQomIzQzOyAqIHByb2dyYW0sIG9yIGZyb20gdGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyBvZiBhIFNZU0NBTEwKJiM0MzsgKiBwcm9ncmFtLCB3aGljaCBydW4gaW4gcHJvY2VzcyBjb250ZXh0IGFuZCBrZWVwIHRoZSBTWVNDQUxMIHByb2dyYW0KJiM0MzsgKiB0eXBlLiBJdCBpcyByZWdpc3RlcmVkIGZvciBCUEZfUFJPR19UWVBFX1NZU0NBTEwgb25seSwgYmVjYXVzZQomIzQzOyAqIGdlbmVyaWMgc2xlZXBhYmxlIHByb2dyYW1zIG1heSBydW4gd2l0aCBmaWxlc3lzdGVtIGxvY2tzIGhlbGQgb3IKJiM0MzsgKiBpbiBOT0ZTL05PSU8gY29udGV4dHMsIHdoZXJlIHRoZSByZWNsYWltIHBhdGggY291bGQgZGVhZGxvY2sgb24KJiM0MzsgKiB0aG9zZSBsb2NrcyB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuCiYjNDM7ICoKJiM0MzsgKiBGb3IgYXN5bmNocm9ub3VzIHJlY2xhaW0gb2YgbW9yZSB0aGFuIG9uZSBiYXRjaCwgZHJpdmluZyB0aGUKJiM0MzsgKiByZWNsYWltIGZyb20gYSBicGZfd3EgY2FsbGJhY2sgaXMgcmVjb21tZW5kZWQ6IGNhbGwgdGhpcyBrZnVuYwomIzQzOyAqIG9uY2UgcGVyIGNhbGxiYWNrIGFuZCByZXF1ZXVlIHRoZSBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQKJiM0MzsgKiBiYXRjaCwgaW5zdGVhZCBvZiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2sgYW5kIG1vbm9wb2xpemluZyBhCiYjNDM7ICogd29ya3F1ZXVlIHdvcmtlciwgYW5kIGdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biB3b3JrIGl0ZW0sCiYjNDM7ICogYXMgaGlnaF93b3JrX2Z1bmMoKSBkb2VzIHdpdGggb25lIHdvcmsgaXRlbSBwZXIgbWVtY2cuIFdoZXRoZXIKJiM0MzsgKiB0byBzdWJtaXQgdGhlIG5leHQgYmF0Y2ggaXMgdXAgdG8gdGhlIEJQRiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcAomIzQzOyAqIGF0IGFueSBwb2ludCwgZS5nLiBvbmNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzCiYjNDM7ICogc21hbGxlciB0aGFuIGEgcGFnZSwgb3IgKHVuc2lnbmVkIGxvbmcpLTEgaWYgQHN3YXBwaW5lc3MgaXMgb3V0IG9mCiYjNDM7ICogcmFuZ2UuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCQkJCQlpbnQgc3dhcHBpbmVzcykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwomIzQzOwomIzQzOwlpZiAoc3dhcHBpbmVzcyAmbHQ7IC0xIHx8IHN3YXBwaW5lc3MgJmd0OyBTV0FQUElORVNTX0FOT05fT05MWSkKJiM0MzsJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKJiM0MzsKJiM0MzsJaWYgKHNpemUgJmx0OyBQQUdFX1NJWkUpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJbnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTsKJiM0MzsKJiM0MzsJbnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsCiYjNDM7CQkJCQkJICAgIEdGUF9LRVJORUwsCiYjNDM7CQkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSwKJiM0MzsJCQkJCQkgICAgc3dhcHBpbmVzcyA9PSAtMSA/IE5VTEwgOgomIzQzOwkJCQkJCQkJICAgICAgICZhbXA7c3dhcHBpbmVzcyk7CiYjNDM7CiYjNDM7CXJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzQsMTkgJiM0MzsyNDQsMzUgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jcywKIH07CiAKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7CiYjNDM7CS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLAomIzQzO307CiYjNDM7CiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTsKLQlpZiAoZXJyKQomIzQzOwlpZiAoZXJyKSB7CiAJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkJiMzNDssIGVycik7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl93YXJuKCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDM4YjExNjUyMTJjOTQuLjQ0ZTk1ZTg3ZTNjZDkgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaApAQCAtNzQsMTEgJiM0Mzs3NCwxMyBAQCB1bnNpZ25lZCBsb25nIGxydXZlY19scnVfc2l6ZShzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIGVudW0gbHJ1X2xpc3QgbHJ1LAogCiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgKDEgJmx0OyZsdDsgMSkKICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUgKDEgJmx0OyZsdDsgMikKLSNkZWZpbmUgTUlOX1NXQVBQSU5FU1MgMAotI2RlZmluZSBNQVhfU1dBUFBJTkVTUyAyMDAKJiM0MztlbnVtIHsKJiM0MzsJTUlOX1NXQVBQSU5FU1MgPSAwLAomIzQzOwlNQVhfU1dBUFBJTkVTUyA9IDIwMCwKIAotLyogSnVzdCByZWNsYWltIGZyb20gYW5vbiBmb2xpb3MgaW4gcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltICovCi0jZGVmaW5lIFNXQVBQSU5FU1NfQU5PTl9PTkxZIChNQVhfU1dBUFBJTkVTUyAmIzQzOyAxKQomIzQzOwkvKiBKdXN0IHJlY2xhaW0gZnJvbSBhbm9uIGZvbGlvcyBpbiBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gKi8KJiM0MzsJU1dBUFBJTkVTU19BTk9OX09OTFkgPSBNQVhfU1dBUFBJTkVTUyAmIzQzOyAxLAomIzQzO307CiAKIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uN2M3ZDI5OWIzYjI4YQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSw3NzkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3QKJiM0MzsgKgomIzQzOyAqIFNldHRpbmcgVEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIPTEgYWRkcyBhIGJhc2VsaW5lIHJ1biBvZiB0aGUKJiM0MzsgKiB3b3JrbG9hZCB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSB0byBtZW1jZ19hc3luY19yZWNsYWltLCBhbmQgcHJpbnRzCiYjNDM7ICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZAomIzQzOyAqIGNncm91cCwgdG8gc3Rkb3V0LgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqLwomIzQzO2VudW0gcmVjbGFpbV9vdXRjb21lIHsKJiM0MzsJUkVDTEFJTV9PVVRDT01FX0NBTExFRCwKJiM0MzsJUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsCiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50IHsKJiM0MzsJdTY0IG91dGNvbWU7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSICYjMzQ7L3RhcmdldCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlCiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kCiYjNDM7ICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXIKJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvCiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy4gVGhlIEJQRgomIzQzOyAqIHByb2dyYW0gcmVwb3J0cyBldmVyeSByZWNsYWltIG91dGNvbWUgdGhyb3VnaCB0aGUgcmluZ2J1Ziwgc28gdGhlCiYjNDM7ICogd2FpdHMganVzdCBwb2xsIGl0IHdpdGggYSB0aW1lb3V0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgRFlJTkdfU0VUVExFX1VTICgyMDAgKiAxMDAwKQomIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9USU1FT1VUX01TICgxMDApCiYjNDM7I2RlZmluZSBFVkVOVF9QT0xMX1JPVU5EUyAoNTApCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHMKJiM0MzsgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcAomIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZQomIzQzOyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjImIzM5O3MKJiM0MzsgKiBuby1pbnRlcm5hbC1wcm9jZXNzIGNvbnN0cmFpbnQga2VlcHMgdGhlIHJlZmF1bHRpbmcgd29ya2xvYWQgb3V0IG9mCiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzZXR1cF9keWluZ19jZ3JvdXBzKHU2NCAqdHJpZ2dlcl9jZ3JvdXBfaWQsIHU2NCAqdGFyZ2V0X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFOwomIzQzOwlmcHJpbnRmKGZwLCAmIzM0OyUuNmYmIzM0OywgZWxhcHNlZCk7CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7CiYjNDM7CXJldHVybiBDSElMRF9FWElUX09LOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CWNoYXIgYnVmWzY0XTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmcCwgJiMzNDtmb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCAmIzM0O2ZnZXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoc3NjYW5mKGJ1ZiwgJiMzNDslbGYmIzM0OywgdGltZSkgIT0gMSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O3NzY2FuZiAlcyYjMzQ7LCBidWYpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQKJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJY2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTsKJiM0MzsJcGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xOwomIzQzOwlwaWRfdCB3YWl0X3JldDsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWxvd19waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsICYjMzQ7Zm9yayBsb3cmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChsb3dfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLAomIzQzOwkJCQkJICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CWhpZ2hfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgJiMzNDtmb3JrIGhpZ2gmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChoaWdoX3BpZCA9PSAwKQomIzQzOwkJX2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJLyoKJiM0MzsJICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsCiYjNDM7CSAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLgomIzQzOwkgKi8KJiM0MzsJbG93X3BpZCA9IC0xOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2xvdyBleGl0ZWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJd2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2hpZ2ggd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJLyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovCiYjNDM7CWhpZ2hfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7aGlnaCBleGl0ZWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKSYjMzQ7LAomIzQzOwkJCSAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLAomIzQzOwkJCSAgIFdFWElUU1RBVFVTKHN0YXR1cykpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwkvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqLwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlpZiAoaGlnaF9waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAobG93X3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGxvd19waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJdW5saW5rKGxvd190aW1lX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF90aW1lX2ZpbGUpOwomIzQzOwl1bmxpbmsobG93X2RhdGFfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX2RhdGFfZmlsZSk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQKJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCwKJiM0MzsJICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7CiYjNDM7CXN0cnVjdCBicGZfYXJncyBhcmdzID0gewomIzQzOwkJLmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsCiYjNDM7CQkubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsCiYjNDM7CQkuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELAomIzQzOwkJLmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLAomIzQzOwl9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsCiYjNDM7CQkuY3R4X2luID0gJmFtcDthcmdzLAomIzQzOwkJLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiB0ZXN0X3Byb2dzIGhpamFja3Mgc3Rkb3V0IGFuZCBvbmx5IHByaW50cyB0aGUgY2FwdHVyZWQgbG9nIHdoZW4gdGhlCiYjNDM7ICogdGVzdCBmYWlscywgc28gYmVuY2htYXJrIG51bWJlcnMgZ28gc3RyYWlnaHQgdG8gdGhlIHJlYWwgc3Rkb3V0IHRvCiYjNDM7ICoga2VlcCB0aGVtIGZyb20gZHJvd25pbmcgaW4gQVNTRVJUIG91dHB1dC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBiZW5jaF9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCiYjNDM7ewomIzQzOwl2YV9saXN0IGFwOwomIzQzOwomIzQzOwl2YV9zdGFydChhcCwgZm10KTsKJiM0MzsJdmZwcmludGYoZW52LnN0ZG91dF9zYXZlZCA/OiBzdGRvdXQsIGZtdCwgYXApOwomIzQzOwl2YV9lbmQoYXApOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJZG91YmxlIGJhc2VfaGlnaF90aW1lID0gMC4wLCBiYXNlX2xvd190aW1lID0gMC4wOwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CWludCBlcnIsIGJlbmNoOwomIzQzOwomIzQzOwliZW5jaCA9ICEhZ2V0ZW52KCYjMzQ7VEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIJiMzNDspOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9wdGlvbmFsIGJhc2VsaW5lIGZvciB0aGUgYmVuY2htYXJrIG51bWJlcnMgYmVsb3c6IHJ1biB0aGUKJiM0MzsJICogc2FtZSB3b3JrbG9hZCBvbmNlIHdpdGhvdXQgdGhlIEJQRiBwcm9ncmFtLCBzbyB0aGUgbG9nIGNhbgomIzQzOwkgKiByZXBvcnQgaG93IG11Y2ggYXN5bmMgcmVjbGFpbSBpbXByb3ZlZCB0aGUgcHJlc3N1cmVkIGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmIChiZW5jaCkgewomIzQzOwkJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7YmFzZV9oaWdoX3RpbWUsICZhbXA7YmFzZV9sb3dfdGltZSwKJiM0MzsJCQkJCSAgICBSRUFEX1RJTUVTKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgYmFzZWxpbmUmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCAmYW1wO3NrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfYnBmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZCgmYW1wO2hpZ2hfdGltZSwgJmFtcDtsb3dfdGltZSwgUkVBRF9USU1FUyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZwomIzQzOwkgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW0KJiM0MzsJICogYWN0dWFsbHkgcmVjbGFpbWVkIG1lbW9yeSBmcm9tIHRoZSBsb3cgY2dyb3VwLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFBU1NFUlRfR1Qoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzLCAwLCAmIzM0O3JlY2xhaW1fY2FsbHMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltZWRfYnl0ZXMsIDAsICYjMzQ7cmVjbGFpbWVkX2J5dGVzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBpcyBhIGJlbmNobWFyayBhbmQgdG9vIGZsYWt5IHRvIGZhaWwgQ0kKJiM0MzsJICogcnVucywgc28gaXQgb25seSBsb2dzIHRoZSBudW1iZXJzOyB0aGUgY291bnRlcnMgYWJvdmUgYWxyZWFkeQomIzQzOwkgKiBwcm92ZWQgdGhhdCB0aGUgQlBGIHByb2dyYW0gcmVjbGFpbWVkIG1lbW9yeS4KJiM0MzsJICovCiYjNDM7CWlmIChiZW5jaCkKJiM0MzsJCWJlbmNoX3ByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW06IGJhc2VsaW5lIGhpZ2g9JWYgbG93PSVmLCAmIzM0OwomIzQzOwkJCSAgICAgJiMzNDtyZWNsYWltIGhpZ2g9JWYgbG93PSVmLCBoaWdoIHNwZWVkdXA9JS4xZiUlXG4mIzM0OywKJiM0MzsJCQkgICAgIGJhc2VfaGlnaF90aW1lLCBiYXNlX2xvd190aW1lLCBoaWdoX3RpbWUsIGxvd190aW1lLAomIzQzOwkJCSAgICAgMTAwLjAgKiAoYmFzZV9oaWdoX3RpbWUgLSBoaWdoX3RpbWUpIC8gYmFzZV9oaWdoX3RpbWUpOwomIzQzOwllbHNlIGlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpCiYjNDM7CQlwcmludGYoJiMzNDttZW1jZ19hc3luY19yZWNsYWltOiBoaWdoIGNncm91cCBub3QgaW1wcm92ZWQ6IGhpZ2g9JWYgbG93PSVmXG4mIzM0OywKJiM0MzsJCSAgICAgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHMKJiM0MzsgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGUKJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzbwomIzQzOyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseQomIzQzOyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3AKJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkICE9IDApCiYjNDM7CQlyZXR1cm4gcGlkOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKQomIzQzOwkJX2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKQomIzQzOwkJCV9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIG9ic2VydmVkIHNvIGZhciwgdGFsbGllZCBmcm9tIHJpbmdidWYgZXZlbnRzLiAqLwomIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHsKJiM0MzsJaW50IGNhbGxlZDsKJiM0MzsJaW50IHNraXBwZWRfZHlpbmc7CiYjNDM7CWludCB0YXJnZXRfZ29uZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgb25fcmVjbGFpbV9ldmVudCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzeikKJiM0Mzt7CiYjNDM7CXN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuICpzZWVuID0gY3R4OwomIzQzOwljb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhOwomIzQzOwomIzQzOwlpZiAoc3ogJmx0OyBzaXplb2YoKmV2KSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzd2l0Y2ggKGV2LSZndDtvdXRjb21lKSB7CiYjNDM7CWNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDoKJiM0MzsJCXNlZW4tJmd0O2NhbGxlZCYjNDM7JiM0Mzs7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORzoKJiM0MzsJCXNlZW4tJmd0O3NraXBwZWRfZHlpbmcmIzQzOyYjNDM7OwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FOgomIzQzOwkJc2Vlbi0mZ3Q7dGFyZ2V0X2dvbmUmIzQzOyYjNDM7OwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmQKJiM0MzsgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mCiYjNDM7ICogcmVjbGFpbWluZyBmcm9tIGl0LgomIzQzOyAqCiYjNDM7ICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQKJiM0MzsgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLAomIzQzOyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIEEgQ0FMTEVEIGV2ZW50IHdoaWxlCiYjNDM7ICogdGhlIHRhcmdldCBpcyBhbGl2ZSBwcm92ZXMgdGhhdCByb3VuZHMgcmVhbGx5IHJ1biAodGhlIGtmdW5jCiYjNDM7ICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kCiYjNDM7ICogYWZ0ZXIgdGhlIHJlbW92YWwgdGhlIHByb2dyYW0gbXVzdCByZXBvcnQgdGhlIHJlbW92ZWQgdGFyZ2V0IHZpYQomIzQzOyAqIFNLSVBQRURfRFlJTkcgb3IgVEFSR0VUX0dPTkUgZXZlbnRzIHdoaWxlIHJlY2xhaW1fY2FsbHMgYW5kCiYjNDM7ICogcmVjbGFpbWVkX2J5dGVzIHN0YXkgZnJvemVuLgomIzQzOyAqLwomIzQzO3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgdHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTsKJiM0MzsJY2hhciBkYXRhX2ZpbGVbUEFUSF9NQVhdID0gJiMzNDsmIzM0OzsKJiM0MzsJc3RydWN0IHJlY2xhaW1fZXZlbnRzX3NlZW4gc2VlbiA9IHt9OwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMOwomIzQzOwlwaWRfdCByZWFkZXJfcGlkID0gLTE7CiYjNDM7CWludCBlcnIsIGZkLCBpOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9keWluZ19jZ3JvdXBzKCZhbXA7dHJpZ2dlcl9jZ3JvdXBfaWQsICZhbXA7dGFyZ2V0X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9keWluZ19jZ3JvdXBzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJcmIgPSByaW5nX2J1ZmZlcl9fbmV3KGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucmVjbGFpbV9ldmVudHMpLAomIzQzOwkJCSAgICAgIG9uX3JlY2xhaW1fZXZlbnQsICZhbXA7c2VlbiwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihyYiwgJiMzNDtyaW5nX2J1ZmZlcl9fbmV3JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGRhdGFfZmlsZSwgc2l6ZW9mKGRhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFgmIzM0Oywgd29ya2xvYWRfZmlsZXNfZGlyKCkpOwomIzQzOwlmZCA9IG1rc3RlbXAoZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CXJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsICYjMzQ7Zm9yayBrZWVwYWxpdmUgcmVhZGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBFVkVOVF9QT0xMX1JPVU5EUyAmYW1wOyZhbXA7ICFzZWVuLmNhbGxlZDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpOwomIzQzOwkJaWYgKCFBU1NFUlRfR0UoZXJyLCAwLCAmIzM0O3JpbmdfYnVmZmVyX19wb2xsJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0dUKHNlZW4uY2FsbGVkLCAwLCAmIzM0O3JlY2xhaW0gZXZlbnRzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CiYjNDM7CS8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovCiYjNDM7CXVzbGVlcChEWUlOR19TRVRUTEVfVVMpOwomIzQzOwomIzQzOwljYWxsc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHM7CiYjNDM7CWJ5dGVzX2JlZm9yZSA9IHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciBhIHJlY2xhaW0gcm91bmQgdG8gaGl0IHRoZSByZW1vdmVkIGNncm91cC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEVWRU5UX1BPTExfUk9VTkRTICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc2Vlbi5za2lwcGVkX2R5aW5nICZhbXA7JmFtcDsgIXNlZW4udGFyZ2V0X2dvbmU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQllcnIgPSByaW5nX2J1ZmZlcl9fcG9sbChyYiwgRVZFTlRfUE9MTF9USU1FT1VUX01TKTsKJiM0MzsJCWlmICghQVNTRVJUX0dFKGVyciwgMCwgJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXNlZW4uc2tpcHBlZF9keWluZyAmYW1wOyZhbXA7ICFzZWVuLnRhcmdldF9nb25lKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7bm8gcmVjbGFpbSByb3VuZCBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwIChnb25lPSVkLCBkeWluZz0lZCkmIzM0OywKJiM0MzsJCQkgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVjawomIzQzOwkgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgdGhleSBoYXBwZW4gaXMgdGltaW5nCiYjNDM7CSAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzbwomIzQzOwkgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLgomIzQzOwkgKi8KJiM0MzsJcHJpbnRmKCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWQsIGR5aW5nPSVkXG4mIzM0OywKJiM0MzsJICAgICAgIHNlZW4udGFyZ2V0X2dvbmUsIHNlZW4uc2tpcHBlZF9keWluZyk7CiYjNDM7CiYjNDM7CS8qIE5vdGhpbmcgbWF5IGhhdmUgYmVlbiByZWNsYWltZWQgZnJvbSB0aGUgcmVtb3ZlZCB0YXJnZXQuICovCiYjNDM7CWlmICghQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCAmIzM0O3JlY2xhaW1fY2FsbHMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltZWRfYnl0ZXMsIGJ5dGVzX2JlZm9yZSwKJiM0MzsJCSAgICAgICAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzO291dDoKJiM0MzsJaWYgKHJlYWRlcl9waWQgJmd0OyAwKSB7CiYjNDM7CQlraWxsKHJlYWRlcl9waWQsIFNJR0tJTEwpOwomIzQzOwkJKHZvaWQpd2FpdHBpZChyZWFkZXJfcGlkLCBOVUxMLCAwKTsKJiM0MzsJfQomIzQzOwlpZiAoZGF0YV9maWxlWzBdKQomIzQzOwkJdW5saW5rKGRhdGFfZmlsZSk7CiYjNDM7CWlmIChyYikKJiM0MzsJCXJpbmdfYnVmZmVyX19mcmVlKHJiKTsKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmMxOGJlYjY0MTZkMzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDI4OCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7LyoKJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkUKJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlCiYjNDM7ICogc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IG9uZSwgc28gbm8gY2FsbGJhY2sgcnVucyBsb25nZXIgdGhhbiBvbmUKJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJncyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5CiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7CiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlczsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE91dGNvbWUgb2YgYSBzaW5nbGUgcmVjbGFpbSBhdHRlbXB0LCByZXBvcnRlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaAomIzQzOyAqIHRoZSByZWNsYWltX2V2ZW50cyByaW5nYnVmIHNvIHRlc3RzIGNhbiB3YWl0IGZvciByZWNsYWltIGV2ZW50cyB3aXRoCiYjNDM7ICogYSB0aW1lb3V0IGluc3RlYWQgb2YgcG9sbGluZyB0aGUgY291bnRlcnMgYWJvdmUuCiYjNDM7ICovCiYjNDM7ZW51bSByZWNsYWltX291dGNvbWUgewomIzQzOwlSRUNMQUlNX09VVENPTUVfQ0FMTEVELAomIzQzOwlSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORywKJiM0MzsJUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FLAomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHJlY2xhaW1fZXZlbnQgewomIzQzOwlfX3U2NCBvdXRjb21lOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxICZsdDsmbHQ7IDE2KTsKJiM0Mzt9IHJlY2xhaW1fZXZlbnRzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVwb3J0cyBhcmUgYmVzdCBlZmZvcnQ6IHdoZW4gdGhlIHJpbmdidWYgaXMgZnVsbCwgZm9yIGV4YW1wbGUgd2hlbgomIzQzOyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBlbWl0X3JlY2xhaW1fZXZlbnQoZW51bSByZWNsYWltX291dGNvbWUgb3V0Y29tZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCByZWNsYWltX2V2ZW50ICpldjsKJiM0MzsKJiM0MzsJZXYgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKCZhbXA7cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTsKJiM0MzsJaWYgKCFldikKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXYtJmd0O291dGNvbWUgPSBvdXRjb21lOwomIzQzOwlicGZfcmluZ2J1Zl9zdWJtaXQoZXYsIDApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLAomIzQzOwkJYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLAomIzQzOwkJCQkgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvcgomIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpCiYjNDM7ICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFjawomIzQzOyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlbgomIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvbgomIzQzOyAqIHRoZSBsb29rdXAgZmFpbGluZy4KJiM0MzsgKgomIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbQomIzQzOyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0bwomIzQzOyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oCiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzbwomIzQzOyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtJmd0O3NlbGYuZmxhZ3M7CiYjNDM7CiYjNDM7CXJldHVybiAoZmxhZ3MgJmFtcDsgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzICZhbXA7IENTU19PTkxJTkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXMKJiM0MzsgKiByZWNsYWltZWQuIEVhY2ggYXR0ZW1wdCByZXBvcnRzIGl0cyBvdXRjb21lIHRocm91Z2ggdGhlCiYjNDM7ICogcmVjbGFpbV9ldmVudHMgcmluZ2J1Zi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdTY0IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCBzaXplKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJdTY0IG5yID0gMDsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKSB7CiYjNDM7CQllbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHsKJiM0MzsJCWVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyk7CiYjNDM7CQlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmVjbGFpbV9jYWxscyYjNDM7JiM0Mzs7CiYjNDM7CW5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplLCAtMSk7CiYjNDM7CXJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7CiYjNDM7CWVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTsKJiM0MzsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5yOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7CiYjNDM7CXN0cnVjdCBicGZfdGltZXIgdGltZXI7CiYjNDM7CXN0cnVjdCBicGZfd3Egd29yazsKJiM0MzsJdTY0IHByZXZfZXZlbnQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0MzsJLyoKJiM0MzsJICogQnl0ZXMgc3RpbGwgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCByb3VuZCwgY2FycmllZCBhY3Jvc3MKJiM0MzsJICogcmVxdWV1ZXMuIDAgbWVhbnMgbm8gcm91bmQgaXMgaW4gcHJvZ3Jlc3M7IHRoZSB0aW1lciBwYXRoCiYjNDM7CSAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rcwomIzQzOwkgKiBhdCBpdC4KJiM0MzsJICovCiYjNDM7CXU2NCByZW1haW5pbmc7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CXU2NCBuciwgc2l6ZTsKJiM0MzsKJiM0MzsJaWYgKCFlbGVtLSZndDtyZW1haW5pbmcpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaW1lci10cmlnZ2VyZWQgZW50cnk6IHN0YXJ0IGEgbmV3IHJvdW5kIG9ubHkgd2hlbiB0aGUKJiM0MzsJCSAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXMKJiM0MzsJCSAqIGNoZWNrIGFuZCBvbmx5IGxvb2sgYXQgcmVtYWluaW5nLCBzbyB0aGUgcmVmYXVsdCBkZWx0YQomIzQzOwkJICogaXMgY29uc3VtZWQgb25jZSBwZXIgcm91bmQuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQkJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkKJiM0MzsJCQlyZXR1cm4gMDsKJiM0MzsJCWVsZW0tJmd0O3JlbWFpbmluZyA9IFJFQ0xBSU1fTUFYX0lURVIgKiBSRUNMQUlNX1NJWkU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogT25lIGJvdW5kZWQgcmVjbGFpbSBwYXNzIHBlciBjYWxsYmFjayAqLwomIzQzOwlzaXplID0gZWxlbS0mZ3Q7cmVtYWluaW5nICZsdDsgUkVDTEFJTV9TSVpFID8gZWxlbS0mZ3Q7cmVtYWluaW5nIDogUkVDTEFJTV9TSVpFOwomIzQzOwluciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpOwomIzQzOwlpZiAoIW5yKSB7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi8KJiM0MzsJaWYgKG5yICZndDs9IGVsZW0tJmd0O3JlbWFpbmluZykKJiM0MzsJCWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsc2UKJiM0MzsJCWVsZW0tJmd0O3JlbWFpbmluZyAtPSBucjsKJiM0MzsKJiM0MzsJLyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovCiYjNDM7CWlmIChlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgcmVjbGFpbV93b3JrX2ZuLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1MjAKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA1MjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gRnV6emluZyBFdmFsdWF0aW9uIGZvciBUaGlzIFBhdGNoIFNlcmllcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZmlndXJlIG91dCB3aGV0aGVyIHdlIG5lZWQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGZvciB0aGlzIHBhdGNoIHNlcmllcy4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgY29kZSBjaGFuZ2VzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgYG1tL2ludGVybmFsLmhgLCBhbmQgc29tZSBzZWxmdGVzdHMuCgpGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBhY3R1YWxseSAqaGFwcGVuaW5nKiBoZXJlLiBUaGUgY29yZSBzZWVtcyB0byBiZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcga2Z1bmMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCB0YWtlcyBhIGBtZW1fY2dyb3VwYCwgYSBzaXplLCBhbmQgYSBgc3dhcHBpbmVzc2AgdmFsdWUsIGRvZXMgc29tZSBzaXplIGFuZCBzd2FwcGluZXNzIGNoZWNraW5nLCBjYWxjdWxhdGVzIGEgbnVtYmVyIG9mIHBhZ2VzLCBhbmQgdGhlbiBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgd2l0aCB0aGUgYEtGX1NMRUVQQUJMRWAgZmxhZywgd2hpY2ggaXMgZ29vZCB0byBub3RlLiBUaGUgYGludGVybmFsLmhgIGNoYW5nZXMganVzdCBsb29rIGxpa2UgYSBjb252ZXJzaW9uIGZyb20gZGVmaW5lcyB0byBhbiBlbnVtIGZvciBzd2FwcGluZXNzIHZhbHVlcy4gQW5kIHdlJiMzOTt2ZSBnb3QgYSBuZXcgc2VsZnRlc3Qgc3VpdGUgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZmAgdGhhdCBhcmUgZ29pbmcgdG8gYmUgdmVyaWZ5aW5nIHRoaXMuCgpNeSBwcmltYXJ5IGNvbmNlcm4gaXMgaG93IGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBhbmQgc3BlY2lmaWNhbGx5IGhvdyB0aGUgYHN3YXBwaW5lc3NgIGFyZ3VtZW50IHdvcmtzIGFuZCBpcyB1c2VkLiBHaXZlbiB0aGlzIGlzIG5ldyBrZnVuYyBhbmQgY291bGQgYmUgZXhwb3NlZCBpbiB1c2VyIHNwYWNlLCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQmIzM5O3MgaW50ZWdyYXRlZCB0byBtYWtlIHN1cmUgdGhlcmUmIzM5O3Mgbm8gc3VidGxlIGlzc3VlIHRoYXQgS01TQU4gbWlnaHQgY2F0Y2gsIGFuZCB0aGF0JiMzOTtzIHByb2JhYmx5IHRoZSBtb3N0IGludGVyZXN0aW5nIHBhcnQgb2YgdGhpcyBwYXRjaCBzZXJpZXMgZm9yIG5vdy4gSSBuZWVkIHRvIGRpZyBpbnRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpdHNlbGYuIEEgcXVpY2sgZ3JlcHBlciBzZWFyY2ggc2hvdWxkIGRvIHRoZSB0cmljaywgb3IgSSBjYW4ganVzdCBjaGVjayB0aGUgY29kZSBpdHNlbGYuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYnBmX21lbWNvbnRyb2wuYz0yMDc9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmMtMjIxLVxubW0vYnBmX21lbWNvbnRyb2wuYzoyMjI6XHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjIzLVx0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuLS1cbm1tL2ludGVybmFsLmg9Nzc9ZW51bSB7XG4tLVxubW0vaW50ZXJuYWwuaC04NC1cbm1tL2ludGVybmFsLmg6ODU6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL2ludGVybmFsLmgtODYtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE3NzE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xODE1LVxubW0vbWVtY29udHJvbC12MS5jOjE4MTY6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODE3LVx0XHRcdFx0bWVtc3cgPyAwIDogTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpIHtcbi0tXG5tbS9tZW1jb250cm9sLXYxLmM9MTgzND1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xODUxLVxubW0vbWVtY29udHJvbC12MS5jOjE4NTI6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODUzLVx0XHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXG4tLVxubW0vbWVtY29udHJvbC5jPTIzNzg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLmMtMjM5My1cdFx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjM5NDpcdFx0bnJfcmVjbGFpbWVkICYjNDM7PSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbm1tL21lbWNvbnRyb2wuYy0yMzk1LVx0XHRcdFx0XHRcdFx0Z2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jPTI2NDU9c3RhdGljIGludCB0cnlfY2hhcmdlX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZ2ZwX3QgZ2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jLTI3MTctXHRwc2lfbWVtc3RhbGxfZW50ZXIoXHUwMDI2cGZsYWdzKTtcbm1tL21lbWNvbnRyb2wuYzoyNzE4Olx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1fb3Zlcl9saW1pdCwgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjcxOS1cdFx0XHRcdFx0XHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4Mzg9c3RhdGljIHNzaXplX3QgbWVtb3J5X2hpZ2hfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxuLS1cbm1tL21lbWNvbnRyb2wuYy00ODc5LVxubW0vbWVtY29udHJvbC5jOjQ4ODA6XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcbm1tL21lbWNvbnRyb2wuYy00ODgxLVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcbi0tXG5tbS9tZW1jb250cm9sLmM9NDg5Nz1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDkzOC1cdFx0aWYgKG5yX3JlY2xhaW1zKSB7XG5tbS9tZW1jb250cm9sLmM6NDkzOTpcdFx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gbWF4LFxubW0vbWVtY29udHJvbC5jLTQ5NDAtXHRcdFx0XHRcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL3Ztc2Nhbi5jPTY4MTU9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS92bXNjYW4uYy02ODU0LVxubW0vdm1zY2FuLmM6Njg1NTp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjg1Ni1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYy02ODk1LSNlbHNlXG5tbS92bXNjYW4uYzo2ODk2OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG5tbS92bXNjYW4uYy02ODk3LVx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL3Ztc2Nhbi5jPTc5NTg9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxuLS1cbm1tL3Ztc2Nhbi5jLTgwMjktXHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XG5tbS92bXNjYW4uYzo4MDMwOlx0XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csXG5tbS92bXNjYW4uYy04MDMxLVx0XHRcdFx0XHRcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc3MzgKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSB3ZXJlIHRoaW5raW5nIHRocm91Z2ggdGhlIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCoqCgpPa2F5LCBzbyBJJiMzOTttIGZvY3VzaW5nIGluIG9uIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCB3aXRoaW4gYG1tL3Ztc2Nhbi5jYC4gVGhpcyBpcyB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkIHdoZW4gaXQgY29tZXMgdG8gbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgY2dyb3Vwcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBrZXJuZWwgaXMgKmFjdHVhbGx5KiBhdHRlbXB0aW5nIHRvIHJlY2xhaW0gbWVtb3J5IGZyb20gYSBzcGVjaWZpYyBjZ3JvdXAuIEkgd2FudCB0byBzZWUgZXhhY3RseSB3aGF0IHN0ZXBzIGFyZSB0YWtlbiB0byBmcmVlIHVwIHBhZ2VzIHdpdGhpbiB0aGF0IGNncm91cCYjMzk7cyBhbGxvY2F0ZWQgbWVtb3J5LiBJIHN1c3BlY3QgdGhlcmUgYXJlIHNvbWUgY3J1Y2lhbCBvcHRpbWl6YXRpb25zIG9yIGxvY2tpbmcgc3RyYXRlZ2llcyBhdCBwbGF5IGhlcmUsIGFuZCBJJiMzOTttIGVhZ2VyIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiB0aGUgbWVjaGFuaWNzIGludm9sdmVkLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZSByZWNsYWltIHByb2Nlc3MgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIHdoYXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIG9yIGFyZWFzIGZvciBpbXByb3ZlbWVudCBtaWdodCBleGlzdC4gVGhpcyBzaG91bGQgYWxzbyBoZWxwIG1lIHVuZGVyc3RhbmQgaG93IGVmZmVjdGl2ZSB0aGUgbWVtb3J5IGNncm91cCBsaW1pdHMgcmVhbGx5IGFyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS92bXNjYW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDY4NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7Njg1MDpcdFx0Km5yX3NjYW5uZWQgPSBzYy5ucl9zY2FubmVkO1xuNjg1MTpcdFxuNjg1MjpcdFx0cmV0dXJuIHNjLm5yX3JlY2xhaW1lZDtcbjY4NTM6XHR9XG42ODU0Olx0XG42ODU1Olx0dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbjY4NTY6XHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbjY4NTc6XHRcdFx0XHRcdFx0ICAgZ2ZwX3QgZ2ZwX21hc2ssXG42ODU4Olx0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGludCByZWNsYWltX29wdGlvbnMsXG42ODU5Olx0XHRcdFx0XHRcdCAgIGludCAqc3dhcHBpbmVzcylcbjY4NjA6XHR7XG42ODYxOlx0XHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbjY4NjI6XHRcdHVuc2lnbmVkIGludCBub3JlY2xhaW1fZmxhZztcbjY4NjM6XHRcdHN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7XG42ODY0Olx0XHRcdC5ucl90b19yZWNsYWltID0gbWF4KG5yX3BhZ2VzLCBTV0FQX0NMVVNURVJfTUFYKSxcbjY4NjU6XHRcdFx0LnByb2FjdGl2ZV9zd2FwcGluZXNzID0gc3dhcHBpbmVzcyxcbjY4NjY6XHRcdFx0LmdmcF9tYXNrID0gKGN1cnJlbnRfZ2ZwX2NvbnRleHQoZ2ZwX21hc2spIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKSB8XG42ODY3Olx0XHRcdFx0XHQoR0ZQX0hJR0hVU0VSX01PVkFCTEUgXHUwMDI2IH5HRlBfUkVDTEFJTV9NQVNLKSxcbjY4Njg6XHRcdFx0LnJlY2xhaW1faWR4ID0gTUFYX05SX1pPTkVTIC0gMSxcbjY4Njk6XHRcdFx0LnRhcmdldF9tZW1fY2dyb3VwID0gbWVtY2csXG42ODcwOlx0XHRcdC5wcmlvcml0eSA9IERFRl9QUklPUklUWSxcbjY4NzE6XHRcdFx0Lm1heV93cml0ZXBhZ2UgPSAxLFxuNjg3MjpcdFx0XHQubWF5X3VubWFwID0gMSxcbjY4NzM6XHRcdFx0Lm1heV9zd2FwID0gISEocmVjbGFpbV9vcHRpb25zIFx1MDAyNiBNRU1DR19SRUNMQUlNX01BWV9TV0FQKSxcbjY4NzQ6XHRcdFx0LnByb2FjdGl2ZSA9ICEhKHJlY2xhaW1fb3B0aW9ucyBcdTAwMjYgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUpLFxuNjg3NTpcdFx0fTtcbjY4NzY6XHRcdC8qXG42ODc3Olx0XHQgKiBUcmF2ZXJzZSB0aGUgWk9ORUxJU1RfRkFMTEJBQ0sgem9uZWxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSB0byBwdXRcbjY4Nzg6XHRcdCAqIGVxdWFsIHByZXNzdXJlIG9uIGFsbCB0aGUgbm9kZXMuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxuNjg3OTpcdFx0ICogdGhlIHJlY2xhaW0gZG9lcyBub3QgYmFpbCBvdXQgZWFybHkuXG42ODgwOlx0XHQgKi9cbjY4ODE6XHRcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLCBzYy5nZnBfbWFzayk7XG42ODgyOlx0XG42ODgzOlx0XHRzZXRfdGFza19yZWNsYWltX3N0YXRlKGN1cnJlbnQsIFx1MDAyNnNjLnJlY2xhaW1fc3RhdGUpO1xuNjg4NDpcdFx0dHJhY2VfbW1fdm1zY2FuX21lbWNnX3JlY2xhaW1fYmVnaW4oc2MuZ2ZwX21hc2ssIDAsIG1lbWNnKTtcbjY4ODU6XHRcdG5vcmVjbGFpbV9mbGFnID0gbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKTtcbjY4ODY6XHRcbjY4ODc6XHRcdG5yX3JlY2xhaW1lZCA9IGRvX3RyeV90b19mcmVlX3BhZ2VzKHpvbmVsaXN0LCBcdTAwMjZzYyk7XG42ODg4Olx0XG42ODg5Olx0XHRtZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZyk7XG42ODkwOlx0XHR0cmFjZV9tbV92bXNjYW5fbWVtY2dfcmVjbGFpbV9lbmQobnJfcmVjbGFpbWVkLCBtZW1jZyk7XG42ODkxOlx0XHRzZXRfdGFza19yZWNsYWltX3N0YXRlKGN1cnJlbnQsIE5VTEwpO1xuNjg5MjpcdFxuNjg5MzpcdFx0cmV0dXJuIG5yX3JlY2xhaW1lZDtcbjY4OTQ6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4ODE5CgkJCQkJCQlvdXRwdXQ6IDI1NwoJCQkJCQkJdGhvdWdodHM6IDY1MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEtNU0FOIFJlbGV2YW5jZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIHdoaWNoIHRha2VzIGEgZmV3IHNjYWxhciBhcmd1bWVudHM6IGBtZW1jZ2AsIGBzaXplYCwgYW5kIGBzd2FwcGluZXNzYC4gSSYjMzk7dmUgY2hlY2tlZCB0aGF0IGl0IHZhbGlkYXRlcyB0aGVzZSBpbnB1dHMsIHNwZWNpZmljYWxseSB0aGUgYHN3YXBwaW5lc3NgIHJhbmdlIGFuZCBhIG1pbmltdW0gYHNpemVgLCBiZWZvcmUgY2FsbGluZyB0aGUgZXhpc3RpbmcgbWVtb3J5IHJlY2xhaW0gZnVuY3Rpb24gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcuCgpDcnVjaWFsbHksIHRoZXJlJiMzOTtzIG5vIG5ldyB1c2VyLXNwYWNlIGNvcHkgaW52b2x2ZWQsIG5vIHN0cnVjdHMgYmVpbmcgc2VudCwgYW5kIG5vIHNpZ25zIG9mIHVuaW5pdGlhbGl6ZWQgYWxsb2NhdGlvbnMuIFRoZSBzZWxmdGVzdHMgYWRkZWQgYXJlIGFsbCB1c2VyLXNwYWNlIHRlc3RzLCB3aGljaCBpcyBmaW5lLgoKTm93LCBsZXQmIzM5O3MgZ28gdGhyb3VnaCB0aGUgS01TQU4gY2hlY2tsaXN0IG1ldGljdWxvdXNseS4KCiogICBEb2VzIHRoaXMgZXhwb3NlIG5ldyBvciBtb2RpZmllZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2UgKHRocm91Z2ggdGhlIHVzdWFsIHN1c3BlY3RzIGxpa2UgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGV0Yy4pIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG1pZ2h0IGJlIGEgcHJvYmxlbT8gTm8sIGFic29sdXRlbHkgbm90LiBUaGUgYXJndW1lbnRzIGFyZSBhbGwgc2NhbGFycywgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMganVzdCBhbiBgdW5zaWduZWQgbG9uZ2AuCiogICBEb2VzIGl0IHVzZSBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCByZWxpZXMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUuIEV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4KKiAgIEFyZSB0aGVyZSBhbnkgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgY3JlYXRlZCB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkIGxhdGVyPyBOby4KKiAgIERvZXMgaXQgbWVzcyB3aXRoIGFueSBib3VuZHMgY2hlY2tzIHRoYXQgY291bGQgbGVhZCB0byByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4KClRoZSBvbmx5IHBvdGVudGlhbCBpc3N1ZXMgaGVyZSBhcmUgdGhlIHVzdWFsIHN1c3BlY3RzIG9mIGtlcm5lbCBwcm9ncmFtbWluZzogZGVhZGxvY2ssIHNsZWVwaW5nIGluIGF0b21pYyBjb250ZXh0LCBpbnZhbGlkIHBvaW50ZXJzLCBvdXQtb2YtYm91bmRzIGFjY2VzcywgZXRjLiBCdXQgdGhvc2UgYXJlIGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCB0aGUgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scywgd2hpY2ggYXJlIG5vdCByZWxldmFudCB0byBLTVNBTi4gVGhpcyBsb29rcyBwcmV0dHkgY2xlYW4gZnJvbSBhIG1lbW9yeS1zYWZldHkgcGVyc3BlY3RpdmUuCgpUbyBiZSBjb21wbGV0ZWx5IHRob3JvdWdoLCBsZXQmIzM5O3Mgc3VtbWFyaXplIHRoZSBwb2ludHM6CgoqICAgVGhlIHBhdGNoIGludHJvZHVjZXMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGEgc2xlZXBhYmxlIEJQRiBrZnVuYywgYWxvbmcgd2l0aCBCUEYgc2VsZnRlc3RzLgoqICAgQWxsIHZhcmlhYmxlcyB1c2VkIChgbnJfcmVjbGFpbWVkYCwgYG5yX3BhZ2VzYCwgYHN3YXBwaW5lc3NgLCBgc2l6ZWApIGFyZSBzY2FsYXIgcHJpbWl0aXZlcy4gVGhleSBhcmUgYWxsIGluaXRpYWxpemVkIGJ5IHZhbHVlLgoqICAgTm8ga2VybmVsLXRvLXVzZXIgbWVtb3J5IGNvcHkgaW50ZXJmYWNlcyBhcmUgYWRkZWQgb3IgbW9kaWZpZWQuCiogICBFeGlzdGluZyByb3V0aW5lcyBhcmUgdXNlZCB3aXRoIHByb3Blcmx5IGluaXRpYWxpemVkIHBhcmFtZXRlcnMuCiogICBBbnkgcG90ZW50aWFsIGZhaWx1cmUgbW9kZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgZGV0ZWN0b3JzLgoqICAgVGhlcmVmb3JlLCBubyBLTVNBTiBpcyBuZWVkZWQsIGFzIHRoZXJlJiMzOTtzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MuIEkmIzM5O20gc2F0aXNmaWVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgbmV3IHNsZWVwYWJsZSBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIEJQRiBzZWxmdGVzdHMuIFRoZSBrZnVuYyBhY2NlcHRzIHByaW1pdGl2ZSBzY2FsYXIgYXJndW1lbnRzIChgbWVtY2dgLCBgc2l6ZWAsIGBzd2FwcGluZXNzYCksIHZhbGlkYXRlcyB0aGUgcGFyYW1ldGVycywgYW5kIGRlbGVnYXRlcyB0byB0aGUgZXhpc3Rpbmcga2VybmVsIHJlY2xhaW0gaW5mcmFzdHJ1Y3R1cmUgdmlhIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLiBcblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzOlxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMgb24gc3RhY2sgb3IgaGVhcCBhcmUgaW50cm9kdWNlZCBvciByZWFkLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIGFyZSBzY2FsYXIgdHlwZXMgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdXNlLlxuMi4gTm8gZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZCB2aWEgaW9jdGxzL3N5c2ZzL25ldGxpbmsvQlBGIGJ1ZmZlcnMuXG4zLiBQb3RlbnRpYWwgY29uY3VycmVuY3ksIGxvY2tpbmcsIG9yIG1lbW9yeS1zYWZldHkgYnVncyAoZS5nLiBzbGVlcGFibGUga2Z1bmMgY29udGV4dCByZXF1aXJlbWVudHMsIGNncm91cCBwb2ludGVyIHZhbGlkaXR5LCBsb2NraW5nIGRlYWRsb2NrcykgYXJlIG1vbml0b3JlZCBieSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZmFjaWxpdGllcyAoS0FTQU4sIExPQ0tERVAsIFBST1ZFX0xPQ0tJTkcpLlxuXG5UaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSBuZXcgc2xlZXBhYmxlIEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgQlBGIHNlbGZ0ZXN0cy4gVGhlIGtmdW5jIGFjY2VwdHMgcHJpbWl0aXZlIHNjYWxhciBhcmd1bWVudHMgKGBtZW1jZ2AsIGBzaXplYCwgYHN3YXBwaW5lc3NgKSwgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzLCBhbmQgZGVsZWdhdGVzIHRvIHRoZSBleGlzdGluZyBrZXJuZWwgcmVjbGFpbSBpbmZyYXN0cnVjdHVyZSB2aWEgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBzdGFjayBvciBoZWFwIGFyZSBpbnRyb2R1Y2VkIG9yIHJlYWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXJlIHNjYWxhciB0eXBlcyBpbml0aWFsaXplZCBwcmlvciB0byB1c2UuXG4yLiBObyBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgZmllbGRzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBleHBvc2VkIHZpYSBpb2N0bHMvc3lzZnMvbmV0bGluay9CUEYgYnVmZmVycy5cbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXG5cblRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNDo0NS43NzQyOTY2NzJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTMwMDAzOTczMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbmV3IHNsZWVwYWJsZSBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIEJQRiBzZWxmdGVzdHMuIFRoZSBrZnVuYyBhY2NlcHRzIHByaW1pdGl2ZSBzY2FsYXIgYXJndW1lbnRzIChgbWVtY2dgLCBgc2l6ZWAsIGBzd2FwcGluZXNzYCksIHZhbGlkYXRlcyB0aGUgcGFyYW1ldGVycywgYW5kIGRlbGVnYXRlcyB0byB0aGUgZXhpc3Rpbmcga2VybmVsIHJlY2xhaW0gaW5mcmFzdHJ1Y3R1cmUgdmlhIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLiBcXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XFxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMgb24gc3RhY2sgb3IgaGVhcCBhcmUgaW50cm9kdWNlZCBvciByZWFkLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIGFyZSBzY2FsYXIgdHlwZXMgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdXNlLlxcbjIuIE5vIGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciBmaWVsZHMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGV4cG9zZWQgdmlhIGlvY3Rscy9zeXNmcy9uZXRsaW5rL0JQRiBidWZmZXJzLlxcbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXFxuXFxuVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTQ6NDUuNzc0MzAxNDYyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzcyOTM2Mzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3N1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAwMzoxNDo0NCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5AQCAtOCw2ICs4LDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiBcXG4rI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuK1xcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuIFxcbiAvKipcXG5AQCAtMTU5LDYgKzE2MSw3NCBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4gXFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xcbisgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXFxuKyAqIEBzd2FwcGluZXNzOiB0aGUgcmVjbGFpbSBzd2FwcGluZXNzLCBpbiB0aGUgcmFuZ2VcXG4rICogICAgICAgICBbTUlOX1NXQVBQSU5FU1MsIFNXQVBQSU5FU1NfQU5PTl9PTkxZXSwgd2hlcmVcXG4rICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXFxuKyAqICAgICAgICAgdGhlIG1lbWNnJ3Mgb3duIHN3YXBwaW5lc3NcXG4rICpcXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xcbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cXG4rICpcXG4rICogT25seSB0aGUgcmVjbGFpbSB0YXJnZXQgaXMgY2FwcGVkOiBAc2l6ZSBpcyBjbGFtcGVkIHRvXFxuKyAqIE1FTUNHX0NIQVJHRV9CQVRDSCwgZm9sbG93aW5nIHRoZSBwcmVjZWRlbnQgb2YgaGlnaF93b3JrX2Z1bmMoKSxcXG4rICogdGhlIG1lbW9yeS5oaWdoIHdvcmtxdWV1ZSBmYWxsYmFjaywgd2hpY2ggYm91bmRzIGVhY2ggcmVjbGFpbVxcbisgKiByZXF1ZXN0IHRoZSBzYW1lIHdheS4gVGhlIGFjdHVhbCBzY2FubmluZyB3b3JrIGFuZCBpdHMgZHVyYXRpb25cXG4rICogYXJlIG5vdCBib3VuZGVkLiBUbyByZWNsYWltIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5XFxuKyAqIGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cXG4rICpcXG4rICogVGhlIGtmdW5jIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBhIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTFxcbisgKiBwcm9ncmFtLCBzeW5jaHJvbm91c2x5IGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQgcnVubmluZyB0aGVcXG4rICogcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIG9mIGEgU1lTQ0FMTFxcbisgKiBwcm9ncmFtLCB3aGljaCBydW4gaW4gcHJvY2VzcyBjb250ZXh0IGFuZCBrZWVwIHRoZSBTWVNDQUxMIHByb2dyYW1cXG4rICogdHlwZS4gSXQgaXMgcmVnaXN0ZXJlZCBmb3IgQlBGX1BST0dfVFlQRV9TWVNDQUxMIG9ubHksIGJlY2F1c2VcXG4rICogZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgbWF5IHJ1biB3aXRoIGZpbGVzeXN0ZW0gbG9ja3MgaGVsZCBvclxcbisgKiBpbiBOT0ZTL05PSU8gY29udGV4dHMsIHdoZXJlIHRoZSByZWNsYWltIHBhdGggY291bGQgZGVhZGxvY2sgb25cXG4rICogdGhvc2UgbG9ja3MgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLlxcbisgKlxcbisgKiBGb3IgYXN5bmNocm9ub3VzIHJlY2xhaW0gb2YgbW9yZSB0aGFuIG9uZSBiYXRjaCwgZHJpdmluZyB0aGVcXG4rICogcmVjbGFpbSBmcm9tIGEgYnBmX3dxIGNhbGxiYWNrIGlzIHJlY29tbWVuZGVkOiBjYWxsIHRoaXMga2Z1bmNcXG4rICogb25jZSBwZXIgY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dFxcbisgKiBiYXRjaCwgaW5zdGVhZCBvZiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2sgYW5kIG1vbm9wb2xpemluZyBhXFxuKyAqIHdvcmtxdWV1ZSB3b3JrZXIsIGFuZCBnaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gd29yayBpdGVtLFxcbisgKiBhcyBoaWdoX3dvcmtfZnVuYygpIGRvZXMgd2l0aCBvbmUgd29yayBpdGVtIHBlciBtZW1jZy4gV2hldGhlclxcbisgKiB0byBzdWJtaXQgdGhlIG5leHQgYmF0Y2ggaXMgdXAgdG8gdGhlIEJQRiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcFxcbisgKiBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBkeWluZy5cXG4rICpcXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXFxuKyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIG9yICh1bnNpZ25lZCBsb25nKS0xIGlmIEBzd2FwcGluZXNzIGlzIG91dCBvZlxcbisgKiByYW5nZS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRpbnQgc3dhcHBpbmVzcylcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcXG4rXFxuK1xcdGlmIChzd2FwcGluZXNzIFxcdTAwM2MgLTEgfHwgc3dhcHBpbmVzcyBcXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxcbitcXHRcXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7XFxuK1xcbitcXHRpZiAoc2l6ZSBcXHUwMDNjIFBBR0VfU0laRSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xcbitcXG4rXFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHN3YXBwaW5lc3MgPT0gLTEgPyBOVUxMIDpcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZzd2FwcGluZXNzKTtcXG4rXFxuK1xcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XFxuK31cXG4rXFxuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XFxuIFxcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcXG5AQCAtMTc0LDE5ICsyNDQsMzUgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxuIFxcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuIFxcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxcbitcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG4gXFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXFxuIFxcdC5zZXQgICAgICAgICAgICA9IFxcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXFxuIH07XFxuIFxcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XFxuK1xcdC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0ICAgICAgICAgICAgPSBcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXFxuK307XFxuK1xcbiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXFxuIHtcXG4gXFx0aW50IGVycjtcXG4gXFxuIFxcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xcbi1cXHRpZiAoZXJyKVxcbitcXHRpZiAoZXJyKSB7XFxuIFxcdFxcdHByX3dhcm4oXFxcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcXFwiLCBlcnIpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfd2FybihcXFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFxcXCIsIGVycik7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXFxuaW5kZXggMzhiMTE2NTIxMmM5NC4uNDRlOTVlODdlM2NkOSAxMDA2NDRcXG4tLS0gYS9tbS9pbnRlcm5hbC5oXFxuKysrIGIvbW0vaW50ZXJuYWwuaFxcbkBAIC03NCwxMSArNzQsMTMgQEAgdW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSxcXG4gXFxuICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCAoMSBcXHUwMDNjXFx1MDAzYyAxKVxcbiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFICgxIFxcdTAwM2NcXHUwMDNjIDIpXFxuLSNkZWZpbmUgTUlOX1NXQVBQSU5FU1MgMFxcbi0jZGVmaW5lIE1BWF9TV0FQUElORVNTIDIwMFxcbitlbnVtIHtcXG4rXFx0TUlOX1NXQVBQSU5FU1MgPSAwLFxcbitcXHRNQVhfU1dBUFBJTkVTUyA9IDIwMCxcXG4gXFxuLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xcbi0jZGVmaW5lIFNXQVBQSU5FU1NfQU5PTl9PTkxZIChNQVhfU1dBUFBJTkVTUyArIDEpXFxuK1xcdC8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xcbitcXHRTV0FQUElORVNTX0FOT05fT05MWSA9IE1BWF9TV0FQUElORVNTICsgMSxcXG4rfTtcXG4gXFxuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uN2M3ZDI5OWIzYjI4YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDc3OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxcbisgKlxcbisgKiBTZXR0aW5nIFRFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSD0xIGFkZHMgYSBiYXNlbGluZSBydW4gb2YgdGhlXFxuKyAqIHdvcmtsb2FkIHdpdGhvdXQgdGhlIEJQRiBwcm9ncmFtIHRvIG1lbWNnX2FzeW5jX3JlY2xhaW0sIGFuZCBwcmludHNcXG4rICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxcbisgKiBjZ3JvdXAsIHRvIHN0ZG91dC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGltZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaGVscGVycy5oXFxcIlxcbitcXG4rc3RydWN0IGJwZl9hcmdzIHtcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkO1xcbitcXHR1NjQgbG93X2Nncm91cF9pZDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rLyogUmVjbGFpbSBvdXRjb21lcyByZXBvcnRlZCBieSB0aGUgQlBGIHByb2dyYW0gdGhyb3VnaCB0aGUgcmluZ2J1Zi4gKi9cXG4rZW51bSByZWNsYWltX291dGNvbWUge1xcbitcXHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxcbitcXHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcXG4rXFx0UkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FLFxcbit9O1xcbitcXG4rc3RydWN0IHJlY2xhaW1fZXZlbnQge1xcbitcXHR1NjQgb3V0Y29tZTtcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0dfRFlJTkdfRElSIFxcXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1xcXCJcXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXFxcIi90cmlnZ2VyXFxcIlxcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFxcXCIvdGFyZ2V0XFxcIlxcbitcXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxcbitcXG4rLypcXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxcbisgKiBpbi1mbGlnaHQgcmVjbGFpbSBwYXNzZXMgdGltZSB0byBkcmFpbiwgdGhlbiB3YWl0IGZvciBhIHJlY2xhaW0gcm91bmRcXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xcbisgKiBzdWNoIGEgcm91bmQgbXVzdCBzaG93IHVwIHdpdGhpbiBhIGZldyB0aW1lciBwZXJpb2RzLiBUaGUgQlBGXFxuKyAqIHByb2dyYW0gcmVwb3J0cyBldmVyeSByZWNsYWltIG91dGNvbWUgdGhyb3VnaCB0aGUgcmluZ2J1Ziwgc28gdGhlXFxuKyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC5cXG4rICovXFxuKyNkZWZpbmUgRFlJTkdfU0VUVExFX1VTICgyMDAgKiAxMDAwKVxcbisjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKVxcbisjZGVmaW5lIEVWRU5UX1BPTExfUk9VTkRTICg1MClcXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcXG4rICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxcbisgKi9cXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBzdGF0ZnMgc3Q7XFxuK1xcbitcXHRpZiAoIXN0YXRmcyhcXFwiL3RtcFxcXCIsIFxcdTAwMjZzdCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCIuXFxcIjtcXG4rXFx0cmV0dXJuIFxcXCIvdG1wXFxcIjtcXG4rfVxcbitcXG4rLypcXG4rICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xcbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXFxuKyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxcbisgKi9cXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xcbitcXHRDSElMRF9FWElUX09LID0gMCxcXG4rXFx0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcXG4rXFx0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxcbitcXHRDSElMRF9FWElUX1JFQURfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXFxuK307XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXFxuK3tcXG4rXFx0c3dpdGNoIChjb2RlKSB7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9PSzpcXG4rXFx0XFx0cmV0dXJuIFxcXCJzdWNjZXNzXFxcIjtcXG4rXFx0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxcbitcXHRcXHRyZXR1cm4gXFxcImpvaW4gY2dyb3VwXFxcIjtcXG4rXFx0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwid3JpdGUgZGF0YSBmaWxlXFxcIjtcXG4rXFx0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcXG4rXFx0XFx0cmV0dXJuIFxcXCJyZWFkIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwid3JpdGUgdGltZSBmaWxlXFxcIjtcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJ1bmtub3duXFxcIjtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdGNoYXIgbGltaXRfYnVmWzIwXTtcXG4rXFxuK1xcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFxcXCJtZW1vcnlcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiZW5hYmxlX2NvbnRyb2xsZXJzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFxcXCIlbHVcXFwiLCBDR19MSU1JVCk7XFxuK1xcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5tYXhcXFwiLCBsaW1pdF9idWYpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxcbitcXHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxcbitcXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFhY2Nlc3MoXFxcIi9wcm9jL3N3YXBzXFxcIiwgRl9PSykpIHtcXG4rXFx0XFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5LnN3YXAubWF4XFxcIiwgXFxcIjBcXFwiKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfSElHSF9ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcXFwiZ2V0X2Nncm91cF9pZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0xPV19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcXFwiZ2V0X2Nncm91cF9pZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rLypcXG4rICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzXFxuKyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXFxuKyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxcbisgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJ3NcXG4rICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZlxcbisgKiBhbnkgcGFyZW50IHRoYXQgaGFzIGRvbWFpbiBjaGlsZHJlbi5cXG4rICovXFxuK3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFx0Y2hhciBsaW1pdF9idWZbMjBdO1xcbitcXG4rXFx0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRFlJTkdfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXFxcIm1lbW9yeVxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJlbmFibGVfY29udHJvbGxlcnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXFxcIiVsdVxcXCIsIENHX0xJTUlUKTtcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCBcXFwibWVtb3J5Lm1heFxcXCIsIGxpbWl0X2J1Zik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0LyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0RZSU5HX1RSSUdHRVJfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19EWUlOR19UQVJHRVRfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqdGFyZ2V0X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XFxuK1xcbitcXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXFx1MDAyNnN0YXJ0KTtcXG4rXFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xcbitcXG4rXFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZlbmQpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdHBpZF90IHdhaXRfcmV0O1xcbitcXHRpbnQgZmQsIHN0YXR1cztcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXG4rXFx0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0bG93X3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXFxcImZvcmsgbG93XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGxvd19waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHRoaWdoX3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFxcXCJmb3JrIGhpZ2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoaGlnaF9waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwibG93IHdhaXRwaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHQvKlxcbitcXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcXG4rXFx0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXFxuK1xcdCAqL1xcbitcXHRsb3dfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJsb3cgZXhpdGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwiaGlnaCB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXFxuK1xcdGhpZ2hfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJoaWdoIGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcXFwiLFxcbitcXHRcXHRcXHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcXG4rXFx0XFx0XFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGlmIChoaWdoX3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdFxcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChsb3dfcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XFxuK1xcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXFxuK1xcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcXG4rXFx0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XFxuK1xcdFxcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxcbitcXHRcXHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXFxuK1xcdFxcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXFxuK1xcdFxcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcXG4rXFx0fTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxcbitcXHRcXHQuY3R4X2luID0gXFx1MDAyNmFyZ3MsXFxuK1xcdFxcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihhcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcXHUwMDI2cnVuX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFxcXCJwcm9nX2luaXQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXG4rXFx0KnNrZWxfcHRyID0gc2tlbDtcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJvcl9vdXQ6XFxuK1xcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rLypcXG4rICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxcbisgKiB0ZXN0IGZhaWxzLCBzbyBiZW5jaG1hcmsgbnVtYmVycyBnbyBzdHJhaWdodCB0byB0aGUgcmVhbCBzdGRvdXQgdG9cXG4rICoga2VlcCB0aGVtIGZyb20gZHJvd25pbmcgaW4gQVNTRVJUIG91dHB1dC5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGJlbmNoX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLilcXG4re1xcbitcXHR2YV9saXN0IGFwO1xcbitcXG4rXFx0dmFfc3RhcnQoYXAsIGZtdCk7XFxuK1xcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcXG4rXFx0dmFfZW5kKGFwKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRkb3VibGUgYmFzZV9oaWdoX3RpbWUgPSAwLjAsIGJhc2VfbG93X3RpbWUgPSAwLjA7XFxuK1xcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcXG4rXFx0aW50IGVyciwgYmVuY2g7XFxuK1xcbitcXHRiZW5jaCA9ICEhZ2V0ZW52KFxcXCJURVNUX01FTUNHX0FTWU5DX1JFQ0xBSU1fQkVOQ0hcXFwiKTtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcXHUwMDI2bG93X2Nncm91cF9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlXFxuK1xcdCAqIHNhbWUgd29ya2xvYWQgb25jZSB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSwgc28gdGhlIGxvZyBjYW5cXG4rXFx0ICogcmVwb3J0IGhvdyBtdWNoIGFzeW5jIHJlY2xhaW0gaW1wcm92ZWQgdGhlIHByZXNzdXJlZCBjZ3JvdXAuXFxuK1xcdCAqL1xcbitcXHRpZiAoYmVuY2gpIHtcXG4rXFx0XFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZiYXNlX2hpZ2hfdGltZSwgXFx1MDAyNmJhc2VfbG93X3RpbWUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBSRUFEX1RJTUVTKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFxcdTAwMjZza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZoaWdoX3RpbWUsIFxcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcXG4rXFx0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXFxuK1xcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cXG4rXFx0ICovXFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXFxcInJlY2xhaW1fY2FsbHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX2J5dGVzLCAwLCBcXFwicmVjbGFpbWVkX2J5dGVzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGlzIGEgYmVuY2htYXJrIGFuZCB0b28gZmxha3kgdG8gZmFpbCBDSVxcbitcXHQgKiBydW5zLCBzbyBpdCBvbmx5IGxvZ3MgdGhlIG51bWJlcnM7IHRoZSBjb3VudGVycyBhYm92ZSBhbHJlYWR5XFxuK1xcdCAqIHByb3ZlZCB0aGF0IHRoZSBCUEYgcHJvZ3JhbSByZWNsYWltZWQgbWVtb3J5LlxcbitcXHQgKi9cXG4rXFx0aWYgKGJlbmNoKVxcbitcXHRcXHRiZW5jaF9wcmludGYoXFxcIm1lbWNnX2FzeW5jX3JlY2xhaW06IGJhc2VsaW5lIGhpZ2g9JWYgbG93PSVmLCBcXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcInJlY2xhaW0gaGlnaD0lZiBsb3c9JWYsIGhpZ2ggc3BlZWR1cD0lLjFmJSVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgYmFzZV9oaWdoX3RpbWUsIGJhc2VfbG93X3RpbWUsIGhpZ2hfdGltZSwgbG93X3RpbWUsXFxuK1xcdFxcdFxcdCAgICAgMTAwLjAgKiAoYmFzZV9oaWdoX3RpbWUgLSBoaWdoX3RpbWUpIC8gYmFzZV9oaWdoX3RpbWUpO1xcbitcXHRlbHNlIGlmIChoaWdoX3RpbWUgXFx1MDAzZT0gbG93X3RpbWUpXFxuK1xcdFxcdHByaW50ZihcXFwibWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xcbitcXG4rb3V0OlxcbitcXHRpZiAoc2tlbClcXG4rXFx0XFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rfVxcbitcXG4rLypcXG4rICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzXFxuKyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxcbisgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xcbisgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHlcXG4rICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxcbisgKiB1bnRpbCBpdCBpcyBraWxsZWQuXFxuKyAqL1xcbitzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXFxuK3tcXG4rXFx0cGlkX3QgcGlkID0gZm9yaygpO1xcbitcXG4rXFx0aWYgKHBpZCAhPSAwKVxcbitcXHRcXHRyZXR1cm4gcGlkO1xcbitcXG4rXFx0aWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpXFxuK1xcdFxcdF9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApO1xcbitcXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKVxcbitcXHRcXHRfZXhpdChDSElMRF9FWElUX1dSSVRFX0ZJTEUpO1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSlcXG4rXFx0XFx0XFx0X2V4aXQoQ0hJTERfRVhJVF9SRUFEX0ZJTEUpO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qIFJlY2xhaW0gb3V0Y29tZXMgb2JzZXJ2ZWQgc28gZmFyLCB0YWxsaWVkIGZyb20gcmluZ2J1ZiBldmVudHMuICovXFxuK3N0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHtcXG4rXFx0aW50IGNhbGxlZDtcXG4rXFx0aW50IHNraXBwZWRfZHlpbmc7XFxuK1xcdGludCB0YXJnZXRfZ29uZTtcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgb25fcmVjbGFpbV9ldmVudCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzeilcXG4re1xcbitcXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiAqc2VlbiA9IGN0eDtcXG4rXFx0Y29uc3Qgc3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2ID0gZGF0YTtcXG4rXFxuK1xcdGlmIChzeiBcXHUwMDNjIHNpemVvZigqZXYpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHN3aXRjaCAoZXYtXFx1MDAzZW91dGNvbWUpIHtcXG4rXFx0Y2FzZSBSRUNMQUlNX09VVENPTUVfQ0FMTEVEOlxcbitcXHRcXHRzZWVuLVxcdTAwM2VjYWxsZWQrKztcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkc6XFxuK1xcdFxcdHNlZW4tXFx1MDAzZXNraXBwZWRfZHlpbmcrKztcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FOlxcbitcXHRcXHRzZWVuLVxcdTAwM2V0YXJnZXRfZ29uZSsrO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXFxuKyAqIHZlcmlmeSB0aGF0IHJlY2xhaW0gc3RvcHMgb24gdGhlIGR5aW5nL3JlbW92ZWQgY2dyb3VwIGluc3RlYWQgb2ZcXG4rICogcmVjbGFpbWluZyBmcm9tIGl0LlxcbisgKlxcbisgKiBUaGUgdGFyZ2V0IHN0YXlzIGVtcHR5OyB0aGUgd29ya2xvYWQgbGl2ZXMgaW4gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZFxcbisgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxcbisgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxcbisgKiB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmNcXG4rICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kXFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcXG4rICogU0tJUFBFRF9EWUlORyBvciBUQVJHRVRfR09ORSBldmVudHMgd2hpbGUgcmVjbGFpbV9jYWxscyBhbmRcXG4rICogcmVjbGFpbWVkX2J5dGVzIHN0YXkgZnJvemVuLlxcbisgKi9cXG4rdm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZClcXG4re1xcbitcXHR1NjQgdHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcXG4rXFx0Y2hhciBkYXRhX2ZpbGVbUEFUSF9NQVhdID0gXFxcIlxcXCI7XFxuK1xcdHN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHNlZW4gPSB7fTtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcXG4rXFx0cGlkX3QgcmVhZGVyX3BpZCA9IC0xO1xcbitcXHRpbnQgZXJyLCBmZCwgaTtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoXFx1MDAyNnRyaWdnZXJfY2dyb3VwX2lkLCBcXHUwMDI2dGFyZ2V0X2Nncm91cF9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2R5aW5nX2Nncm91cHNcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJiID0gcmluZ19idWZmZXJfX25ldyhicGZfbWFwX19mZChza2VsLVxcdTAwM2VtYXBzLnJlY2xhaW1fZXZlbnRzKSxcXG4rXFx0XFx0XFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXFx1MDAyNnNlZW4sIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocmIsIFxcXCJyaW5nX2J1ZmZlcl9fbmV3XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0c25wcmludGYoZGF0YV9maWxlLCBzaXplb2YoZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcXFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XFxuK1xcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFxcXCJmb3JrIGtlZXBhbGl2ZSByZWFkZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXFx1MDAyNlxcdTAwMjYgIXNlZW4uY2FsbGVkOyBpKyspIHtcXG4rXFx0XFx0ZXJyID0gcmluZ19idWZmZXJfX3BvbGwocmIsIEVWRU5UX1BPTExfVElNRU9VVF9NUyk7XFxuK1xcdFxcdGlmICghQVNTRVJUX0dFKGVyciwgMCwgXFxcInJpbmdfYnVmZmVyX19wb2xsXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0dUKHNlZW4uY2FsbGVkLCAwLCBcXFwicmVjbGFpbSBldmVudHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXG4rXFx0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cXG4rXFx0dXNsZWVwKERZSU5HX1NFVFRMRV9VUyk7XFxuK1xcbitcXHRjYWxsc19iZWZvcmUgPSBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHM7XFxuK1xcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX2J5dGVzO1xcbitcXG4rXFx0LyogV2FpdCBmb3IgYSByZWNsYWltIHJvdW5kIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBFVkVOVF9QT0xMX1JPVU5EUyBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNlZW4uc2tpcHBlZF9keWluZyBcXHUwMDI2XFx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSsrKSB7XFxuK1xcdFxcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFxcXCJyaW5nX2J1ZmZlcl9fcG9sbFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFzZWVuLnNraXBwZWRfZHlpbmcgXFx1MDAyNlxcdTAwMjYgIXNlZW4udGFyZ2V0X2dvbmUpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwibm8gcmVjbGFpbSByb3VuZCBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwIChnb25lPSVkLCBkeWluZz0lZClcXFwiLFxcbitcXHRcXHRcXHQgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xcbitcXHQgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgdGhleSBoYXBwZW4gaXMgdGltaW5nXFxuK1xcdCAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzb1xcbitcXHQgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLlxcbitcXHQgKi9cXG4rXFx0cHJpbnRmKFxcXCJtZW1jZ19hc3luY19yZWNsYWltX2R5aW5nOiBza2lwcyBvbiByZW1vdmVkIGNncm91cDogZ29uZT0lZCwgZHlpbmc9JWRcXFxcblxcXCIsXFxuK1xcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xcbitcXG4rXFx0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsIFxcXCJyZWNsYWltX2NhbGxzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxcbitcXHRcXHQgICAgICAgXFxcInJlY2xhaW1lZF9ieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK291dDpcXG4rXFx0aWYgKHJlYWRlcl9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XFxuK1xcdH1cXG4rXFx0aWYgKGRhdGFfZmlsZVswXSlcXG4rXFx0XFx0dW5saW5rKGRhdGFfZmlsZSk7XFxuK1xcdGlmIChyYilcXG4rXFx0XFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xcbitcXHRpZiAoc2tlbClcXG4rXFx0XFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzE4YmViNjQxNmQzMFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxuQEAgLTAsMCArMSwyODggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKyNpbmNsdWRlIFxcXCJ2bWxpbnV4LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXFx0MVxcbisjZGVmaW5lIFBBR0VfU0laRVxcdFxcdDQwOTZVTFxcbisvKlxcbisgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkVcXG4rICogZWFjaC4gRWFjaCBicGZfd3EgY2FsbGJhY2sgcmVjbGFpbXMgYSBzaW5nbGUgYmF0Y2ggYW5kIHJlcXVldWVzIHRoZVxcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxcbisgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy5cXG4rICovXFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXFx0XFx0KDMyICogUEFHRV9TSVpFKVxcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcXHQzMlxcbitcXG4rc3RydWN0IGJwZl9hcmdzIHtcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkO1xcbitcXHR1NjQgbG93X2Nncm91cF9pZDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IGNncm91cF9tZW1jZyB7XFxuK1xcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcXG4rfTtcXG4rXFxuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XFxuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcXG4rXFxuKy8qXFxuKyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XFxuKyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxcbisgKi9cXG4rdTY0IHJlY2xhaW1fY2FsbHM7XFxuK3U2NCByZWNsYWltZWRfYnl0ZXM7XFxuK1xcbisvKlxcbisgKiBPdXRjb21lIG9mIGEgc2luZ2xlIHJlY2xhaW0gYXR0ZW1wdCwgcmVwb3J0ZWQgdG8gdXNlcnNwYWNlIHRocm91Z2hcXG4rICogdGhlIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYgc28gdGVzdHMgY2FuIHdhaXQgZm9yIHJlY2xhaW0gZXZlbnRzIHdpdGhcXG4rICogYSB0aW1lb3V0IGluc3RlYWQgb2YgcG9sbGluZyB0aGUgY291bnRlcnMgYWJvdmUuXFxuKyAqL1xcbitlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XFxuK1xcdFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsXFxuK1xcdFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HLFxcbitcXHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXFxuK307XFxuK1xcbitzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XFxuK1xcdF9fdTY0IG91dGNvbWU7XFxuK307XFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEgXFx1MDAzY1xcdTAwM2MgMTYpO1xcbit9IHJlY2xhaW1fZXZlbnRzIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuKy8qXFxuKyAqIFJlcG9ydHMgYXJlIGJlc3QgZWZmb3J0OiB3aGVuIHRoZSByaW5nYnVmIGlzIGZ1bGwsIGZvciBleGFtcGxlIHdoZW5cXG4rICogdXNlcnNwYWNlIGRvZXMgbm90IGNvbnN1bWUgdGhlIGV2ZW50cywgdGhlIHJlcG9ydCBpcyBkcm9wcGVkLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgZW1pdF9yZWNsYWltX2V2ZW50KGVudW0gcmVjbGFpbV9vdXRjb21lIG91dGNvbWUpXFxuK3tcXG4rXFx0c3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2O1xcbitcXG4rXFx0ZXYgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKFxcdTAwMjZyZWNsYWltX2V2ZW50cywgc2l6ZW9mKCpldiksIDApO1xcbitcXHRpZiAoIWV2KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRldi1cXHUwMDNlb3V0Y29tZSA9IG91dGNvbWU7XFxuK1xcdGJwZl9yaW5nYnVmX3N1Ym1pdChldiwgMCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXFxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXFxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcXG4rICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXFxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxcbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXFxuKyAqXFxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxcbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cXG4rICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXFxuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXFx1MDAzZXNlbGYuZmxhZ3M7XFxuK1xcbitcXHRyZXR1cm4gKGZsYWdzIFxcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFxcdTAwMjYgQ1NTX09OTElORSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxcbisgKiBieXRlcyByZWNsYWltZWQsIG9yIDAgaWYgdGhlIGNncm91cCBpcyBkeWluZyBvciBnb25lIG9yIG5vdGhpbmcgd2FzXFxuKyAqIHJlY2xhaW1lZC4gRWFjaCBhdHRlbXB0IHJlcG9ydHMgaXRzIG91dGNvbWUgdGhyb3VnaCB0aGVcXG4rICogcmVjbGFpbV9ldmVudHMgcmluZ2J1Zi5cXG4rICovXFxuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0dTY0IG5yID0gMDtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKSB7XFxuK1xcdFxcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNncm91cF9pc19keWluZyhjbS5jZ3JwKSkge1xcbitcXHRcXHRlbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcpO1xcbitcXHRcXHRwdXRfY2dyb3VwX21lbWNnKFxcdTAwMjZjbSk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRyZWNsYWltX2NhbGxzKys7XFxuK1xcdG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplLCAtMSk7XFxuK1xcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcXG4rXFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQpO1xcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIG5yO1xcbit9XFxuK1xcbitzdHJ1Y3Qgd3FfZWxlbSB7XFxuK1xcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XFxuK1xcdHN0cnVjdCBicGZfd3Egd29yaztcXG4rXFx0dTY0IHByZXZfZXZlbnQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rXFx0LypcXG4rXFx0ICogQnl0ZXMgc3RpbGwgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCByb3VuZCwgY2FycmllZCBhY3Jvc3NcXG4rXFx0ICogcmVxdWV1ZXMuIDAgbWVhbnMgbm8gcm91bmQgaXMgaW4gcHJvZ3Jlc3M7IHRoZSB0aW1lciBwYXRoXFxuK1xcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xcbitcXHQgKiBhdCBpdC5cXG4rXFx0ICovXFxuK1xcdHU2NCByZW1haW5pbmc7XFxuK307XFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCAxKTtcXG4rXFx0X190eXBlKGtleSwgX191MzIpO1xcbitcXHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcXG4rfSB3cV9tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcXG4rXFx0dTY0IG5yLCBzaXplO1xcbitcXG4rXFx0aWYgKCFlbGVtLVxcdTAwM2VyZW1haW5pbmcpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXFxuK1xcdFxcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcXG4rXFx0XFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXFxuK1xcdFxcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZlbGVtLVxcdTAwM2VwcmV2X2V2ZW50LFxcbitcXHRcXHRcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKVxcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcXG4rXFx0fVxcbitcXG4rXFx0LyogT25lIGJvdW5kZWQgcmVjbGFpbSBwYXNzIHBlciBjYWxsYmFjayAqL1xcbitcXHRzaXplID0gZWxlbS1cXHUwMDNlcmVtYWluaW5nIFxcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cXHUwMDNlcmVtYWluaW5nIDogUkVDTEFJTV9TSVpFO1xcbitcXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xcbitcXHRpZiAoIW5yKSB7XFxuK1xcdFxcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyA9IDA7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWF5IHJlY2xhaW0gbW9yZSB0aGFuIHJlcXVlc3RlZCAqL1xcbitcXHRpZiAobnIgXFx1MDAzZT0gZWxlbS1cXHUwMDNlcmVtYWluaW5nKVxcbitcXHRcXHRlbGVtLVxcdTAwM2VyZW1haW5pbmcgPSAwO1xcbitcXHRlbHNlXFxuK1xcdFxcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyAtPSBucjtcXG4rXFxuK1xcdC8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqL1xcbitcXHRpZiAoZWxlbS1cXHUwMDNlcmVtYWluaW5nKVxcbitcXHRcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXFxuK3tcXG4rXFx0YnBmX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0YnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX2luaXQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBcXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGVsZW0tXFx1MDAzZXByZXZfZXZlbnQgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VyZW1haW5pbmcgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0ZWxlbS1cXHUwMDNlY2hlY2tfbnMgPSBjdHgtXFx1MDAzZWNoZWNrX25zO1xcbitcXG4rXFx0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xcbitcXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2Vsb3dfY2dyb3VwX2lkO1xcbitcXG4rXFx0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rfVxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE0OjQ3LjE0NzkyNjU5MVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzU1MzU4MzY5ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJERUJVR19JTkZPX0JURlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGluIG1tL2JwZl9tZW1jb250cm9sLmMsIGV4cG9zaW5nIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gZnVuY3Rpb25hbGl0eSB0byBzbGVlcGFibGUgQlBGIHN5c2NhbGwgcHJvZ3JhbXMuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBsb2dpYyBhbmQgaXMgcmVhY2hhYmxlIHZpYSBCUEYgcHJvZ3JhbSBleGVjdXRpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3N1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjE0OjQ0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtOCw2ICs4LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuKyNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4rXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuIFxuIC8qKlxuQEAgLTE1OSw2ICsxNjEsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMsIGNsYW1wZWQgdG9cbisgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4rICogQHN3YXBwaW5lc3M6IHRoZSByZWNsYWltIHN3YXBwaW5lc3MsIGluIHRoZSByYW5nZVxuKyAqICAgICAgICAgW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0sIHdoZXJlXG4rICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXG4rICogICAgICAgICB0aGUgbWVtY2cncyBvd24gc3dhcHBpbmVzc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqXG4rICogT25seSB0aGUgcmVjbGFpbSB0YXJnZXQgaXMgY2FwcGVkOiBAc2l6ZSBpcyBjbGFtcGVkIHRvXG4rICogTUVNQ0dfQ0hBUkdFX0JBVENILCBmb2xsb3dpbmcgdGhlIHByZWNlZGVudCBvZiBoaWdoX3dvcmtfZnVuYygpLFxuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2ssIHdoaWNoIGJvdW5kcyBlYWNoIHJlY2xhaW1cbisgKiByZXF1ZXN0IHRoZSBzYW1lIHdheS4gVGhlIGFjdHVhbCBzY2FubmluZyB3b3JrIGFuZCBpdHMgZHVyYXRpb25cbisgKiBhcmUgbm90IGJvdW5kZWQuIFRvIHJlY2xhaW0gbW9yZSwgY2FsbCB0aGlzIGtmdW5jIHJlcGVhdGVkbHlcbisgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXG4rICpcbisgKiBUaGUga2Z1bmMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGEgQlBGX1BST0dfVFlQRV9TWVNDQUxMXG4rICogcHJvZ3JhbSwgc3luY2hyb25vdXNseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlXG4rICogcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIG9mIGEgU1lTQ0FMTFxuKyAqIHByb2dyYW0sIHdoaWNoIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgYW5kIGtlZXAgdGhlIFNZU0NBTEwgcHJvZ3JhbVxuKyAqIHR5cGUuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBvbmx5LCBiZWNhdXNlXG4rICogZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgbWF5IHJ1biB3aXRoIGZpbGVzeXN0ZW0gbG9ja3MgaGVsZCBvclxuKyAqIGluIE5PRlMvTk9JTyBjb250ZXh0cywgd2hlcmUgdGhlIHJlY2xhaW0gcGF0aCBjb3VsZCBkZWFkbG9jayBvblxuKyAqIHRob3NlIGxvY2tzIHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbisgKlxuKyAqIEZvciBhc3luY2hyb25vdXMgcmVjbGFpbSBvZiBtb3JlIHRoYW4gb25lIGJhdGNoLCBkcml2aW5nIHRoZVxuKyAqIHJlY2xhaW0gZnJvbSBhIGJwZl93cSBjYWxsYmFjayBpcyByZWNvbW1lbmRlZDogY2FsbCB0aGlzIGtmdW5jXG4rICogb25jZSBwZXIgY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dFxuKyAqIGJhdGNoLCBpbnN0ZWFkIG9mIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjayBhbmQgbW9ub3BvbGl6aW5nIGFcbisgKiB3b3JrcXVldWUgd29ya2VyLCBhbmQgZ2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIHdvcmsgaXRlbSxcbisgKiBhcyBoaWdoX3dvcmtfZnVuYygpIGRvZXMgd2l0aCBvbmUgd29yayBpdGVtIHBlciBtZW1jZy4gV2hldGhlclxuKyAqIHRvIHN1Ym1pdCB0aGUgbmV4dCBiYXRjaCBpcyB1cCB0byB0aGUgQlBGIHByb2dyYW0sIHdoaWNoIGNhbiBzdG9wXG4rICogYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlLCBvciAodW5zaWduZWQgbG9uZyktMSBpZiBAc3dhcHBpbmVzcyBpcyBvdXQgb2ZcbisgKiByYW5nZS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0XHRcdGludCBzd2FwcGluZXNzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcbitcbitcdGlmIChzd2FwcGluZXNzIFx1MDAzYyAtMSB8fCBzd2FwcGluZXNzIFx1MDAzZSBTV0FQUElORVNTX0FOT05fT05MWSlcbitcdFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKS0xO1xuK1xuK1x0aWYgKHNpemUgXHUwMDNjIFBBR0VfU0laRSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG4rXHRcdFx0XHRcdFx0ICAgIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbitcdFx0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyA9PSAtMSA/IE5VTEwgOlxuK1x0XHRcdFx0XHRcdFx0XHQgICAgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rXG4rXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xuK31cbitcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3NCwxOSArMjQ0LDM1IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDM4YjExNjUyMTJjOTQuLjQ0ZTk1ZTg3ZTNjZDkgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNzQsMTEgKzc0LDEzIEBAIHVuc2lnbmVkIGxvbmcgbHJ1dmVjX2xydV9zaXplKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgZW51bSBscnVfbGlzdCBscnUsXG4gXG4gI2RlZmluZSBNRU1DR19SRUNMQUlNX01BWV9TV0FQICgxIFx1MDAzY1x1MDAzYyAxKVxuICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUgKDEgXHUwMDNjXHUwMDNjIDIpXG4tI2RlZmluZSBNSU5fU1dBUFBJTkVTUyAwXG4tI2RlZmluZSBNQVhfU1dBUFBJTkVTUyAyMDBcbitlbnVtIHtcbitcdE1JTl9TV0FQUElORVNTID0gMCxcbitcdE1BWF9TV0FQUElORVNTID0gMjAwLFxuIFxuLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuLSNkZWZpbmUgU1dBUFBJTkVTU19BTk9OX09OTFkgKE1BWF9TV0FQUElORVNTICsgMSlcbitcdC8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuK1x0U1dBUFBJTkVTU19BTk9OX09OTFkgPSBNQVhfU1dBUFBJTkVTUyArIDEsXG4rfTtcbiBcbiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdjN2QyOTliM2IyOGFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSw3NzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcbisgKlxuKyAqIFNldHRpbmcgVEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIPTEgYWRkcyBhIGJhc2VsaW5lIHJ1biBvZiB0aGVcbisgKiB3b3JrbG9hZCB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSB0byBtZW1jZ19hc3luY19yZWNsYWltLCBhbmQgcHJpbnRzXG4rICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxuKyAqIGNncm91cCwgdG8gc3Rkb3V0LlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqL1xuK2VudW0gcmVjbGFpbV9vdXRjb21lIHtcbitcdFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsXG4rXHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcbitcdFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSxcbit9O1xuK1xuK3N0cnVjdCByZWNsYWltX2V2ZW50IHtcbitcdHU2NCBvdXRjb21lO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgNTBcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDR19EWUlOR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1wiXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXCIvdHJpZ2dlclwiXG4rI2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiBcIi90YXJnZXRcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuKy8qXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxuKyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZFxuKyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xuKyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEZcbisgKiBwcm9ncmFtIHJlcG9ydHMgZXZlcnkgcmVjbGFpbSBvdXRjb21lIHRocm91Z2ggdGhlIHJpbmdidWYsIHNvIHRoZVxuKyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKVxuKyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbisgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcbit7XG4rXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuK1xuK1x0aWYgKCFzdGF0ZnMoXCIvdG1wXCIsIFx1MDAyNnN0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4rXHRcdHJldHVybiBcIi5cIjtcbitcdHJldHVybiBcIi90bXBcIjtcbit9XG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4rICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4rICovXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xuK1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4rXHRDSElMRF9FWElUX0pPSU5fQ0dST1VQLFxuK1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuK1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4rXHRDSElMRF9FWElUX1RJTUVfRklMRSxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSlcbit7XG4rXHRzd2l0Y2ggKGNvZGUpIHtcbitcdGNhc2UgQ0hJTERfRVhJVF9PSzpcbitcdFx0cmV0dXJuIFwic3VjY2Vzc1wiO1xuK1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuK1x0XHRyZXR1cm4gXCJqb2luIGNncm91cFwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcbitcdFx0cmV0dXJuIFwicmVhZCBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIHRpbWUgZmlsZVwiO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbitcdCAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuXG4rXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuK1x0ICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHNcbisgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcFxuKyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuKyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjInc1xuKyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbisgKiBhbnkgcGFyZW50IHRoYXQgaGFzIGRvbWFpbiBjaGlsZHJlbi5cbisgKi9cbitzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFNlZSB0aGUgbWF0Y2hpbmcgd3JpdGUgaW4gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygpLiAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdHJpZ2dlcl9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RBUkdFVF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuKy8qXG4rICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxuKyAqIHRlc3QgZmFpbHMsIHNvIGJlbmNobWFyayBudW1iZXJzIGdvIHN0cmFpZ2h0IHRvIHRoZSByZWFsIHN0ZG91dCB0b1xuKyAqIGtlZXAgdGhlbSBmcm9tIGRyb3duaW5nIGluIEFTU0VSVCBvdXRwdXQuXG4rICovXG4rc3RhdGljIHZvaWQgYmVuY2hfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKVxuK3tcbitcdHZhX2xpc3QgYXA7XG4rXG4rXHR2YV9zdGFydChhcCwgZm10KTtcbitcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcbitcdHZhX2VuZChhcCk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRkb3VibGUgYmFzZV9oaWdoX3RpbWUgPSAwLjAsIGJhc2VfbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRpbnQgZXJyLCBiZW5jaDtcbitcbitcdGJlbmNoID0gISFnZXRlbnYoXCJURVNUX01FTUNHX0FTWU5DX1JFQ0xBSU1fQkVOQ0hcIik7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlXG4rXHQgKiBzYW1lIHdvcmtsb2FkIG9uY2Ugd2l0aG91dCB0aGUgQlBGIHByb2dyYW0sIHNvIHRoZSBsb2cgY2FuXG4rXHQgKiByZXBvcnQgaG93IG11Y2ggYXN5bmMgcmVjbGFpbSBpbXByb3ZlZCB0aGUgcHJlc3N1cmVkIGNncm91cC5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKSB7XG4rXHRcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZiYXNlX2hpZ2hfdGltZSwgXHUwMDI2YmFzZV9sb3dfdGltZSxcbitcdFx0XHRcdFx0ICAgIFJFQURfVElNRVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJXG4rXHQgKiBydW5zLCBzbyBpdCBvbmx5IGxvZ3MgdGhlIG51bWJlcnM7IHRoZSBjb3VudGVycyBhYm92ZSBhbHJlYWR5XG4rXHQgKiBwcm92ZWQgdGhhdCB0aGUgQlBGIHByb2dyYW0gcmVjbGFpbWVkIG1lbW9yeS5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKVxuK1x0XHRiZW5jaF9wcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgXCJcbitcdFx0XHQgICAgIFwicmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxcblwiLFxuK1x0XHRcdCAgICAgYmFzZV9oaWdoX3RpbWUsIGJhc2VfbG93X3RpbWUsIGhpZ2hfdGltZSwgbG93X3RpbWUsXG4rXHRcdFx0ICAgICAxMDAuMCAqIChiYXNlX2hpZ2hfdGltZSAtIGhpZ2hfdGltZSkgLyBiYXNlX2hpZ2hfdGltZSk7XG4rXHRlbHNlIGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcblwiLFxuK1x0XHQgICAgICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbitcbisvKlxuKyAqIEtlZXAgcmVmYXVsdHMgZmxvd2luZyB0aHJvdWdoIHRoZSB0cmlnZ2VyIGNncm91cCBzbyByZWNsYWltIHJvdW5kc1xuKyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuKyAqIGNoaWxkIGpvaW5zIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgd3JpdGVzIHRoZSBkYXRhIGZpbGUgdGhlcmUsIHNvXG4rICogdGhhdCB0aGUgZmlsZSBwYWdlcyBhcmUgY2hhcmdlZCB0byB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIGFjdHVhbGx5XG4rICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuKyAqIHVudGlsIGl0IGlzIGtpbGxlZC5cbisgKi9cbitzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4re1xuK1x0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0aWYgKHBpZCAhPSAwKVxuK1x0XHRyZXR1cm4gcGlkO1xuK1xuK1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApO1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbitcdFx0X2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTtcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuK1x0XHRcdF9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTtcbitcdH1cbit9XG4rXG4rLyogUmVjbGFpbSBvdXRjb21lcyBvYnNlcnZlZCBzbyBmYXIsIHRhbGxpZWQgZnJvbSByaW5nYnVmIGV2ZW50cy4gKi9cbitzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7XG4rXHRpbnQgY2FsbGVkO1xuK1x0aW50IHNraXBwZWRfZHlpbmc7XG4rXHRpbnQgdGFyZ2V0X2dvbmU7XG4rfTtcbitcbitzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opXG4re1xuK1x0c3RydWN0IHJlY2xhaW1fZXZlbnRzX3NlZW4gKnNlZW4gPSBjdHg7XG4rXHRjb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhO1xuK1xuK1x0aWYgKHN6IFx1MDAzYyBzaXplb2YoKmV2KSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRzd2l0Y2ggKGV2LVx1MDAzZW91dGNvbWUpIHtcbitcdGNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDpcbitcdFx0c2Vlbi1cdTAwM2VjYWxsZWQrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HOlxuK1x0XHRzZWVuLVx1MDAzZXNraXBwZWRfZHlpbmcrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORTpcbitcdFx0c2Vlbi1cdTAwM2V0YXJnZXRfZ29uZSsrO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXG4rICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZlxuKyAqIHJlY2xhaW1pbmcgZnJvbSBpdC5cbisgKlxuKyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kXG4rICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZyxcbisgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxuKyAqIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcbisgKiBTS0lQUEVEX0RZSU5HIG9yIFRBUkdFVF9HT05FIGV2ZW50cyB3aGlsZSByZWNsYWltX2NhbGxzIGFuZFxuKyAqIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiBzZWVuID0ge307XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcbitcdHBpZF90IHJlYWRlcl9waWQgPSAtMTtcbitcdGludCBlcnIsIGZkLCBpO1xuK1xuK1x0ZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcyhcdTAwMjZ0cmlnZ2VyX2Nncm91cF9pZCwgXHUwMDI2dGFyZ2V0X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfZHlpbmdfY2dyb3Vwc1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yZWNsYWltX2V2ZW50cyksXG4rXHRcdFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXHUwMDI2c2VlbiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocmIsIFwicmluZ19idWZmZXJfX25ld1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcIiwgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuK1x0ZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNsb3NlKGZkKTtcbitcbitcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcImZvcmsga2VlcGFsaXZlIHJlYWRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2ICFzZWVuLmNhbGxlZDsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgXCJyZWNsYWltIGV2ZW50c1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZCB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc2Vlbi5za2lwcGVkX2R5aW5nIFx1MDAyNlx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXNlZW4uc2tpcHBlZF9keWluZyBcdTAwMjZcdTAwMjYgIXNlZW4udGFyZ2V0X2dvbmUpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpXCIsXG4rXHRcdFx0ICAgc2Vlbi50YXJnZXRfZ29uZSwgc2Vlbi5za2lwcGVkX2R5aW5nKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIHRoZXkgaGFwcGVuIGlzIHRpbWluZ1xuK1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4rXHQgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLlxuK1x0ICovXG4rXHRwcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltX2R5aW5nOiBza2lwcyBvbiByZW1vdmVkIGNncm91cDogZ29uZT0lZCwgZHlpbmc9JWRcXG5cIixcbitcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuK1xuK1x0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxuK1x0XHQgICAgICAgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK291dDpcbitcdGlmIChyZWFkZXJfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XG4rXHRcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XG4rXHR9XG4rXHRpZiAoZGF0YV9maWxlWzBdKVxuK1x0XHR1bmxpbmsoZGF0YV9maWxlKTtcbitcdGlmIChyYilcbitcdFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMxOGJlYjY0MTZkMzBcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjg4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuKy8qXG4rICogT3V0Y29tZSBvZiBhIHNpbmdsZSByZWNsYWltIGF0dGVtcHQsIHJlcG9ydGVkIHRvIHVzZXJzcGFjZSB0aHJvdWdoXG4rICogdGhlIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYgc28gdGVzdHMgY2FuIHdhaXQgZm9yIHJlY2xhaW0gZXZlbnRzIHdpdGhcbisgKiBhIHRpbWVvdXQgaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBjb3VudGVycyBhYm92ZS5cbisgKi9cbitlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XG4rXHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxuK1x0UkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsXG4rXHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXG4rfTtcbitcbitzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XG4rXHRfX3U2NCBvdXRjb21lO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEgXHUwMDNjXHUwMDNjIDE2KTtcbit9IHJlY2xhaW1fZXZlbnRzIFNFQyhcIi5tYXBzXCIpO1xuK1xuKy8qXG4rICogUmVwb3J0cyBhcmUgYmVzdCBlZmZvcnQ6IHdoZW4gdGhlIHJpbmdidWYgaXMgZnVsbCwgZm9yIGV4YW1wbGUgd2hlblxuKyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC5cbisgKi9cbitzdGF0aWMgdm9pZCBlbWl0X3JlY2xhaW1fZXZlbnQoZW51bSByZWNsYWltX291dGNvbWUgb3V0Y29tZSlcbit7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXY7XG4rXG4rXHRldiA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTtcbitcdGlmICghZXYpXG4rXHRcdHJldHVybjtcbitcbitcdGV2LVx1MDAzZW91dGNvbWUgPSBvdXRjb21lO1xuK1x0YnBmX3JpbmdidWZfc3VibWl0KGV2LCAwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4rXHRcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcbitcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuKy8qXG4rICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvclxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4rICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFja1xuKyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlblxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuKyAqIHRoZSBsb29rdXAgZmFpbGluZy5cbisgKlxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuKyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0b1xuKyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXG4rICogdGhlIHZhbHVlcyBhbHJlYWR5IG1hdGNoIHRoZSB0YXJnZXQga2VybmVsLlxuKyAqL1xuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxuK3tcbitcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbitcbitcdHJldHVybiAoZmxhZ3MgXHUwMDI2IENTU19EWUlORykgfHwgIShmbGFncyBcdTAwMjYgQ1NTX09OTElORSk7XG4rfVxuK1xuKy8qXG4rICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgcmVjbGFpbWVkLCBvciAwIGlmIHRoZSBjZ3JvdXAgaXMgZHlpbmcgb3IgZ29uZSBvciBub3RoaW5nIHdhc1xuKyAqIHJlY2xhaW1lZC4gRWFjaCBhdHRlbXB0IHJlcG9ydHMgaXRzIG91dGNvbWUgdGhyb3VnaCB0aGVcbisgKiByZWNsYWltX2V2ZW50cyByaW5nYnVmLlxuKyAqL1xuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdHU2NCBuciA9IDA7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKSB7XG4rXHRcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HKTtcbitcdFx0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0cmVjbGFpbV9jYWxscysrO1xuK1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUsIC0xKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTQ6NDcuMTQ3OTI4MTExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6OTgwODM3ODcxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEJQRiBQcm9hY3RpdmUgTWVtb3J5IFJlY2xhaW0gUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgbG9va3MgbGlrZSB3ZSdyZSBpbnRyb2R1Y2luZyBhIG5ldyBCUEYga2Z1bmMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLCB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSB3aXRoaW4gYSBtZW1jZy4gU3BlY2lmaWNhbGx5LCBJIHNlZSBpdCdzIGFkZGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbmQgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgd2l0aCB0aGUgYEtGX1NMRUVQQUJMRWAgZmxhZy4gVGhhdCBtZWFucyB0aGlzIGZ1bmN0aW9uIGNhbiBwb3RlbnRpYWxseSBzbGVlcCwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIG5vdGUgZm9yIEJQRiBjb250ZXh0LiBUaGUgY29kZSBzZWVtcyB0byBjYWxsIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgd2hpY2ggaXMgdGhlIGNvcmUgb2YgdGhlIHJlY2xhaW0gcHJvY2VzcywgYW5kIGl0IGxvb2tzIGxpa2Ugd2UgaGF2ZSBjb250cm9sIG92ZXIgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSB0byByZWNsYWltIGFuZCB0aGUgc3dhcHBpbmVzcyB2YWx1ZS4gIFRoZSBlbnVtIGNoYW5nZSBpbiBgbW0vaW50ZXJuYWwuaGAgaXMgYSBtaW5vciBkZXRhaWwsIGxvb2tzIGxpa2UgdGhleSBhcmUgc2ltcGx5IHVwZGF0aW5nIHRoZSB3YXkgdGhhdCBjb25zdGFudHMgYXJlIGRlZmluZWQuIFRoZXJlIGFyZSBhbHNvIGFzc29jaWF0ZWQgc2VsZnRlc3RzLlxuXG5Ob3csIGxldCdzIHJ1biB0aHJvdWdoIHRoZSBzYW5pdHkgY2hlY2tzLiBGaXJzdCwgKnJlYWNoYWJpbGl0eSouIFRoaXMgaXMgYSBCUEYga2Z1bmMsIHNvLCB5ZXMsIGl0J3MgZGVmaW5pdGVseSByZWFjaGFibGUuIFVzZXIgc3BhY2UgcHJvZ3JhbXMgY2FuIGxvYWQgYW5kIGV4ZWN1dGUgQlBGIHByb2dyYW1zIHZpYSBgc3lzX2JwZmAgb3Igd2l0aGluIG90aGVyIGNvbnRleHRzIGxpa2UgYGJwZl93cWAuIEdvb2QuIFNlY29uZCwgKmNvcmUgc3Vic3lzdGVtKi4gQlBGICphbmQqIE1lbW9yeSBNYW5hZ2VtZW50IChtZW1jZykgLS0gdGhhdCdzIGRlZmluaXRlbHkgYSBjb3JlIGFyZWEsIHNvIHdlJ3JlIGdvb2QgdGhlcmUuIFRoaXJkLCBkb2VzIGl0ICptb2RpZnkqIGtlcm5lbCBleGVjdXRhYmxlIGNvZGU/ICBZZXMsIGFkZGluZyBhIG5ldyBrZnVuYyAqZGVmaW5pdGVseSogbW9kaWZpZXMga2VybmVsIGNvZGUuXG5cblNvLCBpdCdzICpyZWFjaGJsZSosIGl0cyBpbiBhICpjb3JlIHN1YnN5c3RlbSosIGFuZCBpdCAqbW9kaWZpZXMqIGV4ZWN1dGFibGUgY29kZS4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYS5cblxuSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhlcmUgYXJlIGFueSBLY29uZmlnIGRlcGVuZGVuY2llcywgb3Igb3RoZXIgaW1wb3J0YW50IGZpbGVzIGludm9sdmVkIHRvIGNvbXBsZXRlIHRoaXMgYW5hbHlzaXMuIFRpbWUgdG8gY2hlY2sgYGdyZXBwZXJgLCBgbW0vTWFrZWZpbGVgLCBvciBkaXJlY3RseSByZXZpZXcgYG1tL2JwZl9tZW1jb250cm9sLmNgIGZvciBhbnkgc3VidGxlIGNvbm5lY3Rpb25zIG9yIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBXZSBuZWVkIHRvIGJlIHRob3JvdWdoIHdpdGggcGF0Y2hlcyB0aGlzIGltcG9ydGFudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYzMDgsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MzgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNDo1Ni45NTYzMDk2ODNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk1NjY5NTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2xcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTEwNj1pZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG5tbS9NYWtlZmlsZToxMDc6b2JqLSQoQ09ORklHX01FTUNHKSArPSBicGZfbWVtY29udHJvbC5vXFxubW0vTWFrZWZpbGUtMTA4LWVuZGlmXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jPTIzMj1fX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjMzLVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjM0OkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjM1LUJURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X3Jvb3RfbWVtX2Nncm91cCwgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDM9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDQtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDU6QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ2LVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ3OkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDgtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ5OkJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjUwLVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjUxOnN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTItXFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTM6XFx0LnNldCAgICAgICAgICAgID0gXFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1NC19O1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU1LVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjU2OnN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCA9IHtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1Ny1cXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI1ODpcXHQuc2V0ICAgICAgICAgICAgPSBcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTktfTtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2MC1cXG5tbS9icGZfbWVtY29udHJvbC5jOjI2MTpzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjIte1xcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjUtXFx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI2NjpcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2Ny1cXHRpZiAoZXJyKSB7XFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTI3Mi1cXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI3MzpcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjc0LVxcdGlmIChlcnIpXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTI3OC19XFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNzk6bGF0ZV9pbml0Y2FsbChicGZfbWVtY29udHJvbF9pbml0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTQ6NTcuMDA1ODgxMTM2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Nzk2NzgwODI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYnBmX21lbWNvbnRyb2wuYydzIEtjb25maWcgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZSBLY29uZmlnIHJlcXVpcmVtZW50cyBmb3IgYG1tL2JwZl9tZW1jb250cm9sLmNgLiBGaXJzdCwgSSdsbCBxdWlja2x5IGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgLiBSaWdodCwgaXQgbG9va3MgbGlrZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19NRU1DR2AgYXJlIHRoZSBjb3JlIGRlcGVuZGVuY2llcywgYW5kIHRoZXkgbXVzdCBib3RoIGJlIHNldC4gTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGBDT05GSUdfREVCVUdfSU5GT19CVEZgIGlzIGFsc28gZW5hYmxlZCwgc2luY2UgdGhhdCdzIHVzdWFsbHkgcmVxdWlyZWQgZm9yIEJURiByZWdpc3RyYXRpb24sIGtmdW5jIHJlc29sdXRpb24sIGFuZCB0aGUgcmVsYXRlZCBwcm9jZXNzZXMuXG5cbk5vdywgSSdsbCB6ZXJvIGluIG9uIGByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0YC4gSSB3YW50IHRvIHZlcmlmeSB0aGF0IGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBpbmRlZWQgKnRoZSogbWFpbiBkcml2ZXJzLCBvciBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGludm9sdmVkIGhlcmUuIFNvLCBsZXQncyB0cmFjayBkb3duIHRoZSBkZWZpbml0aW9uIG9mIGByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0YCBhbmQgc2VlIHdoYXQgZWxzZSBtaWdodCBiZSBsdXJraW5nIGluIHRoZXJlLiBHb3R0YSBjb3ZlciBhbGwgdGhlIGJhc2VzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxODE2NSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTowNC45NzM2OTIzMDRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg0ODMzMDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2FyZW5hLmM9MTEzMT1zdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXFxua2VybmVsL2JwZi9hcmVuYS5jLTExMzIte1xcbmtlcm5lbC9icGYvYXJlbmEuYzoxMTMzOlxcdHJldHVybiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2Y29tbW9uX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9hcmVuYS5jLTExMzQtfVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04OTQyPXN0YXRpYyBpbnQgYnRmX3BvcHVsYXRlX2tmdW5jX3NldChzdHJ1Y3QgYnRmICpidGYsIGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODk4OC1cXHRzZXQgPSB0YWItXFx1MDAzZXNldHNbaG9va107XFxua2VybmVsL2JwZi9idGYuYzo4OTg5OlxcdC8qIFdhcm4gd2hlbiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0IGlzIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgaG9va1xcbmtlcm5lbC9icGYvYnRmLmMtODk5MC1cXHQgKiBmb3IgbW9kdWxlIHNldHMuXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTkyMTM9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjEtXFxua2VybmVsL2JwZi9idGYuYzo5MjIyOnN0YXRpYyBpbnQgX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjMtXFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy05MjQ4LS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIG9ubHkgZnJvbSBpbml0Y2FsbHMvbW9kdWxlIGluaXQgZnVuY3Rpb25zICovXFxua2VybmVsL2JwZi9idGYuYzo5MjQ5OmludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXFxua2VybmVsL2JwZi9idGYuYy05MjUwLVxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy05MjYyLVxcdGhvb2sgPSBicGZfcHJvZ190eXBlX3RvX2tmdW5jX2hvb2socHJvZ190eXBlKTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjkyNjM6XFx0cmV0dXJuIF9fcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChob29rLCBrc2V0KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjQtfVxcbmtlcm5lbC9icGYvYnRmLmM6OTI2NTpFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjYtXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTkyNjg9aW50IHJlZ2lzdGVyX2J0Zl9mbW9kcmV0X2lkX3NldChjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldClcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjkte1xcbmtlcm5lbC9icGYvYnRmLmM6OTI3MDpcXHRyZXR1cm4gX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJURl9LRlVOQ19IT09LX0ZNT0RSRVQsIGtzZXQpO1xcbmtlcm5lbC9icGYvYnRmLmMtOTI3MS19XFxuLS1cXG5rZXJuZWwvYnBmL2NwdW1hc2suYz01MTU9c3RhdGljIGludCBfX2luaXQgY3B1bWFza19rZnVuY19pbml0KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjUtXFx0cmV0ID0gYnBmX21lbV9hbGxvY19pbml0KFxcdTAwMjZicGZfY3B1bWFza19tYSwgc2l6ZW9mKHN0cnVjdCBicGZfY3B1bWFzayksIGZhbHNlKTtcXG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1MjY6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNzpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFxcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI4OlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjktXFx0cmV0dXJuICByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGNwdW1hc2tfZHRvcnMsXFxuLS1cXG5rZXJuZWwvYnBmL2NyeXB0by5jPTM3OT1zdGF0aWMgaW50IF9faW5pdCBjcnlwdG9fa2Z1bmNfaW5pdCh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9jcnlwdG8uYy0zODgtXFxua2VybmVsL2JwZi9jcnlwdG8uYzozODk6XFx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcnlwdG8uYzozOTA6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1QsIFxcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkxOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfWERQLCBcXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MjpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXFxua2VybmVsL2JwZi9jcnlwdG8uYy0zOTMtXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZjcnlwdF9pbml0X2tmdW5jX3NldCk7XFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00OTgyPXN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ5OTctXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDk5ODpcXHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0OTk5OlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDA6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMTpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMjpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMzpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwNC1cXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGdlbmVyaWNfZHRvcnMsXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA2LVxcdFxcdFxcdFxcdFxcdFxcdCAgVEhJU19NT0RVTEUpO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDc6XFx0cmV0dXJuIHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2Y29tbW9uX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwOC19XFxuLS1cXG5rZXJuZWwvYnBmL21hcF9pdGVyLmM9MjMwPXN0YXRpYyBpbnQgaW5pdF9zdWJzeXN0ZW0odm9pZClcXG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMxLXtcXG5rZXJuZWwvYnBmL21hcF9pdGVyLmM6MjMyOlxcdHJldHVybiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2YnBmX21hcF9pdGVyX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9tYXBfaXRlci5jLTIzMy19XFxuLS1cXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYz03NTk9c3RhdGljIF9faW5pdCBpbnQgcnFzcGlubG9ja19yZWdpc3Rlcl9rZnVuY3Modm9pZClcXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYy03NjAte1xcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jOjc2MTpcXHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXFx1MDAyNnJxc3BpbmxvY2tfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYy03NjItfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTowNS4wMjIxODE5NDZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozOTk0Nzk1NTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV4YW1pbmluZyB0aGUgQlBGIE1lbW9yeSBDb250cm9sIENvZGUqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhlIGBtbS9icGZfbWVtY29udHJvbC5jYCBmaWxlLiBNeSBwcmltYXJ5IGludGVyZXN0IHJpZ2h0IG5vdyBpcyB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgc3ltYm9sLiBJJ20gbm90aW5nIHRoYXQgaXQncyBkZWZpbmVkIGFzIGEga2Z1bmMsIHdoaWNoIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIGl0cyByb2xlIHdpdGhpbiB0aGUga2VybmVsLiBCZWZvcmUgSSBnZXQgdG9vIGRlZXAgaW50byB0aGF0IHNwZWNpZmljIGZ1bmN0aW9uLCBJJ2xsIHF1aWNrbHkgc2NhbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gSSB3YW50IHRvIGJ1aWxkIGEgbW9yZSBob2xpc3RpYyBwaWN0dXJlIOKAkyBzZWUgd2hhdCBvdGhlciBmdW5jdGlvbmFsaXRpZXMgYXJlIGltcGxlbWVudGVkIHdpdGhpbiBgYnBmX21lbWNvbnRyb2wuY2AgdGhhdCBtaWdodCBpbnRlcmFjdCB3aXRoLCBvciBiZSByZWxhdGVkIHRvLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQncyBhbHdheXMgYmVuZWZpY2lhbCB0byBoYXZlIHRoYXQgY29udGV4dHVhbCBhd2FyZW5lc3MgYmVmb3JlIEkgc3RhcnQgZGlzc2VjdGluZyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNjIzLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MDkuMDE2OTc5NzE0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE2NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vYnBmX21lbWNvbnRyb2wuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICogTWVtb3J5IENvbnRyb2xsZXItcmVsYXRlZCBCUEYga2Z1bmNzIGFuZCBhdXhpbGlhcnkgY29kZVxcbiAgIDQ6XFx0ICpcXG4gICA1OlxcdCAqIEF1dGhvcjogUm9tYW4gR3VzaGNoaW4gXFx1MDAzY3JvbWFuLmd1c2hjaGluQGxpbnV4LmRldlxcdTAwM2VcXG4gICA2OlxcdCAqL1xcbiAgIDc6XFx0XFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtY29udHJvbC5oXFx1MDAzZVxcbiAgIDk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiAgMTA6XFx0XFxuICAxMTpcXHQjaW5jbHVkZSBcXFwiaW50ZXJuYWwuaFxcXCJcXG4gIDEyOlxcdFxcbiAgMTM6XFx0X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbiAgMTQ6XFx0XFxuICAxNTpcXHQvKipcXG4gIDE2OlxcdCAqIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgbWVtb3J5IGNncm91cFxcbiAgMTc6XFx0ICpcXG4gIDE4OlxcdCAqIFRoZSBmdW5jdGlvbiBoYXMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MsIGV2ZW4gdGhvdWdoIHRoZSByb290IG1lbW9yeVxcbiAgMTk6XFx0ICogY2dyb3VwIGlzIG5ldmVyIGRlc3Ryb3llZCBhZnRlciBiZWluZyBjcmVhdGVkIGFuZCBkb2Vzbid0IHJlcXVpcmVcXG4gIDIwOlxcdCAqIHJlZmVyZW5jZSBjb3VudGluZy4gQW5kIGl0J3MgcGVyZmVjdGx5IHNhZmUgdG8gcGFzcyBpdCB0b1xcbiAgMjE6XFx0ICogYnBmX3B1dF9tZW1fY2dyb3VwKClcXG4gIDIyOlxcdCAqXFxuICAyMzpcXHQgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBtZW1vcnkgY2dyb3VwLlxcbiAgMjQ6XFx0ICovXFxuICAyNTpcXHRfX2JwZl9rZnVuYyBzdHJ1Y3QgbWVtX2Nncm91cCAqYnBmX2dldF9yb290X21lbV9jZ3JvdXAodm9pZClcXG4gIDI2OlxcdHtcXG4gIDI3OlxcdFxcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpXFxuICAyODpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDI5OlxcdFxcbiAgMzA6XFx0XFx0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cXG4gIDMxOlxcdFxcdHJldHVybiByb290X21lbV9jZ3JvdXA7XFxuICAzMjpcXHR9XFxuICAzMzpcXHRcXG4gIDM0OlxcdC8qKlxcbiAgMzU6XFx0ICogYnBmX2dldF9tZW1fY2dyb3VwIC0gR2V0IGEgcmVmZXJlbmNlIHRvIGEgbWVtb3J5IGNncm91cFxcbiAgMzY6XFx0ICogQGNzczogcG9pbnRlciB0byB0aGUgY3NzIHN0cnVjdHVyZVxcbiAgMzc6XFx0ICpcXG4gIDM4OlxcdCAqIEl0J3MgZmluZSB0byBwYXNzIGEgY3NzIHdoaWNoIGJlbG9uZ3MgdG8gYW55IGNncm91cCBjb250cm9sbGVyLFxcbiAgMzk6XFx0ICogZS5nLiB1bmlmaWVkIGhpZXJhcmNoeSdzIG1haW4gY3NzLlxcbiAgNDA6XFx0ICpcXG4gIDQxOlxcdCAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXFxuICA0MjpcXHQgKlxcbiAgNDM6XFx0ICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBtZW1fY2dyb3VwIHN0cnVjdHVyZSBhZnRlciBidW1waW5nXFxuICA0NDpcXHQgKiB0aGUgY29ycmVzcG9uZGluZyBjc3MncyByZWZlcmVuY2UgY291bnRlci5cXG4gIDQ1OlxcdCAqL1xcbiAgNDY6XFx0X19icGZfa2Z1bmMgc3RydWN0IG1lbV9jZ3JvdXAgKlxcbiAgNDc6XFx0YnBmX2dldF9tZW1fY2dyb3VwKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXFxuICA0ODpcXHR7XFxuICA0OTpcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMO1xcbiAgNTA6XFx0XFx0Ym9vbCByY3VfdW5sb2NrID0gZmFsc2U7XFxuICA1MTpcXHRcXG4gIDUyOlxcdFxcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkgfHwgIXJvb3RfbWVtX2Nncm91cClcXG4gIDUzOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAgNTQ6XFx0XFxuICA1NTpcXHRcXHRpZiAocm9vdF9tZW1fY2dyb3VwLVxcdTAwM2Vjc3Muc3MgIT0gY3NzLVxcdTAwM2Vzcykge1xcbiAgNTY6XFx0XFx0XFx0c3RydWN0IGNncm91cCAqY2dyb3VwID0gY3NzLVxcdTAwM2VjZ3JvdXA7XFxuICA1NzpcXHRcXHRcXHRpbnQgc3NpZCA9IHJvb3RfbWVtX2Nncm91cC1cXHUwMDNlY3NzLnNzLVxcdTAwM2VpZDtcXG4gIDU4OlxcdFxcbiAgNTk6XFx0XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiAgNjA6XFx0XFx0XFx0cmN1X3VubG9jayA9IHRydWU7XFxuICA2MTpcXHRcXHRcXHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNncm91cC1cXHUwMDNlc3Vic3lzW3NzaWRdKTtcXG4gIDYyOlxcdFxcdH1cXG4gIDYzOlxcdFxcbiAgNjQ6XFx0XFx0aWYgKGNzcyBcXHUwMDI2XFx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXFxuICA2NTpcXHRcXHRcXHRtZW1jZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCBtZW1fY2dyb3VwLCBjc3MpO1xcbiAgNjY6XFx0XFxuICA2NzpcXHRcXHRpZiAocmN1X3VubG9jaylcXG4gIDY4OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAgNjk6XFx0XFxuICA3MDpcXHRcXHRyZXR1cm4gbWVtY2c7XFxuICA3MTpcXHR9XFxuICA3MjpcXHRcXG4gIDczOlxcdC8qKlxcbiAgNzQ6XFx0ICogYnBmX3B1dF9tZW1fY2dyb3VwIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgbWVtb3J5IGNncm91cFxcbiAgNzU6XFx0ICogQG1lbWNnOiBtZW1vcnkgY2dyb3VwIHRvIHJlbGVhc2VcXG4gIDc2OlxcdCAqXFxuICA3NzpcXHQgKiBSZWxlYXNlcyBhIHByZXZpb3VzbHkgYWNxdWlyZWQgbWVtY2cgcmVmZXJlbmNlLlxcbiAgNzg6XFx0ICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cXG4gIDc5OlxcdCAqL1xcbiAgODA6XFx0X19icGZfa2Z1bmMgdm9pZCBicGZfcHV0X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTowOS4wMTcwNTI3MDNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozODU3NjIzMTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBQcm9hY3RpdmUgUmVjbGFpbSBpbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaWcgYSBiaXQgZGVlcGVyIGludG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGFuZCBob3cgcHJvYWN0aXZlIHJlY2xhaW0gaW50ZXJhY3RzIHdpdGggaXQuIEkgd2FudCB0byBzZWUgaG93IHRoZSBzeXN0ZW0gaXMgKnJlYWxseSogd29ya2luZywgbm90IGp1c3QgdGhlIHN1cmZhY2UgbGV2ZWwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBudWFuY2VzIG9mIHRoZSBwcm9hY3RpdmUgcmVjbGFpbSBsb2dpYyB3aXRoaW4gdGhhdCBmdW5jdGlvbiwgZXNwZWNpYWxseSBpbiBkaWZmZXJlbnQgc2NlbmFyaW9zLiBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGhldXJpc3RpY3MgaW52b2x2ZWQsIHRoZSB0cmlnZ2VyaW5nIGNvbmRpdGlvbnMsIGFuZCB0aGUgYWN0dWFsIG1lY2hhbmlzbXMgaXQgdXNlcyB0byBpZGVudGlmeSBhbmQgZnJlZSBwYWdlcy4gSSdtIGtlZW4gdG8gZXhhbWluZSBob3cgaXQgYmFsYW5jZXMgcmVjbGFpbSBlZmZvcnRzIGFjcm9zcyBkaWZmZXJlbnQgbWVtb3J5IGNncm91cHMsIGVzcGVjaWFsbHkgdW5kZXIgbWVtb3J5IHByZXNzdXJlLiBTcGVjaWZpY2FsbHksIEknbSBpbnRlcmVzdGVkIGluIGhvdyBpdCBwcmlvcml0aXplcyBjZXJ0YWluIHR5cGVzIG9mIHJlY2xhaW0gKGUuZy4sIHBhZ2UgY2FjaGUsIGFub255bW91cyBwYWdlcykgZHVyaW5nIHByb2FjdGl2ZSByZWNsYWltIHZlcnN1cyByZWFjdGl2ZSByZWNsYWltLiBJJ2xsIHByb2JhYmx5IGxvb2sgYXQgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIGdsb2JhbCBMUlUgbGlzdHMgdG9vLiBJIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBpbXBhY3Qgb2YgdGhpbmdzIGxpa2Ugc3dhcCBhbmQgZGlmZmVyZW50IG1lbW9yeSBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb25zIG9uIHRoaXMgcm91dGluZS4gVWx0aW1hdGVseSwgSSdtIGFpbWluZyBmb3IgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBlZmZpY2llbmN5IGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MgaW4gYSBoaWdoLWNvbnRlbnRpb24gbWVtb3J5IGVudmlyb25tZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTk3NCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MTIuODc0Njc3ODczWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzgzOTQyMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9icGZfbWVtY29udHJvbC5jPTIwNz1fX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMS1cXG5tbS9icGZfbWVtY29udHJvbC5jOjIyMjpcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMy1cXHRcXHRcXHRcXHRcXHRcXHQgICAgR0ZQX0tFUk5FTCxcXG4tLVxcbm1tL2ludGVybmFsLmg9Nzc9ZW51bSB7XFxuLS1cXG5tbS9pbnRlcm5hbC5oLTg0LVxcbm1tL2ludGVybmFsLmg6ODU6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS9pbnRlcm5hbC5oLTg2LVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTc3MT1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfcmVzaXplX21heChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMTgxNS1cXG5tbS9tZW1jb250cm9sLXYxLmM6MTgxNjpcXHRcXHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXFxubW0vbWVtY29udHJvbC12MS5jLTE4MTctXFx0XFx0XFx0XFx0bWVtc3cgPyAwIDogTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpIHtcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xODM0PXN0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMTg1MS1cXG5tbS9tZW1jb250cm9sLXYxLmM6MTg1MjpcXHRcXHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXFxubW0vbWVtY29udHJvbC12MS5jLTE4NTMtXFx0XFx0XFx0XFx0XFx0XFx0ICBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yMzc4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMjM5My1cXHRcXHRwc2lfbWVtc3RhbGxfZW50ZXIoXFx1MDAyNnBmbGFncyk7XFxubW0vbWVtY29udHJvbC5jOjIzOTQ6XFx0XFx0bnJfcmVjbGFpbWVkICs9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxcbm1tL21lbWNvbnRyb2wuYy0yMzk1LVxcdFxcdFxcdFxcdFxcdFxcdFxcdGdmcF9tYXNrLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTI2NDU9c3RhdGljIGludCB0cnlfY2hhcmdlX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZ2ZwX3QgZ2ZwX21hc2ssXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMjcxNy1cXHRwc2lfbWVtc3RhbGxfZW50ZXIoXFx1MDAyNnBmbGFncyk7XFxubW0vbWVtY29udHJvbC5jOjI3MTg6XFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1fb3Zlcl9saW1pdCwgbnJfcGFnZXMsXFxubW0vbWVtY29udHJvbC5jLTI3MTktXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTQ4Mzg9c3RhdGljIHNzaXplX3QgbWVtb3J5X2hpZ2hfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQ4NzktXFxubW0vbWVtY29udHJvbC5jOjQ4ODA6XFx0XFx0cmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMgLSBoaWdoLFxcbm1tL21lbWNvbnRyb2wuYy00ODgxLVxcdFxcdFxcdFxcdFxcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpO1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTQ4OTc9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDkzOC1cXHRcXHRpZiAobnJfcmVjbGFpbXMpIHtcXG5tbS9tZW1jb250cm9sLmM6NDkzOTpcXHRcXHRcXHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gbWF4LFxcbm1tL21lbWNvbnRyb2wuYy00OTQwLVxcdFxcdFxcdFxcdFxcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxcbi0tXFxubW0vdm1zY2FuLmM9NjgxNT11bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfc2hyaW5rX25vZGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vdm1zY2FuLmMtNjg1NC1cXG5tbS92bXNjYW4uYzo2ODU1OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1zY2FuLmMtNjg1Ni1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vdm1zY2FuLmMtNjg5NS0jZWxzZVxcbm1tL3Ztc2Nhbi5jOjY4OTY6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS92bXNjYW4uYy02ODk3LVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS92bXNjYW4uYz03OTU4PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1ZixcXG4tLVxcbm1tL3Ztc2Nhbi5jLTgwMjktXFx0XFx0XFx0XFx0XFx0ICBNRU1DR19SRUNMQUlNX1BST0FDVElWRTtcXG5tbS92bXNjYW4uYzo4MDMwOlxcdFxcdFxcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csXFxubW0vdm1zY2FuLmMtODAzMS1cXHRcXHRcXHRcXHRcXHRcXHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjEyLjkyODUyNzM0NVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo5NjczMzAyNDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaCBmb3IgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBrZXJuZWwgY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIHBhdGNoIHJlbGllcyBvbi4gQmFzZWQgb24gdGhlIGluaXRpYWwgY2hlY2tzLCBpdCBsb29rcyBsaWtlIGBNRU1DR2AsIGBCUEZfU1lTQ0FMTGAsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBlc3NlbnRpYWwuIGBERUJVR19JTkZPX0JURmAgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBzaW5jZSBpdCdzIHJlcXVpcmVkIGZvciBib3RoIEJURiBhbmQga2Z1bmNzLCB3aGljaCBhcmUgY2VudHJhbCB0byB0aGlzIHBhdGNoLlxuXG5OZXh0LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMuIFRoZSBmb2N1cyBzZWVtcyB0byBiZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSSBzaG91bGQgZG91YmxlIGNoZWNrIGlmIGBicGZfbWVtY29udHJvbF9pbml0YCBpcyBhIGxhdGVfaW5pdGNhbGwsIGJ1dCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBsb29rcyB0byBiZSB0aGUgcmVhbCBrZnVuYyBlbnRyeXBvaW50LlxuXG5Ob3csIGxldCdzIGFzc2VzcyB0aGUgZnV6emluZyBwb3RlbnRpYWwuIFRoZSBwYXRjaCB0b3VjaGVzIGNyaXRpY2FsIHN1YnN5c3RlbXM6IEJQRiBhbmQgTWVtb3J5IE1hbmFnZW1lbnQuIEEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGlzIGFkZGVkLiBDcnVjaWFsbHksIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLCBhbmQgdGhlIGFyZ3VtZW50cyAoc2l6ZSwgc3dhcHBpbmVzcykgc2VlbSB1c2VyLWNvbnRyb2xsYWJsZS4gVGhlIHBhdGNoIGFsc28gcmVnaXN0ZXJzIHRoaXMga2Z1bmMgZm9yIGBCUEZfUFJPR19UWVBFX1NZU0NBTExgLCBtYWtpbmcgaXQgZGVmaW5pdGVseSBleGVjdXRhYmxlIGNvZGUgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGlzIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nLlxuXG5UbyBzdW1tYXJpemUgdGhlIHJlcXVpcmVtZW50czogV2UgbmVlZCBgQlBGX1NZU0NBTExgLCBgTUVNQ0dgLCBhbmQgYERFQlVHX0lORk9fQlRGYCBlbmFibGVkLiBUaGUgbWFpbiBmdW5jdGlvbiB0byBmb2N1cyBvbiBpcyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQncyBsb2NhdGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC5cblxuT2theSwgSSdtIHJlYWR5IHRvIHByZXBhcmUgdGhlIHRvb2wgY2FsbCBub3cuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgZm9ybWF0IGlzIGNvcnJlY3Q6IFRoZSBlbmFibGUgY29uZmlndXJhdGlvbnMgYXJlIHN0cmlwcGVkIG9mIHRoZSBgQ09ORklHX2AgcHJlZml4LiBUaGUgZm9jdXMgc3ltYm9sIGlzIHRoYXQgbmV3IGZ1bmN0aW9uLiBJIGhhdmUgYSBjb25jaXNlIGV4cGxhbmF0aW9uIGZvciB0aGUgcmVhc29uaW5nLCBhbmQgdGhlIGBXb3J0aEZ1enppbmdgIGZsYWcgaXMgc2V0IHRvIHRydWUuIFRpbWUgdG8gYXNzZW1ibGUgdGhlIGRhdGEgYW5kIGdldCB0aGlzIGludG8gdGhlIGZ1enplci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjM1NTUsIk91dHB1dFRva2VucyI6MTI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjIyLjYwMTgzMTkxOFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxOTI4NDU3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MjIuNjgzNzY2ODE1WiIsIlNlcSI6MTMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjM5MDU1OTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjIyLjY4NDIxMDkzNVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjMyMzkwMTExODYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbmV3IHNsZWVwYWJsZSBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIEJQRiBzZWxmdGVzdHMuIFRoZSBrZnVuYyBhY2NlcHRzIHByaW1pdGl2ZSBzY2FsYXIgYXJndW1lbnRzIChgbWVtY2dgLCBgc2l6ZWAsIGBzd2FwcGluZXNzYCksIHZhbGlkYXRlcyB0aGUgcGFyYW1ldGVycywgYW5kIGRlbGVnYXRlcyB0byB0aGUgZXhpc3Rpbmcga2VybmVsIHJlY2xhaW0gaW5mcmFzdHJ1Y3R1cmUgdmlhIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLiBcXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XFxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMgb24gc3RhY2sgb3IgaGVhcCBhcmUgaW50cm9kdWNlZCBvciByZWFkLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIGFyZSBzY2FsYXIgdHlwZXMgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdXNlLlxcbjIuIE5vIGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciBmaWVsZHMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGV4cG9zZWQgdmlhIGlvY3Rscy9zeXNmcy9uZXRsaW5rL0JQRiBidWZmZXJzLlxcbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXFxuXFxuVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3N1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjE0OjQ0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtOCw2ICs4LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuKyNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4rXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuIFxuIC8qKlxuQEAgLTE1OSw2ICsxNjEsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMsIGNsYW1wZWQgdG9cbisgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4rICogQHN3YXBwaW5lc3M6IHRoZSByZWNsYWltIHN3YXBwaW5lc3MsIGluIHRoZSByYW5nZVxuKyAqICAgICAgICAgW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0sIHdoZXJlXG4rICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXG4rICogICAgICAgICB0aGUgbWVtY2cncyBvd24gc3dhcHBpbmVzc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqXG4rICogT25seSB0aGUgcmVjbGFpbSB0YXJnZXQgaXMgY2FwcGVkOiBAc2l6ZSBpcyBjbGFtcGVkIHRvXG4rICogTUVNQ0dfQ0hBUkdFX0JBVENILCBmb2xsb3dpbmcgdGhlIHByZWNlZGVudCBvZiBoaWdoX3dvcmtfZnVuYygpLFxuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2ssIHdoaWNoIGJvdW5kcyBlYWNoIHJlY2xhaW1cbisgKiByZXF1ZXN0IHRoZSBzYW1lIHdheS4gVGhlIGFjdHVhbCBzY2FubmluZyB3b3JrIGFuZCBpdHMgZHVyYXRpb25cbisgKiBhcmUgbm90IGJvdW5kZWQuIFRvIHJlY2xhaW0gbW9yZSwgY2FsbCB0aGlzIGtmdW5jIHJlcGVhdGVkbHlcbisgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXG4rICpcbisgKiBUaGUga2Z1bmMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGEgQlBGX1BST0dfVFlQRV9TWVNDQUxMXG4rICogcHJvZ3JhbSwgc3luY2hyb25vdXNseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlXG4rICogcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIG9mIGEgU1lTQ0FMTFxuKyAqIHByb2dyYW0sIHdoaWNoIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgYW5kIGtlZXAgdGhlIFNZU0NBTEwgcHJvZ3JhbVxuKyAqIHR5cGUuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBvbmx5LCBiZWNhdXNlXG4rICogZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgbWF5IHJ1biB3aXRoIGZpbGVzeXN0ZW0gbG9ja3MgaGVsZCBvclxuKyAqIGluIE5PRlMvTk9JTyBjb250ZXh0cywgd2hlcmUgdGhlIHJlY2xhaW0gcGF0aCBjb3VsZCBkZWFkbG9jayBvblxuKyAqIHRob3NlIGxvY2tzIHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbisgKlxuKyAqIEZvciBhc3luY2hyb25vdXMgcmVjbGFpbSBvZiBtb3JlIHRoYW4gb25lIGJhdGNoLCBkcml2aW5nIHRoZVxuKyAqIHJlY2xhaW0gZnJvbSBhIGJwZl93cSBjYWxsYmFjayBpcyByZWNvbW1lbmRlZDogY2FsbCB0aGlzIGtmdW5jXG4rICogb25jZSBwZXIgY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dFxuKyAqIGJhdGNoLCBpbnN0ZWFkIG9mIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjayBhbmQgbW9ub3BvbGl6aW5nIGFcbisgKiB3b3JrcXVldWUgd29ya2VyLCBhbmQgZ2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIHdvcmsgaXRlbSxcbisgKiBhcyBoaWdoX3dvcmtfZnVuYygpIGRvZXMgd2l0aCBvbmUgd29yayBpdGVtIHBlciBtZW1jZy4gV2hldGhlclxuKyAqIHRvIHN1Ym1pdCB0aGUgbmV4dCBiYXRjaCBpcyB1cCB0byB0aGUgQlBGIHByb2dyYW0sIHdoaWNoIGNhbiBzdG9wXG4rICogYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlLCBvciAodW5zaWduZWQgbG9uZyktMSBpZiBAc3dhcHBpbmVzcyBpcyBvdXQgb2ZcbisgKiByYW5nZS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0XHRcdGludCBzd2FwcGluZXNzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcbitcbitcdGlmIChzd2FwcGluZXNzIFx1MDAzYyAtMSB8fCBzd2FwcGluZXNzIFx1MDAzZSBTV0FQUElORVNTX0FOT05fT05MWSlcbitcdFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKS0xO1xuK1xuK1x0aWYgKHNpemUgXHUwMDNjIFBBR0VfU0laRSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG4rXHRcdFx0XHRcdFx0ICAgIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbitcdFx0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyA9PSAtMSA/IE5VTEwgOlxuK1x0XHRcdFx0XHRcdFx0XHQgICAgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rXG4rXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xuK31cbitcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3NCwxOSArMjQ0LDM1IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDM4YjExNjUyMTJjOTQuLjQ0ZTk1ZTg3ZTNjZDkgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNzQsMTEgKzc0LDEzIEBAIHVuc2lnbmVkIGxvbmcgbHJ1dmVjX2xydV9zaXplKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgZW51bSBscnVfbGlzdCBscnUsXG4gXG4gI2RlZmluZSBNRU1DR19SRUNMQUlNX01BWV9TV0FQICgxIFx1MDAzY1x1MDAzYyAxKVxuICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUgKDEgXHUwMDNjXHUwMDNjIDIpXG4tI2RlZmluZSBNSU5fU1dBUFBJTkVTUyAwXG4tI2RlZmluZSBNQVhfU1dBUFBJTkVTUyAyMDBcbitlbnVtIHtcbitcdE1JTl9TV0FQUElORVNTID0gMCxcbitcdE1BWF9TV0FQUElORVNTID0gMjAwLFxuIFxuLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuLSNkZWZpbmUgU1dBUFBJTkVTU19BTk9OX09OTFkgKE1BWF9TV0FQUElORVNTICsgMSlcbitcdC8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuK1x0U1dBUFBJTkVTU19BTk9OX09OTFkgPSBNQVhfU1dBUFBJTkVTUyArIDEsXG4rfTtcbiBcbiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdjN2QyOTliM2IyOGFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSw3NzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcbisgKlxuKyAqIFNldHRpbmcgVEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIPTEgYWRkcyBhIGJhc2VsaW5lIHJ1biBvZiB0aGVcbisgKiB3b3JrbG9hZCB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSB0byBtZW1jZ19hc3luY19yZWNsYWltLCBhbmQgcHJpbnRzXG4rICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxuKyAqIGNncm91cCwgdG8gc3Rkb3V0LlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqL1xuK2VudW0gcmVjbGFpbV9vdXRjb21lIHtcbitcdFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsXG4rXHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcbitcdFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSxcbit9O1xuK1xuK3N0cnVjdCByZWNsYWltX2V2ZW50IHtcbitcdHU2NCBvdXRjb21lO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgNTBcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDR19EWUlOR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1wiXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXCIvdHJpZ2dlclwiXG4rI2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiBcIi90YXJnZXRcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuKy8qXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxuKyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZFxuKyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xuKyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEZcbisgKiBwcm9ncmFtIHJlcG9ydHMgZXZlcnkgcmVjbGFpbSBvdXRjb21lIHRocm91Z2ggdGhlIHJpbmdidWYsIHNvIHRoZVxuKyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKVxuKyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbisgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcbit7XG4rXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuK1xuK1x0aWYgKCFzdGF0ZnMoXCIvdG1wXCIsIFx1MDAyNnN0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4rXHRcdHJldHVybiBcIi5cIjtcbitcdHJldHVybiBcIi90bXBcIjtcbit9XG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4rICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4rICovXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xuK1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4rXHRDSElMRF9FWElUX0pPSU5fQ0dST1VQLFxuK1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuK1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4rXHRDSElMRF9FWElUX1RJTUVfRklMRSxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSlcbit7XG4rXHRzd2l0Y2ggKGNvZGUpIHtcbitcdGNhc2UgQ0hJTERfRVhJVF9PSzpcbitcdFx0cmV0dXJuIFwic3VjY2Vzc1wiO1xuK1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuK1x0XHRyZXR1cm4gXCJqb2luIGNncm91cFwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcbitcdFx0cmV0dXJuIFwicmVhZCBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIHRpbWUgZmlsZVwiO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbitcdCAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuXG4rXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuK1x0ICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHNcbisgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcFxuKyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuKyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjInc1xuKyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbisgKiBhbnkgcGFyZW50IHRoYXQgaGFzIGRvbWFpbiBjaGlsZHJlbi5cbisgKi9cbitzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFNlZSB0aGUgbWF0Y2hpbmcgd3JpdGUgaW4gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygpLiAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdHJpZ2dlcl9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RBUkdFVF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuKy8qXG4rICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxuKyAqIHRlc3QgZmFpbHMsIHNvIGJlbmNobWFyayBudW1iZXJzIGdvIHN0cmFpZ2h0IHRvIHRoZSByZWFsIHN0ZG91dCB0b1xuKyAqIGtlZXAgdGhlbSBmcm9tIGRyb3duaW5nIGluIEFTU0VSVCBvdXRwdXQuXG4rICovXG4rc3RhdGljIHZvaWQgYmVuY2hfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKVxuK3tcbitcdHZhX2xpc3QgYXA7XG4rXG4rXHR2YV9zdGFydChhcCwgZm10KTtcbitcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcbitcdHZhX2VuZChhcCk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRkb3VibGUgYmFzZV9oaWdoX3RpbWUgPSAwLjAsIGJhc2VfbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRpbnQgZXJyLCBiZW5jaDtcbitcbitcdGJlbmNoID0gISFnZXRlbnYoXCJURVNUX01FTUNHX0FTWU5DX1JFQ0xBSU1fQkVOQ0hcIik7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlXG4rXHQgKiBzYW1lIHdvcmtsb2FkIG9uY2Ugd2l0aG91dCB0aGUgQlBGIHByb2dyYW0sIHNvIHRoZSBsb2cgY2FuXG4rXHQgKiByZXBvcnQgaG93IG11Y2ggYXN5bmMgcmVjbGFpbSBpbXByb3ZlZCB0aGUgcHJlc3N1cmVkIGNncm91cC5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKSB7XG4rXHRcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZiYXNlX2hpZ2hfdGltZSwgXHUwMDI2YmFzZV9sb3dfdGltZSxcbitcdFx0XHRcdFx0ICAgIFJFQURfVElNRVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJXG4rXHQgKiBydW5zLCBzbyBpdCBvbmx5IGxvZ3MgdGhlIG51bWJlcnM7IHRoZSBjb3VudGVycyBhYm92ZSBhbHJlYWR5XG4rXHQgKiBwcm92ZWQgdGhhdCB0aGUgQlBGIHByb2dyYW0gcmVjbGFpbWVkIG1lbW9yeS5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKVxuK1x0XHRiZW5jaF9wcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgXCJcbitcdFx0XHQgICAgIFwicmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxcblwiLFxuK1x0XHRcdCAgICAgYmFzZV9oaWdoX3RpbWUsIGJhc2VfbG93X3RpbWUsIGhpZ2hfdGltZSwgbG93X3RpbWUsXG4rXHRcdFx0ICAgICAxMDAuMCAqIChiYXNlX2hpZ2hfdGltZSAtIGhpZ2hfdGltZSkgLyBiYXNlX2hpZ2hfdGltZSk7XG4rXHRlbHNlIGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcblwiLFxuK1x0XHQgICAgICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbitcbisvKlxuKyAqIEtlZXAgcmVmYXVsdHMgZmxvd2luZyB0aHJvdWdoIHRoZSB0cmlnZ2VyIGNncm91cCBzbyByZWNsYWltIHJvdW5kc1xuKyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuKyAqIGNoaWxkIGpvaW5zIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgd3JpdGVzIHRoZSBkYXRhIGZpbGUgdGhlcmUsIHNvXG4rICogdGhhdCB0aGUgZmlsZSBwYWdlcyBhcmUgY2hhcmdlZCB0byB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIGFjdHVhbGx5XG4rICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuKyAqIHVudGlsIGl0IGlzIGtpbGxlZC5cbisgKi9cbitzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4re1xuK1x0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0aWYgKHBpZCAhPSAwKVxuK1x0XHRyZXR1cm4gcGlkO1xuK1xuK1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApO1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbitcdFx0X2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTtcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuK1x0XHRcdF9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTtcbitcdH1cbit9XG4rXG4rLyogUmVjbGFpbSBvdXRjb21lcyBvYnNlcnZlZCBzbyBmYXIsIHRhbGxpZWQgZnJvbSByaW5nYnVmIGV2ZW50cy4gKi9cbitzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7XG4rXHRpbnQgY2FsbGVkO1xuK1x0aW50IHNraXBwZWRfZHlpbmc7XG4rXHRpbnQgdGFyZ2V0X2dvbmU7XG4rfTtcbitcbitzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opXG4re1xuK1x0c3RydWN0IHJlY2xhaW1fZXZlbnRzX3NlZW4gKnNlZW4gPSBjdHg7XG4rXHRjb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhO1xuK1xuK1x0aWYgKHN6IFx1MDAzYyBzaXplb2YoKmV2KSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRzd2l0Y2ggKGV2LVx1MDAzZW91dGNvbWUpIHtcbitcdGNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDpcbitcdFx0c2Vlbi1cdTAwM2VjYWxsZWQrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HOlxuK1x0XHRzZWVuLVx1MDAzZXNraXBwZWRfZHlpbmcrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORTpcbitcdFx0c2Vlbi1cdTAwM2V0YXJnZXRfZ29uZSsrO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXG4rICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZlxuKyAqIHJlY2xhaW1pbmcgZnJvbSBpdC5cbisgKlxuKyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kXG4rICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZyxcbisgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxuKyAqIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcbisgKiBTS0lQUEVEX0RZSU5HIG9yIFRBUkdFVF9HT05FIGV2ZW50cyB3aGlsZSByZWNsYWltX2NhbGxzIGFuZFxuKyAqIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiBzZWVuID0ge307XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcbitcdHBpZF90IHJlYWRlcl9waWQgPSAtMTtcbitcdGludCBlcnIsIGZkLCBpO1xuK1xuK1x0ZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcyhcdTAwMjZ0cmlnZ2VyX2Nncm91cF9pZCwgXHUwMDI2dGFyZ2V0X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfZHlpbmdfY2dyb3Vwc1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yZWNsYWltX2V2ZW50cyksXG4rXHRcdFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXHUwMDI2c2VlbiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocmIsIFwicmluZ19idWZmZXJfX25ld1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcIiwgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuK1x0ZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNsb3NlKGZkKTtcbitcbitcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcImZvcmsga2VlcGFsaXZlIHJlYWRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2ICFzZWVuLmNhbGxlZDsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgXCJyZWNsYWltIGV2ZW50c1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZCB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc2Vlbi5za2lwcGVkX2R5aW5nIFx1MDAyNlx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXNlZW4uc2tpcHBlZF9keWluZyBcdTAwMjZcdTAwMjYgIXNlZW4udGFyZ2V0X2dvbmUpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpXCIsXG4rXHRcdFx0ICAgc2Vlbi50YXJnZXRfZ29uZSwgc2Vlbi5za2lwcGVkX2R5aW5nKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIHRoZXkgaGFwcGVuIGlzIHRpbWluZ1xuK1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4rXHQgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLlxuK1x0ICovXG4rXHRwcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltX2R5aW5nOiBza2lwcyBvbiByZW1vdmVkIGNncm91cDogZ29uZT0lZCwgZHlpbmc9JWRcXG5cIixcbitcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuK1xuK1x0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxuK1x0XHQgICAgICAgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK291dDpcbitcdGlmIChyZWFkZXJfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XG4rXHRcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XG4rXHR9XG4rXHRpZiAoZGF0YV9maWxlWzBdKVxuK1x0XHR1bmxpbmsoZGF0YV9maWxlKTtcbitcdGlmIChyYilcbitcdFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMxOGJlYjY0MTZkMzBcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjg4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuKy8qXG4rICogT3V0Y29tZSBvZiBhIHNpbmdsZSByZWNsYWltIGF0dGVtcHQsIHJlcG9ydGVkIHRvIHVzZXJzcGFjZSB0aHJvdWdoXG4rICogdGhlIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYgc28gdGVzdHMgY2FuIHdhaXQgZm9yIHJlY2xhaW0gZXZlbnRzIHdpdGhcbisgKiBhIHRpbWVvdXQgaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBjb3VudGVycyBhYm92ZS5cbisgKi9cbitlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XG4rXHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxuK1x0UkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsXG4rXHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXG4rfTtcbitcbitzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XG4rXHRfX3U2NCBvdXRjb21lO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEgXHUwMDNjXHUwMDNjIDE2KTtcbit9IHJlY2xhaW1fZXZlbnRzIFNFQyhcIi5tYXBzXCIpO1xuK1xuKy8qXG4rICogUmVwb3J0cyBhcmUgYmVzdCBlZmZvcnQ6IHdoZW4gdGhlIHJpbmdidWYgaXMgZnVsbCwgZm9yIGV4YW1wbGUgd2hlblxuKyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC5cbisgKi9cbitzdGF0aWMgdm9pZCBlbWl0X3JlY2xhaW1fZXZlbnQoZW51bSByZWNsYWltX291dGNvbWUgb3V0Y29tZSlcbit7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXY7XG4rXG4rXHRldiA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTtcbitcdGlmICghZXYpXG4rXHRcdHJldHVybjtcbitcbitcdGV2LVx1MDAzZW91dGNvbWUgPSBvdXRjb21lO1xuK1x0YnBmX3JpbmdidWZfc3VibWl0KGV2LCAwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4rXHRcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcbitcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuKy8qXG4rICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvclxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4rICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFja1xuKyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlblxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuKyAqIHRoZSBsb29rdXAgZmFpbGluZy5cbisgKlxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuKyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0b1xuKyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXG4rICogdGhlIHZhbHVlcyBhbHJlYWR5IG1hdGNoIHRoZSB0YXJnZXQga2VybmVsLlxuKyAqL1xuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxuK3tcbitcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbitcbitcdHJldHVybiAoZmxhZ3MgXHUwMDI2IENTU19EWUlORykgfHwgIShmbGFncyBcdTAwMjYgQ1NTX09OTElORSk7XG4rfVxuK1xuKy8qXG4rICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgcmVjbGFpbWVkLCBvciAwIGlmIHRoZSBjZ3JvdXAgaXMgZHlpbmcgb3IgZ29uZSBvciBub3RoaW5nIHdhc1xuKyAqIHJlY2xhaW1lZC4gRWFjaCBhdHRlbXB0IHJlcG9ydHMgaXRzIG91dGNvbWUgdGhyb3VnaCB0aGVcbisgKiByZWNsYWltX2V2ZW50cyByaW5nYnVmLlxuKyAqL1xuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdHU2NCBuciA9IDA7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKSB7XG4rXHRcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HKTtcbitcdFx0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0cmVjbGFpbV9jYWxscysrO1xuK1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUsIC0xKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MjIuNjg0MjEzNTA1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY5MDQ4MzE4ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gRnV6emluZyBFdmFsdWF0aW9uIGZvciBUaGlzIFBhdGNoIFNlcmllcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBuZWVkIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBmb3IgdGhpcyBwYXRjaCBzZXJpZXMuIFdlJ3JlIGxvb2tpbmcgYXQgY29kZSBjaGFuZ2VzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgYG1tL2ludGVybmFsLmhgLCBhbmQgc29tZSBzZWxmdGVzdHMuXG5cbkZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYWN0dWFsbHkgKmhhcHBlbmluZyogaGVyZS4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgdGhlIGFkZGl0aW9uIG9mIGEgbmV3IGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCB0YWtlcyBhIGBtZW1fY2dyb3VwYCwgYSBzaXplLCBhbmQgYSBgc3dhcHBpbmVzc2AgdmFsdWUsIGRvZXMgc29tZSBzaXplIGFuZCBzd2FwcGluZXNzIGNoZWNraW5nLCBjYWxjdWxhdGVzIGEgbnVtYmVyIG9mIHBhZ2VzLCBhbmQgdGhlbiBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgd2l0aCB0aGUgYEtGX1NMRUVQQUJMRWAgZmxhZywgd2hpY2ggaXMgZ29vZCB0byBub3RlLiBUaGUgYGludGVybmFsLmhgIGNoYW5nZXMganVzdCBsb29rIGxpa2UgYSBjb252ZXJzaW9uIGZyb20gZGVmaW5lcyB0byBhbiBlbnVtIGZvciBzd2FwcGluZXNzIHZhbHVlcy4gQW5kIHdlJ3ZlIGdvdCBhIG5ldyBzZWxmdGVzdCBzdWl0ZSBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmYCB0aGF0IGFyZSBnb2luZyB0byBiZSB2ZXJpZnlpbmcgdGhpcy5cblxuTXkgcHJpbWFyeSBjb25jZXJuIGlzIGhvdyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgYW5kIHNwZWNpZmljYWxseSBob3cgdGhlIGBzd2FwcGluZXNzYCBhcmd1bWVudCB3b3JrcyBhbmQgaXMgdXNlZC4gR2l2ZW4gdGhpcyBpcyBuZXcga2Z1bmMgYW5kIGNvdWxkIGJlIGV4cG9zZWQgaW4gdXNlciBzcGFjZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0J3MgaW50ZWdyYXRlZCB0byBtYWtlIHN1cmUgdGhlcmUncyBubyBzdWJ0bGUgaXNzdWUgdGhhdCBLTVNBTiBtaWdodCBjYXRjaCwgYW5kIHRoYXQncyBwcm9iYWJseSB0aGUgbW9zdCBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoaXMgcGF0Y2ggc2VyaWVzIGZvciBub3cuIEkgbmVlZCB0byBkaWcgaW50byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgaXRzZWxmLiBBIHF1aWNrIGdyZXBwZXIgc2VhcmNoIHNob3VsZCBkbyB0aGUgdHJpY2ssIG9yIEkgY2FuIGp1c3QgY2hlY2sgdGhlIGNvZGUgaXRzZWxmLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTUyMCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjI5LjU4OTA0ODg4NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTAxNTUyNjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vYnBmX21lbWNvbnRyb2wuYz0yMDc9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMjEtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyMjI6XFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMjMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgIEdGUF9LRVJORUwsXFxuLS1cXG5tbS9pbnRlcm5hbC5oPTc3PWVudW0ge1xcbi0tXFxubW0vaW50ZXJuYWwuaC04NC1cXG5tbS9pbnRlcm5hbC5oOjg1OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vaW50ZXJuYWwuaC04Ni1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE3NzE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE4MTUtXFxubW0vbWVtY29udHJvbC12MS5jOjE4MTY6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODE3LVxcdFxcdFxcdFxcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTgzND1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE4NTEtXFxubW0vbWVtY29udHJvbC12MS5jOjE4NTI6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODUzLVxcdFxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjM3OD1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWNsYWltX2hpZ2goc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIzOTMtXFx0XFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyMzk0OlxcdFxcdG5yX3JlY2xhaW1lZCArPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjM5NS1cXHRcXHRcXHRcXHRcXHRcXHRcXHRnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yNjQ1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTI3MTctXFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyNzE4OlxcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxcbm1tL21lbWNvbnRyb2wuYy0yNzE5LVxcdFxcdFxcdFxcdFxcdFxcdCAgICBnZnBfbWFzaywgcmVjbGFpbV9vcHRpb25zLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00ODM4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODc5LVxcbm1tL21lbWNvbnRyb2wuYzo0ODgwOlxcdFxcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcXG5tbS9tZW1jb250cm9sLmMtNDg4MS1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00ODk3PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9tYXhfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQ5MzgtXFx0XFx0aWYgKG5yX3JlY2xhaW1zKSB7XFxubW0vbWVtY29udHJvbC5jOjQ5Mzk6XFx0XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcXG5tbS9tZW1jb250cm9sLmMtNDk0MC1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcXG4tLVxcbm1tL3Ztc2Nhbi5jPTY4MTU9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4NTQtXFxubW0vdm1zY2FuLmM6Njg1NTp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY4NTYtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4OTUtI2Vsc2VcXG5tbS92bXNjYW4uYzo2ODk2OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1zY2FuLmMtNjg5Ny1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vdm1zY2FuLmM9Nzk1OD1pbnQgdXNlcl9wcm9hY3RpdmVfcmVjbGFpbShjaGFyICpidWYsXFxuLS1cXG5tbS92bXNjYW4uYy04MDI5LVxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XFxubW0vdm1zY2FuLmM6ODAzMDpcXHRcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTgwMzEtXFx0XFx0XFx0XFx0XFx0XFx0IGJhdGNoX3NpemUsIGdmcF9tYXNrLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNToyOS42MzkyMDc3ODZaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzQ1NzgzNjM0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJIHdlcmUgdGhpbmtpbmcgdGhyb3VnaCB0aGUgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AqKlxuXG5Pa2F5LCBzbyBJJ20gZm9jdXNpbmcgaW4gb24gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIHdpdGhpbiBgbW0vdm1zY2FuLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQgd2hlbiBpdCBjb21lcyB0byBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBjZ3JvdXBzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGtlcm5lbCBpcyAqYWN0dWFsbHkqIGF0dGVtcHRpbmcgdG8gcmVjbGFpbSBtZW1vcnkgZnJvbSBhIHNwZWNpZmljIGNncm91cC4gSSB3YW50IHRvIHNlZSBleGFjdGx5IHdoYXQgc3RlcHMgYXJlIHRha2VuIHRvIGZyZWUgdXAgcGFnZXMgd2l0aGluIHRoYXQgY2dyb3VwJ3MgYWxsb2NhdGVkIG1lbW9yeS4gSSBzdXNwZWN0IHRoZXJlIGFyZSBzb21lIGNydWNpYWwgb3B0aW1pemF0aW9ucyBvciBsb2NraW5nIHN0cmF0ZWdpZXMgYXQgcGxheSBoZXJlLCBhbmQgSSdtIGVhZ2VyIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiB0aGUgbWVjaGFuaWNzIGludm9sdmVkLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZSByZWNsYWltIHByb2Nlc3MgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIHdoYXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIG9yIGFyZWFzIGZvciBpbXByb3ZlbWVudCBtaWdodCBleGlzdC4gVGhpcyBzaG91bGQgYWxzbyBoZWxwIG1lIHVuZGVyc3RhbmQgaG93IGVmZmVjdGl2ZSB0aGUgbWVtb3J5IGNncm91cCBsaW1pdHMgcmVhbGx5IGFyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc3MzgsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTozMy4wOTcwNDY5MloiLCJTZXEiOjE4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDc2NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vdm1zY2FuLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjg1MCxcbiAgXCJMaW5lQ291bnRcIjogNDVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNjg1MDpcXHRcXHQqbnJfc2Nhbm5lZCA9IHNjLm5yX3NjYW5uZWQ7XFxuNjg1MTpcXHRcXG42ODUyOlxcdFxcdHJldHVybiBzYy5ucl9yZWNsYWltZWQ7XFxuNjg1MzpcXHR9XFxuNjg1NDpcXHRcXG42ODU1OlxcdHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuNjg1NjpcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbjY4NTc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgZ2ZwX3QgZ2ZwX21hc2ssXFxuNjg1ODpcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBpbnQgcmVjbGFpbV9vcHRpb25zLFxcbjY4NTk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgaW50ICpzd2FwcGluZXNzKVxcbjY4NjA6XFx0e1xcbjY4NjE6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XFxuNjg2MjpcXHRcXHR1bnNpZ25lZCBpbnQgbm9yZWNsYWltX2ZsYWc7XFxuNjg2MzpcXHRcXHRzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0ge1xcbjY4NjQ6XFx0XFx0XFx0Lm5yX3RvX3JlY2xhaW0gPSBtYXgobnJfcGFnZXMsIFNXQVBfQ0xVU1RFUl9NQVgpLFxcbjY4NjU6XFx0XFx0XFx0LnByb2FjdGl2ZV9zd2FwcGluZXNzID0gc3dhcHBpbmVzcyxcXG42ODY2OlxcdFxcdFxcdC5nZnBfbWFzayA9IChjdXJyZW50X2dmcF9jb250ZXh0KGdmcF9tYXNrKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spIHxcXG42ODY3OlxcdFxcdFxcdFxcdFxcdChHRlBfSElHSFVTRVJfTU9WQUJMRSBcXHUwMDI2IH5HRlBfUkVDTEFJTV9NQVNLKSxcXG42ODY4OlxcdFxcdFxcdC5yZWNsYWltX2lkeCA9IE1BWF9OUl9aT05FUyAtIDEsXFxuNjg2OTpcXHRcXHRcXHQudGFyZ2V0X21lbV9jZ3JvdXAgPSBtZW1jZyxcXG42ODcwOlxcdFxcdFxcdC5wcmlvcml0eSA9IERFRl9QUklPUklUWSxcXG42ODcxOlxcdFxcdFxcdC5tYXlfd3JpdGVwYWdlID0gMSxcXG42ODcyOlxcdFxcdFxcdC5tYXlfdW5tYXAgPSAxLFxcbjY4NzM6XFx0XFx0XFx0Lm1heV9zd2FwID0gISEocmVjbGFpbV9vcHRpb25zIFxcdTAwMjYgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCksXFxuNjg3NDpcXHRcXHRcXHQucHJvYWN0aXZlID0gISEocmVjbGFpbV9vcHRpb25zIFxcdTAwMjYgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUpLFxcbjY4NzU6XFx0XFx0fTtcXG42ODc2OlxcdFxcdC8qXFxuNjg3NzpcXHRcXHQgKiBUcmF2ZXJzZSB0aGUgWk9ORUxJU1RfRkFMTEJBQ0sgem9uZWxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSB0byBwdXRcXG42ODc4OlxcdFxcdCAqIGVxdWFsIHByZXNzdXJlIG9uIGFsbCB0aGUgbm9kZXMuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxcbjY4Nzk6XFx0XFx0ICogdGhlIHJlY2xhaW0gZG9lcyBub3QgYmFpbCBvdXQgZWFybHkuXFxuNjg4MDpcXHRcXHQgKi9cXG42ODgxOlxcdFxcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLCBzYy5nZnBfbWFzayk7XFxuNjg4MjpcXHRcXG42ODgzOlxcdFxcdHNldF90YXNrX3JlY2xhaW1fc3RhdGUoY3VycmVudCwgXFx1MDAyNnNjLnJlY2xhaW1fc3RhdGUpO1xcbjY4ODQ6XFx0XFx0dHJhY2VfbW1fdm1zY2FuX21lbWNnX3JlY2xhaW1fYmVnaW4oc2MuZ2ZwX21hc2ssIDAsIG1lbWNnKTtcXG42ODg1OlxcdFxcdG5vcmVjbGFpbV9mbGFnID0gbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKTtcXG42ODg2OlxcdFxcbjY4ODc6XFx0XFx0bnJfcmVjbGFpbWVkID0gZG9fdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZWxpc3QsIFxcdTAwMjZzYyk7XFxuNjg4ODpcXHRcXG42ODg5OlxcdFxcdG1lbWFsbG9jX25vcmVjbGFpbV9yZXN0b3JlKG5vcmVjbGFpbV9mbGFnKTtcXG42ODkwOlxcdFxcdHRyYWNlX21tX3Ztc2Nhbl9tZW1jZ19yZWNsYWltX2VuZChucl9yZWNsYWltZWQsIG1lbWNnKTtcXG42ODkxOlxcdFxcdHNldF90YXNrX3JlY2xhaW1fc3RhdGUoY3VycmVudCwgTlVMTCk7XFxuNjg5MjpcXHRcXG42ODkzOlxcdFxcdHJldHVybiBucl9yZWNsYWltZWQ7XFxuNjg5NDpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjMzLjA5NzY1NzEzWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxOTc2NjQ0ODQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBQYXRjaCBmb3IgS01TQU4gUmVsZXZhbmNlKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIHdoaWNoIHRha2VzIGEgZmV3IHNjYWxhciBhcmd1bWVudHM6IGBtZW1jZ2AsIGBzaXplYCwgYW5kIGBzd2FwcGluZXNzYC4gSSd2ZSBjaGVja2VkIHRoYXQgaXQgdmFsaWRhdGVzIHRoZXNlIGlucHV0cywgc3BlY2lmaWNhbGx5IHRoZSBgc3dhcHBpbmVzc2AgcmFuZ2UgYW5kIGEgbWluaW11bSBgc2l6ZWAsIGJlZm9yZSBjYWxsaW5nIHRoZSBleGlzdGluZyBtZW1vcnkgcmVjbGFpbSBmdW5jdGlvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYC4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gdW5zaWduZWQgbG9uZy5cblxuQ3J1Y2lhbGx5LCB0aGVyZSdzIG5vIG5ldyB1c2VyLXNwYWNlIGNvcHkgaW52b2x2ZWQsIG5vIHN0cnVjdHMgYmVpbmcgc2VudCwgYW5kIG5vIHNpZ25zIG9mIHVuaW5pdGlhbGl6ZWQgYWxsb2NhdGlvbnMuIFRoZSBzZWxmdGVzdHMgYWRkZWQgYXJlIGFsbCB1c2VyLXNwYWNlIHRlc3RzLCB3aGljaCBpcyBmaW5lLlxuXG5Ob3csIGxldCdzIGdvIHRocm91Z2ggdGhlIEtNU0FOIGNoZWNrbGlzdCBtZXRpY3Vsb3VzbHkuXG5cbiogICBEb2VzIHRoaXMgZXhwb3NlIG5ldyBvciBtb2RpZmllZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2UgKHRocm91Z2ggdGhlIHVzdWFsIHN1c3BlY3RzIGxpa2UgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGV0Yy4pIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG1pZ2h0IGJlIGEgcHJvYmxlbT8gTm8sIGFic29sdXRlbHkgbm90LiBUaGUgYXJndW1lbnRzIGFyZSBhbGwgc2NhbGFycywgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMganVzdCBhbiBgdW5zaWduZWQgbG9uZ2AuXG4qICAgRG9lcyBpdCB1c2UgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOb3BlLiBFdmVyeXRoaW5nIGlzIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgZnVuY3Rpb24uXG4qICAgQXJlIHRoZXJlIGFueSBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBjcmVhdGVkIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/IE5vLlxuKiAgIERvZXMgaXQgbWVzcyB3aXRoIGFueSBib3VuZHMgY2hlY2tzIHRoYXQgY291bGQgbGVhZCB0byByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby5cblxuVGhlIG9ubHkgcG90ZW50aWFsIGlzc3VlcyBoZXJlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgb2Yga2VybmVsIHByb2dyYW1taW5nOiBkZWFkbG9jaywgc2xlZXBpbmcgaW4gYXRvbWljIGNvbnRleHQsIGludmFsaWQgcG9pbnRlcnMsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBldGMuIEJ1dCB0aG9zZSBhcmUgY292ZXJlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLCB3aGljaCBhcmUgbm90IHJlbGV2YW50IHRvIEtNU0FOLiBUaGlzIGxvb2tzIHByZXR0eSBjbGVhbiBmcm9tIGEgbWVtb3J5LXNhZmV0eSBwZXJzcGVjdGl2ZS5cblxuVG8gYmUgY29tcGxldGVseSB0aG9yb3VnaCwgbGV0J3Mgc3VtbWFyaXplIHRoZSBwb2ludHM6XG5cbiogICBUaGUgcGF0Y2ggaW50cm9kdWNlcyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgYSBzbGVlcGFibGUgQlBGIGtmdW5jLCBhbG9uZyB3aXRoIEJQRiBzZWxmdGVzdHMuXG4qICAgQWxsIHZhcmlhYmxlcyB1c2VkIChgbnJfcmVjbGFpbWVkYCwgYG5yX3BhZ2VzYCwgYHN3YXBwaW5lc3NgLCBgc2l6ZWApIGFyZSBzY2FsYXIgcHJpbWl0aXZlcy4gVGhleSBhcmUgYWxsIGluaXRpYWxpemVkIGJ5IHZhbHVlLlxuKiAgIE5vIGtlcm5lbC10by11c2VyIG1lbW9yeSBjb3B5IGludGVyZmFjZXMgYXJlIGFkZGVkIG9yIG1vZGlmaWVkLlxuKiAgIEV4aXN0aW5nIHJvdXRpbmVzIGFyZSB1c2VkIHdpdGggcHJvcGVybHkgaW5pdGlhbGl6ZWQgcGFyYW1ldGVycy5cbiogICBBbnkgcG90ZW50aWFsIGZhaWx1cmUgbW9kZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgZGV0ZWN0b3JzLlxuKiAgIFRoZXJlZm9yZSwgbm8gS01TQU4gaXMgbmVlZGVkLCBhcyB0aGVyZSdzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MuIEknbSBzYXRpc2ZpZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4ODE5LCJPdXRwdXRUb2tlbnMiOjI1NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjU1LjA3NDMwNTYyNVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIG5ldyBzbGVlcGFibGUgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKWAgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBCUEYgc2VsZnRlc3RzLiBUaGUga2Z1bmMgYWNjZXB0cyBwcmltaXRpdmUgc2NhbGFyIGFyZ3VtZW50cyAoYG1lbWNnYCwgYHNpemVgLCBgc3dhcHBpbmVzc2ApLCB2YWxpZGF0ZXMgdGhlIHBhcmFtZXRlcnMsIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIGV4aXN0aW5nIGtlcm5lbCByZWNsYWltIGluZnJhc3RydWN0dXJlIHZpYSBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYC4gXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzOlxcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zIG9uIHN0YWNrIG9yIGhlYXAgYXJlIGludHJvZHVjZWQgb3IgcmVhZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyBhcmUgc2NhbGFyIHR5cGVzIGluaXRpYWxpemVkIHByaW9yIHRvIHVzZS5cXG4yLiBObyBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgZmllbGRzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBleHBvc2VkIHZpYSBpb2N0bHMvc3lzZnMvbmV0bGluay9CUEYgYnVmZmVycy5cXG4zLiBQb3RlbnRpYWwgY29uY3VycmVuY3ksIGxvY2tpbmcsIG9yIG1lbW9yeS1zYWZldHkgYnVncyAoZS5nLiBzbGVlcGFibGUga2Z1bmMgY29udGV4dCByZXF1aXJlbWVudHMsIGNncm91cCBwb2ludGVyIHZhbGlkaXR5LCBsb2NraW5nIGRlYWRsb2NrcykgYXJlIG1vbml0b3JlZCBieSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZmFjaWxpdGllcyAoS0FTQU4sIExPQ0tERVAsIFBST1ZFX0xPQ0tJTkcpLlxcblxcblRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBuZXcgc2xlZXBhYmxlIEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgQlBGIHNlbGZ0ZXN0cy4gVGhlIGtmdW5jIGFjY2VwdHMgcHJpbWl0aXZlIHNjYWxhciBhcmd1bWVudHMgKGBtZW1jZ2AsIGBzaXplYCwgYHN3YXBwaW5lc3NgKSwgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzLCBhbmQgZGVsZWdhdGVzIHRvIHRoZSBleGlzdGluZyBrZXJuZWwgcmVjbGFpbSBpbmZyYXN0cnVjdHVyZSB2aWEgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcXG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBzdGFjayBvciBoZWFwIGFyZSBpbnRyb2R1Y2VkIG9yIHJlYWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXJlIHNjYWxhciB0eXBlcyBpbml0aWFsaXplZCBwcmlvciB0byB1c2UuXFxuMi4gTm8gZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZCB2aWEgaW9jdGxzL3N5c2ZzL25ldGxpbmsvQlBGIGJ1ZmZlcnMuXFxuMy4gUG90ZW50aWFsIGNvbmN1cnJlbmN5LCBsb2NraW5nLCBvciBtZW1vcnktc2FmZXR5IGJ1Z3MgKGUuZy4gc2xlZXBhYmxlIGtmdW5jIGNvbnRleHQgcmVxdWlyZW1lbnRzLCBjZ3JvdXAgcG9pbnRlciB2YWxpZGl0eSwgbG9ja2luZyBkZWFkbG9ja3MpIGFyZSBtb25pdG9yZWQgYnkgc3RhbmRhcmQgZGVidWdnaW5nIGZhY2lsaXRpZXMgKEtBU0FOLCBMT0NLREVQLCBQUk9WRV9MT0NLSU5HKS5cXG5cXG5UaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowzxspf[0].run-triage(0) Phase: Succeeded StartedAt: 2026-09-11 02:27:26 +0000 UTC FinishedAt: 2026-09-11 03:15:56 +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": "af0b84a9215d951d16f26b7ee34353b970cf5d4e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "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": "af0b84a9215d951d16f26b7ee34353b970cf5d4e", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "BPF_SYSCALL", "MEMCG", "DEBUG_INFO_BTF" ], "series_id": "1abb9a8a-0600-40ab-a2ba-9c7fae077cb0" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "bpf_proactive_reclaim" ], "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+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE0PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O0JQRl9TWVNDQUxMJiMzNDssCiAgICAmIzM0O01FTUNHJiMzNDssCiAgICAmIzM0O0RFQlVHX0lORk9fQlRGJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7YnBmX3Byb2FjdGl2ZV9yZWNsYWltJiMzNDsKICBdLAogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggYWRkcyBhIG5ldyBzbGVlcGFibGUgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKWAgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBCUEYgc2VsZnRlc3RzLiBUaGUga2Z1bmMgYWNjZXB0cyBwcmltaXRpdmUgc2NhbGFyIGFyZ3VtZW50cyAoYG1lbWNnYCwgYHNpemVgLCBgc3dhcHBpbmVzc2ApLCB2YWxpZGF0ZXMgdGhlIHBhcmFtZXRlcnMsIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIGV4aXN0aW5nIGtlcm5lbCByZWNsYWltIGluZnJhc3RydWN0dXJlIHZpYSBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYC4gXG5cblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zIG9uIHN0YWNrIG9yIGhlYXAgYXJlIGludHJvZHVjZWQgb3IgcmVhZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyBhcmUgc2NhbGFyIHR5cGVzIGluaXRpYWxpemVkIHByaW9yIHRvIHVzZS5cbjIuIE5vIGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciBmaWVsZHMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGV4cG9zZWQgdmlhIGlvY3Rscy9zeXNmcy9uZXRsaW5rL0JQRiBidWZmZXJzLlxuMy4gUG90ZW50aWFsIGNvbmN1cnJlbmN5LCBsb2NraW5nLCBvciBtZW1vcnktc2FmZXR5IGJ1Z3MgKGUuZy4gc2xlZXBhYmxlIGtmdW5jIGNvbnRleHQgcmVxdWlyZW1lbnRzLCBjZ3JvdXAgcG9pbnRlciB2YWxpZGl0eSwgbG9ja2luZyBkZWFkbG9ja3MpIGFyZSBtb25pdG9yZWQgYnkgc3RhbmRhcmQgZGVidWdnaW5nIGZhY2lsaXRpZXMgKEtBU0FOLCBMT0NLREVQLCBQUk9WRV9MT0NLSU5HKS5cblxuVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGluIG1tL2JwZl9tZW1jb250cm9sLmMsIGV4cG9zaW5nIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gZnVuY3Rpb25hbGl0eSB0byBzbGVlcGFibGUgQlBGIHN5c2NhbGwgcHJvZ3JhbXMuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBsb2dpYyBhbmQgaXMgcmVhY2hhYmxlIHZpYSBCUEYgcHJvZ3JhbSBleGVjdXRpb24uJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MS8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPnJlYWQtcGF0Y2gtZGlmZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O1BhdGNoRGlmZiYjMzQ7OiAmIzM0O2NvbW1pdCBjZWM4NTM5YjhlMjEzYWY2ZjI1YjhlZGZmZjdjNjI4Y2VmYzY3MDc3XG5BdXRob3I6IHN5ei1jbHVzdGVyIFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXHUwMDNlXG5EYXRlOiAgIEZyaSBTZXAgMTEgMDM6MTQ6NDQgMjAyNiAmIzQzOzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4mIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtOCw2ICYjNDM7OCw4IEBAXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4gI2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiBcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7aW50ZXJuYWwuaFwmIzM0O1xuJiM0MztcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XG4gXG4gLyoqXG5AQCAtMTU5LDYgJiM0MzsxNjEsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4mIzQzOy8qKlxuJiM0MzsgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XG4mIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cbiYjNDM7ICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xuJiM0MzsgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4mIzQzOyAqIEBzd2FwcGluZXNzOiB0aGUgcmVjbGFpbSBzd2FwcGluZXNzLCBpbiB0aGUgcmFuZ2VcbiYjNDM7ICogICAgICAgICBbTUlOX1NXQVBQSU5FU1MsIFNXQVBQSU5FU1NfQU5PTl9PTkxZXSwgd2hlcmVcbiYjNDM7ICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXG4mIzQzOyAqICAgICAgICAgdGhlIG1lbWNnJiMzOTtzIG93biBzd2FwcGluZXNzXG4mIzQzOyAqXG4mIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG9cbiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuXG4mIzQzOyAqXG4mIzQzOyAqIE9ubHkgdGhlIHJlY2xhaW0gdGFyZ2V0IGlzIGNhcHBlZDogQHNpemUgaXMgY2xhbXBlZCB0b1xuJiM0MzsgKiBNRU1DR19DSEFSR0VfQkFUQ0gsIGZvbGxvd2luZyB0aGUgcHJlY2VkZW50IG9mIGhpZ2hfd29ya19mdW5jKCksXG4mIzQzOyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2ssIHdoaWNoIGJvdW5kcyBlYWNoIHJlY2xhaW1cbiYjNDM7ICogcmVxdWVzdCB0aGUgc2FtZSB3YXkuIFRoZSBhY3R1YWwgc2Nhbm5pbmcgd29yayBhbmQgaXRzIGR1cmF0aW9uXG4mIzQzOyAqIGFyZSBub3QgYm91bmRlZC4gVG8gcmVjbGFpbSBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseVxuJiM0MzsgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXG4mIzQzOyAqXG4mIzQzOyAqIFRoZSBrZnVuYyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gYSBCUEZfUFJPR19UWVBFX1NZU0NBTExcbiYjNDM7ICogcHJvZ3JhbSwgc3luY2hyb25vdXNseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlXG4mIzQzOyAqIHByb2dyYW0sIG9yIGZyb20gdGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyBvZiBhIFNZU0NBTExcbiYjNDM7ICogcHJvZ3JhbSwgd2hpY2ggcnVuIGluIHByb2Nlc3MgY29udGV4dCBhbmQga2VlcCB0aGUgU1lTQ0FMTCBwcm9ncmFtXG4mIzQzOyAqIHR5cGUuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBvbmx5LCBiZWNhdXNlXG4mIzQzOyAqIGdlbmVyaWMgc2xlZXBhYmxlIHByb2dyYW1zIG1heSBydW4gd2l0aCBmaWxlc3lzdGVtIGxvY2tzIGhlbGQgb3JcbiYjNDM7ICogaW4gTk9GUy9OT0lPIGNvbnRleHRzLCB3aGVyZSB0aGUgcmVjbGFpbSBwYXRoIGNvdWxkIGRlYWRsb2NrIG9uXG4mIzQzOyAqIHRob3NlIGxvY2tzIHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbiYjNDM7ICpcbiYjNDM7ICogRm9yIGFzeW5jaHJvbm91cyByZWNsYWltIG9mIG1vcmUgdGhhbiBvbmUgYmF0Y2gsIGRyaXZpbmcgdGhlXG4mIzQzOyAqIHJlY2xhaW0gZnJvbSBhIGJwZl93cSBjYWxsYmFjayBpcyByZWNvbW1lbmRlZDogY2FsbCB0aGlzIGtmdW5jXG4mIzQzOyAqIG9uY2UgcGVyIGNhbGxiYWNrIGFuZCByZXF1ZXVlIHRoZSBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHRcbiYjNDM7ICogYmF0Y2gsIGluc3RlYWQgb2YgbG9vcGluZyBpbnNpZGUgdGhlIGNhbGxiYWNrIGFuZCBtb25vcG9saXppbmcgYVxuJiM0MzsgKiB3b3JrcXVldWUgd29ya2VyLCBhbmQgZ2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIHdvcmsgaXRlbSxcbiYjNDM7ICogYXMgaGlnaF93b3JrX2Z1bmMoKSBkb2VzIHdpdGggb25lIHdvcmsgaXRlbSBwZXIgbWVtY2cuIFdoZXRoZXJcbiYjNDM7ICogdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYgcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3BcbiYjNDM7ICogYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpc1xuJiM0MzsgKiBzbWFsbGVyIHRoYW4gYSBwYWdlLCBvciAodW5zaWduZWQgbG9uZyktMSBpZiBAc3dhcHBpbmVzcyBpcyBvdXQgb2ZcbiYjNDM7ICogcmFuZ2UuXG4mIzQzOyAqL1xuJiM0MztfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4mIzQzO1x0XHRcdFx0XHRcdHVuc2lnbmVkIGxvbmcgc2l6ZSxcbiYjNDM7XHRcdFx0XHRcdFx0aW50IHN3YXBwaW5lc3MpXG4mIzQzO3tcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbiYjNDM7XHR1bnNpZ25lZCBsb25nIG5yX3BhZ2VzO1xuJiM0MztcbiYjNDM7XHRpZiAoc3dhcHBpbmVzcyBcdTAwM2MgLTEgfHwgc3dhcHBpbmVzcyBcdTAwM2UgU1dBUFBJTkVTU19BTk9OX09OTFkpXG4mIzQzO1x0XHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7XG4mIzQzO1xuJiM0MztcdGlmIChzaXplIFx1MDAzYyBQQUdFX1NJWkUpXG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO1x0bnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTtcbiYjNDM7XG4mIzQzO1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG4mIzQzO1x0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuJiM0MztcdFx0XHRcdFx0XHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XG4mIzQzO1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbiYjNDM7XHRcdFx0XHRcdFx0ICAgIHN3YXBwaW5lc3MgPT0gLTEgPyBOVUxMIDpcbiYjNDM7XHRcdFx0XHRcdFx0XHRcdCAgICAgICBcdTAwMjZzd2FwcGluZXNzKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIG5yX3JlY2xhaW1lZCAqIFBBR0VfU0laRTtcbiYjNDM7fVxuJiM0MztcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3NCwxOSAmIzQzOzI0NCwzNSBAQCBCVEZfSURfRkxBR1MoZnVuYywgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMsIEtGX1NMRUVQQUJMRSlcbiBcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXG4gXG4mIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXG4mIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbiYjNDM7QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXG4mIzQzO1xuIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XG4gXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbiBcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcbiB9O1xuIFxuJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4mIzQzO1x0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4mIzQzO1x0LnNldCAgICAgICAgICAgID0gXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXG4mIzQzO307XG4mIzQzO1xuIHN0YXRpYyBpbnQgX19pbml0IGJwZl9tZW1jb250cm9sX2luaXQodm9pZClcbiB7XG4gXHRpbnQgZXJyO1xuIFxuIFx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcbiBcdFx0XHRcdFx0XHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTtcbi1cdGlmIChlcnIpXG4mIzQzO1x0aWYgKGVycikge1xuIFx0XHRwcl93YXJuKFwmIzM0O2Vycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcJiMzNDssIGVycik7XG4mIzQzO1x0XHRyZXR1cm4gZXJyO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXG4mIzQzO1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4mIzQzO1x0aWYgKGVycilcbiYjNDM7XHRcdHByX3dhcm4oXCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwmIzM0OywgZXJyKTtcbiBcbiBcdHJldHVybiBlcnI7XG4gfVxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXG5pbmRleCAzOGIxMTY1MjEyYzk0Li40NGU5NWU4N2UzY2Q5IDEwMDY0NFxuLS0tIGEvbW0vaW50ZXJuYWwuaFxuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaFxuQEAgLTc0LDExICYjNDM7NzQsMTMgQEAgdW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSxcbiBcbiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgKDEgXHUwMDNjXHUwMDNjIDEpXG4gI2RlZmluZSBNRU1DR19SRUNMQUlNX1BST0FDVElWRSAoMSBcdTAwM2NcdTAwM2MgMilcbi0jZGVmaW5lIE1JTl9TV0FQUElORVNTIDBcbi0jZGVmaW5lIE1BWF9TV0FQUElORVNTIDIwMFxuJiM0MztlbnVtIHtcbiYjNDM7XHRNSU5fU1dBUFBJTkVTUyA9IDAsXG4mIzQzO1x0TUFYX1NXQVBQSU5FU1MgPSAyMDAsXG4gXG4tLyogSnVzdCByZWNsYWltIGZyb20gYW5vbiBmb2xpb3MgaW4gcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltICovXG4tI2RlZmluZSBTV0FQUElORVNTX0FOT05fT05MWSAoTUFYX1NXQVBQSU5FU1MgJiM0MzsgMSlcbiYjNDM7XHQvKiBKdXN0IHJlY2xhaW0gZnJvbSBhbm9uIGZvbGlvcyBpbiBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gKi9cbiYjNDM7XHRTV0FQUElORVNTX0FOT05fT05MWSA9IE1BWF9TV0FQUElORVNTICYjNDM7IDEsXG4mIzQzO307XG4gXG4gdW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbiBcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi43YzdkMjk5YjNiMjhhXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgJiM0MzsxLDc3OSBAQFxuJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuJiM0MzsvKlxuJiM0MzsgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxuJiM0MzsgKlxuJiM0MzsgKiBTZXR0aW5nIFRFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSD0xIGFkZHMgYSBiYXNlbGluZSBydW4gb2YgdGhlXG4mIzQzOyAqIHdvcmtsb2FkIHdpdGhvdXQgdGhlIEJQRiBwcm9ncmFtIHRvIG1lbWNnX2FzeW5jX3JlY2xhaW0sIGFuZCBwcmludHNcbiYjNDM7ICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxuJiM0MzsgKiBjZ3JvdXAsIHRvIHN0ZG91dC5cbiYjNDM7ICovXG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcdTAwM2N0ZXN0X3Byb2dzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3lzL21tYW4uaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N5cy92ZnMuaFx1MDAzZVxuJiM0MzsjaW5jbHVkZSBcdTAwM2NzeXMvd2FpdC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc2lnbmFsLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjdGltZS5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4mIzQzOyNpbmNsdWRlIFx1MDAzY3N0ZGlvLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RkbGliLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGltaXRzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjbGludXgvbWFnaWMuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2luY2x1ZGUgXCYjMzQ7Y2dyb3VwX2hlbHBlcnMuaFwmIzM0O1xuJiM0MztcbiYjNDM7c3RydWN0IGJwZl9hcmdzIHtcbiYjNDM7XHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGxvd19jZ3JvdXBfaWQ7XG4mIzQzO1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHR1NjQgY2hlY2tfbnM7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqL1xuJiM0MztlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XG4mIzQzO1x0UkVDTEFJTV9PVVRDT01FX0NBTExFRCxcbiYjNDM7XHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcbiYjNDM7XHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XG4mIzQzO1x0dTY0IG91dGNvbWU7XG4mIzQzO307XG4mIzQzO1xuJiM0MzsjaW5jbHVkZSBcJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbiYjNDM7I2RlZmluZSBCVUZGRVJfU0laRSAoNDA5NilcbiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKVxuJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTBcbiYjNDM7XG4mIzQzOyNkZWZpbmUgQ0dfRElSIFwmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFwmIzM0Oy9oaWdoXCYjMzQ7XG4mIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgXCYjMzQ7L2xvd1wmIzM0O1xuJiM0MztcbiYjNDM7I2RlZmluZSBDR19EWUlOR19ESVIgXCYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmdcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXCYjMzQ7L3RyaWdnZXJcJiMzNDtcbiYjNDM7I2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiBcJiMzNDsvdGFyZ2V0XCYjMzQ7XG4mIzQzO1xuJiM0MzsjZGVmaW5lIENIRUNLX1BFUklPRF9OUyAoMiAqIDEwMDAgKiAxMDAwdWxsKVxuJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxXG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlXG4mIzQzOyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZFxuJiM0MzsgKiB0byBoaXQgdGhlIHJlbW92ZWQgdGFyZ2V0LiBUaGUga2VlcGFsaXZlIHJlYWRlciBrZWVwcyB0aGUgdHJpZ2dlclxuJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvXG4mIzQzOyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEZcbiYjNDM7ICogcHJvZ3JhbSByZXBvcnRzIGV2ZXJ5IHJlY2xhaW0gb3V0Y29tZSB0aHJvdWdoIHRoZSByaW5nYnVmLCBzbyB0aGVcbiYjNDM7ICogd2FpdHMganVzdCBwb2xsIGl0IHdpdGggYSB0aW1lb3V0LlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBEWUlOR19TRVRUTEVfVVMgKDIwMCAqIDEwMDApXG4mIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9USU1FT1VUX01TICgxMDApXG4mIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbiYjNDM7ICogZGlzYWJsZWQgZm9yIHRoZSBjZ3JvdXAsIHRtcGZzL3JhbWZzIHBhZ2VzIGFyZSB1bmV2aWN0YWJsZSBhbmQgd291bGRcbiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZFxuJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuJiM0MzsgKiBldmVudHMgdGhlIEJQRiBwcm9ncmFtIG1vbml0b3JzLiBGYWxsIGJhY2sgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4mIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqd29ya2xvYWRfZmlsZXNfZGlyKHZvaWQpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuJiM0MztcbiYjNDM7XHRpZiAoIXN0YXRmcyhcJiMzNDsvdG1wXCYjMzQ7LCBcdTAwMjZzdCkgXHUwMDI2XHUwMDI2XG4mIzQzO1x0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcbiYjNDM7XHRcdHJldHVybiBcJiMzNDsuXCYjMzQ7O1xuJiM0MztcdHJldHVybiBcJiMzNDsvdG1wXCYjMzQ7O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4mIzQzOyAqIGFueXRoaW5nIHRoZXkgcHJpbnQgaXMgbG9zdCB3aXRoIHRoZWlyIHByaXZhdGUgY29weSBvZiB0aGUgaGlqYWNrZWRcbiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXNcbiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4mIzQzOyAqL1xuJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7XG4mIzQzO1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4mIzQzO1x0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcbiYjNDM7XHRDSElMRF9FWElUX1dSSVRFX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4mIzQzO1x0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXG4mIzQzO3tcbiYjNDM7XHRzd2l0Y2ggKGNvZGUpIHtcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfT0s6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7c3VjY2Vzc1wmIzM0OztcbiYjNDM7XHRjYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7am9pbiBjZ3JvdXBcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7d3JpdGUgZGF0YSBmaWxlXCYjMzQ7O1xuJiM0MztcdGNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6XG4mIzQzO1x0XHRyZXR1cm4gXCYjMzQ7cmVhZCBkYXRhIGZpbGVcJiMzNDs7XG4mIzQzO1x0Y2FzZSBDSElMRF9FWElUX1RJTUVfRklMRTpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt3cml0ZSB0aW1lIGZpbGVcJiMzNDs7XG4mIzQzO1x0ZGVmYXVsdDpcbiYjNDM7XHRcdHJldHVybiBcJiMzNDt1bmtub3duXCYjMzQ7O1xuJiM0MztcdH1cbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZClcbiYjNDM7e1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1x0Y2hhciBsaW1pdF9idWZbMjBdO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3NldHVwX2Nncm91cF9lbnZpcm9ubWVudFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwmIzM0OyBDR19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFwmIzM0O21lbW9yeVwmIzM0Oyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDtlbmFibGVfY29udHJvbGxlcnNcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcJiMzNDslbHVcJiMzNDssIENHX0xJTUlUKTtcbiYjNDM7XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5tYXhcJiMzNDssIGxpbWl0X2J1Zik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0socmV0LCBcJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbiYjNDM7XHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxuJiM0MztcdCAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFhY2Nlc3MoXCYjMzQ7L3Byb2Mvc3dhcHNcJiMzNDssIEZfT0spKSB7XG4mIzQzO1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwmIzM0O21lbW9yeS5zd2FwLm1heFwmIzM0OywgXCYjMzQ7MFwmIzM0Oyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0hJR0hfRElSKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShyZXQpO1xuJiM0MztcbiYjNDM7XHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsIFwmIzM0O2dldF9jZ3JvdXBfaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0xPV19ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCpsb3dfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19MT1dfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzXG4mIzQzOyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXG4mIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuJiM0MzsgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJiMzOTtzXG4mIzQzOyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldDtcbiYjNDM7XHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4mIzQzO1xuJiM0MztcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX0RJUik7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCYjMzQ7IENHX0RZSU5HX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5XCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O2VuYWJsZV9jb250cm9sbGVyc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFwmIzM0OyVsdVwmIzM0OywgQ0dfTElNSVQpO1xuJiM0MztcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5Lm1heFwmIzM0OywgbGltaXRfYnVmKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHQvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi9cbiYjNDM7XHRpZiAoIWFjY2VzcyhcJiMzNDsvcHJvYy9zd2Fwc1wmIzM0OywgRl9PSykpIHtcbiYjNDM7XHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXCYjMzQ7bWVtb3J5LnN3YXAubWF4XCYjMzQ7LCBcJiMzNDswXCYjMzQ7KTtcbiYjNDM7XHRcdGlmICghQVNTRVJUX09LKHJldCwgXCYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCYjMzQ7KSlcbiYjNDM7XHRcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKHJldCk7XG4mIzQzO1xuJiM0MztcdCp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCYjMzQ7Z2V0X2Nncm91cF9pZFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UQVJHRVRfRElSKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0Y2xvc2UocmV0KTtcbiYjNDM7XG4mIzQzO1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKCp0YXJnZXRfY2dyb3VwX2lkLCAwLCBcJiMzNDtnZXRfY2dyb3VwX2lkXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztjbGVhbnVwOlxuJiM0MztcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4mIzQzO1x0cmV0dXJuIC0xO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0c2l6ZV90IHdyaXR0ZW4gPSAwO1xuJiM0MztcdGNoYXIgKmJ1ZmZlcjtcbiYjNDM7XHRGSUxFICpmcDtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3BlbihmaWxlbmFtZSwgXCYjMzQ7d2JcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0YnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTtcbiYjNDM7XHRpZiAoIWJ1ZmZlcilcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mcDtcbiYjNDM7XG4mIzQzO1x0bWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTtcbiYjNDM7XG4mIzQzO1x0d2hpbGUgKHdyaXR0ZW4gXHUwMDNjIEZJTEVfU0laRSkge1xuJiM0MztcdFx0c2l6ZV90IHRvX3dyaXRlID0gRklMRV9TSVpFIC0gd3JpdHRlbiBcdTAwM2MgQlVGRkVSX1NJWkUgP1xuJiM0MztcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuJiM0MztcbiYjNDM7XHRcdGlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKVxuJiM0MztcdFx0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1x0XHR3cml0dGVuICYjNDM7PSB0b193cml0ZTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHJldCA9IDA7XG4mIzQzO2NsZWFudXA6XG4mIzQzO1x0ZnJlZShidWZmZXIpO1xuJiM0MztjbGVhbnVwX2ZwOlxuJiM0MztcdGZjbG9zZShmcCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpXG4mIzQzO3tcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1x0bG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7XG4mIzQzO1x0Y2hhciAqbWFwO1xuJiM0MztcdHNpemVfdCBpO1xuJiM0MztcdGludCBmZDtcbiYjNDM7XHRzdHJ1Y3Qgc3RhdCBzYjtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XG4mIzQzO1x0aWYgKGZkID09IC0xKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbiYjNDM7XHRcdGZwcmludGYoc3RkZXJyLCBcJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0KHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cF9mZDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XG4mIzQzO1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSAmIzQzOz0gcGFnZV9zaXplKSB7XG4mIzQzO1x0XHRcdC8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovXG4mIzQzO1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbiYjNDM7XHRcdFx0KHZvaWQpdjtcbiYjNDM7XHRcdH1cbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxuJiM0MztcdFx0Z290byBjbGVhbnVwX2ZkO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cF9mZDpcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO291dDpcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHJlYWxfdGVzdF9jaGlsZF93b3JrKGNvbnN0IGNoYXIgKmNncm91cF9wYXRoLCBjaGFyICpkYXRhX2ZpbGVuYW1lLFxuJiM0MztcdFx0XHRcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7XG4mIzQzO1x0ZG91YmxlIGVsYXBzZWQ7XG4mIzQzO1x0RklMRSAqZnA7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoY2dyb3VwX3BhdGgpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4mIzQzO1xuJiM0MztcdGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCBcdTAwMjZzdGFydCk7XG4mIzQzO1xuJiM0MztcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxuJiM0MztcdFx0cmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTtcbiYjNDM7XG4mIzQzO1x0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTtcbiYjNDM7XG4mIzQzO1x0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFx1MDAyNmVuZCk7XG4mIzQzO1xuJiM0MztcdGlmICghdGltZV9maWxlbmFtZSlcbiYjNDM7XHRcdHJldHVybiBDSElMRF9FWElUX09LO1xuJiM0MztcbiYjNDM7XHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7XG4mIzQzO1x0XHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xuJiM0MztcbiYjNDM7XHRmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsIFwmIzM0O3dcJiMzNDspO1xuJiM0MztcdGlmICghZnApXG4mIzQzO1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XG4mIzQzO1x0ZnByaW50ZihmcCwgXCYjMzQ7JS42ZlwmIzM0OywgZWxhcHNlZCk7XG4mIzQzO1x0ZmNsb3NlKGZwKTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgZ2V0X3RpbWUoY2hhciAqdGltZV9maWxlbmFtZSwgZG91YmxlICp0aW1lKVxuJiM0Mzt7XG4mIzQzO1x0aW50IHJldCA9IC0xO1xuJiM0MztcdEZJTEUgKmZwO1xuJiM0MztcdGNoYXIgYnVmWzY0XTtcbiYjNDM7XG4mIzQzO1x0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcJiMzNDtyXCYjMzQ7KTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFwmIzM0O2ZvcGVuXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCBcJiMzNDtmZ2V0c1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGNsZWFudXA7XG4mIzQzO1xuJiM0MztcdGlmIChzc2NhbmYoYnVmLCBcJiMzNDslbGZcJiMzNDssIHRpbWUpICE9IDEpIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7c3NjYW5mICVzXCYjMzQ7LCBidWYpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0ID0gMDtcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHRmY2xvc2UoZnApO1xuJiM0MztvdXQ6XG4mIzQzO1x0cmV0dXJuIHJldDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludFxuJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKVxuJiM0Mzt7XG4mIzQzO1x0Y2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07XG4mIzQzO1x0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbiYjNDM7XHRjaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdO1xuJiM0MztcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xuJiM0MztcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbiYjNDM7XHRwaWRfdCB3YWl0X3JldDtcbiYjNDM7XHRpbnQgZmQsIHN0YXR1cztcbiYjNDM7XHRpbnQgcmV0ID0gLTE7XG4mIzQzO1xuJiM0MztcdHNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfZGF0YV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWFwmIzM0OywgZGlyKTtcbiYjNDM7XHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCYjMzQ7LCBkaXIpO1xuJiM0MztcdHNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSxcbiYjNDM7XHRcdCBcJiMzNDslcy9tZW1jZ19hc3luY19sb3dfdGltZV9YWFhYWFhcJiMzNDssIGRpcik7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFwmIzM0O21rc3RlbXBcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0ZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRjbG9zZShmZCk7XG4mIzQzO1xuJiM0MztcdGxvd19waWQgPSBmb3JrKCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCYjMzQ7Zm9yayBsb3dcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChsb3dfcGlkID09IDApXG4mIzQzO1x0XHRfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4mIzQzO1xuJiM0MztcdGhpZ2hfcGlkID0gZm9yaygpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcJiMzNDtmb3JrIGhpZ2hcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChoaWdoX3BpZCA9PSAwKVxuJiM0MztcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxuJiM0MztcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuJiM0MztcbiYjNDM7XHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXHUwMDI2c3RhdHVzLCAwKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCYjMzQ7bG93IHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsXG4mIzQzO1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4mIzQzO1x0ICovXG4mIzQzO1x0bG93X3BpZCA9IC0xO1xuJiM0MztcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwmIzM0O2xvdyBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4mIzQzO1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0d2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCBcdTAwMjZzdGF0dXMsIDApO1xuJiM0MztcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcJiMzNDtoaWdoIHdhaXRwaWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuJiM0MztcdGhpZ2hfcGlkID0gLTE7XG4mIzQzO1x0aWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgXCYjMzQ7aGlnaCBleGl0ZWRcJiMzNDspKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbiYjNDM7XHRcdFBSSU5UX0ZBSUwoXCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcJiMzNDssXG4mIzQzO1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuJiM0MztcdFx0XHQgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTtcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbiYjNDM7XHRcdGdvdG8gY2xlYW51cDtcbiYjNDM7XHRpZiAoZ2V0X3RpbWUobG93X3RpbWVfZmlsZSwgbG93X2VsYXBzZWQpKVxuJiM0MztcdFx0Z290byBjbGVhbnVwO1xuJiM0MztcbiYjNDM7XHRyZXQgPSAwO1xuJiM0MztcbiYjNDM7Y2xlYW51cDpcbiYjNDM7XHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xuJiM0MztcdGlmIChyZXQpIHtcbiYjNDM7XHRcdGlmIChoaWdoX3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGhpZ2hfcGlkLCBTSUdLSUxMKTtcbiYjNDM7XHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4mIzQzO1x0XHR9XG4mIzQzO1x0XHRpZiAobG93X3BpZCBcdTAwM2UgMCkge1xuJiM0MztcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuJiM0MztcdFx0XHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xuJiM0MztcdFx0fVxuJiM0MztcdH1cbiYjNDM7XHR1bmxpbmsobG93X3RpbWVfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfdGltZV9maWxlKTtcbiYjNDM7XHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4mIzQzO1x0dW5saW5rKGhpZ2hfZGF0YV9maWxlKTtcbiYjNDM7XHRyZXR1cm4gcmV0O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50XG4mIzQzO3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuJiM0MztcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuJiM0MztcdHN0cnVjdCBicGZfYXJncyBhcmdzID0ge1xuJiM0MztcdFx0LmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsXG4mIzQzO1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4mIzQzO1x0XHQuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELFxuJiM0MztcdFx0LmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLFxuJiM0MztcdH07XG4mIzQzO1x0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxuJiM0MztcdFx0LmN0eF9pbiA9IFx1MDAyNmFyZ3MsXG4mIzQzO1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuJiM0MztcdGludCBwcm9nX2luaXRfZmQsIGVycjtcbiYjNDM7XG4mIzQzO1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFwmIzM0OykpXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4mIzQzO1xuJiM0MztcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcdTAwMjZydW5fb3B0cyk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDticGZfcHJvZ190ZXN0X3J1bl9vcHRzXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gZXJyb3Jfb3V0O1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHJ1bl9vcHRzLnJldHZhbCwgMCwgXCYjMzQ7cHJvZ19pbml0IHJldHZhbFwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIGVycm9yX291dDtcbiYjNDM7XG4mIzQzO1x0KnNrZWxfcHRyID0gc2tlbDtcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7XG4mIzQzO2Vycm9yX291dDpcbiYjNDM7XHRtZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpO1xuJiM0MztcdHJldHVybiAtMTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxuJiM0MzsgKiB0ZXN0IGZhaWxzLCBzbyBiZW5jaG1hcmsgbnVtYmVycyBnbyBzdHJhaWdodCB0byB0aGUgcmVhbCBzdGRvdXQgdG9cbiYjNDM7ICoga2VlcCB0aGVtIGZyb20gZHJvd25pbmcgaW4gQVNTRVJUIG91dHB1dC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGJlbmNoX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLilcbiYjNDM7e1xuJiM0MztcdHZhX2xpc3QgYXA7XG4mIzQzO1xuJiM0MztcdHZhX3N0YXJ0KGFwLCBmbXQpO1xuJiM0MztcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcbiYjNDM7XHR2YV9lbmQoYXApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuJiM0MztcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xuJiM0MztcdGRvdWJsZSBiYXNlX2hpZ2hfdGltZSA9IDAuMCwgYmFzZV9sb3dfdGltZSA9IDAuMDtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0aW50IGVyciwgYmVuY2g7XG4mIzQzO1xuJiM0MztcdGJlbmNoID0gISFnZXRlbnYoXCYjMzQ7VEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcyhcdTAwMjZoaWdoX2Nncm91cF9pZCwgXHUwMDI2bG93X2Nncm91cF9pZCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIE9wdGlvbmFsIGJhc2VsaW5lIGZvciB0aGUgYmVuY2htYXJrIG51bWJlcnMgYmVsb3c6IHJ1biB0aGVcbiYjNDM7XHQgKiBzYW1lIHdvcmtsb2FkIG9uY2Ugd2l0aG91dCB0aGUgQlBGIHByb2dyYW0sIHNvIHRoZSBsb2cgY2FuXG4mIzQzO1x0ICogcmVwb3J0IGhvdyBtdWNoIGFzeW5jIHJlY2xhaW0gaW1wcm92ZWQgdGhlIHByZXNzdXJlZCBjZ3JvdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGJlbmNoKSB7XG4mIzQzO1x0XHRlcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoXHUwMDI2YmFzZV9oaWdoX3RpbWUsIFx1MDAyNmJhc2VfbG93X3RpbWUsXG4mIzQzO1x0XHRcdFx0XHQgICAgUkVBRF9USU1FUyk7XG4mIzQzO1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3J1bl9oaWdoX2xvd193b3JrbG9hZCBiYXNlbGluZVwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2JwZlwmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW1cJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcbiYjNDM7XHQgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW1cbiYjNDM7XHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKCFBU1NFUlRfR1Qoc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwmIzM0O3JlY2xhaW1lZF9ieXRlc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJXG4mIzQzO1x0ICogcnVucywgc28gaXQgb25seSBsb2dzIHRoZSBudW1iZXJzOyB0aGUgY291bnRlcnMgYWJvdmUgYWxyZWFkeVxuJiM0MztcdCAqIHByb3ZlZCB0aGF0IHRoZSBCUEYgcHJvZ3JhbSByZWNsYWltZWQgbWVtb3J5LlxuJiM0MztcdCAqL1xuJiM0MztcdGlmIChiZW5jaClcbiYjNDM7XHRcdGJlbmNoX3ByaW50ZihcJiMzNDttZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgXCYjMzQ7XG4mIzQzO1x0XHRcdCAgICAgXCYjMzQ7cmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxcblwmIzM0OyxcbiYjNDM7XHRcdFx0ICAgICBiYXNlX2hpZ2hfdGltZSwgYmFzZV9sb3dfdGltZSwgaGlnaF90aW1lLCBsb3dfdGltZSxcbiYjNDM7XHRcdFx0ICAgICAxMDAuMCAqIChiYXNlX2hpZ2hfdGltZSAtIGhpZ2hfdGltZSkgLyBiYXNlX2hpZ2hfdGltZSk7XG4mIzQzO1x0ZWxzZSBpZiAoaGlnaF90aW1lIFx1MDAzZT0gbG93X3RpbWUpXG4mIzQzO1x0XHRwcmludGYoXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcblwmIzM0OyxcbiYjNDM7XHRcdCAgICAgICBoaWdoX3RpbWUsIGxvd190aW1lKTtcbiYjNDM7XG4mIzQzO291dDpcbiYjNDM7XHRpZiAoc2tlbClcbiYjNDM7XHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4mIzQzO1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzXG4mIzQzOyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xuJiM0MzsgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHlcbiYjNDM7ICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4mIzQzO3tcbiYjNDM7XHRwaWRfdCBwaWQgPSBmb3JrKCk7XG4mIzQzO1xuJiM0MztcdGlmIChwaWQgIT0gMClcbiYjNDM7XHRcdHJldHVybiBwaWQ7XG4mIzQzO1xuJiM0MztcdGlmIChqb2luX3BhcmVudF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpKVxuJiM0MztcdFx0X2V4aXQoQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCk7XG4mIzQzO1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbiYjNDM7XHRcdF9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7XG4mIzQzO1x0Zm9yICg7Oykge1xuJiM0MztcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuJiM0MztcdFx0XHRfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7XG4mIzQzO1x0fVxuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIG9ic2VydmVkIHNvIGZhciwgdGFsbGllZCBmcm9tIHJpbmdidWYgZXZlbnRzLiAqL1xuJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7XG4mIzQzO1x0aW50IGNhbGxlZDtcbiYjNDM7XHRpbnQgc2tpcHBlZF9keWluZztcbiYjNDM7XHRpbnQgdGFyZ2V0X2dvbmU7XG4mIzQzO307XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiAqc2VlbiA9IGN0eDtcbiYjNDM7XHRjb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhO1xuJiM0MztcbiYjNDM7XHRpZiAoc3ogXHUwMDNjIHNpemVvZigqZXYpKVxuJiM0MztcdFx0cmV0dXJuIDA7XG4mIzQzO1xuJiM0MztcdHN3aXRjaCAoZXYtXHUwMDNlb3V0Y29tZSkge1xuJiM0MztcdGNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDpcbiYjNDM7XHRcdHNlZW4tXHUwMDNlY2FsbGVkJiM0MzsmIzQzOztcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdGNhc2UgUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkc6XG4mIzQzO1x0XHRzZWVuLVx1MDAzZXNraXBwZWRfZHlpbmcmIzQzOyYjNDM7O1xuJiM0MztcdFx0YnJlYWs7XG4mIzQzO1x0Y2FzZSBSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkU6XG4mIzQzO1x0XHRzZWVuLVx1MDAzZXRhcmdldF9nb25lJiM0MzsmIzQzOztcbiYjNDM7XHRcdGJyZWFrO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXG4mIzQzOyAqIHZlcmlmeSB0aGF0IHJlY2xhaW0gc3RvcHMgb24gdGhlIGR5aW5nL3JlbW92ZWQgY2dyb3VwIGluc3RlYWQgb2ZcbiYjNDM7ICogcmVjbGFpbWluZyBmcm9tIGl0LlxuJiM0MzsgKlxuJiM0MzsgKiBUaGUgdGFyZ2V0IHN0YXlzIGVtcHR5OyB0aGUgd29ya2xvYWQgbGl2ZXMgaW4gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZFxuJiM0MzsgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxuJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxuJiM0MzsgKiB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmNcbiYjNDM7ICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kXG4mIzQzOyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcbiYjNDM7ICogU0tJUFBFRF9EWUlORyBvciBUQVJHRVRfR09ORSBldmVudHMgd2hpbGUgcmVjbGFpbV9jYWxscyBhbmRcbiYjNDM7ICogcmVjbGFpbWVkX2J5dGVzIHN0YXkgZnJvemVuLlxuJiM0MzsgKi9cbiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZClcbiYjNDM7e1xuJiM0MztcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgY2FsbHNfYmVmb3JlLCBieXRlc19iZWZvcmU7XG4mIzQzO1x0Y2hhciBkYXRhX2ZpbGVbUEFUSF9NQVhdID0gXCYjMzQ7XCYjMzQ7O1xuJiM0MztcdHN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHNlZW4gPSB7fTtcbiYjNDM7XHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4mIzQzO1x0c3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IE5VTEw7XG4mIzQzO1x0cGlkX3QgcmVhZGVyX3BpZCA9IC0xO1xuJiM0MztcdGludCBlcnIsIGZkLCBpO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9keWluZ19jZ3JvdXBzKFx1MDAyNnRyaWdnZXJfY2dyb3VwX2lkLCBcdTAwMjZ0YXJnZXRfY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwmIzM0O3NldHVwX2R5aW5nX2Nncm91cHNcJiMzNDspKVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRlcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsIFx1MDAyNnNrZWwpO1xuJiM0MztcdGlmICghQVNTRVJUX09LKGVyciwgXCYjMzQ7c2V0dXBfYnBmXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRyYiA9IHJpbmdfYnVmZmVyX19uZXcoYnBmX21hcF9fZmQoc2tlbC1cdTAwM2VtYXBzLnJlY2xhaW1fZXZlbnRzKSxcbiYjNDM7XHRcdFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXHUwMDI2c2VlbiwgTlVMTCk7XG4mIzQzO1x0aWYgKCFBU1NFUlRfT0tfUFRSKHJiLCBcJiMzNDtyaW5nX2J1ZmZlcl9fbmV3XCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcbiYjNDM7XHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuJiM0MztcdFx0IFwmIzM0OyVzL21lbWNnX2FzeW5jX2R5aW5nX1hYWFhYWFwmIzM0Oywgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuJiM0MztcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xuJiM0MztcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcJiMzNDtta3N0ZW1wXCYjMzQ7KSlcbiYjNDM7XHRcdGdvdG8gb3V0O1xuJiM0MztcdGNsb3NlKGZkKTtcbiYjNDM7XG4mIzQzO1x0cmVhZGVyX3BpZCA9IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoZGF0YV9maWxlKTtcbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcJiMzNDtmb3JrIGtlZXBhbGl2ZSByZWFkZXJcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdC8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovXG4mIzQzO1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2ICFzZWVuLmNhbGxlZDsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR0UoZXJyLCAwLCBcJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgXCYjMzQ7cmVjbGFpbSBldmVudHNcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztcdHJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4mIzQzO1xuJiM0MztcdC8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovXG4mIzQzO1x0dXNsZWVwKERZSU5HX1NFVFRMRV9VUyk7XG4mIzQzO1xuJiM0MztcdGNhbGxzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHM7XG4mIzQzO1x0Ynl0ZXNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbWVkX2J5dGVzO1xuJiM0MztcbiYjNDM7XHQvKiBXYWl0IGZvciBhIHJlY2xhaW0gcm91bmQgdG8gaGl0IHRoZSByZW1vdmVkIGNncm91cC4gKi9cbiYjNDM7XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBFVkVOVF9QT0xMX1JPVU5EUyBcdTAwMjZcdTAwMjZcbiYjNDM7XHRcdCAgICAhc2Vlbi5za2lwcGVkX2R5aW5nIFx1MDAyNlx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSYjNDM7JiM0MzspIHtcbiYjNDM7XHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuJiM0MztcdFx0aWYgKCFBU1NFUlRfR0UoZXJyLCAwLCBcJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbFwmIzM0OykpXG4mIzQzO1x0XHRcdGdvdG8gb3V0O1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0aWYgKCFzZWVuLnNraXBwZWRfZHlpbmcgXHUwMDI2XHUwMDI2ICFzZWVuLnRhcmdldF9nb25lKSB7XG4mIzQzO1x0XHRQUklOVF9GQUlMKFwmIzM0O25vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpXCYjMzQ7LFxuJiM0MztcdFx0XHQgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKlxuJiM0MztcdCAqIHNraXBwZWRfZHlpbmcgZXZlbnRzIHNob3cgdGhhdCB0aGUgQ1NTX0RZSU5HL0NTU19PTkxJTkUgY2hlY2tcbiYjNDM7XHQgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgdGhleSBoYXBwZW4gaXMgdGltaW5nXG4mIzQzO1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4mIzQzO1x0ICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC5cbiYjNDM7XHQgKi9cbiYjNDM7XHRwcmludGYoXCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWQsIGR5aW5nPSVkXFxuXCYjMzQ7LFxuJiM0MztcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuJiM0MztcbiYjNDM7XHQvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqL1xuJiM0MztcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgXCYjMzQ7cmVjbGFpbV9jYWxsc1wmIzM0OykpXG4mIzQzO1x0XHRnb3RvIG91dDtcbiYjNDM7XHRpZiAoIUFTU0VSVF9FUShza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIGJ5dGVzX2JlZm9yZSxcbiYjNDM7XHRcdCAgICAgICBcJiMzNDtyZWNsYWltZWRfYnl0ZXNcJiMzNDspKVxuJiM0MztcdFx0Z290byBvdXQ7XG4mIzQzO1xuJiM0MztvdXQ6XG4mIzQzO1x0aWYgKHJlYWRlcl9waWQgXHUwMDNlIDApIHtcbiYjNDM7XHRcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XG4mIzQzO1x0XHQodm9pZCl3YWl0cGlkKHJlYWRlcl9waWQsIE5VTEwsIDApO1xuJiM0MztcdH1cbiYjNDM7XHRpZiAoZGF0YV9maWxlWzBdKVxuJiM0MztcdFx0dW5saW5rKGRhdGFfZmlsZSk7XG4mIzQzO1x0aWYgKHJiKVxuJiM0MztcdFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuJiM0MztcdGlmIChza2VsKVxuJiM0MztcdFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcbiYjNDM7XHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuJiM0Mzt9XG5kaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XG5pbmRleCAwMDAwMDAwMDAwMDAwLi5jMThiZWI2NDE2ZDMwXG4tLS0gL2Rldi9udWxsXG4mIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXG5AQCAtMCwwICYjNDM7MSwyODggQEBcbiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbiYjNDM7XG4mIzQzOyNpbmNsdWRlIFwmIzM0O3ZtbGludXguaFwmIzM0O1xuJiM0MzsjaW5jbHVkZSBcJiMzNDticGZfZXhwZXJpbWVudGFsLmhcJiMzNDtcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9oZWxwZXJzLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbiYjNDM7I2luY2x1ZGUgXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFx1MDAzZVxuJiM0MztcbiYjNDM7I2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbiYjNDM7I2RlZmluZSBQQUdFX1NJWkVcdFx0NDA5NlVMXG4mIzQzOy8qXG4mIzQzOyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlXG4mIzQzOyAqIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBvbmUsIHNvIG5vIGNhbGxiYWNrIHJ1bnMgbG9uZ2VyIHRoYW4gb25lXG4mIzQzOyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuJiM0MzsgKi9cbiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkVcdFx0KDMyICogUEFHRV9TSVpFKVxuJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4mIzQzO1xuJiM0MztzdHJ1Y3QgYnBmX2FyZ3Mge1xuJiM0MztcdHU2NCBoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgbG93X2Nncm91cF9pZDtcbiYjNDM7XHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0MztcdHU2NCBjaGVja19ucztcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuJiM0MztcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XG4mIzQzO1x0c3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDtcbiYjNDM7c3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuXG4mIzQzOyAqL1xuJiM0Mzt1NjQgcmVjbGFpbV9jYWxscztcbiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlcztcbiYjNDM7XG4mIzQzOy8qXG4mIzQzOyAqIE91dGNvbWUgb2YgYSBzaW5nbGUgcmVjbGFpbSBhdHRlbXB0LCByZXBvcnRlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaFxuJiM0MzsgKiB0aGUgcmVjbGFpbV9ldmVudHMgcmluZ2J1ZiBzbyB0ZXN0cyBjYW4gd2FpdCBmb3IgcmVjbGFpbSBldmVudHMgd2l0aFxuJiM0MzsgKiBhIHRpbWVvdXQgaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBjb3VudGVycyBhYm92ZS5cbiYjNDM7ICovXG4mIzQzO2VudW0gcmVjbGFpbV9vdXRjb21lIHtcbiYjNDM7XHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxuJiM0MztcdFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HLFxuJiM0MztcdFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSxcbiYjNDM7fTtcbiYjNDM7XG4mIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50IHtcbiYjNDM7XHRfX3U2NCBvdXRjb21lO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xuJiM0MztcdF9fdWludChtYXhfZW50cmllcywgMSBcdTAwM2NcdTAwM2MgMTYpO1xuJiM0Mzt9IHJlY2xhaW1fZXZlbnRzIFNFQyhcJiMzNDsubWFwc1wmIzM0Oyk7XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXBvcnRzIGFyZSBiZXN0IGVmZm9ydDogd2hlbiB0aGUgcmluZ2J1ZiBpcyBmdWxsLCBmb3IgZXhhbXBsZSB3aGVuXG4mIzQzOyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIGVtaXRfcmVjbGFpbV9ldmVudChlbnVtIHJlY2xhaW1fb3V0Y29tZSBvdXRjb21lKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2O1xuJiM0MztcbiYjNDM7XHRldiA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTtcbiYjNDM7XHRpZiAoIWV2KVxuJiM0MztcdFx0cmV0dXJuO1xuJiM0MztcbiYjNDM7XHRldi1cdTAwM2VvdXRjb21lID0gb3V0Y29tZTtcbiYjNDM7XHRicGZfcmluZ2J1Zl9zdWJtaXQoZXYsIDApO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSlcbiYjNDM7e1xuJiM0MztcdGNtLVx1MDAzZWNncnAgPSBicGZfY2dyb3VwX2Zyb21faWQoY2dyb3VwX2lkKTtcbiYjNDM7XHRpZiAoIWNtLVx1MDAzZWNncnApXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdGNtLVx1MDAzZW1lbWNnID0gYnBmX2dldF9tZW1fY2dyb3VwKFx1MDAyNmNtLVx1MDAzZWNncnAtXHUwMDNlc2VsZik7XG4mIzQzO1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuJiM0MztcdFx0YnBmX2Nncm91cF9yZWxlYXNlKGNtLVx1MDAzZWNncnApO1xuJiM0MztcdFx0cmV0dXJuIC0xO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmV0dXJuIDA7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4mIzQzO3tcbiYjNDM7XHRicGZfcHV0X21lbV9jZ3JvdXAoY20tXHUwMDNlbWVtY2cpO1xuJiM0MztcdGJwZl9jZ3JvdXBfcmVsZWFzZShjbS1cdTAwM2VjZ3JwKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbiYjNDM7XHRcdHJldHVybiAtMTtcbiYjNDM7XHRicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7XG4mIzQzO1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4mIzQzO1x0XHRicGZfY29yZV9lbnVtX3ZhbHVlKGVudW0gbm9kZV9zdGF0X2l0ZW0sXG4mIzQzO1x0XHRcdFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgYm9vbFxuJiM0MztzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuJiM0Mzt7XG4mIzQzO1x0dTY0IGN1ciwgZGVsdGE7XG4mIzQzO1xuJiM0MztcdGlmIChnZXRfY2dyb3VwX2V2ZW50KGNncm91cF9pZCwgXHUwMDI2Y3VyKSlcbiYjNDM7XHRcdHJldHVybiBmYWxzZTtcbiYjNDM7XG4mIzQzO1x0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcbiYjNDM7XHQqcHJldl9ldmVudCA9IGN1cjtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGRlbHRhIFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXG4mIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4mIzQzOyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcbiYjNDM7ICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXG4mIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuJiM0MzsgKiB0aGUgbG9va3VwIGZhaWxpbmcuXG4mIzQzOyAqXG4mIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuJiM0MzsgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cbiYjNDM7ICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcbiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzb1xuJiM0MzsgKiB0aGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggdGhlIHRhcmdldCBrZXJuZWwuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycClcbiYjNDM7e1xuJiM0MztcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIChmbGFncyBcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFx1MDAyNiBDU1NfT05MSU5FKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7LypcbiYjNDM7ICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4mIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXNcbiYjNDM7ICogcmVjbGFpbWVkLiBFYWNoIGF0dGVtcHQgcmVwb3J0cyBpdHMgb3V0Y29tZSB0aHJvdWdoIHRoZVxuJiM0MzsgKiByZWNsYWltX2V2ZW50cyByaW5nYnVmLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSlcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBjZ3JvdXBfbWVtY2cgY207XG4mIzQzO1x0dTY0IG5yID0gMDtcbiYjNDM7XG4mIzQzO1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSkge1xuJiM0MztcdFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSk7XG4mIzQzO1x0XHRyZXR1cm4gMDtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbiYjNDM7XHRcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyk7XG4mIzQzO1x0XHRwdXRfY2dyb3VwX21lbWNnKFx1MDAyNmNtKTtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0cmVjbGFpbV9jYWxscyYjNDM7JiM0Mzs7XG4mIzQzO1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUsIC0xKTtcbiYjNDM7XHRyZWNsYWltZWRfYnl0ZXMgJiM0Mzs9IG5yO1xuJiM0MztcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTtcbiYjNDM7XG4mIzQzO1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4mIzQzO1xuJiM0MztcdHJldHVybiBucjtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RydWN0IHdxX2VsZW0ge1xuJiM0MztcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XG4mIzQzO1x0c3RydWN0IGJwZl93cSB3b3JrO1xuJiM0MztcdHU2NCBwcmV2X2V2ZW50O1xuJiM0MztcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4mIzQzO1x0dTY0IGNoZWNrX25zO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQnl0ZXMgc3RpbGwgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCByb3VuZCwgY2FycmllZCBhY3Jvc3NcbiYjNDM7XHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbiYjNDM7XHQgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3NcbiYjNDM7XHQgKiBhdCBpdC5cbiYjNDM7XHQgKi9cbiYjNDM7XHR1NjQgcmVtYWluaW5nO1xuJiM0Mzt9O1xuJiM0MztcbiYjNDM7c3RydWN0IHtcbiYjNDM7XHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcbiYjNDM7XHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuJiM0MztcdF9fdHlwZShrZXksIF9fdTMyKTtcbiYjNDM7XHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcbiYjNDM7fSB3cV9tYXAgU0VDKFwmIzM0Oy5tYXBzXCYjMzQ7KTtcbiYjNDM7XG4mIzQzO3N0YXRpYyBpbnQgcmVjbGFpbV93b3JrX2ZuKHZvaWQgKm1hcCwgaW50ICprZXksIHZvaWQgKnZhbHVlKVxuJiM0Mzt7XG4mIzQzO1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbiYjNDM7XHR1NjQgbnIsIHNpemU7XG4mIzQzO1xuJiM0MztcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbiYjNDM7XHRcdC8qXG4mIzQzO1x0XHQgKiBUaW1lci10cmlnZ2VyZWQgZW50cnk6IHN0YXJ0IGEgbmV3IHJvdW5kIG9ubHkgd2hlbiB0aGVcbiYjNDM7XHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbiYjNDM7XHRcdCAqIGNoZWNrIGFuZCBvbmx5IGxvb2sgYXQgcmVtYWluaW5nLCBzbyB0aGUgcmVmYXVsdCBkZWx0YVxuJiM0MztcdFx0ICogaXMgY29uc3VtZWQgb25jZSBwZXIgcm91bmQuXG4mIzQzO1x0XHQgKi9cbiYjNDM7XHRcdGlmICghc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCBcdTAwMjZlbGVtLVx1MDAzZXByZXZfZXZlbnQsXG4mIzQzO1x0XHRcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkKSlcbiYjNDM7XHRcdFx0cmV0dXJuIDA7XG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IFJFQ0xBSU1fTUFYX0lURVIgKiBSRUNMQUlNX1NJWkU7XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHQvKiBPbmUgYm91bmRlZCByZWNsYWltIHBhc3MgcGVyIGNhbGxiYWNrICovXG4mIzQzO1x0c2l6ZSA9IGVsZW0tXHUwMDNlcmVtYWluaW5nIFx1MDAzYyBSRUNMQUlNX1NJWkUgPyBlbGVtLVx1MDAzZXJlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTtcbiYjNDM7XHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuJiM0MztcdGlmICghbnIpIHtcbiYjNDM7XHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gMDtcbiYjNDM7XHRcdHJldHVybiAwO1xuJiM0MztcdH1cbiYjNDM7XG4mIzQzO1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbiYjNDM7XHRpZiAobnIgXHUwMDNlPSBlbGVtLVx1MDAzZXJlbWFpbmluZylcbiYjNDM7XHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gMDtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyAtPSBucjtcbiYjNDM7XG4mIzQzO1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4mIzQzO1x0aWYgKGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuJiM0MztcdFx0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1xuJiM0MztcdHJldHVybiAwO1xuJiM0Mzt9XG4mIzQzO1xuJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKVxuJiM0Mzt7XG4mIzQzO1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4mIzQzO1x0YnBmX3RpbWVyX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIGVsZW0tXHUwMDNlY2hlY2tfbnMsIDApO1xuJiM0MztcbiYjNDM7XHRyZXR1cm4gMDtcbiYjNDM7fVxuJiM0MztcbiYjNDM7U0VDKFwmIzM0O3N5c2NhbGxcJiMzNDspXG4mIzQzO2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgd3FfZWxlbSAqZWxlbTtcbiYjNDM7XHRfX3UzMiBrZXkgPSAwO1xuJiM0MztcdGludCByZXQ7XG4mIzQzO1xuJiM0MztcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbiYjNDM7XHRpZiAoIWVsZW0pXG4mIzQzO1x0XHRyZXR1cm4gLTE7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl93cV9pbml0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgXHUwMDI2d3FfbWFwLCAwKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXdvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbiYjNDM7XHRpZiAocmV0KVxuJiM0MztcdFx0cmV0dXJuIHJldDtcbiYjNDM7XG4mIzQzO1x0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCB3cV90aW1lcl9jYik7XG4mIzQzO1x0aWYgKHJldClcbiYjNDM7XHRcdHJldHVybiByZXQ7XG4mIzQzO1xuJiM0MztcdGVsZW0tXHUwMDNlcHJldl9ldmVudCA9IDA7XG4mIzQzO1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuJiM0MztcdGVsZW0tXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbiYjNDM7XHRlbGVtLVx1MDAzZWNoZWNrX25zID0gY3R4LVx1MDAzZWNoZWNrX25zO1xuJiM0MztcbiYjNDM7XHR3cV9oaWdoX2Nncm91cF9pZCA9IGN0eC1cdTAwM2VoaWdoX2Nncm91cF9pZDtcbiYjNDM7XHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWxvd19jZ3JvdXBfaWQ7XG4mIzQzO1xuJiM0MztcdHJldHVybiBicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoXCYjMzQ7bGljZW5zZVwmIzM0OykgPSBcJiMzNDtHUExcJiMzNDs7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Mi8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7REVCVUdfSU5GT19CVEYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPkluc3RydWN0aW9uOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+WW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIG1haW50YWluZXIgYW5kIHNlY3VyaXR5IGVuZ2luZWVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGV2YWx1YXRlIHdoZXRoZXIgaXQgd2FycmFudHMgZnV6emluZyB3aXRoIHN5emthbGxlci4KCklNUE9SVEFOVDogVGhlIGNoYW5nZXMgaGF2ZSBBTFJFQURZIGJlZW4gYXBwbGllZCBhbmQgY29tbWl0dGVkIGFzIHRoZSBIRUFEIGNvbW1pdCBpbgp5b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24gaW50ZXJuYWwgYXNzdW1wdGlvbnMuIFlvdSBtdXN0IGFjdGl2ZWx5IHVzZSB5b3VyIGNvZGUgYWNjZXNzCnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoxLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ClRoZSBnb2FsIG9mIHBhdGNoIGZ1enppbmcgaXMgdG8gZGlzY292ZXIgY3Jhc2hlcywgcmVncmVzc2lvbnMsIGV4cG9zZWQgbGF0ZW50IGJ1Z3MsCmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuCgotIFJFQUNIQUJJTElUWSBJUyBUSEUgUFJJTUFSWSBHQVRFOgogIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWQKICBlbnZpcm9ubWVudHMgKEdDRSBvciBRRU1VLCB1dGlsaXppbmcgc29mdHdhcmUtZW11bGF0ZWQgZGV2aWNlcyBsaWtlIFVTQiBnYWRnZXRzLCBuZXRkZXYsIHR1bi90YXApLgogIElmIHRoZSBtb2RpZmllZCBjb2RlIGlzIHN0cnVjdHVyYWxseSB1bnJlYWNoYWJsZSAoc2VlIFNlY3Rpb24gMiksIGl0IE1VU1QgTk9UIGJlIGZ1enplZCwKICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuCgotIERPIE5PVCBCTElORExZIFRSVVNUICYjMzQ7Tk8gRlVOQ1RJT05BTCBDSEFOR0UmIzM0OyAoTkZDSSkgT1IgJiMzNDtSRUZBQ1RPUklORyYjMzQ7IENMQUlNUzoKICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzICYjMzQ7Y2xlYW51cHMmIzM0OywgJiMzNDtyZWZhY3RvcmluZ3MmIzM0Oywgb3Igc3RhdGUKICAmIzM0O05vIGZ1bmN0aW9uYWwgY2hhbmdlIGludGVuZGVkJiMzNDsuIERvIE5PVCB0YWtlIHRoZXNlIGNsYWltcyBhdCBmYWNlIHZhbHVlLgogIENvZGUgcmVmYWN0b3JpbmdzIHRoYXQgcmVhcnJhbmdlIGxvZ2ljLCBpbnRyb2R1Y2UgaGVscGVyIGZ1bmN0aW9ucywgb3IgYWx0ZXIgc3RhdGUgbWFuYWdlbWVudAogIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLgogIElmIHJlYWNoYWJsZSBleGVjdXRhYmxlIGNvZGUgaXMgbW9kaWZpZWQgb3IgcmVmYWN0b3JlZCwgaXQgTVVTVCBiZSBmdXp6ZWQuCgotIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOgogIFdoZW4gYSBwYXRjaCBpbnRyb2R1Y2VzIG9yIG1vZGlmaWVzIHJ1bnRpbWUgY2hlY2tzIG9yIGFzc2VydGlvbnMgKGUuZy4sIFdBUk5fT04qLCBWTV9XQVJOX09OKiwKICBCVUdfT04qLCBsb2NrZGVwX2Fzc2VydCopIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLCBpdCBlbmZvcmNlcyBuZXcgb3Igc3RyaWN0ZXIgaW52YXJpYW50cy4KICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyCiAgYW4gdW51c3VhbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIGNhbiB2aW9sYXRlIGl0LgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMi4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPWZhbHNlIChORUdBVElWRSBDUklURVJJQSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczoKCi0gTm9uLWtlcm5lbCBhbmQgbm9uLWV4ZWN1dGFibGUgY2hhbmdlczoKICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy4KICAqIFVzZXItc3BhY2UgZGlyZWN0b3JpZXMsIHNlbGYtdGVzdHMsIHNhbXBsZXMsIG9yIHNjcmlwdHMgKGUuZy4sIHRvb2xzLywgc2FtcGxlcy8sIHNjcmlwdHMvLCB1c3IvKQogICAgdGhhdCBkbyBub3QgYWZmZWN0IHRoZSBjb21waWxlZCBrZXJuZWwgaW1hZ2UgKHZtbGludXgpIG9yIGtlcm5lbCBtb2R1bGVzLgogICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHMKICAgIHRoYXQgZG8gbm90IGFsdGVyIGNvbnRyb2wgZmxvdyBvciBkYXRhIHN0cnVjdHVyZXMuCiAgKiBCdWlsZCBzeXN0ZW0gb3IgS2NvbmZpZyBjaGFuZ2VzIHRoYXQgZG8gbm90IGFsdGVyIGNvbXBpbGVkIEMgbG9naWMuCi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOgogICogVmVuZG9yLXNwZWNpZmljIFBDSWUgc3dpdGNoZXMsIFNtYXJ0TklDcywgb3IgR1BVIGRyaXZlcnMgKGUuZy4sIG1seHN3LCBwZHNfY29yZSwgcWVkLAogICAgaW9uaWMsIGFtZGdwdSkgcmVxdWlyaW5nIHBoeXNpY2FsIEFTSUMvUENJZSBjYXJkcyBub3QgZW11bGF0ZWQgaW4gc3RhbmRhcmQgUUVNVS4KLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6CiAgKiBEcml2ZXIgdGVhcmRvd24gY2FsbGJhY2tzICgucmVtb3ZlLCAuc2h1dGRvd24sIHBjaV91bnJlZ2lzdGVyX2RyaXZlcikgZXhlY3V0ZWQgb25seSBkdXJpbmcKICAgIHBoeXNpY2FsIFBDSSBob3QtdW5wbHVnIG9yIG1hbnVhbCBzeXNmcyBkcml2ZXIgdW5iaW5kaW5nLgogICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSZXR1cm4gV29ydGhGdXp6aW5nPXRydWUgd2hlbmV2ZXIgdGhlIHBhdGNoIHRvdWNoZXMgcmVhY2hhYmxlIGV4ZWN1dGFibGUgY29kZSwgaW5jbHVkaW5nOgotIENvcmUgU3Vic3lzdGVtczoKICAqIEFueSBsb2dpYyBtb2RpZmljYXRpb25zIGluIG1lbW9yeSBtYW5hZ2VtZW50IChtbS8pLCBzeW5jaHJvbml6YXRpb24vbG9ja2luZyAoa2VybmVsL2xvY2tpbmcvKSwKICAgIEJQRiwgc2NoZWR1bGVyLCBjb3JlIG5ldHdvcmtpbmcsIFZGUywgb3Igc3lzY2FsbCBoYW5kbGluZy4KLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6CiAgKiBBbnkgcmVzdHJ1Y3R1cmluZyBvZiByZWFjaGFibGUgZGF0YSBzdHJ1Y3R1cmVzLCBoZWxwZXIgYWJzdHJhY3Rpb25zLCBvciBhbGdvcml0aG0gZmxvd3MuCi0gUnVudGltZSBBc3NlcnRpb25zIGFuZCBEZWZlbnNpdmUgQ2hlY2tzOgogICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLgotIFJlYWNoYWJsZSBEcml2ZXJzIGFuZCBQcm90b2NvbHM6CiAgKiBEcml2ZXJzIGFjY2Vzc2libGUgdmlhIHZpcnR1YWwgYnVzZXMgKHZpcnRpbywgVVNCIGdhZGdldCwgbG9vcGJhY2ssIG5ldGxpbmssIGJpbmRlciwgc29ja2V0cywgZXRjLikuCgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQo0LiBFWFRSQUNUSU5HIEZvY3VzU3ltYm9scyAoUFJFVkVOVElORyBESUxVVElPTikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KV2hlbiBXb3J0aEZ1enppbmc9dHJ1ZSwgeW91IG11c3QgZXh0cmFjdCBzcGVjaWZpYyBrZXJuZWwgZnVuY3Rpb25zIGludG8gRm9jdXNTeW1ib2xzIHRvIGd1aWRlIHRoZSBmdXp6ZXI6CgotIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzoKICBEbyBOT1QgbGlzdCBnZW5lcmljLCB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYWxsZWQgYnkgYWxtb3N0IGV2ZXJ5IHByb2dyYW0gaW4gdGhlIGNvcnB1cwogIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bzogZ2VuZXJhbCBtZW1vcnkgYWxsb2NhdG9ycyBhbmQgZGVhbGxvY2F0b3JzLCBwYWdlIGZhdWx0CiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuCiAgTGlzdGluZyB1YmlxdWl0b3VzIGZ1bmN0aW9ucyBjYXVzZXMgdGhlIGZ1enplciB0byBjbGFzc2lmeSB0aG91c2FuZHMgb2YgdW5yZWxhdGVkIHRlc3RzIGFzICYjMzQ7Zm9jdXNlZCYjMzQ7LAogIHdoaWNoIHNldmVyZWx5IGRpbHV0ZXMgZnV6emluZyBlZmZvcnQgYXdheSBmcm9tIHRoZSBhY3R1YWwgY2hhbmdlcy4KCi0gVEFSR0VUIFNQRUNJRklDIEZFQVRVUkUgTE9HSUMgQU5EIEVOVFJZUE9JTlRTOgogIExpc3QgZnVuY3Rpb25zIHRoYXQgc3BlY2lmaWNhbGx5IGltcGxlbWVudCB0aGUgbG9naWMgYmVpbmcgYWRkZWQgb3IgYWx0ZXJlZCwgb3IgZGlyZWN0IEFQSSBlbnRyeXBvaW50cwogIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LgoKLSBIQU5ETElORyBTVEFUSUMgSU5MSU5FIEZVTkNUSU9OUyBJTiBIRUFERVJTICguaCk6CiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFjawogIGRpc3RpbmN0IHN5bWJvbCBhZGRyZXNzZXMgaW4gdm1saW51eCBhbmQgY2Fubm90IGJlIHRhcmdldGVkIGRpcmVjdGx5IGJ5IHN5bWJvbCBjb3ZlcmFnZSBmaWx0ZXJzLgogIElmIHRoZSBjaGFuZ2VzIGFyZSBwcmltYXJpbHkgaW4gc3RhdGljIGlubGluZSBoZWxwZXJzLCBpZGVudGlmeSBub24tc3RhdGljLCBmZWF0dXJlLXNwZWNpZmljIGNhbGxlcgogIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS4KCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3MKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSWRlbnRpZnkgYW55IHNwZWNpZmljIENPTkZJR18gb3B0aW9ucyByZXF1aXJlZCB0byBwcm9wZXJseSBjb21waWxlIGFuZCByZWFjaCB0aGUgbW9kaWZpZWQgY29kZToKLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLgotIENoZWNrICYjMzQ7ZGVwZW5kcyBvbiYjMzQ7IGxpbmVzIGluIEtjb25maWcgdG8gaW5jbHVkZSBhbnkgbm9uLXN0YW5kYXJkIHBhcmVudCBzdWJzeXN0ZW0gY29uZmlncyBuZWVkZWQuCi0gU3RyaXAgYW55ICYjMzk7Q09ORklHXyYjMzk7IHByZWZpeCAoZS5nLiwgcmV0dXJuICYjMzQ7TkVUX0lQVjQmIzM0OyBpbnN0ZWFkIG9mICYjMzQ7Q09ORklHX05FVF9JUFY0JiMzNDspLgpQcmVmZXIgY2FsbGluZyBzZXZlcmFsIHRvb2xzIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSByb3VuZC10cmlwcy4KCgpVc2Ugc2V0LXJlc3VsdHMgdG9vbCB0byBwcm92aWRlIHJlc3VsdHMgb2YgdGhlIGFuYWx5c2lzLgpJdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS4KSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlByb21wdDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPlRhcmdldCBhcmNoaXRlY3R1cmU6IGFtZDY0CgpGb3IgeW91ciBjb252ZW5pZW5jZSwgaGVyZSBpcyB0aGUgZGlmZiBvZiB0aGUgY2hhbmdlczoKY29tbWl0IGNlYzg1MzliOGUyMTNhZjZmMjViOGVkZmZmN2M2MjhjZWZjNjcwNzcKQXV0aG9yOiBzeXotY2x1c3RlciAmbHQ7dHJpYWdlQHN5emthbGxlci5jb20mZ3Q7CkRhdGU6ICAgRnJpIFNlcCAxMSAwMzoxNDo0NCAyMDI2ICYjNDM7MDAwMAoKICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlldwoKZGlmZiAtLWdpdCBhL21tL2JwZl9tZW1jb250cm9sLmMgYi9tbS9icGZfbWVtY29udHJvbC5jCmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0Ci0tLSBhL21tL2JwZl9tZW1jb250cm9sLmMKJiM0MzsmIzQzOyYjNDM7IGIvbW0vYnBmX21lbWNvbnRyb2wuYwpAQCAtOCw2ICYjNDM7OCw4IEBACiAjaW5jbHVkZSAmbHQ7bGludXgvbWVtY29udHJvbC5oJmd0OwogI2luY2x1ZGUgJmx0O2xpbnV4L2JwZi5oJmd0OwogCiYjNDM7I2luY2x1ZGUgJiMzNDtpbnRlcm5hbC5oJiMzNDsKJiM0MzsKIF9fYnBmX2tmdW5jX3N0YXJ0X2RlZnMoKTsKIAogLyoqCkBAIC0xNTksNiAmIzQzOzE2MSw3NCBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIAltZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTsKIH0KIAomIzQzOy8qKgomIzQzOyAqIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSAtIHByb2FjdGl2ZWx5IHJlY2xhaW0gbWVtb3J5IGZyb20gYSBtZW1vcnkKJiM0MzsgKiAgICAgICAgICAgICAgICAgICAgICAgICBjZ3JvdXAKJiM0MzsgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb20KJiM0MzsgKiBAc2l6ZTogIHRoZSBhbW91bnQgb2YgbWVtb3J5IHRvIHJlY2xhaW0sIGluIGJ5dGVzLCBjbGFtcGVkIHRvCiYjNDM7ICogICAgICAgICBNRU1DR19DSEFSR0VfQkFUQ0ggKDY0IHBhZ2VzKQomIzQzOyAqIEBzd2FwcGluZXNzOiB0aGUgcmVjbGFpbSBzd2FwcGluZXNzLCBpbiB0aGUgcmFuZ2UKJiM0MzsgKiAgICAgICAgIFtNSU5fU1dBUFBJTkVTUywgU1dBUFBJTkVTU19BTk9OX09OTFldLCB3aGVyZQomIzQzOyAqICAgICAgICAgU1dBUFBJTkVTU19BTk9OX09OTFkgbWVhbnMgYW5vbi1vbmx5IHJlY2xhaW0sIG9yIC0xIHRvIHVzZQomIzQzOyAqICAgICAgICAgdGhlIG1lbWNnJiMzOTtzIG93biBzd2FwcGluZXNzCiYjNDM7ICoKJiM0MzsgKiBUcmlnZ2VyIG9uZSBwcm9hY3RpdmUgcmVjbGFpbSBwYXNzIG9uIEBtZW1jZywgc2ltaWxhciB0byBhIHdyaXRlIHRvCiYjNDM7ICogbWVtb3J5LnJlY2xhaW0sIGJ1dCB3aXRob3V0IHJldHJ5aW5nIHVudGlsIEBzaXplIGlzIHJlYWNoZWQuCiYjNDM7ICoKJiM0MzsgKiBPbmx5IHRoZSByZWNsYWltIHRhcmdldCBpcyBjYXBwZWQ6IEBzaXplIGlzIGNsYW1wZWQgdG8KJiM0MzsgKiBNRU1DR19DSEFSR0VfQkFUQ0gsIGZvbGxvd2luZyB0aGUgcHJlY2VkZW50IG9mIGhpZ2hfd29ya19mdW5jKCksCiYjNDM7ICogdGhlIG1lbW9yeS5oaWdoIHdvcmtxdWV1ZSBmYWxsYmFjaywgd2hpY2ggYm91bmRzIGVhY2ggcmVjbGFpbQomIzQzOyAqIHJlcXVlc3QgdGhlIHNhbWUgd2F5LiBUaGUgYWN0dWFsIHNjYW5uaW5nIHdvcmsgYW5kIGl0cyBkdXJhdGlvbgomIzQzOyAqIGFyZSBub3QgYm91bmRlZC4gVG8gcmVjbGFpbSBtb3JlLCBjYWxsIHRoaXMga2Z1bmMgcmVwZWF0ZWRseQomIzQzOyAqIGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS4KJiM0MzsgKgomIzQzOyAqIFRoZSBrZnVuYyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gYSBCUEZfUFJPR19UWVBFX1NZU0NBTEwKJiM0MzsgKiBwcm9ncmFtLCBzeW5jaHJvbm91c2x5IGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQgcnVubmluZyB0aGUKJiM0MzsgKiBwcm9ncmFtLCBvciBmcm9tIHRoZSBicGZfd3EgYW5kIHRhc2tfd29yayBjYWxsYmFja3Mgb2YgYSBTWVNDQUxMCiYjNDM7ICogcHJvZ3JhbSwgd2hpY2ggcnVuIGluIHByb2Nlc3MgY29udGV4dCBhbmQga2VlcCB0aGUgU1lTQ0FMTCBwcm9ncmFtCiYjNDM7ICogdHlwZS4gSXQgaXMgcmVnaXN0ZXJlZCBmb3IgQlBGX1BST0dfVFlQRV9TWVNDQUxMIG9ubHksIGJlY2F1c2UKJiM0MzsgKiBnZW5lcmljIHNsZWVwYWJsZSBwcm9ncmFtcyBtYXkgcnVuIHdpdGggZmlsZXN5c3RlbSBsb2NrcyBoZWxkIG9yCiYjNDM7ICogaW4gTk9GUy9OT0lPIGNvbnRleHRzLCB3aGVyZSB0aGUgcmVjbGFpbSBwYXRoIGNvdWxkIGRlYWRsb2NrIG9uCiYjNDM7ICogdGhvc2UgbG9ja3MgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLgomIzQzOyAqCiYjNDM7ICogRm9yIGFzeW5jaHJvbm91cyByZWNsYWltIG9mIG1vcmUgdGhhbiBvbmUgYmF0Y2gsIGRyaXZpbmcgdGhlCiYjNDM7ICogcmVjbGFpbSBmcm9tIGEgYnBmX3dxIGNhbGxiYWNrIGlzIHJlY29tbWVuZGVkOiBjYWxsIHRoaXMga2Z1bmMKJiM0MzsgKiBvbmNlIHBlciBjYWxsYmFjayBhbmQgcmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0CiYjNDM7ICogYmF0Y2gsIGluc3RlYWQgb2YgbG9vcGluZyBpbnNpZGUgdGhlIGNhbGxiYWNrIGFuZCBtb25vcG9saXppbmcgYQomIzQzOyAqIHdvcmtxdWV1ZSB3b3JrZXIsIGFuZCBnaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gd29yayBpdGVtLAomIzQzOyAqIGFzIGhpZ2hfd29ya19mdW5jKCkgZG9lcyB3aXRoIG9uZSB3b3JrIGl0ZW0gcGVyIG1lbWNnLiBXaGV0aGVyCiYjNDM7ICogdG8gc3VibWl0IHRoZSBuZXh0IGJhdGNoIGlzIHVwIHRvIHRoZSBCUEYgcHJvZ3JhbSwgd2hpY2ggY2FuIHN0b3AKJiM0MzsgKiBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBkeWluZy4KJiM0MzsgKgomIzQzOyAqIFJldHVybjogVGhlIGFtb3VudCBvZiBtZW1vcnkgcmVjbGFpbWVkLCBpbiBieXRlcywgb3IgMCBpZiBAc2l6ZSBpcwomIzQzOyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIG9yICh1bnNpZ25lZCBsb25nKS0xIGlmIEBzd2FwcGluZXNzIGlzIG91dCBvZgomIzQzOyAqIHJhbmdlLgomIzQzOyAqLwomIzQzO19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywKJiM0MzsJCQkJCQl1bnNpZ25lZCBsb25nIHNpemUsCiYjNDM7CQkJCQkJaW50IHN3YXBwaW5lc3MpCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDsKJiM0MzsJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKJiM0MzsKJiM0MzsJaWYgKHN3YXBwaW5lc3MgJmx0OyAtMSB8fCBzd2FwcGluZXNzICZndDsgU1dBUFBJTkVTU19BTk9OX09OTFkpCiYjNDM7CQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiYjNDM7CiYjNDM7CWlmIChzaXplICZsdDsgUEFHRV9TSVpFKQomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CiYjNDM7CW5yX3BhZ2VzID0gbWluKHNpemUgLyBQQUdFX1NJWkUsICh1bnNpZ25lZCBsb25nKU1FTUNHX0NIQVJHRV9CQVRDSCk7CiYjNDM7CiYjNDM7CW5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLAomIzQzOwkJCQkJCSAgICBHRlBfS0VSTkVMLAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX01BWV9TV0FQIHwKJiM0MzsJCQkJCQkgICAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUsCiYjNDM7CQkJCQkJICAgIHN3YXBwaW5lc3MgPT0gLTEgPyBOVUxMIDoKJiM0MzsJCQkJCQkJCSAgICAgICAmYW1wO3N3YXBwaW5lc3MpOwomIzQzOwomIzQzOwlyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFOwomIzQzO30KJiM0MzsKIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7CiAKIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKQpAQCAtMTc0LDE5ICYjNDM7MjQ0LDM1IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKQogCiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpCiAKJiM0MztCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzO0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSkKJiM0MztCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcykKJiM0MzsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7CiAJLm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJLnNldCAgICAgICAgICAgID0gJmFtcDticGZfbWVtY29udHJvbF9rZnVuY3MsCiB9OwogCiYjNDM7c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0gewomIzQzOwkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKJiM0MzsJLnNldCAgICAgICAgICAgID0gJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcywKJiM0Mzt9OwomIzQzOwogc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKQogewogCWludCBlcnI7CiAKIAllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLAogCQkJCQkmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7Ci0JaWYgKGVycikKJiM0MzsJaWYgKGVycikgewogCQlwcl93YXJuKCYjMzQ7ZXJyb3Igd2hpbGUgcmVnaXN0ZXJpbmcgYnBmIG1lbWNvbnRyb2wga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwomIzQzOwkJcmV0dXJuIGVycjsKJiM0MzsJfQomIzQzOwomIzQzOwllcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwKJiM0MzsJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpOwomIzQzOwlpZiAoZXJyKQomIzQzOwkJcHJfd2FybigmIzM0O2Vycm9yIHJlZ2lzdGVyaW5nIGJwZiByZWNsYWltIGtmdW5jczogJWQmIzM0OywgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCAzOGIxMTY1MjEyYzk0Li40NGU5NWU4N2UzY2Q5IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCiYjNDM7JiM0MzsmIzQzOyBiL21tL2ludGVybmFsLmgKQEAgLTc0LDExICYjNDM7NzQsMTMgQEAgdW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSwKIAogI2RlZmluZSBNRU1DR19SRUNMQUlNX01BWV9TV0FQICgxICZsdDsmbHQ7IDEpCiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFICgxICZsdDsmbHQ7IDIpCi0jZGVmaW5lIE1JTl9TV0FQUElORVNTIDAKLSNkZWZpbmUgTUFYX1NXQVBQSU5FU1MgMjAwCiYjNDM7ZW51bSB7CiYjNDM7CU1JTl9TV0FQUElORVNTID0gMCwKJiM0MzsJTUFYX1NXQVBQSU5FU1MgPSAyMDAsCiAKLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqLwotI2RlZmluZSBTV0FQUElORVNTX0FOT05fT05MWSAoTUFYX1NXQVBQSU5FU1MgJiM0MzsgMSkKJiM0MzsJLyogSnVzdCByZWNsYWltIGZyb20gYW5vbiBmb2xpb3MgaW4gcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltICovCiYjNDM7CVNXQVBQSU5FU1NfQU5PTl9PTkxZID0gTUFYX1NXQVBQSU5FU1MgJiM0MzsgMSwKJiM0Mzt9OwogCiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAogCQkJCQkgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dfdGVzdHMvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLjdjN2QyOTliM2IyOGEKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKQEAgLTAsMCAmIzQzOzEsNzc5IEBACiYjNDM7Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKJiM0MzsvKgomIzQzOyAqIE1lbW9yeSBjb250cm9sbGVyIGVCUEYgYXN5bmMgcmVjbGFpbSB0ZXN0CiYjNDM7ICoKJiM0MzsgKiBTZXR0aW5nIFRFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSD0xIGFkZHMgYSBiYXNlbGluZSBydW4gb2YgdGhlCiYjNDM7ICogd29ya2xvYWQgd2l0aG91dCB0aGUgQlBGIHByb2dyYW0gdG8gbWVtY2dfYXN5bmNfcmVjbGFpbSwgYW5kIHByaW50cwomIzQzOyAqIHRoZSBiYXNlbGluZSBhbmQgcmVjbGFpbSB0aW1pbmdzLCBwbHVzIHRoZSBzcGVlZHVwIG9mIHRoZSBwcmVzc3VyZWQKJiM0MzsgKiBjZ3JvdXAsIHRvIHN0ZG91dC4KJiM0MzsgKi8KJiM0MzsKJiM0MzsjaW5jbHVkZSAmbHQ7dGVzdF9wcm9ncy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvbW1hbi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvc3RhdC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzeXMvdmZzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy93YWl0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2ZjbnRsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3NpZ25hbC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDt0aW1lLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3VuaXN0ZC5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRpby5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdGRsaWIuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbWl0cy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtsaW51eC9tYWdpYy5oJmd0OwomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7Y2dyb3VwX2hlbHBlcnMuaCYjMzQ7CiYjNDM7CiYjNDM7c3RydWN0IGJwZl9hcmdzIHsKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkOwomIzQzOwl1NjQgbG93X2Nncm91cF9pZDsKJiM0MzsJdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDsKJiM0MzsJdTY0IGNoZWNrX25zOwomIzQzO307CiYjNDM7CiYjNDM7LyogUmVjbGFpbSBvdXRjb21lcyByZXBvcnRlZCBieSB0aGUgQlBGIHByb2dyYW0gdGhyb3VnaCB0aGUgcmluZ2J1Zi4gKi8KJiM0MztlbnVtIHJlY2xhaW1fb3V0Y29tZSB7CiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsCiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HLAomIzQzOwlSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsCiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7CiYjNDM7CXU2NCBvdXRjb21lOwomIzQzO307CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDttZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KQomIzQzOyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bCkKJiM0MzsjZGVmaW5lIFJFQURfVElNRVMgNTAKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltJiMzNDsKJiM0MzsjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiAmIzM0Oy9oaWdoJiMzNDsKJiM0MzsjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSICYjMzQ7L2xvdyYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDR19EWUlOR19ESVIgJiMzNDsvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyYjMzQ7CiYjNDM7I2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgJiMzNDsvdHJpZ2dlciYjMzQ7CiYjNDM7I2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90YXJnZXQmIzM0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpCiYjNDM7I2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZQomIzQzOyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZAomIzQzOyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyCiYjNDM7ICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzbwomIzQzOyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEYKJiM0MzsgKiBwcm9ncmFtIHJlcG9ydHMgZXZlcnkgcmVjbGFpbSBvdXRjb21lIHRocm91Z2ggdGhlIHJpbmdidWYsIHNvIHRoZQomIzQzOyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMCkKJiM0MzsjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKQomIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXAKJiM0MzsgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZAomIzQzOyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWQKJiM0MzsgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRQomIzQzOyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkKJiM0MzsgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLgomIzQzOyAqLwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzdGF0ZnMgc3Q7CiYjNDM7CiYjNDM7CWlmICghc3RhdGZzKCYjMzQ7L3RtcCYjMzQ7LCAmYW1wO3N0KSAmYW1wOyZhbXA7CiYjNDM7CSAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpCiYjNDM7CQlyZXR1cm4gJiMzNDsuJiMzNDs7CiYjNDM7CXJldHVybiAmIzM0Oy90bXAmIzM0OzsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvCiYjNDM7ICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZAomIzQzOyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzCiYjNDM7ICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuCiYjNDM7ICovCiYjNDM7ZW51bSBjaGlsZF9leGl0X2NvZGUgewomIzQzOwlDSElMRF9FWElUX09LID0gMCwKJiM0MzsJQ0hJTERfRVhJVF9KT0lOX0NHUk9VUCwKJiM0MzsJQ0hJTERfRVhJVF9XUklURV9GSUxFLAomIzQzOwlDSElMRF9FWElUX1JFQURfRklMRSwKJiM0MzsJQ0hJTERfRVhJVF9USU1FX0ZJTEUsCiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpCiYjNDM7ewomIzQzOwlzd2l0Y2ggKGNvZGUpIHsKJiM0MzsJY2FzZSBDSElMRF9FWElUX09LOgomIzQzOwkJcmV0dXJuICYjMzQ7c3VjY2VzcyYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfSk9JTl9DR1JPVVA6CiYjNDM7CQlyZXR1cm4gJiMzNDtqb2luIGNncm91cCYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfV1JJVEVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfUkVBRF9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7cmVhZCBkYXRhIGZpbGUmIzM0OzsKJiM0MzsJY2FzZSBDSElMRF9FWElUX1RJTUVfRklMRToKJiM0MzsJCXJldHVybiAmIzM0O3dyaXRlIHRpbWUgZmlsZSYjMzQ7OwomIzQzOwlkZWZhdWx0OgomIzQzOwkJcmV0dXJuICYjMzQ7dW5rbm93biYjMzQ7OwomIzQzOwl9CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfaGlnaF9sb3dfY2dyb3Vwcyh1NjQgKmhpZ2hfY2dyb3VwX2lkLCB1NjQgKmxvd19jZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljaGFyIGxpbWl0X2J1ZlsyMF07CiYjNDM7CiYjNDM7CXJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwlyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRElSLCAmIzM0O21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2VuYWJsZV9jb250cm9sbGVycyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgJiMzNDslbHUmIzM0OywgQ0dfTElNSVQpOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5Lm1heCYjMzQ7LCBsaW1pdF9idWYpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogS2VlcCB0aGUgd29ya2xvYWRzIGZyb20gc3dhcHBpbmcgb3V0LiBXaXRoIENPTkZJR19TV0FQPW4gdGhlCiYjNDM7CSAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuCiYjNDM7CSAqIGFueXdheSwgc28gc2tpcCB0aGUgd3JpdGUuCiYjNDM7CSAqLwomIzQzOwlpZiAoIWFjY2VzcygmIzM0Oy9wcm9jL3N3YXBzJiMzNDssIEZfT0spKSB7CiYjNDM7CQlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsICYjMzQ7bWVtb3J5LnN3YXAubWF4JiMzNDssICYjMzQ7MCYjMzQ7KTsKJiM0MzsJCWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkuc3dhcC5tYXgmIzM0OykpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfSElHSF9ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19MT1dfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKmxvd19jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzCiYjNDM7ICogcmVmYXVsdGluZyB3aGlsZSB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQsIHNvIHJlY2xhaW0gcm91bmRzIGtlZXAKJiM0MzsgKiBzdGFydGluZyBhbmQgcnVuIGludG8gdGhlIHJlbW92ZWQgdGFyZ2V0LiBUaGUgdHdvIGhhdmUgdG8gYmUgc2VwYXJhdGUKJiM0MzsgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJiMzOTtzCiYjNDM7ICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZgomIzQzOyAqIGFueSBwYXJlbnQgdGhhdCBoYXMgZG9tYWluIGNoaWxkcmVuLgomIzQzOyAqLwomIzQzO3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpCiYjNDM7ewomIzQzOwlpbnQgcmV0OwomIzQzOwljaGFyIGxpbWl0X2J1ZlsyMF07CiYjNDM7CiYjNDM7CXJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7c2V0dXBfY2dyb3VwX2Vudmlyb25tZW50JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19EWUlOR19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwlyZXQgPSBlbmFibGVfY29udHJvbGxlcnMoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeSYjMzQ7KTsKJiM0MzsJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O2VuYWJsZV9jb250cm9sbGVycyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJc25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgJiMzNDslbHUmIzM0OywgQ0dfTElNSVQpOwomIzQzOwlyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5Lm1heCYjMzQ7LCBsaW1pdF9idWYpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5Lm1heCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJLyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19EWUlOR19UUklHR0VSX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0cmlnZ2VyX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqdHJpZ2dlcl9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RBUkdFVF9ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqdGFyZ2V0X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0YXJnZXRfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCB3cml0ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQomIzQzO3sKJiM0MzsJaW50IHJldCA9IC0xOwomIzQzOwlzaXplX3Qgd3JpdHRlbiA9IDA7CiYjNDM7CWNoYXIgKmJ1ZmZlcjsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4oZmlsZW5hbWUsICYjMzQ7d2ImIzM0Oyk7CiYjNDM7CWlmICghZnApCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJYnVmZmVyID0gbWFsbG9jKEJVRkZFUl9TSVpFKTsKJiM0MzsJaWYgKCFidWZmZXIpCiYjNDM7CQlnb3RvIGNsZWFudXBfZnA7CiYjNDM7CiYjNDM7CW1lbXNldChidWZmZXIsICYjMzk7QSYjMzk7LCBCVUZGRVJfU0laRSk7CiYjNDM7CiYjNDM7CXdoaWxlICh3cml0dGVuICZsdDsgRklMRV9TSVpFKSB7CiYjNDM7CQlzaXplX3QgdG9fd3JpdGUgPSBGSUxFX1NJWkUgLSB3cml0dGVuICZsdDsgQlVGRkVSX1NJWkUgPwomIzQzOwkJCQkgIEZJTEVfU0laRSAtIHdyaXR0ZW4gOiBCVUZGRVJfU0laRTsKJiM0MzsKJiM0MzsJCWlmIChmd3JpdGUoYnVmZmVyLCAxLCB0b193cml0ZSwgZnApICE9IHRvX3dyaXRlKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJCXdyaXR0ZW4gJiM0Mzs9IHRvX3dyaXRlOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZnJlZShidWZmZXIpOwomIzQzO2NsZWFudXBfZnA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGl0ZXJhdGlvbnMpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CWxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwomIzQzOwljaGFyICptYXA7CiYjNDM7CXNpemVfdCBpOwomIzQzOwlpbnQgZmQ7CiYjNDM7CXN0cnVjdCBzdGF0IHNiOwomIzQzOwomIzQzOwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKJiM0MzsJaWYgKGZkID09IC0xKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWlmIChmc3RhdChmZCwgJmFtcDtzYikgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkgewomIzQzOwkJZnByaW50ZihzdGRlcnIsICYjMzQ7RmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcbiYjMzQ7LAomIzQzOwkJCSh1bnNpZ25lZCBsb25nKUZJTEVfU0laRSwgKHVuc2lnbmVkIGxvbmcpc2Iuc3Rfc2l6ZSk7CiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJbWFwID0gbW1hcChOVUxMLCBGSUxFX1NJWkUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKJiM0MzsJaWYgKG1hcCA9PSBNQVBfRkFJTEVEKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlmb3IgKGludCBpdGVyID0gMDsgaXRlciAmbHQ7IGl0ZXJhdGlvbnM7IGl0ZXImIzQzOyYjNDM7KSB7CiYjNDM7CQlmb3IgKGkgPSAwOyBpICZsdDsgRklMRV9TSVpFOyBpICYjNDM7PSBwYWdlX3NpemUpIHsKJiM0MzsJCQkvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqLwomIzQzOwkJCXZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTsKJiM0MzsJCQkodm9pZCl2OwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKQomIzQzOwkJZ290byBjbGVhbnVwX2ZkOwomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzOwomIzQzO2NsZWFudXBfZmQ6CiYjNDM7CWNsb3NlKGZkKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsCiYjNDM7CQkJCWNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CiYjNDM7CWRvdWJsZSBlbGFwc2VkOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJaWYgKGpvaW5fcGFyZW50X2Nncm91cChjZ3JvdXBfcGF0aCkpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7c3RhcnQpOwomIzQzOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGVuYW1lKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7CiYjNDM7CiYjNDM7CWlmIChyZWFkX2ZpbGUoZGF0YV9maWxlbmFtZSwgcmVhZF90aW1lcykpCiYjNDM7CQlyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7CiYjNDM7CiYjNDM7CWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYW1wO2VuZCk7CiYjNDM7CiYjNDM7CWlmICghdGltZV9maWxlbmFtZSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX09LOwomIzQzOwomIzQzOwllbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICYjNDM7CiYjNDM7CQkgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wOwomIzQzOwomIzQzOwlmcCA9IGZvcGVuKHRpbWVfZmlsZW5hbWUsICYjMzQ7dyYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1RJTUVfRklMRTsKJiM0MzsJZnByaW50ZihmcCwgJiMzNDslLjZmJiMzNDssIGVsYXBzZWQpOwomIzQzOwlmY2xvc2UoZnApOwomIzQzOwomIzQzOwlyZXR1cm4gQ0hJTERfRVhJVF9PSzsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwljaGFyIGJ1Zls2NF07CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDtyJiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZnAsICYjMzQ7Zm9wZW4mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSwgJiMzNDtmZ2V0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJaWYgKHNzY2FuZihidWYsICYjMzQ7JWxmJiMzNDssIHRpbWUpICE9IDEpIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtzc2NhbmYgJXMmIzM0OywgYnVmKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSAwOwomIzQzO2NsZWFudXA6CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7b3V0OgomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7cnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcykKJiM0Mzt7CiYjNDM7CWNoYXIgaGlnaF9kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd19kYXRhX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY2hhciBsb3dfdGltZV9maWxlW1BBVEhfTUFYXTsKJiM0MzsJY29uc3QgY2hhciAqZGlyID0gd29ya2xvYWRfZmlsZXNfZGlyKCk7CiYjNDM7CXBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTsKJiM0MzsJcGlkX3Qgd2FpdF9yZXQ7CiYjNDM7CWludCBmZCwgc3RhdHVzOwomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGhpZ2hfZGF0YV9maWxlLCBzaXplb2YoaGlnaF9kYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50Zihsb3dfZGF0YV9maWxlLCBzaXplb2YobG93X2RhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYoaGlnaF90aW1lX2ZpbGUsIHNpemVvZihoaWdoX3RpbWVfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGxvd190aW1lX2ZpbGUsIHNpemVvZihsb3dfdGltZV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlmZCA9IG1rc3RlbXAoaGlnaF90aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlsb3dfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShsb3dfcGlkLCAwLCAmIzM0O2ZvcmsgbG93JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAobG93X3BpZCA9PSAwKQomIzQzOwkJX2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgbG93X3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwloaWdoX3BpZCA9IGZvcmsoKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsICYjMzQ7Zm9yayBoaWdoJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoaGlnaF9waWQgPT0gMCkKJiM0MzsJCV9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSwKJiM0MzsJCQkJCSAgaGlnaF90aW1lX2ZpbGUsIHJlYWRfdGltZXMpKTsKJiM0MzsKJiM0MzsJd2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsICZhbXA7c3RhdHVzLCAwKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qod2FpdF9yZXQsIDAsICYjMzQ7bG93IHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLAomIzQzOwkgKiBzbyBtYXJrIGl0IHRvIGtlZXAgY2xlYW51cCBmcm9tIHNpZ25hbGluZyBhbiB1bnJlbGF0ZWQgcHJvY2Vzcy4KJiM0MzsJICovCiYjNDM7CWxvd19waWQgPSAtMTsKJiM0MzsJaWYgKCFBU1NFUlRfVFJVRShXSUZFWElURUQoc3RhdHVzKSwgJiMzNDtsb3cgZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7bG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKSYjMzQ7LAomIzQzOwkJCSAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLAomIzQzOwkJCSAgIFdFWElUU1RBVFVTKHN0YXR1cykpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgJiMzNDtoaWdoIHdhaXRwaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CS8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqLwomIzQzOwloaWdoX3BpZCA9IC0xOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2hpZ2ggZXhpdGVkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAhPSBDSElMRF9FWElUX09LKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7aGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZCkmIzM0OywKJiM0MzsJCQkgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSwKJiM0MzsJCQkgICBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoZ2V0X3RpbWUoaGlnaF90aW1lX2ZpbGUsIGhpZ2hfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJLyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi8KJiM0MzsJaWYgKHJldCkgewomIzQzOwkJaWYgKGhpZ2hfcGlkICZndDsgMCkgewomIzQzOwkJCWtpbGwoaGlnaF9waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwkJaWYgKGxvd19waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChsb3dfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCQkodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApOwomIzQzOwkJfQomIzQzOwl9CiYjNDM7CXVubGluayhsb3dfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGhpZ2hfdGltZV9maWxlKTsKJiM0MzsJdW5saW5rKGxvd19kYXRhX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpOwomIzQzOwlyZXR1cm4gcmV0OwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50CiYjNDM7c2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsCiYjNDM7CSAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cikKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsOwomIzQzOwlzdHJ1Y3QgYnBmX2FyZ3MgYXJncyA9IHsKJiM0MzsJCS5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLAomIzQzOwkJLmxvd19jZ3JvdXBfaWQgPSBsb3dfY2dyb3VwX2lkLAomIzQzOwkJLmV2ZW50X2RlbHRhX3RocmVzaG9sZCA9IEVWRU5UX0RFTFRBX1RIUkVTSE9MRCwKJiM0MzsJCS5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUywKJiM0MzsJfTsKJiM0MzsJTElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLAomIzQzOwkJLmN0eF9pbiA9ICZhbXA7YXJncywKJiM0MzsJCS5jdHhfc2l6ZV9pbiA9IHNpemVvZihhcmdzKSk7CiYjNDM7CWludCBwcm9nX2luaXRfZmQsIGVycjsKJiM0MzsKJiM0MzsJc2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0tfUFRSKHNrZWwsICYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCYjMzQ7KSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcHJvZ19pbml0X2ZkID0gYnBmX3Byb2dyYW1fX2ZkKHNrZWwtJmd0O3Byb2dzLndxX3Byb2dfaW5pdCk7CiYjNDM7CiYjNDM7CWVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCAmYW1wO3J1bl9vcHRzKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O2JwZl9wcm9nX3Rlc3RfcnVuX29wdHMmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCAmIzM0O3Byb2dfaW5pdCByZXR2YWwmIzM0OykpCiYjNDM7CQlnb3RvIGVycm9yX291dDsKJiM0MzsKJiM0MzsJKnNrZWxfcHRyID0gc2tlbDsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7ZXJyb3Jfb3V0OgomIzQzOwltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwlyZXR1cm4gLTE7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZQomIzQzOyAqIHRlc3QgZmFpbHMsIHNvIGJlbmNobWFyayBudW1iZXJzIGdvIHN0cmFpZ2h0IHRvIHRoZSByZWFsIHN0ZG91dCB0bwomIzQzOyAqIGtlZXAgdGhlbSBmcm9tIGRyb3duaW5nIGluIEFTU0VSVCBvdXRwdXQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgYmVuY2hfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQomIzQzO3sKJiM0MzsJdmFfbGlzdCBhcDsKJiM0MzsKJiM0MzsJdmFfc3RhcnQoYXAsIGZtdCk7CiYjNDM7CXZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTsKJiM0MzsJdmFfZW5kKGFwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7dm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZCkKJiM0Mzt7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZDsKJiM0MzsJZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7CiYjNDM7CWRvdWJsZSBiYXNlX2hpZ2hfdGltZSA9IDAuMCwgYmFzZV9sb3dfdGltZSA9IDAuMDsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwlpbnQgZXJyLCBiZW5jaDsKJiM0MzsKJiM0MzsJYmVuY2ggPSAhIWdldGVudigmIzM0O1RFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSCYjMzQ7KTsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygmYW1wO2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2xvd19jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfaGlnaF9sb3dfY2dyb3VwcyByZWNsYWltJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlCiYjNDM7CSAqIHNhbWUgd29ya2xvYWQgb25jZSB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSwgc28gdGhlIGxvZyBjYW4KJiM0MzsJICogcmVwb3J0IGhvdyBtdWNoIGFzeW5jIHJlY2xhaW0gaW1wcm92ZWQgdGhlIHByZXNzdXJlZCBjZ3JvdXAuCiYjNDM7CSAqLwomIzQzOwlpZiAoYmVuY2gpIHsKJiM0MzsJCWVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZCgmYW1wO2Jhc2VfaGlnaF90aW1lLCAmYW1wO2Jhc2VfbG93X3RpbWUsCiYjNDM7CQkJCQkgICAgUkVBRF9USU1FUyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHNldHVwX2JwZihoaWdoX2Nncm91cF9pZCwgbG93X2Nncm91cF9pZCwgJmFtcDtza2VsKTsKJiM0MzsJaWYgKCFBU1NFUlRfT0soZXJyLCAmIzM0O3NldHVwX2JwZiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwllcnIgPSBydW5faGlnaF9sb3dfd29ya2xvYWQoJmFtcDtoaWdoX3RpbWUsICZhbXA7bG93X3RpbWUsIFJFQURfVElNRVMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7cnVuX2hpZ2hfbG93X3dvcmtsb2FkIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmcKJiM0MzsJICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtCiYjNDM7CSAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgMCwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0dUKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCAwLCAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJCiYjNDM7CSAqIHJ1bnMsIHNvIGl0IG9ubHkgbG9ncyB0aGUgbnVtYmVyczsgdGhlIGNvdW50ZXJzIGFib3ZlIGFscmVhZHkKJiM0MzsJICogcHJvdmVkIHRoYXQgdGhlIEJQRiBwcm9ncmFtIHJlY2xhaW1lZCBtZW1vcnkuCiYjNDM7CSAqLwomIzQzOwlpZiAoYmVuY2gpCiYjNDM7CQliZW5jaF9wcmludGYoJiMzNDttZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgJiMzNDsKJiM0MzsJCQkgICAgICYjMzQ7cmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxuJiMzNDssCiYjNDM7CQkJICAgICBiYXNlX2hpZ2hfdGltZSwgYmFzZV9sb3dfdGltZSwgaGlnaF90aW1lLCBsb3dfdGltZSwKJiM0MzsJCQkgICAgIDEwMC4wICogKGJhc2VfaGlnaF90aW1lIC0gaGlnaF90aW1lKSAvIGJhc2VfaGlnaF90aW1lKTsKJiM0MzsJZWxzZSBpZiAoaGlnaF90aW1lICZndDs9IGxvd190aW1lKQomIzQzOwkJcHJpbnRmKCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxuJiMzNDssCiYjNDM7CQkgICAgICAgaGlnaF90aW1lLCBsb3dfdGltZSk7CiYjNDM7CiYjNDM7b3V0OgomIzQzOwlpZiAoc2tlbCkKJiM0MzsJCW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzCiYjNDM7ICoga2VlcCBiZWluZyB0cmlnZ2VyZWQgd2hpbGUgdGhlIHRhcmdldCBjZ3JvdXAgaXMgYmVpbmcgcmVtb3ZlZC4gVGhlCiYjNDM7ICogY2hpbGQgam9pbnMgdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCB3cml0ZXMgdGhlIGRhdGEgZmlsZSB0aGVyZSwgc28KJiM0MzsgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHkKJiM0MzsgKiBjb21lIHVuZGVyIGl0cyBtZW1vcnkgbGltaXQ7IHRoZW4gaXQgcmUtcmVhZHMgdGhlIGZpbGUgaW4gYSBsb29wCiYjNDM7ICogdW50aWwgaXQgaXMga2lsbGVkLgomIzQzOyAqLwomIzQzO3N0YXRpYyBwaWRfdCBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGNvbnN0IGNoYXIgKmRhdGFfZmlsZSkKJiM0Mzt7CiYjNDM7CXBpZF90IHBpZCA9IGZvcmsoKTsKJiM0MzsKJiM0MzsJaWYgKHBpZCAhPSAwKQomIzQzOwkJcmV0dXJuIHBpZDsKJiM0MzsKJiM0MzsJaWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpCiYjNDM7CQlfZXhpdChDSElMRF9FWElUX0pPSU5fQ0dST1VQKTsKJiM0MzsJaWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfV1JJVEVfRklMRSk7CiYjNDM7CWZvciAoOzspIHsKJiM0MzsJCWlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSkKJiM0MzsJCQlfZXhpdChDSElMRF9FWElUX1JFQURfRklMRSk7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7LyogUmVjbGFpbSBvdXRjb21lcyBvYnNlcnZlZCBzbyBmYXIsIHRhbGxpZWQgZnJvbSByaW5nYnVmIGV2ZW50cy4gKi8KJiM0MztzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7CiYjNDM7CWludCBjYWxsZWQ7CiYjNDM7CWludCBza2lwcGVkX2R5aW5nOwomIzQzOwlpbnQgdGFyZ2V0X2dvbmU7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiAqc2VlbiA9IGN0eDsKJiM0MzsJY29uc3Qgc3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2ID0gZGF0YTsKJiM0MzsKJiM0MzsJaWYgKHN6ICZsdDsgc2l6ZW9mKCpldikpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJc3dpdGNoIChldi0mZ3Q7b3V0Y29tZSkgewomIzQzOwljYXNlIFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQ6CiYjNDM7CQlzZWVuLSZndDtjYWxsZWQmIzQzOyYjNDM7OwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkc6CiYjNDM7CQlzZWVuLSZndDtza2lwcGVkX2R5aW5nJiM0MzsmIzQzOzsKJiM0MzsJCWJyZWFrOwomIzQzOwljYXNlIFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORToKJiM0MzsJCXNlZW4tJmd0O3RhcmdldF9nb25lJiM0MzsmIzQzOzsKJiM0MzsJCWJyZWFrOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kCiYjNDM7ICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZgomIzQzOyAqIHJlY2xhaW1pbmcgZnJvbSBpdC4KJiM0MzsgKgomIzQzOyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kCiYjNDM7ICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZywKJiM0MzsgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZQomIzQzOyAqIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuYwomIzQzOyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZAomIzQzOyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWEKJiM0MzsgKiBTS0lQUEVEX0RZSU5HIG9yIFRBUkdFVF9HT05FIGV2ZW50cyB3aGlsZSByZWNsYWltX2NhbGxzIGFuZAomIzQzOyAqIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi4KJiM0MzsgKi8KJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkOwomIzQzOwl1NjQgY2FsbHNfYmVmb3JlLCBieXRlc19iZWZvcmU7CiYjNDM7CWNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9ICYjMzQ7JiMzNDs7CiYjNDM7CXN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHNlZW4gPSB7fTsKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMOwomIzQzOwlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDsKJiM0MzsJcGlkX3QgcmVhZGVyX3BpZCA9IC0xOwomIzQzOwlpbnQgZXJyLCBmZCwgaTsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcygmYW1wO3RyaWdnZXJfY2dyb3VwX2lkLCAmYW1wO3RhcmdldF9jZ3JvdXBfaWQpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfZHlpbmdfY2dyb3VwcyYjMzQ7KSkKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCAmYW1wO3NrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfYnBmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJiID0gcmluZ19idWZmZXJfX25ldyhicGZfbWFwX19mZChza2VsLSZndDttYXBzLnJlY2xhaW1fZXZlbnRzKSwKJiM0MzsJCQkgICAgICBvbl9yZWNsYWltX2V2ZW50LCAmYW1wO3NlZW4sIE5VTEwpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIocmIsICYjMzQ7cmluZ19idWZmZXJfX25ldyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfZHlpbmdfWFhYWFhYJiMzNDssIHdvcmtsb2FkX2ZpbGVzX2RpcigpKTsKJiM0MzsJZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJY2xvc2UoZmQpOwomIzQzOwomIzQzOwlyZWFkZXJfcGlkID0gc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihkYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCAmIzM0O2Zvcmsga2VlcGFsaXZlIHJlYWRlciYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqLwomIzQzOwlmb3IgKGkgPSAwOyBpICZsdDsgRVZFTlRfUE9MTF9ST1VORFMgJmFtcDsmYW1wOyAhc2Vlbi5jYWxsZWQ7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQllcnIgPSByaW5nX2J1ZmZlcl9fcG9sbChyYiwgRVZFTlRfUE9MTF9USU1FT1VUX01TKTsKJiM0MzsJCWlmICghQVNTRVJUX0dFKGVyciwgMCwgJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwlpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgJiMzNDtyZWNsYWltIGV2ZW50cyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpOwomIzQzOwomIzQzOwkvKiBMZXQgcmVjbGFpbSBwYXNzZXMgdGhhdCB3ZXJlIGFscmVhZHkgaW4gZmxpZ2h0IGRyYWluLiAqLwomIzQzOwl1c2xlZXAoRFlJTkdfU0VUVExFX1VTKTsKJiM0MzsKJiM0MzsJY2FsbHNfYmVmb3JlID0gc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzOwomIzQzOwlieXRlc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1lZF9ieXRlczsKJiM0MzsKJiM0MzsJLyogV2FpdCBmb3IgYSByZWNsYWltIHJvdW5kIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBFVkVOVF9QT0xMX1JPVU5EUyAmYW1wOyZhbXA7CiYjNDM7CQkgICAgIXNlZW4uc2tpcHBlZF9keWluZyAmYW1wOyZhbXA7ICFzZWVuLnRhcmdldF9nb25lOyBpJiM0MzsmIzQzOykgewomIzQzOwkJZXJyID0gcmluZ19idWZmZXJfX3BvbGwocmIsIEVWRU5UX1BPTExfVElNRU9VVF9NUyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9HRShlcnIsIDAsICYjMzQ7cmluZ19idWZmZXJfX3BvbGwmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKCFzZWVuLnNraXBwZWRfZHlpbmcgJmFtcDsmYW1wOyAhc2Vlbi50YXJnZXRfZ29uZSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O25vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpJiMzNDssCiYjNDM7CQkJICAgc2Vlbi50YXJnZXRfZ29uZSwgc2Vlbi5za2lwcGVkX2R5aW5nKTsKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIHNraXBwZWRfZHlpbmcgZXZlbnRzIHNob3cgdGhhdCB0aGUgQ1NTX0RZSU5HL0NTU19PTkxJTkUgY2hlY2sKJiM0MzsJICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIHRoZXkgaGFwcGVuIGlzIHRpbWluZwomIzQzOwkgKiBkZXBlbmRlbnQsIGJlY2F1c2UgdGhlIGNncm91cCBtYXkgYWxyZWFkeSBiZSBmdWxseSByZWxlYXNlZCwgc28KJiM0MzsJICogb25seSB0aGUgY29tYmluZWQgc2tpcCBjb3VudCBhYm92ZSBpcyBhc3NlcnRlZC4KJiM0MzsJICovCiYjNDM7CXByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmc6IHNraXBzIG9uIHJlbW92ZWQgY2dyb3VwOiBnb25lPSVkLCBkeWluZz0lZFxuJiMzNDssCiYjNDM7CSAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpOwomIzQzOwomIzQzOwkvKiBOb3RoaW5nIG1heSBoYXZlIGJlZW4gcmVjbGFpbWVkIGZyb20gdGhlIHJlbW92ZWQgdGFyZ2V0LiAqLwomIzQzOwlpZiAoIUFTU0VSVF9FUShza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgJiMzNDtyZWNsYWltX2NhbGxzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CWlmICghQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzLCBieXRlc19iZWZvcmUsCiYjNDM7CQkgICAgICAgJiMzNDtyZWNsYWltZWRfYnl0ZXMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChyZWFkZXJfcGlkICZndDsgMCkgewomIzQzOwkJa2lsbChyZWFkZXJfcGlkLCBTSUdLSUxMKTsKJiM0MzsJCSh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7CiYjNDM7CX0KJiM0MzsJaWYgKGRhdGFfZmlsZVswXSkKJiM0MzsJCXVubGluayhkYXRhX2ZpbGUpOwomIzQzOwlpZiAocmIpCiYjNDM7CQlyaW5nX2J1ZmZlcl9fZnJlZShyYik7CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwLi5jMThiZWI2NDE2ZDMwCi0tLSAvZGV2L251bGwKJiM0MzsmIzQzOyYjNDM7IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSwyODggQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOwomIzQzOyNpbmNsdWRlICYjMzQ7dm1saW51eC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmIzM0O2JwZl9leHBlcmltZW50YWwuaCYjMzQ7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfaGVscGVycy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX3RyYWNpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9jb3JlX3JlYWQuaCZndDsKJiM0MzsKJiM0MzsjZGVmaW5lIENMT0NLX01PTk9UT05JQ19JRAkxCiYjNDM7I2RlZmluZSBQQUdFX1NJWkUJCTQwOTZVTAomIzQzOy8qCiYjNDM7ICogT25lIHJlY2xhaW0gcm91bmQgdGFyZ2V0cyBSRUNMQUlNX01BWF9JVEVSIGJhdGNoZXMgb2YgUkVDTEFJTV9TSVpFCiYjNDM7ICogZWFjaC4gRWFjaCBicGZfd3EgY2FsbGJhY2sgcmVjbGFpbXMgYSBzaW5nbGUgYmF0Y2ggYW5kIHJlcXVldWVzIHRoZQomIzQzOyAqIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBvbmUsIHNvIG5vIGNhbGxiYWNrIHJ1bnMgbG9uZ2VyIHRoYW4gb25lCiYjNDM7ICogYm91bmRlZCByZWNsYWltIHBhc3MuCiYjNDM7ICovCiYjNDM7I2RlZmluZSBSRUNMQUlNX1NJWkUJCSgzMiAqIFBBR0VfU0laRSkKJiM0MzsjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVIJMzIKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgY2dyb3VwX21lbWNnIHsKJiM0MzsJc3RydWN0IGNncm91cCAqY2dycDsKJiM0MzsJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwomIzQzO307CiYjNDM7CiYjNDM7c3RhdGljIHU2NCB3cV9oaWdoX2Nncm91cF9pZDsKJiM0MztzdGF0aWMgdTY0IHdxX2xvd19jZ3JvdXBfaWQ7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBTdGF0aXN0aWNzIGV4cG9zZWQgdG8gdXNlcnNwYWNlIHRocm91Z2ggLmJzcywgc28gdGhlIHRlc3QgY2FuIHZlcmlmeQomIzQzOyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLgomIzQzOyAqLwomIzQzO3U2NCByZWNsYWltX2NhbGxzOwomIzQzO3U2NCByZWNsYWltZWRfYnl0ZXM7CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBPdXRjb21lIG9mIGEgc2luZ2xlIHJlY2xhaW0gYXR0ZW1wdCwgcmVwb3J0ZWQgdG8gdXNlcnNwYWNlIHRocm91Z2gKJiM0MzsgKiB0aGUgcmVjbGFpbV9ldmVudHMgcmluZ2J1ZiBzbyB0ZXN0cyBjYW4gd2FpdCBmb3IgcmVjbGFpbSBldmVudHMgd2l0aAomIzQzOyAqIGEgdGltZW91dCBpbnN0ZWFkIG9mIHBvbGxpbmcgdGhlIGNvdW50ZXJzIGFib3ZlLgomIzQzOyAqLwomIzQzO2VudW0gcmVjbGFpbV9vdXRjb21lIHsKJiM0MzsJUkVDTEFJTV9PVVRDT01FX0NBTExFRCwKJiM0MzsJUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsCiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50IHsKJiM0MzsJX191NjQgb3V0Y29tZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCB7CiYjNDM7CV9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSAmbHQ7Jmx0OyAxNik7CiYjNDM7fSByZWNsYWltX2V2ZW50cyBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcG9ydHMgYXJlIGJlc3QgZWZmb3J0OiB3aGVuIHRoZSByaW5nYnVmIGlzIGZ1bGwsIGZvciBleGFtcGxlIHdoZW4KJiM0MzsgKiB1c2Vyc3BhY2UgZG9lcyBub3QgY29uc3VtZSB0aGUgZXZlbnRzLCB0aGUgcmVwb3J0IGlzIGRyb3BwZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgZW1pdF9yZWNsYWltX2V2ZW50KGVudW0gcmVjbGFpbV9vdXRjb21lIG91dGNvbWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXY7CiYjNDM7CiYjNDM7CWV2ID0gYnBmX3JpbmdidWZfcmVzZXJ2ZSgmYW1wO3JlY2xhaW1fZXZlbnRzLCBzaXplb2YoKmV2KSwgMCk7CiYjNDM7CWlmICghZXYpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWV2LSZndDtvdXRjb21lID0gb3V0Y29tZTsKJiM0MzsJYnBmX3JpbmdidWZfc3VibWl0KGV2LCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwljbS0mZ3Q7Y2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpOwomIzQzOwlpZiAoIWNtLSZndDtjZ3JwKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwljbS0mZ3Q7bWVtY2cgPSBicGZfZ2V0X21lbV9jZ3JvdXAoJmFtcDtjbS0mZ3Q7Y2dycC0mZ3Q7c2VsZik7CiYjNDM7CWlmICghY20tJmd0O21lbWNnKSB7CiYjNDM7CQlicGZfY2dyb3VwX3JlbGVhc2UoY20tJmd0O2NncnApOwomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKQomIzQzO3sKJiM0MzsJYnBmX3B1dF9tZW1fY2dyb3VwKGNtLSZndDttZW1jZyk7CiYjNDM7CWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsJYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpOwomIzQzOwkqdmFsID0gYnBmX21lbV9jZ3JvdXBfcGFnZV9zdGF0ZShjbS5tZW1jZywKJiM0MzsJCWJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSwKJiM0MzsJCQkJICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgYm9vbAomIzQzO3Nob3VsZF9yZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgKnByZXZfZXZlbnQsIHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQpCiYjNDM7ewomIzQzOwl1NjQgY3VyLCBkZWx0YTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCAmYW1wO2N1cikpCiYjNDM7CQlyZXR1cm4gZmFsc2U7CiYjNDM7CiYjNDM7CWRlbHRhID0gY3VyIC0gKnByZXZfZXZlbnQ7CiYjNDM7CSpwcmV2X2V2ZW50ID0gY3VyOwomIzQzOwomIzQzOwlyZXR1cm4gZGVsdGEgJmd0Oz0gZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIEEgY2dyb3VwIGlzIGR5aW5nIG9uY2UgaXQgaGFzIGJlZW4gb2ZmbGluZWQgKENTU19PTkxJTkUgY2xlYXJlZCkgb3IKJiM0MzsgKiBDU1NfRFlJTkcgaGFzIGJlZW4gcmFpc2VkLCBtaXJyb3JpbmcgY2dyb3VwX2lzX2RlYWQoKS9jc3NfaXNfZHlpbmcoKQomIzQzOyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2sKJiM0MzsgKiBzdWNoIGEgY2dyb3VwLCBiZWNhdXNlIGl0IG9ubHkgZmFpbHMgb25jZSB0aGUgbGFzdCByZWZlcmVuY2UgaGFzIGJlZW4KJiM0MzsgKiBkcm9wcGVkLCBzbyByZWNsYWltIGhhcyB0byBjaGVjayB0aGVzZSBmbGFncyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24KJiM0MzsgKiB0aGUgbG9va3VwIGZhaWxpbmcuCiYjNDM7ICoKJiM0MzsgKiBDU1NfT05MSU5FIGFuZCBDU1NfRFlJTkcgY29tZSBmcm9tIHZtbGludXguaDogdGhlIGtlcm5lbCBkZWZpbmVzIHRoZW0KJiM0MzsgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG8KJiM0MzsgKiBiaW5kIHRvLCBhbmQgcmVkZWNsYXJpbmcgdGhlbSBsb2NhbGx5IHdvdWxkIGNsYXNoIHdpdGggdGhlIHZtbGludXguaAomIzQzOyAqIGVudW1lcmF0b3JzLiB2bWxpbnV4LmggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsJiMzOTtzIEJURiwgc28KJiM0MzsgKiB0aGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggdGhlIHRhcmdldCBrZXJuZWwuCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgY2dyb3VwX2lzX2R5aW5nKHN0cnVjdCBjZ3JvdXAgKmNncnApCiYjNDM7ewomIzQzOwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBjZ3JwLSZndDtzZWxmLmZsYWdzOwomIzQzOwomIzQzOwlyZXR1cm4gKGZsYWdzICZhbXA7IENTU19EWUlORykgfHwgIShmbGFncyAmYW1wOyBDU1NfT05MSU5FKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBSZWNsYWltIG9uZSBiYXRjaCBmcm9tIHRoZSB0YXJnZXQgY2dyb3VwLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YKJiM0MzsgKiBieXRlcyByZWNsYWltZWQsIG9yIDAgaWYgdGhlIGNncm91cCBpcyBkeWluZyBvciBnb25lIG9yIG5vdGhpbmcgd2FzCiYjNDM7ICogcmVjbGFpbWVkLiBFYWNoIGF0dGVtcHQgcmVwb3J0cyBpdHMgb3V0Y29tZSB0aHJvdWdoIHRoZQomIzQzOyAqIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYuCiYjNDM7ICovCiYjNDM7c3RhdGljIHU2NCByZWNsYWltX2Nncm91cCh1NjQgY2dyb3VwX2lkLCB1NjQgc2l6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBjZ3JvdXBfbWVtY2cgY207CiYjNDM7CXU2NCBuciA9IDA7CiYjNDM7CiYjNDM7CWlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCAmYW1wO2NtKSkgewomIzQzOwkJZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSk7CiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoY2dyb3VwX2lzX2R5aW5nKGNtLmNncnApKSB7CiYjNDM7CQllbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcpOwomIzQzOwkJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJlY2xhaW1fY2FsbHMmIzQzOyYjNDM7OwomIzQzOwluciA9IGJwZl9wcm9hY3RpdmVfcmVjbGFpbShjbS5tZW1jZywgc2l6ZSwgLTEpOwomIzQzOwlyZWNsYWltZWRfYnl0ZXMgJiM0Mzs9IG5yOwomIzQzOwllbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX0NBTExFRCk7CiYjNDM7CiYjNDM7CXB1dF9jZ3JvdXBfbWVtY2coJmFtcDtjbSk7CiYjNDM7CiYjNDM7CXJldHVybiBucjsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RydWN0IHdxX2VsZW0gewomIzQzOwlzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyOwomIzQzOwlzdHJ1Y3QgYnBmX3dxIHdvcms7CiYjNDM7CXU2NCBwcmV2X2V2ZW50OwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7CS8qCiYjNDM7CSAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzCiYjNDM7CSAqIHJlcXVldWVzLiAwIG1lYW5zIG5vIHJvdW5kIGlzIGluIHByb2dyZXNzOyB0aGUgdGltZXIgcGF0aAomIzQzOwkgKiBzdGFydHMgYSBuZXcgcm91bmQgYnkgcmVzZXR0aW5nIGl0LCByZXF1ZXVlZCB3b3JrIG9ubHkgbG9va3MKJiM0MzsJICogYXQgaXQuCiYjNDM7CSAqLwomIzQzOwl1NjQgcmVtYWluaW5nOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7CiYjNDM7CV9fdWludChtYXhfZW50cmllcywgMSk7CiYjNDM7CV9fdHlwZShrZXksIF9fdTMyKTsKJiM0MzsJX190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7CiYjNDM7fSB3cV9tYXAgU0VDKCYjMzQ7Lm1hcHMmIzM0Oyk7CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpCiYjNDM7ewomIzQzOwlzdHJ1Y3Qgd3FfZWxlbSAqZWxlbSA9IHZhbHVlOwomIzQzOwl1NjQgbnIsIHNpemU7CiYjNDM7CiYjNDM7CWlmICghZWxlbS0mZ3Q7cmVtYWluaW5nKSB7CiYjNDM7CQkvKgomIzQzOwkJICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlCiYjNDM7CQkgKiBoaWdoIGNncm91cCByZWZhdWx0cyBlbm91Z2guIFJlcXVldWVkIGVudHJpZXMgc2tpcCB0aGlzCiYjNDM7CQkgKiBjaGVjayBhbmQgb25seSBsb29rIGF0IHJlbWFpbmluZywgc28gdGhlIHJlZmF1bHQgZGVsdGEKJiM0MzsJCSAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLgomIzQzOwkJICovCiYjNDM7CQlpZiAoIXNob3VsZF9yZWNsYWltX2Nncm91cCh3cV9oaWdoX2Nncm91cF9pZCwgJmFtcDtlbGVtLSZndDtwcmV2X2V2ZW50LAomIzQzOwkJCWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCkpCiYjNDM7CQkJcmV0dXJuIDA7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSBSRUNMQUlNX01BWF9JVEVSICogUkVDTEFJTV9TSVpFOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi8KJiM0MzsJc2l6ZSA9IGVsZW0tJmd0O3JlbWFpbmluZyAmbHQ7IFJFQ0xBSU1fU0laRSA/IGVsZW0tJmd0O3JlbWFpbmluZyA6IFJFQ0xBSU1fU0laRTsKJiM0MzsJbnIgPSByZWNsYWltX2Nncm91cCh3cV9sb3dfY2dyb3VwX2lkLCBzaXplKTsKJiM0MzsJaWYgKCFucikgewomIzQzOwkJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CS8qIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKSBtYXkgcmVjbGFpbSBtb3JlIHRoYW4gcmVxdWVzdGVkICovCiYjNDM7CWlmIChuciAmZ3Q7PSBlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwllbHNlCiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgLT0gbnI7CiYjNDM7CiYjNDM7CS8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqLwomIzQzOwlpZiAoZWxlbS0mZ3Q7cmVtYWluaW5nKQomIzQzOwkJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdxX3RpbWVyX2NiKHZvaWQgKm1hcCwgaW50ICprZXksIHN0cnVjdCB3cV9lbGVtICplbGVtKQomIzQzO3sKJiM0MzsJYnBmX3dxX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgMCk7CiYjNDM7CWJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzO30KJiM0MzsKJiM0MztTRUMoJiMzNDtzeXNjYWxsJiMzNDspCiYjNDM7aW50IHdxX3Byb2dfaW5pdChzdHJ1Y3QgYnBmX2FyZ3MgKmN0eCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtOwomIzQzOwlfX3UzMiBrZXkgPSAwOwomIzQzOwlpbnQgcmV0OwomIzQzOwomIzQzOwllbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbSgmYW1wO3dxX21hcCwgJmFtcDtrZXkpOwomIzQzOwlpZiAoIWVsZW0pCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl93cV9pbml0KCZhbXA7ZWxlbS0mZ3Q7d29yaywgJmFtcDt3cV9tYXAsIDApOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3dvcmssIHJlY2xhaW1fd29ya19mbiwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfdGltZXJfaW5pdCgmYW1wO2VsZW0tJmd0O3RpbWVyLCAmYW1wO3dxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9zZXRfY2FsbGJhY2soJmFtcDtlbGVtLSZndDt0aW1lciwgd3FfdGltZXJfY2IpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJZWxlbS0mZ3Q7cHJldl9ldmVudCA9IDA7CiYjNDM7CWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsZW0tJmd0O2V2ZW50X2RlbHRhX3RocmVzaG9sZCA9IGN0eC0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwllbGVtLSZndDtjaGVja19ucyA9IGN0eC0mZ3Q7Y2hlY2tfbnM7CiYjNDM7CiYjNDM7CXdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LSZndDtoaWdoX2Nncm91cF9pZDsKJiM0MzsJd3FfbG93X2Nncm91cF9pZCA9IGN0eC0mZ3Q7bG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsJcmV0dXJuIGJwZl90aW1lcl9zdGFydCgmYW1wO2VsZW0tJmd0O3RpbWVyLCBlbGVtLSZndDtjaGVja19ucywgMCk7CiYjNDM7fQomIzQzOwomIzQzO2NoYXIgX2xpY2Vuc2VbXSBTRUMoJiMzNDtsaWNlbnNlJiMzNDspID0gJiMzNDtHUEwmIzM0OzsKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+My8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTYzMDgKCQkJCQkJCW91dHB1dDogMjcKCQkJCQkJCXRob3VnaHRzOiA0MzgKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBCUEYgUHJvYWN0aXZlIE1lbW9yeSBSZWNsYWltIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgbG9va3MgbGlrZSB3ZSYjMzk7cmUgaW50cm9kdWNpbmcgYSBuZXcgQlBGIGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgdG8gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgd2l0aGluIGEgbWVtY2cuIFNwZWNpZmljYWxseSwgSSBzZWUgaXQmIzM5O3MgYWRkZWQgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFuZCByZWdpc3RlcmVkIGZvciBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCB3aXRoIHRoZSBgS0ZfU0xFRVBBQkxFYCBmbGFnLiBUaGF0IG1lYW5zIHRoaXMgZnVuY3Rpb24gY2FuIHBvdGVudGlhbGx5IHNsZWVwLCB3aGljaCBpcyBpbXBvcnRhbnQgdG8gbm90ZSBmb3IgQlBGIGNvbnRleHQuIFRoZSBjb2RlIHNlZW1zIHRvIGNhbGwgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLCB3aGljaCBpcyB0aGUgY29yZSBvZiB0aGUgcmVjbGFpbSBwcm9jZXNzLCBhbmQgaXQgbG9va3MgbGlrZSB3ZSBoYXZlIGNvbnRyb2wgb3ZlciB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHRvIHJlY2xhaW0gYW5kIHRoZSBzd2FwcGluZXNzIHZhbHVlLiAgVGhlIGVudW0gY2hhbmdlIGluIGBtbS9pbnRlcm5hbC5oYCBpcyBhIG1pbm9yIGRldGFpbCwgbG9va3MgbGlrZSB0aGV5IGFyZSBzaW1wbHkgdXBkYXRpbmcgdGhlIHdheSB0aGF0IGNvbnN0YW50cyBhcmUgZGVmaW5lZC4gVGhlcmUgYXJlIGFsc28gYXNzb2NpYXRlZCBzZWxmdGVzdHMuCgpOb3csIGxldCYjMzk7cyBydW4gdGhyb3VnaCB0aGUgc2FuaXR5IGNoZWNrcy4gRmlyc3QsICpyZWFjaGFiaWxpdHkqLiBUaGlzIGlzIGEgQlBGIGtmdW5jLCBzbywgeWVzLCBpdCYjMzk7cyBkZWZpbml0ZWx5IHJlYWNoYWJsZS4gVXNlciBzcGFjZSBwcm9ncmFtcyBjYW4gbG9hZCBhbmQgZXhlY3V0ZSBCUEYgcHJvZ3JhbXMgdmlhIGBzeXNfYnBmYCBvciB3aXRoaW4gb3RoZXIgY29udGV4dHMgbGlrZSBgYnBmX3dxYC4gR29vZC4gU2Vjb25kLCAqY29yZSBzdWJzeXN0ZW0qLiBCUEYgKmFuZCogTWVtb3J5IE1hbmFnZW1lbnQgKG1lbWNnKSAtLSB0aGF0JiMzOTtzIGRlZmluaXRlbHkgYSBjb3JlIGFyZWEsIHNvIHdlJiMzOTtyZSBnb29kIHRoZXJlLiBUaGlyZCwgZG9lcyBpdCAqbW9kaWZ5KiBrZXJuZWwgZXhlY3V0YWJsZSBjb2RlPyAgWWVzLCBhZGRpbmcgYSBuZXcga2Z1bmMgKmRlZmluaXRlbHkqIG1vZGlmaWVzIGtlcm5lbCBjb2RlLgoKU28sIGl0JiMzOTtzICpyZWFjaGJsZSosIGl0cyBpbiBhICpjb3JlIHN1YnN5c3RlbSosIGFuZCBpdCAqbW9kaWZpZXMqIGV4ZWN1dGFibGUgY29kZS4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYS4KCkkgbmVlZCB0byBjb25maXJtIGlmIHRoZXJlIGFyZSBhbnkgS2NvbmZpZyBkZXBlbmRlbmNpZXMsIG9yIG90aGVyIGltcG9ydGFudCBmaWxlcyBpbnZvbHZlZCB0byBjb21wbGV0ZSB0aGlzIGFuYWx5c2lzLiBUaW1lIHRvIGNoZWNrIGBncmVwcGVyYCwgYG1tL01ha2VmaWxlYCwgb3IgZGlyZWN0bHkgcmV2aWV3IGBtbS9icGZfbWVtY29udHJvbC5jYCBmb3IgYW55IHN1YnRsZSBjb25uZWN0aW9ucyBvciBjb25maWd1cmF0aW9uIHJlcXVpcmVtZW50cy4gV2UgbmVlZCB0byBiZSB0aG9yb3VnaCB3aXRoIHBhdGNoZXMgdGhpcyBpbXBvcnRhbnQuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+NC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTQ8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5ncmVwcGVyPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFeHByZXNzaW9uJiMzNDs6ICYjMzQ7YnBmX21lbWNvbnRyb2wmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTA2PWlmZGVmIENPTkZJR19CUEZfU1lTQ0FMTFxubW0vTWFrZWZpbGU6MTA3Om9iai0kKENPTkZJR19NRU1DRykgJiM0Mzs9IGJwZl9tZW1jb250cm9sLm9cbm1tL01ha2VmaWxlLTEwOC1lbmRpZlxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmM9MjMyPV9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTIzMy1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjM0OkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yMzUtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwLCBLRl9BQ1FVSVJFIHwgS0ZfUkVUX05VTEwpXG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDM9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXG5tbS9icGZfbWVtY29udHJvbC5jLTI0NC1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ1OkJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ2LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDc6QlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ4LUJURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ5OkJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTAtXG5tbS9icGZfbWVtY29udHJvbC5jOjI1MTpzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNTItXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjUzOlx0LnNldCAgICAgICAgICAgID0gXHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNzLFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTQtfTtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU1LVxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTY6c3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0ID0ge1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNTctXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjU4Olx0LnNldCAgICAgICAgICAgID0gXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXG5tbS9icGZfbWVtY29udHJvbC5jLTI1OS19O1xubW0vYnBmX21lbWNvbnRyb2wuYy0yNjAtXG5tbS9icGZfbWVtY29udHJvbC5jOjI2MTpzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXG5tbS9icGZfbWVtY29udHJvbC5jLTI2Mi17XG4tLVxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjUtXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNjY6XHRcdFx0XHRcdFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jX3NldCk7XG5tbS9icGZfbWVtY29udHJvbC5jLTI2Ny1cdGlmIChlcnIpIHtcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTI3Mi1cdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNzM6XHRcdFx0XHRcdFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0KTtcbm1tL2JwZl9tZW1jb250cm9sLmMtMjc0LVx0aWYgKGVycilcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTI3OC19XG5tbS9icGZfbWVtY29udHJvbC5jOjI3OTpsYXRlX2luaXRjYWxsKGJwZl9tZW1jb250cm9sX2luaXQpO1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE0PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4MTY1CgkJCQkJCQlvdXRwdXQ6IDM2CgkJCQkJCQl0aG91Z2h0czogMTU3CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkFuYWx5emluZyBicGZfbWVtY29udHJvbC5jJiMzOTtzIEtjb25maWcgRGVwZW5kZW5jaWVzKioKCk9rYXksIHNvIEkmIzM5O20gZGl2aW5nIGludG8gdGhlIEtjb25maWcgcmVxdWlyZW1lbnRzIGZvciBgbW0vYnBmX21lbWNvbnRyb2wuY2AuIEZpcnN0LCBJJiMzOTtsbCBxdWlja2x5IGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgLiBSaWdodCwgaXQgbG9va3MgbGlrZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19NRU1DR2AgYXJlIHRoZSBjb3JlIGRlcGVuZGVuY2llcywgYW5kIHRoZXkgbXVzdCBib3RoIGJlIHNldC4gTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGBDT05GSUdfREVCVUdfSU5GT19CVEZgIGlzIGFsc28gZW5hYmxlZCwgc2luY2UgdGhhdCYjMzk7cyB1c3VhbGx5IHJlcXVpcmVkIGZvciBCVEYgcmVnaXN0cmF0aW9uLCBrZnVuYyByZXNvbHV0aW9uLCBhbmQgdGhlIHJlbGF0ZWQgcHJvY2Vzc2VzLgoKTm93LCBJJiMzOTtsbCB6ZXJvIGluIG9uIGByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0YC4gSSB3YW50IHRvIHZlcmlmeSB0aGF0IGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBpbmRlZWQgKnRoZSogbWFpbiBkcml2ZXJzLCBvciBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGludm9sdmVkIGhlcmUuIFNvLCBsZXQmIzM5O3MgdHJhY2sgZG93biB0aGUgZGVmaW5pdGlvbiBvZiBgcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldGAgYW5kIHNlZSB3aGF0IGVsc2UgbWlnaHQgYmUgbHVya2luZyBpbiB0aGVyZS4gR290dGEgY292ZXIgYWxsIHRoZSBiYXNlcyEKCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0JiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7a2VybmVsL2JwZi9hcmVuYS5jPTExMzE9c3RhdGljIGludCBfX2luaXQga2Z1bmNfaW5pdCh2b2lkKVxua2VybmVsL2JwZi9hcmVuYS5jLTExMzIte1xua2VybmVsL2JwZi9hcmVuYS5jOjExMzM6XHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXHUwMDI2Y29tbW9uX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2FyZW5hLmMtMTEzNC19XG4tLVxua2VybmVsL2JwZi9idGYuYz04OTQyPXN0YXRpYyBpbnQgYnRmX3BvcHVsYXRlX2tmdW5jX3NldChzdHJ1Y3QgYnRmICpidGYsIGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTg5ODgtXHRzZXQgPSB0YWItXHUwMDNlc2V0c1tob29rXTtcbmtlcm5lbC9icGYvYnRmLmM6ODk4OTpcdC8qIFdhcm4gd2hlbiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0IGlzIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgaG9va1xua2VybmVsL2JwZi9idGYuYy04OTkwLVx0ICogZm9yIG1vZHVsZSBzZXRzLlxuLS1cbmtlcm5lbC9icGYvYnRmLmM9OTIxMz11MzIgKmJ0Zl9rZnVuY19pc19tb2RpZnlfcmV0dXJuKGNvbnN0IHN0cnVjdCBidGYgKmJ0ZiwgdTMyIGtmdW5jX2J0Zl9pZCxcbi0tXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjEtXG5rZXJuZWwvYnBmL2J0Zi5jOjkyMjI6c3RhdGljIGludCBfX3JlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoZW51bSBidGZfa2Z1bmNfaG9vayBob29rLFxua2VybmVsL2JwZi9idGYuYy05MjIzLVx0XHRcdFx0ICAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxuLS1cbmtlcm5lbC9icGYvYnRmLmMtOTI0OC0vKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgaW52b2tlZCBvbmx5IGZyb20gaW5pdGNhbGxzL21vZHVsZSBpbml0IGZ1bmN0aW9ucyAqL1xua2VybmVsL2JwZi9idGYuYzo5MjQ5OmludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNTAtXHRcdFx0ICAgICAgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXG4tLVxua2VybmVsL2JwZi9idGYuYy05MjYyLVx0aG9vayA9IGJwZl9wcm9nX3R5cGVfdG9fa2Z1bmNfaG9vayhwcm9nX3R5cGUpO1xua2VybmVsL2JwZi9idGYuYzo5MjYzOlx0cmV0dXJuIF9fcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChob29rLCBrc2V0KTtcbmtlcm5lbC9icGYvYnRmLmMtOTI2NC19XG5rZXJuZWwvYnBmL2J0Zi5jOjkyNjU6RVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldCk7XG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjYtXG4tLVxua2VybmVsL2JwZi9idGYuYz05MjY4PWludCByZWdpc3Rlcl9idGZfZm1vZHJldF9pZF9zZXQoY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgKmtzZXQpXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjkte1xua2VybmVsL2JwZi9idGYuYzo5MjcwOlx0cmV0dXJuIF9fcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCVEZfS0ZVTkNfSE9PS19GTU9EUkVULCBrc2V0KTtcbmtlcm5lbC9icGYvYnRmLmMtOTI3MS19XG4tLVxua2VybmVsL2JwZi9jcHVtYXNrLmM9NTE1PXN0YXRpYyBpbnQgX19pbml0IGNwdW1hc2tfa2Z1bmNfaW5pdCh2b2lkKVxuLS1cbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyNS1cdHJldCA9IGJwZl9tZW1fYWxsb2NfaW5pdChcdTAwMjZicGZfY3B1bWFza19tYSwgc2l6ZW9mKHN0cnVjdCBicGZfY3B1bWFzayksIGZhbHNlKTtcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNjpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI3Olx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TVFJVQ1RfT1BTLCBcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1Mjg6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3B1bWFzay5jLTUyOS1cdHJldHVybiAgcmV0ID86IHJlZ2lzdGVyX2J0Zl9pZF9kdG9yX2tmdW5jcyhjcHVtYXNrX2R0b3JzLFxuLS1cbmtlcm5lbC9icGYvY3J5cHRvLmM9Mzc5PXN0YXRpYyBpbnQgX19pbml0IGNyeXB0b19rZnVuY19pbml0KHZvaWQpXG4tLVxua2VybmVsL2JwZi9jcnlwdG8uYy0zODgtXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM4OTpcdHJldCA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9DTFMsIFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MDpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULCBcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9jcnlwdG8uYzozOTE6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1hEUCwgXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkyOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxua2VybmVsL2JwZi9jcnlwdG8uYy0zOTMtXHRcdFx0XHRcdCAgICAgICBcdTAwMjZjcnlwdF9pbml0X2tmdW5jX3NldCk7XG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmM9NDk4Mj1zdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNDk5Ny1cbmtlcm5lbC9icGYvaGVscGVycy5jOjQ5OTg6XHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9oZWxwZXJzLmM6NDk5OTpcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo1MDAwOlx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDE6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDI6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDM6XHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcbmtlcm5lbC9icGYvaGVscGVycy5jLTUwMDQtXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGdlbmVyaWNfZHRvcnMsXG4tLVxua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwNi1cdFx0XHRcdFx0XHQgIFRISVNfTU9EVUxFKTtcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDc6XHRyZXR1cm4gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsIFx1MDAyNmNvbW1vbl9rZnVuY19zZXQpO1xua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwOC19XG4tLVxua2VybmVsL2JwZi9tYXBfaXRlci5jPTIzMD1zdGF0aWMgaW50IGluaXRfc3Vic3lzdGVtKHZvaWQpXG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMxLXtcbmtlcm5lbC9icGYvbWFwX2l0ZXIuYzoyMzI6XHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXHUwMDI2YnBmX21hcF9pdGVyX2tmdW5jX3NldCk7XG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMzLX1cbi0tXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYz03NTk9c3RhdGljIF9faW5pdCBpbnQgcnFzcGlubG9ja19yZWdpc3Rlcl9rZnVuY3Modm9pZClcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jLTc2MC17XG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYzo3NjE6XHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXHUwMDI2cnFzcGlubG9ja19rZnVuY19zZXQpO1xua2VybmVsL2JwZi9ycXNwaW5sb2NrLmMtNzYyLX1cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD43LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAyMDYyMwoJCQkJCQkJb3V0cHV0OiAzNQoJCQkJCQkJdGhvdWdodHM6IDYzCgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkV4YW1pbmluZyB0aGUgQlBGIE1lbW9yeSBDb250cm9sIENvZGUqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGUgYG1tL2JwZl9tZW1jb250cm9sLmNgIGZpbGUuIE15IHByaW1hcnkgaW50ZXJlc3QgcmlnaHQgbm93IGlzIHRoZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBzeW1ib2wuIEkmIzM5O20gbm90aW5nIHRoYXQgaXQmIzM5O3MgZGVmaW5lZCBhcyBhIGtmdW5jLCB3aGljaCBpcyBjcml0aWNhbCBmb3IgdW5kZXJzdGFuZGluZyBpdHMgcm9sZSB3aXRoaW4gdGhlIGtlcm5lbC4gQmVmb3JlIEkgZ2V0IHRvbyBkZWVwIGludG8gdGhhdCBzcGVjaWZpYyBmdW5jdGlvbiwgSSYjMzk7bGwgcXVpY2tseSBzY2FuIHRoZSByZXN0IG9mIHRoZSBmaWxlLiBJIHdhbnQgdG8gYnVpbGQgYSBtb3JlIGhvbGlzdGljIHBpY3R1cmUg4oCTIHNlZSB3aGF0IG90aGVyIGZ1bmN0aW9uYWxpdGllcyBhcmUgaW1wbGVtZW50ZWQgd2l0aGluIGBicGZfbWVtY29udHJvbC5jYCB0aGF0IG1pZ2h0IGludGVyYWN0IHdpdGgsIG9yIGJlIHJlbGF0ZWQgdG8sIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCYjMzk7cyBhbHdheXMgYmVuZWZpY2lhbCB0byBoYXZlIHRoYXQgY29udGV4dHVhbCBhd2FyZW5lc3MgYmVmb3JlIEkgc3RhcnQgZGlzc2VjdGluZyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OC8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS9icGZfbWVtY29udHJvbC5jJiMzNDssCiAgJiMzNDtGaXJzdExpbmUmIzM0OzogMSwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA4MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgICAxOlx0Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb3ItbGF0ZXJcbiAgIDI6XHQvKlxuICAgMzpcdCAqIE1lbW9yeSBDb250cm9sbGVyLXJlbGF0ZWQgQlBGIGtmdW5jcyBhbmQgYXV4aWxpYXJ5IGNvZGVcbiAgIDQ6XHQgKlxuICAgNTpcdCAqIEF1dGhvcjogUm9tYW4gR3VzaGNoaW4gXHUwMDNjcm9tYW4uZ3VzaGNoaW5AbGludXguZGV2XHUwMDNlXG4gICA2Olx0ICovXG4gICA3Olx0XG4gICA4Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvbWVtY29udHJvbC5oXHUwMDNlXG4gICA5Olx0I2luY2x1ZGUgXHUwMDNjbGludXgvYnBmLmhcdTAwM2VcbiAgMTA6XHRcbiAgMTE6XHQjaW5jbHVkZSBcJiMzNDtpbnRlcm5hbC5oXCYjMzQ7XG4gIDEyOlx0XG4gIDEzOlx0X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuICAxNDpcdFxuICAxNTpcdC8qKlxuICAxNjpcdCAqIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgbWVtb3J5IGNncm91cFxuICAxNzpcdCAqXG4gIDE4Olx0ICogVGhlIGZ1bmN0aW9uIGhhcyBLRl9BQ1FVSVJFIHNlbWFudGljcywgZXZlbiB0aG91Z2ggdGhlIHJvb3QgbWVtb3J5XG4gIDE5Olx0ICogY2dyb3VwIGlzIG5ldmVyIGRlc3Ryb3llZCBhZnRlciBiZWluZyBjcmVhdGVkIGFuZCBkb2VzbiYjMzk7dCByZXF1aXJlXG4gIDIwOlx0ICogcmVmZXJlbmNlIGNvdW50aW5nLiBBbmQgaXQmIzM5O3MgcGVyZmVjdGx5IHNhZmUgdG8gcGFzcyBpdCB0b1xuICAyMTpcdCAqIGJwZl9wdXRfbWVtX2Nncm91cCgpXG4gIDIyOlx0ICpcbiAgMjM6XHQgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBtZW1vcnkgY2dyb3VwLlxuICAyNDpcdCAqL1xuICAyNTpcdF9fYnBmX2tmdW5jIHN0cnVjdCBtZW1fY2dyb3VwICpicGZfZ2V0X3Jvb3RfbWVtX2Nncm91cCh2b2lkKVxuICAyNjpcdHtcbiAgMjc6XHRcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpXG4gIDI4Olx0XHRcdHJldHVybiBOVUxMO1xuICAyOTpcdFxuICAzMDpcdFx0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cbiAgMzE6XHRcdHJldHVybiByb290X21lbV9jZ3JvdXA7XG4gIDMyOlx0fVxuICAzMzpcdFxuICAzNDpcdC8qKlxuICAzNTpcdCAqIGJwZl9nZXRfbWVtX2Nncm91cCAtIEdldCBhIHJlZmVyZW5jZSB0byBhIG1lbW9yeSBjZ3JvdXBcbiAgMzY6XHQgKiBAY3NzOiBwb2ludGVyIHRvIHRoZSBjc3Mgc3RydWN0dXJlXG4gIDM3Olx0ICpcbiAgMzg6XHQgKiBJdCYjMzk7cyBmaW5lIHRvIHBhc3MgYSBjc3Mgd2hpY2ggYmVsb25ncyB0byBhbnkgY2dyb3VwIGNvbnRyb2xsZXIsXG4gIDM5Olx0ICogZS5nLiB1bmlmaWVkIGhpZXJhcmNoeSYjMzk7cyBtYWluIGNzcy5cbiAgNDA6XHQgKlxuICA0MTpcdCAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXG4gIDQyOlx0ICpcbiAgNDM6XHQgKiBSZXR1cm46IEEgcG9pbnRlciB0byBhIG1lbV9jZ3JvdXAgc3RydWN0dXJlIGFmdGVyIGJ1bXBpbmdcbiAgNDQ6XHQgKiB0aGUgY29ycmVzcG9uZGluZyBjc3MmIzM5O3MgcmVmZXJlbmNlIGNvdW50ZXIuXG4gIDQ1Olx0ICovXG4gIDQ2Olx0X19icGZfa2Z1bmMgc3RydWN0IG1lbV9jZ3JvdXAgKlxuICA0NzpcdGJwZl9nZXRfbWVtX2Nncm91cChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKVxuICA0ODpcdHtcbiAgNDk6XHRcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IE5VTEw7XG4gIDUwOlx0XHRib29sIHJjdV91bmxvY2sgPSBmYWxzZTtcbiAgNTE6XHRcbiAgNTI6XHRcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkgfHwgIXJvb3RfbWVtX2Nncm91cClcbiAgNTM6XHRcdFx0cmV0dXJuIE5VTEw7XG4gIDU0Olx0XG4gIDU1Olx0XHRpZiAocm9vdF9tZW1fY2dyb3VwLVx1MDAzZWNzcy5zcyAhPSBjc3MtXHUwMDNlc3MpIHtcbiAgNTY6XHRcdFx0c3RydWN0IGNncm91cCAqY2dyb3VwID0gY3NzLVx1MDAzZWNncm91cDtcbiAgNTc6XHRcdFx0aW50IHNzaWQgPSByb290X21lbV9jZ3JvdXAtXHUwMDNlY3NzLnNzLVx1MDAzZWlkO1xuICA1ODpcdFxuICA1OTpcdFx0XHRyY3VfcmVhZF9sb2NrKCk7XG4gIDYwOlx0XHRcdHJjdV91bmxvY2sgPSB0cnVlO1xuICA2MTpcdFx0XHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNncm91cC1cdTAwM2VzdWJzeXNbc3NpZF0pO1xuICA2MjpcdFx0fVxuICA2MzpcdFxuICA2NDpcdFx0aWYgKGNzcyBcdTAwMjZcdTAwMjYgY3NzX3RyeWdldChjc3MpKVxuICA2NTpcdFx0XHRtZW1jZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCBtZW1fY2dyb3VwLCBjc3MpO1xuICA2NjpcdFxuICA2NzpcdFx0aWYgKHJjdV91bmxvY2spXG4gIDY4Olx0XHRcdHJjdV9yZWFkX3VubG9jaygpO1xuICA2OTpcdFxuICA3MDpcdFx0cmV0dXJuIG1lbWNnO1xuICA3MTpcdH1cbiAgNzI6XHRcbiAgNzM6XHQvKipcbiAgNzQ6XHQgKiBicGZfcHV0X21lbV9jZ3JvdXAgLSBQdXQgYSByZWZlcmVuY2UgdG8gYSBtZW1vcnkgY2dyb3VwXG4gIDc1Olx0ICogQG1lbWNnOiBtZW1vcnkgY2dyb3VwIHRvIHJlbGVhc2VcbiAgNzY6XHQgKlxuICA3NzpcdCAqIFJlbGVhc2VzIGEgcHJldmlvdXNseSBhY3F1aXJlZCBtZW1jZyByZWZlcmVuY2UuXG4gIDc4Olx0ICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cbiAgNzk6XHQgKi9cbiAgODA6XHRfX2JwZl9rZnVuYyB2b2lkIGJwZl9wdXRfbWVtX2Nncm91cChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+OS8yPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMjE5NzQKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+T2theSwgaGVyZSYjMzk7cyBteSB0YWtlIG9uIHRob3NlIHRob3VnaHRzLCB0YWlsb3JlZCBmb3IgYW4gZXhwZXJ0IGF1ZGllbmNlOgoKKipEaXZpbmcgaW50byBQcm9hY3RpdmUgUmVjbGFpbSBpbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AqKgoKQWxyaWdodCwgdGltZSB0byByZWZyZXNoIG15IG1lbW9yeSBhbmQgZGlnIGEgYml0IGRlZXBlciBpbnRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBhbmQgaG93IHByb2FjdGl2ZSByZWNsYWltIGludGVyYWN0cyB3aXRoIGl0LiBJIHdhbnQgdG8gc2VlIGhvdyB0aGUgc3lzdGVtIGlzICpyZWFsbHkqIHdvcmtpbmcsIG5vdCBqdXN0IHRoZSBzdXJmYWNlIGxldmVsLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgbnVhbmNlcyBvZiB0aGUgcHJvYWN0aXZlIHJlY2xhaW0gbG9naWMgd2l0aGluIHRoYXQgZnVuY3Rpb24sIGVzcGVjaWFsbHkgaW4gZGlmZmVyZW50IHNjZW5hcmlvcy4gSSYjMzk7bSB0aGlua2luZyBhYm91dCB0aGUgaGV1cmlzdGljcyBpbnZvbHZlZCwgdGhlIHRyaWdnZXJpbmcgY29uZGl0aW9ucywgYW5kIHRoZSBhY3R1YWwgbWVjaGFuaXNtcyBpdCB1c2VzIHRvIGlkZW50aWZ5IGFuZCBmcmVlIHBhZ2VzLiBJJiMzOTttIGtlZW4gdG8gZXhhbWluZSBob3cgaXQgYmFsYW5jZXMgcmVjbGFpbSBlZmZvcnRzIGFjcm9zcyBkaWZmZXJlbnQgbWVtb3J5IGNncm91cHMsIGVzcGVjaWFsbHkgdW5kZXIgbWVtb3J5IHByZXNzdXJlLiBTcGVjaWZpY2FsbHksIEkmIzM5O20gaW50ZXJlc3RlZCBpbiBob3cgaXQgcHJpb3JpdGl6ZXMgY2VydGFpbiB0eXBlcyBvZiByZWNsYWltIChlLmcuLCBwYWdlIGNhY2hlLCBhbm9ueW1vdXMgcGFnZXMpIGR1cmluZyBwcm9hY3RpdmUgcmVjbGFpbSB2ZXJzdXMgcmVhY3RpdmUgcmVjbGFpbS4gSSYjMzk7bGwgcHJvYmFibHkgbG9vayBhdCB0aGUgaW50ZXJhY3Rpb24gd2l0aCB0aGUgZ2xvYmFsIExSVSBsaXN0cyB0b28uIEkgc2hvdWxkIGFsc28gY2hlY2sgdGhlIGltcGFjdCBvZiB0aGluZ3MgbGlrZSBzd2FwIGFuZCBkaWZmZXJlbnQgbWVtb3J5IG1hbmFnZW1lbnQgY29uZmlndXJhdGlvbnMgb24gdGhpcyByb3V0aW5lLiBVbHRpbWF0ZWx5LCBJJiMzOTttIGFpbWluZyBmb3IgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBlZmZpY2llbmN5IGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MgaW4gYSBoaWdoLWNvbnRlbnRpb24gbWVtb3J5IGVudmlyb25tZW50LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEwLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDt0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2JwZl9tZW1jb250cm9sLmM9MjA3PV9fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMS1cbm1tL2JwZl9tZW1jb250cm9sLmM6MjIyOlx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMy1cdFx0XHRcdFx0XHQgICAgR0ZQX0tFUk5FTCxcbi0tXG5tbS9pbnRlcm5hbC5oPTc3PWVudW0ge1xuLS1cbm1tL2ludGVybmFsLmgtODQtXG5tbS9pbnRlcm5hbC5oOjg1OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG5tbS9pbnRlcm5hbC5oLTg2LVx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYz0xNzcxPXN0YXRpYyBpbnQgbWVtX2Nncm91cF9yZXNpemVfbWF4KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTgxNS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxODE2Olx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTgxNy1cdFx0XHRcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE4MzQ9c3RhdGljIGludCBtZW1fY2dyb3VwX2ZvcmNlX2VtcHR5KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcbi0tXG5tbS9tZW1jb250cm9sLXYxLmMtMTg1MS1cbm1tL21lbWNvbnRyb2wtdjEuYzoxODUyOlx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXG5tbS9tZW1jb250cm9sLXYxLmMtMTg1My1cdFx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL21lbWNvbnRyb2wuYz0yMzc4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vbWVtY29udHJvbC5jLTIzOTMtXHRcdHBzaV9tZW1zdGFsbF9lbnRlcihcdTAwMjZwZmxhZ3MpO1xubW0vbWVtY29udHJvbC5jOjIzOTQ6XHRcdG5yX3JlY2xhaW1lZCAmIzQzOz0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjM5NS1cdFx0XHRcdFx0XHRcdGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYz0yNjQ1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxuLS1cbm1tL21lbWNvbnRyb2wuYy0yNzE3LVx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjcxODpcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxubW0vbWVtY29udHJvbC5jLTI3MTktXHRcdFx0XHRcdFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xuLS1cbm1tL21lbWNvbnRyb2wuYz00ODM4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDg3OS1cbm1tL21lbWNvbnRyb2wuYzo0ODgwOlx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIGhpZ2gsXG5tbS9tZW1jb250cm9sLmMtNDg4MS1cdFx0XHRcdFx0R0ZQX0tFUk5FTCwgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4OTc9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXG4tLVxubW0vbWVtY29udHJvbC5jLTQ5MzgtXHRcdGlmIChucl9yZWNsYWltcykge1xubW0vbWVtY29udHJvbC5jOjQ5Mzk6XHRcdFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcbm1tL21lbWNvbnRyb2wuYy00OTQwLVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcbi0tXG5tbS92bXNjYW4uYz02ODE1PXVuc2lnbmVkIGxvbmcgbWVtX2Nncm91cF9zaHJpbmtfbm9kZShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4tLVxubW0vdm1zY2FuLmMtNjg1NC1cbm1tL3Ztc2Nhbi5jOjY4NTU6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL3Ztc2Nhbi5jLTY4NTYtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vdm1zY2FuLmMtNjg5NS0jZWxzZVxubW0vdm1zY2FuLmM6Njg5Njp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjg5Ny1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYz03OTU4PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1Zixcbi0tXG5tbS92bXNjYW4uYy04MDI5LVx0XHRcdFx0XHQgIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFO1xubW0vdm1zY2FuLmM6ODAzMDpcdFx0XHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxubW0vdm1zY2FuLmMtODAzMS1cdFx0XHRcdFx0XHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTEvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDIzNTU1CgkJCQkJCQlvdXRwdXQ6IDEyNwoJCQkJCQkJdGhvdWdodHM6IDM4OAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgYSBLZXJuZWwgUGF0Y2ggZm9yIEZ1enppbmcgUG90ZW50aWFsKioKCk9rYXksIGxldCYjMzk7cyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBrZXJuZWwgY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIHBhdGNoIHJlbGllcyBvbi4gQmFzZWQgb24gdGhlIGluaXRpYWwgY2hlY2tzLCBpdCBsb29rcyBsaWtlIGBNRU1DR2AsIGBCUEZfU1lTQ0FMTGAsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBlc3NlbnRpYWwuIGBERUJVR19JTkZPX0JURmAgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBzaW5jZSBpdCYjMzk7cyByZXF1aXJlZCBmb3IgYm90aCBCVEYgYW5kIGtmdW5jcywgd2hpY2ggYXJlIGNlbnRyYWwgdG8gdGhpcyBwYXRjaC4KCk5leHQsIEkgbmVlZCB0byBwaW5wb2ludCB0aGUgY3JpdGljYWwgZnVuY3Rpb25zIHRoaXMgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcy4gVGhlIGZvY3VzIHNlZW1zIHRvIGJlIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJIHNob3VsZCBkb3VibGUgY2hlY2sgaWYgYGJwZl9tZW1jb250cm9sX2luaXRgIGlzIGEgbGF0ZV9pbml0Y2FsbCwgYnV0IGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGxvb2tzIHRvIGJlIHRoZSByZWFsIGtmdW5jIGVudHJ5cG9pbnQuCgpOb3csIGxldCYjMzk7cyBhc3Nlc3MgdGhlIGZ1enppbmcgcG90ZW50aWFsLiBUaGUgcGF0Y2ggdG91Y2hlcyBjcml0aWNhbCBzdWJzeXN0ZW1zOiBCUEYgYW5kIE1lbW9yeSBNYW5hZ2VtZW50LiBBIG5ldyBCUEYga2Z1bmMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLCBpcyBhZGRlZC4gQ3J1Y2lhbGx5LCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGNhbGxzIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgYW5kIHRoZSBhcmd1bWVudHMgKHNpemUsIHN3YXBwaW5lc3MpIHNlZW0gdXNlci1jb250cm9sbGFibGUuIFRoZSBwYXRjaCBhbHNvIHJlZ2lzdGVycyB0aGlzIGtmdW5jIGZvciBgQlBGX1BST0dfVFlQRV9TWVNDQUxMYCwgbWFraW5nIGl0IGRlZmluaXRlbHkgZXhlY3V0YWJsZSBjb2RlIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4gVGhpcyBpcyAqZGVmaW5pdGVseSogd29ydGggZnV6emluZy4KClRvIHN1bW1hcml6ZSB0aGUgcmVxdWlyZW1lbnRzOiBXZSBuZWVkIGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgIGVuYWJsZWQuIFRoZSBtYWluIGZ1bmN0aW9uIHRvIGZvY3VzIG9uIGlzIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCYjMzk7cyBsb2NhdGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC4KCk9rYXksIEkmIzM5O20gcmVhZHkgdG8gcHJlcGFyZSB0aGUgdG9vbCBjYWxsIG5vdy4gSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBmb3JtYXQgaXMgY29ycmVjdDogVGhlIGVuYWJsZSBjb25maWd1cmF0aW9ucyBhcmUgc3RyaXBwZWQgb2YgdGhlIGBDT05GSUdfYCBwcmVmaXguIFRoZSBmb2N1cyBzeW1ib2wgaXMgdGhhdCBuZXcgZnVuY3Rpb24uIEkgaGF2ZSBhIGNvbmNpc2UgZXhwbGFuYXRpb24gZm9yIHRoZSByZWFzb25pbmcsIGFuZCB0aGUgYFdvcnRoRnV6emluZ2AgZmxhZyBpcyBzZXQgdG8gdHJ1ZS4gVGltZSB0byBhc3NlbWJsZSB0aGUgZGF0YSBhbmQgZ2V0IHRoaXMgaW50byB0aGUgZnV6emVyLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7REVCVUdfSU5GT19CVEYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7QlBGX1NZU0NBTEwmIzM0OywKICAgICYjMzQ7TUVNQ0cmIzM0OywKICAgICYjMzQ7REVCVUdfSU5GT19CVEYmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDticGZfcHJvYWN0aXZlX3JlY2xhaW0mIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi4mIzM0OywKICAmIzM0O1dvcnRoRnV6emluZyYjMzQ7OiB0cnVlCn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xMy8xPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+YWN0aW9uPC90ZD4KCQkJPHRkPklmPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE0LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSBuZXcgc2xlZXBhYmxlIEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgQlBGIHNlbGZ0ZXN0cy4gVGhlIGtmdW5jIGFjY2VwdHMgcHJpbWl0aXZlIHNjYWxhciBhcmd1bWVudHMgKGBtZW1jZ2AsIGBzaXplYCwgYHN3YXBwaW5lc3NgKSwgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzLCBhbmQgZGVsZWdhdGVzIHRvIHRoZSBleGlzdGluZyBrZXJuZWwgcmVjbGFpbSBpbmZyYXN0cnVjdHVyZSB2aWEgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBzdGFjayBvciBoZWFwIGFyZSBpbnRyb2R1Y2VkIG9yIHJlYWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXJlIHNjYWxhciB0eXBlcyBpbml0aWFsaXplZCBwcmlvciB0byB1c2UuXG4yLiBObyBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgZmllbGRzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBleHBvc2VkIHZpYSBpb2N0bHMvc3lzZnMvbmV0bGluay9CUEYgYnVmZmVycy5cbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXG5cblRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+VGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjQKCkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOgpjb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3NwpBdXRob3I6IHN5ei1jbHVzdGVyICZsdDt0cmlhZ2VAc3l6a2FsbGVyLmNvbSZndDsKRGF0ZTogICBGcmkgU2VwIDExIDAzOjE0OjQ0IDIwMjYgJiM0MzswMDAwCgogICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3CgpkaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmMKaW5kZXggNzE2ZGY0OWQ3NjQ3Ny4uZDg4MjdiYzM4OGVmYyAxMDA2NDQKLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuYwomIzQzOyYjNDM7JiM0MzsgYi9tbS9icGZfbWVtY29udHJvbC5jCkBAIC04LDYgJiM0Mzs4LDggQEAKICNpbmNsdWRlICZsdDtsaW51eC9tZW1jb250cm9sLmgmZ3Q7CiAjaW5jbHVkZSAmbHQ7bGludXgvYnBmLmgmZ3Q7CiAKJiM0MzsjaW5jbHVkZSAmIzM0O2ludGVybmFsLmgmIzM0OwomIzQzOwogX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpOwogCiAvKioKQEAgLTE1OSw2ICYjNDM7MTYxLDc0IEBAIF9fYnBmX2tmdW5jIHZvaWQgYnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogCW1lbV9jZ3JvdXBfZmx1c2hfc3RhdHMobWVtY2cpOwogfQogCiYjNDM7LyoqCiYjNDM7ICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeQomIzQzOyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cAomIzQzOyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbQomIzQzOyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMsIGNsYW1wZWQgdG8KJiM0MzsgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpCiYjNDM7ICogQHN3YXBwaW5lc3M6IHRoZSByZWNsYWltIHN3YXBwaW5lc3MsIGluIHRoZSByYW5nZQomIzQzOyAqICAgICAgICAgW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0sIHdoZXJlCiYjNDM7ICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlCiYjNDM7ICogICAgICAgICB0aGUgbWVtY2cmIzM5O3Mgb3duIHN3YXBwaW5lc3MKJiM0MzsgKgomIzQzOyAqIFRyaWdnZXIgb25lIHByb2FjdGl2ZSByZWNsYWltIHBhc3Mgb24gQG1lbWNnLCBzaW1pbGFyIHRvIGEgd3JpdGUgdG8KJiM0MzsgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC4KJiM0MzsgKgomIzQzOyAqIE9ubHkgdGhlIHJlY2xhaW0gdGFyZ2V0IGlzIGNhcHBlZDogQHNpemUgaXMgY2xhbXBlZCB0bwomIzQzOyAqIE1FTUNHX0NIQVJHRV9CQVRDSCwgZm9sbG93aW5nIHRoZSBwcmVjZWRlbnQgb2YgaGlnaF93b3JrX2Z1bmMoKSwKJiM0MzsgKiB0aGUgbWVtb3J5LmhpZ2ggd29ya3F1ZXVlIGZhbGxiYWNrLCB3aGljaCBib3VuZHMgZWFjaCByZWNsYWltCiYjNDM7ICogcmVxdWVzdCB0aGUgc2FtZSB3YXkuIFRoZSBhY3R1YWwgc2Nhbm5pbmcgd29yayBhbmQgaXRzIGR1cmF0aW9uCiYjNDM7ICogYXJlIG5vdCBib3VuZGVkLiBUbyByZWNsYWltIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5CiYjNDM7ICogaW5zdGVhZCBvZiBwYXNzaW5nIGEgbGFyZ2VyIEBzaXplLgomIzQzOyAqCiYjNDM7ICogVGhlIGtmdW5jIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBhIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTAomIzQzOyAqIHByb2dyYW0sIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHRocmVhZCBydW5uaW5nIHRoZQomIzQzOyAqIHByb2dyYW0sIG9yIGZyb20gdGhlIGJwZl93cSBhbmQgdGFza193b3JrIGNhbGxiYWNrcyBvZiBhIFNZU0NBTEwKJiM0MzsgKiBwcm9ncmFtLCB3aGljaCBydW4gaW4gcHJvY2VzcyBjb250ZXh0IGFuZCBrZWVwIHRoZSBTWVNDQUxMIHByb2dyYW0KJiM0MzsgKiB0eXBlLiBJdCBpcyByZWdpc3RlcmVkIGZvciBCUEZfUFJPR19UWVBFX1NZU0NBTEwgb25seSwgYmVjYXVzZQomIzQzOyAqIGdlbmVyaWMgc2xlZXBhYmxlIHByb2dyYW1zIG1heSBydW4gd2l0aCBmaWxlc3lzdGVtIGxvY2tzIGhlbGQgb3IKJiM0MzsgKiBpbiBOT0ZTL05PSU8gY29udGV4dHMsIHdoZXJlIHRoZSByZWNsYWltIHBhdGggY291bGQgZGVhZGxvY2sgb24KJiM0MzsgKiB0aG9zZSBsb2NrcyB2aWEgZmlsZXN5c3RlbSBzaHJpbmtlcnMuCiYjNDM7ICoKJiM0MzsgKiBGb3IgYXN5bmNocm9ub3VzIHJlY2xhaW0gb2YgbW9yZSB0aGFuIG9uZSBiYXRjaCwgZHJpdmluZyB0aGUKJiM0MzsgKiByZWNsYWltIGZyb20gYSBicGZfd3EgY2FsbGJhY2sgaXMgcmVjb21tZW5kZWQ6IGNhbGwgdGhpcyBrZnVuYwomIzQzOyAqIG9uY2UgcGVyIGNhbGxiYWNrIGFuZCByZXF1ZXVlIHRoZSBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQKJiM0MzsgKiBiYXRjaCwgaW5zdGVhZCBvZiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2sgYW5kIG1vbm9wb2xpemluZyBhCiYjNDM7ICogd29ya3F1ZXVlIHdvcmtlciwgYW5kIGdpdmUgZWFjaCB0YXJnZXQgbWVtY2cgaXRzIG93biB3b3JrIGl0ZW0sCiYjNDM7ICogYXMgaGlnaF93b3JrX2Z1bmMoKSBkb2VzIHdpdGggb25lIHdvcmsgaXRlbSBwZXIgbWVtY2cuIFdoZXRoZXIKJiM0MzsgKiB0byBzdWJtaXQgdGhlIG5leHQgYmF0Y2ggaXMgdXAgdG8gdGhlIEJQRiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcAomIzQzOyAqIGF0IGFueSBwb2ludCwgZS5nLiBvbmNlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGR5aW5nLgomIzQzOyAqCiYjNDM7ICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzCiYjNDM7ICogc21hbGxlciB0aGFuIGEgcGFnZSwgb3IgKHVuc2lnbmVkIGxvbmcpLTEgaWYgQHN3YXBwaW5lc3MgaXMgb3V0IG9mCiYjNDM7ICogcmFuZ2UuCiYjNDM7ICovCiYjNDM7X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLAomIzQzOwkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKJiM0MzsJCQkJCQlpbnQgc3dhcHBpbmVzcykKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkOwomIzQzOwl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzOwomIzQzOwomIzQzOwlpZiAoc3dhcHBpbmVzcyAmbHQ7IC0xIHx8IHN3YXBwaW5lc3MgJmd0OyBTV0FQUElORVNTX0FOT05fT05MWSkKJiM0MzsJCXJldHVybiAodW5zaWduZWQgbG9uZyktMTsKJiM0MzsKJiM0MzsJaWYgKHNpemUgJmx0OyBQQUdFX1NJWkUpCiYjNDM7CQlyZXR1cm4gMDsKJiM0MzsKJiM0MzsJbnJfcGFnZXMgPSBtaW4oc2l6ZSAvIFBBR0VfU0laRSwgKHVuc2lnbmVkIGxvbmcpTUVNQ0dfQ0hBUkdFX0JBVENIKTsKJiM0MzsKJiM0MzsJbnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsCiYjNDM7CQkJCQkJICAgIEdGUF9LRVJORUwsCiYjNDM7CQkJCQkJICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfAomIzQzOwkJCQkJCSAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSwKJiM0MzsJCQkJCQkgICAgc3dhcHBpbmVzcyA9PSAtMSA/IE5VTEwgOgomIzQzOwkJCQkJCQkJICAgICAgICZhbXA7c3dhcHBpbmVzcyk7CiYjNDM7CiYjNDM7CXJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7CiYjNDM7fQomIzQzOwogX19icGZfa2Z1bmNfZW5kX2RlZnMoKTsKIAogQlRGX0tGVU5DU19TVEFSVChicGZfbWVtY29udHJvbF9rZnVuY3MpCkBAIC0xNzQsMTkgJiM0MzsyNDQsMzUgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpCiAKIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcykKIAomIzQzO0JURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpCiYjNDM7QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKQomIzQzO0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKQomIzQzOwogc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHsKIAkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX2tmdW5jcywKIH07CiAKJiM0MztzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7CiYjNDM7CS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAomIzQzOwkuc2V0ICAgICAgICAgICAgPSAmYW1wO2JwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLAomIzQzO307CiYjNDM7CiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKIAogCWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJCQkJCSZhbXA7YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTsKLQlpZiAoZXJyKQomIzQzOwlpZiAoZXJyKSB7CiAJCXByX3dhcm4oJiMzNDtlcnJvciB3aGlsZSByZWdpc3RlcmluZyBicGYgbWVtY29udHJvbCBrZnVuY3M6ICVkJiMzNDssIGVycik7CiYjNDM7CQlyZXR1cm4gZXJyOwomIzQzOwl9CiYjNDM7CiYjNDM7CWVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLAomIzQzOwkJCQkJJmFtcDticGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7CiYjNDM7CWlmIChlcnIpCiYjNDM7CQlwcl93YXJuKCYjMzQ7ZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZCYjMzQ7LCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oCmluZGV4IDM4YjExNjUyMTJjOTQuLjQ0ZTk1ZTg3ZTNjZDkgMTAwNjQ0Ci0tLSBhL21tL2ludGVybmFsLmgKJiM0MzsmIzQzOyYjNDM7IGIvbW0vaW50ZXJuYWwuaApAQCAtNzQsMTEgJiM0Mzs3NCwxMyBAQCB1bnNpZ25lZCBsb25nIGxydXZlY19scnVfc2l6ZShzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIGVudW0gbHJ1X2xpc3QgbHJ1LAogCiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgKDEgJmx0OyZsdDsgMSkKICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUgKDEgJmx0OyZsdDsgMikKLSNkZWZpbmUgTUlOX1NXQVBQSU5FU1MgMAotI2RlZmluZSBNQVhfU1dBUFBJTkVTUyAyMDAKJiM0MztlbnVtIHsKJiM0MzsJTUlOX1NXQVBQSU5FU1MgPSAwLAomIzQzOwlNQVhfU1dBUFBJTkVTUyA9IDIwMCwKIAotLyogSnVzdCByZWNsYWltIGZyb20gYW5vbiBmb2xpb3MgaW4gcHJvYWN0aXZlIG1lbW9yeSByZWNsYWltICovCi0jZGVmaW5lIFNXQVBQSU5FU1NfQU5PTl9PTkxZIChNQVhfU1dBUFBJTkVTUyAmIzQzOyAxKQomIzQzOwkvKiBKdXN0IHJlY2xhaW0gZnJvbSBhbm9uIGZvbGlvcyBpbiBwcm9hY3RpdmUgbWVtb3J5IHJlY2xhaW0gKi8KJiM0MzsJU1dBUFBJTkVTU19BTk9OX09OTFkgPSBNQVhfU1dBUFBJTkVTUyAmIzQzOyAxLAomIzQzO307CiAKIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCSAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMC4uN2M3ZDI5OWIzYjI4YQotLS0gL2Rldi9udWxsCiYjNDM7JiM0MzsmIzQzOyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYwpAQCAtMCwwICYjNDM7MSw3NzkgQEAKJiM0MzsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAomIzQzOy8qCiYjNDM7ICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3QKJiM0MzsgKgomIzQzOyAqIFNldHRpbmcgVEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIPTEgYWRkcyBhIGJhc2VsaW5lIHJ1biBvZiB0aGUKJiM0MzsgKiB3b3JrbG9hZCB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSB0byBtZW1jZ19hc3luY19yZWNsYWltLCBhbmQgcHJpbnRzCiYjNDM7ICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZAomIzQzOyAqIGNncm91cCwgdG8gc3Rkb3V0LgomIzQzOyAqLwomIzQzOwomIzQzOyNpbmNsdWRlICZsdDt0ZXN0X3Byb2dzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9tbWFuLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy9zdGF0LmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N5cy92ZnMuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c3lzL3dhaXQuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7ZmNudGwuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7c2lnbmFsLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3RpbWUuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7dW5pc3RkLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGlvLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O3N0ZGxpYi5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDtzdHJpbmcuaCZndDsKJiM0MzsjaW5jbHVkZSAmbHQ7bGltaXRzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2xpbnV4L21hZ2ljLmgmZ3Q7CiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDtjZ3JvdXBfaGVscGVycy5oJiMzNDsKJiM0MzsKJiM0MztzdHJ1Y3QgYnBmX2FyZ3MgewomIzQzOwl1NjQgaGlnaF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBsb3dfY2dyb3VwX2lkOwomIzQzOwl1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkOwomIzQzOwl1NjQgY2hlY2tfbnM7CiYjNDM7fTsKJiM0MzsKJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqLwomIzQzO2VudW0gcmVjbGFpbV9vdXRjb21lIHsKJiM0MzsJUkVDTEFJTV9PVVRDT01FX0NBTExFRCwKJiM0MzsJUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsCiYjNDM7CVJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50IHsKJiM0MzsJdTY0IG91dGNvbWU7CiYjNDM7fTsKJiM0MzsKJiM0MzsjaW5jbHVkZSAmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW0uc2tlbC5oJiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIEZJTEVfU0laRSAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpCiYjNDM7I2RlZmluZSBDR19MSU1JVCAoMzIgKiAxMDI0ICogMTAyNHVsKQomIzQzOyNkZWZpbmUgUkVBRF9USU1FUyA1MAomIzQzOwomIzQzOyNkZWZpbmUgQ0dfRElSICYjMzQ7L21lbWNnX2FzeW5jX3JlY2xhaW0mIzM0OwomIzQzOyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSICYjMzQ7L2hpZ2gmIzM0OwomIzQzOyNkZWZpbmUgQ0dfTE9XX0RJUiBDR19ESVIgJiMzNDsvbG93JiMzNDsKJiM0MzsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX0RJUiAmIzM0Oy9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RSSUdHRVJfRElSIENHX0RZSU5HX0RJUiAmIzM0Oy90cmlnZ2VyJiMzNDsKJiM0MzsjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSICYjMzQ7L3RhcmdldCYjMzQ7CiYjNDM7CiYjNDM7I2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbCkKJiM0MzsjZGVmaW5lIEVWRU5UX0RFTFRBX1RIUkVTSE9MRCAxCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaW1pbmcgZm9yIHRoZSBkeWluZyB0ZXN0OiBhZnRlciB0aGUgdGFyZ2V0IGNncm91cCBpcyByZW1vdmVkLCBnaXZlCiYjNDM7ICogaW4tZmxpZ2h0IHJlY2xhaW0gcGFzc2VzIHRpbWUgdG8gZHJhaW4sIHRoZW4gd2FpdCBmb3IgYSByZWNsYWltIHJvdW5kCiYjNDM7ICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXIKJiM0MzsgKiBjZ3JvdXAgcmVmYXVsdGluZywgYW5kIHRoZSB0aW1lciBmaXJlcyBldmVyeSBDSEVDS19QRVJJT0RfTlMsIHNvCiYjNDM7ICogc3VjaCBhIHJvdW5kIG11c3Qgc2hvdyB1cCB3aXRoaW4gYSBmZXcgdGltZXIgcGVyaW9kcy4gVGhlIEJQRgomIzQzOyAqIHByb2dyYW0gcmVwb3J0cyBldmVyeSByZWNsYWltIG91dGNvbWUgdGhyb3VnaCB0aGUgcmluZ2J1Ziwgc28gdGhlCiYjNDM7ICogd2FpdHMganVzdCBwb2xsIGl0IHdpdGggYSB0aW1lb3V0LgomIzQzOyAqLwomIzQzOyNkZWZpbmUgRFlJTkdfU0VUVExFX1VTICgyMDAgKiAxMDAwKQomIzQzOyNkZWZpbmUgRVZFTlRfUE9MTF9USU1FT1VUX01TICgxMDApCiYjNDM7I2RlZmluZSBFVkVOVF9QT0xMX1JPVU5EUyAoNTApCiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgd29ya2xvYWQgZmlsZXMgbXVzdCBzaXQgb24gYSByZWd1bGFyIGZpbGVzeXN0ZW06IHdpdGggc3dhcAomIzQzOyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkCiYjNDM7ICogT09NIHRoZSBjZ3JvdXAgaW5zdGVhZCBvZiBleGVyY2lzaW5nIHJlY2xhaW07IHRoZXkgYXJlIGFsc28gY2hhcmdlZAomIzQzOyAqIGFzIGFub255bW91cyBtZW1vcnksIHNvIHRoZXkgbmV2ZXIgcmFpc2UgdGhlIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFCiYjNDM7ICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeQomIzQzOyAqIHdoZW4gL3RtcCBpcyBiYWNrZWQgYnkgc3VjaCBhIGZpbGVzeXN0ZW0uCiYjNDM7ICovCiYjNDM7c3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKQomIzQzO3sKJiM0MzsJc3RydWN0IHN0YXRmcyBzdDsKJiM0MzsKJiM0MzsJaWYgKCFzdGF0ZnMoJiMzNDsvdG1wJiMzNDssICZhbXA7c3QpICZhbXA7JmFtcDsKJiM0MzsJICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSkKJiM0MzsJCXJldHVybiAmIzM0Oy4mIzM0OzsKJiM0MzsJcmV0dXJuICYjMzQ7L3RtcCYjMzQ7OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFRoZSB3b3JrbG9hZCBjaGlsZHJlbiBydW4gYWZ0ZXIgdGVzdF9wcm9ncyBoaWphY2tlZCBzdGRpbywgc28KJiM0MzsgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkCiYjNDM7ICogYnVmZmVyLiBUaGUgZXhpdCBzdGF0dXMgaXMgdGhlIG9ubHkgZGlhZ25vc3RpY3MgY2hhbm5lbCB0aGF0IHJlYWNoZXMKJiM0MzsgKiB0aGUgcGFyZW50LCBzbyBlYWNoIGZhaWxpbmcgc3RlcCBnZXRzIGl0cyBvd24gY29kZS4KJiM0MzsgKi8KJiM0MztlbnVtIGNoaWxkX2V4aXRfY29kZSB7CiYjNDM7CUNISUxEX0VYSVRfT0sgPSAwLAomIzQzOwlDSElMRF9FWElUX0pPSU5fQ0dST1VQLAomIzQzOwlDSElMRF9FWElUX1dSSVRFX0ZJTEUsCiYjNDM7CUNISUxEX0VYSVRfUkVBRF9GSUxFLAomIzQzOwlDSElMRF9FWElUX1RJTUVfRklMRSwKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSkKJiM0Mzt7CiYjNDM7CXN3aXRjaCAoY29kZSkgewomIzQzOwljYXNlIENISUxEX0VYSVRfT0s6CiYjNDM7CQlyZXR1cm4gJiMzNDtzdWNjZXNzJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9KT0lOX0NHUk9VUDoKJiM0MzsJCXJldHVybiAmIzM0O2pvaW4gY2dyb3VwJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9XUklURV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgZGF0YSBmaWxlJiMzNDs7CiYjNDM7CWNhc2UgQ0hJTERfRVhJVF9SRUFEX0ZJTEU6CiYjNDM7CQlyZXR1cm4gJiMzNDtyZWFkIGRhdGEgZmlsZSYjMzQ7OwomIzQzOwljYXNlIENISUxEX0VYSVRfVElNRV9GSUxFOgomIzQzOwkJcmV0dXJuICYjMzQ7d3JpdGUgdGltZSBmaWxlJiMzNDs7CiYjNDM7CWRlZmF1bHQ6CiYjNDM7CQlyZXR1cm4gJiMzNDt1bmtub3duJiMzNDs7CiYjNDM7CX0KJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKHU2NCAqaGlnaF9jZ3JvdXBfaWQsIHU2NCAqbG93X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGUKJiM0MzsJICogbWVtb3J5LnN3YXAubWF4IGZpbGUgZG9lcyBub3QgZXhpc3QsIGFuZCBubyBzd2FwIGNhbiBoYXBwZW4KJiM0MzsJICogYW55d2F5LCBzbyBza2lwIHRoZSB3cml0ZS4KJiM0MzsJICovCiYjNDM7CWlmICghYWNjZXNzKCYjMzQ7L3Byb2Mvc3dhcHMmIzM0OywgRl9PSykpIHsKJiM0MzsJCXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgJiMzNDttZW1vcnkuc3dhcC5tYXgmIzM0OywgJiMzNDswJiMzNDspOwomIzQzOwkJaWYgKCFBU1NFUlRfT0socmV0LCAmIzM0O3dyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heCYjMzQ7KSkKJiM0MzsJCQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UocmV0LCAwLCAmIzM0O2NyZWF0ZV9hbmRfZ2V0X2Nncm91cCAmIzM0OyBDR19ISUdIX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HVCgqaGlnaF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0xPV19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0xPV19ESVIpKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShyZXQpOwomIzQzOwomIzQzOwkqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCAmIzM0O2dldF9jZ3JvdXBfaWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldHVybiAwOwomIzQzOwomIzQzO2NsZWFudXA6CiYjNDM7CWNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHMKJiM0MzsgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcAomIzQzOyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZQomIzQzOyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjImIzM5O3MKJiM0MzsgKiBuby1pbnRlcm5hbC1wcm9jZXNzIGNvbnN0cmFpbnQga2VlcHMgdGhlIHJlZmF1bHRpbmcgd29ya2xvYWQgb3V0IG9mCiYjNDM7ICogYW55IHBhcmVudCB0aGF0IGhhcyBkb21haW4gY2hpbGRyZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGludCBzZXR1cF9keWluZ19jZ3JvdXBzKHU2NCAqdHJpZ2dlcl9jZ3JvdXBfaWQsIHU2NCAqdGFyZ2V0X2Nncm91cF9pZCkKJiM0Mzt7CiYjNDM7CWludCByZXQ7CiYjNDM7CWNoYXIgbGltaXRfYnVmWzIwXTsKJiM0MzsKJiM0MzsJcmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDtzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CiYjNDM7CXJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CXJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19EWUlOR19ESVIsICYjMzQ7bWVtb3J5JiMzNDspOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7ZW5hYmxlX2NvbnRyb2xsZXJzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCAmIzM0OyVsdSYjMzQ7LCBDR19MSU1JVCk7CiYjNDM7CXJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgJiMzNDttZW1vcnkubWF4JiMzNDssIGxpbWl0X2J1Zik7CiYjNDM7CWlmICghQVNTRVJUX09LKHJldCwgJiMzNDt3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4JiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwkvKiBTZWUgdGhlIG1hdGNoaW5nIHdyaXRlIGluIHNldHVwX2hpZ2hfbG93X2Nncm91cHMoKS4gKi8KJiM0MzsJaWYgKCFhY2Nlc3MoJiMzNDsvcHJvYy9zd2FwcyYjMzQ7LCBGX09LKSkgewomIzQzOwkJcmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCAmIzM0O21lbW9yeS5zd2FwLm1heCYjMzQ7LCAmIzM0OzAmIzM0Oyk7CiYjNDM7CQlpZiAoIUFTU0VSVF9PSyhyZXQsICYjMzQ7d3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4JiMzNDspKQomIzQzOwkJCWdvdG8gY2xlYW51cDsKJiM0MzsJfQomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShyZXQsIDAsICYjMzQ7Y3JlYXRlX2FuZF9nZXRfY2dyb3VwICYjMzQ7IENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJY2xvc2UocmV0KTsKJiM0MzsKJiM0MzsJKnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgJiMzNDtnZXRfY2dyb3VwX2lkJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CWlmICghQVNTRVJUX0dFKHJldCwgMCwgJiMzNDtjcmVhdGVfYW5kX2dldF9jZ3JvdXAgJiMzNDsgQ0dfRFlJTkdfVEFSR0VUX0RJUikpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKHJldCk7CiYjNDM7CiYjNDM7CSp0YXJnZXRfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UQVJHRVRfRElSKTsKJiM0MzsJaWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsICYjMzQ7Z2V0X2Nncm91cF9pZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7CiYjNDM7Y2xlYW51cDoKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0MzsJcmV0dXJuIC0xOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IHdyaXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiYjNDM7ewomIzQzOwlpbnQgcmV0ID0gLTE7CiYjNDM7CXNpemVfdCB3cml0dGVuID0gMDsKJiM0MzsJY2hhciAqYnVmZmVyOwomIzQzOwlGSUxFICpmcDsKJiM0MzsKJiM0MzsJZnAgPSBmb3BlbihmaWxlbmFtZSwgJiMzNDt3YiYjMzQ7KTsKJiM0MzsJaWYgKCFmcCkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlidWZmZXIgPSBtYWxsb2MoQlVGRkVSX1NJWkUpOwomIzQzOwlpZiAoIWJ1ZmZlcikKJiM0MzsJCWdvdG8gY2xlYW51cF9mcDsKJiM0MzsKJiM0MzsJbWVtc2V0KGJ1ZmZlciwgJiMzOTtBJiMzOTssIEJVRkZFUl9TSVpFKTsKJiM0MzsKJiM0MzsJd2hpbGUgKHdyaXR0ZW4gJmx0OyBGSUxFX1NJWkUpIHsKJiM0MzsJCXNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gJmx0OyBCVUZGRVJfU0laRSA/CiYjNDM7CQkJCSAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFOwomIzQzOwomIzQzOwkJaWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpCiYjNDM7CQkJZ290byBjbGVhbnVwOwomIzQzOwkJd3JpdHRlbiAmIzQzOz0gdG9fd3JpdGU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MztjbGVhbnVwOgomIzQzOwlmcmVlKGJ1ZmZlcik7CiYjNDM7Y2xlYW51cF9mcDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucykKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJbG9uZyBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFU0laRSk7CiYjNDM7CWNoYXIgKm1hcDsKJiM0MzsJc2l6ZV90IGk7CiYjNDM7CWludCBmZDsKJiM0MzsJc3RydWN0IHN0YXQgc2I7CiYjNDM7CiYjNDM7CWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOwomIzQzOwlpZiAoZmQgPT0gLTEpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJaWYgKGZzdGF0KGZkLCAmYW1wO3NiKSA9PSAtMSkKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsKJiM0MzsJaWYgKHNiLnN0X3NpemUgIT0gRklMRV9TSVpFKSB7CiYjNDM7CQlmcHJpbnRmKHN0ZGVyciwgJiMzNDtGaWxlIHNpemUgbWlzbWF0Y2g6IGV4cGVjdGVkICVsdSwgZ290ICVsdVxuJiMzNDssCiYjNDM7CQkJKHVuc2lnbmVkIGxvbmcpRklMRV9TSVpFLCAodW5zaWduZWQgbG9uZylzYi5zdF9zaXplKTsKJiM0MzsJCWdvdG8gY2xlYW51cF9mZDsKJiM0MzsJfQomIzQzOwomIzQzOwltYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOwomIzQzOwlpZiAobWFwID09IE1BUF9GQUlMRUQpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CWZvciAoaW50IGl0ZXIgPSAwOyBpdGVyICZsdDsgaXRlcmF0aW9uczsgaXRlciYjNDM7JiM0MzspIHsKJiM0MzsJCWZvciAoaSA9IDA7IGkgJmx0OyBGSUxFX1NJWkU7IGkgJiM0Mzs9IHBhZ2Vfc2l6ZSkgewomIzQzOwkJCS8qIGFjY2VzcyBhIGJ5dGUgdG8gdHJpZ2dlciBwYWdlIGZhdWx0ICovCiYjNDM7CQkJdm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldOwomIzQzOwkJCSh2b2lkKXY7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsKJiM0MzsJaWYgKG11bm1hcChtYXAsIEZJTEVfU0laRSkgPT0gLTEpCiYjNDM7CQlnb3RvIGNsZWFudXBfZmQ7CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7CiYjNDM7Y2xlYW51cF9mZDoKJiM0MzsJY2xvc2UoZmQpOwomIzQzO291dDoKJiM0MzsJcmV0dXJuIHJldDsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCByZWFsX3Rlc3RfY2hpbGRfd29yayhjb25zdCBjaGFyICpjZ3JvdXBfcGF0aCwgY2hhciAqZGF0YV9maWxlbmFtZSwKJiM0MzsJCQkJY2hhciAqdGltZV9maWxlbmFtZSwgaW50IHJlYWRfdGltZXMpCiYjNDM7ewomIzQzOwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKJiM0MzsJZG91YmxlIGVsYXBzZWQ7CiYjNDM7CUZJTEUgKmZwOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX0pPSU5fQ0dST1VQOwomIzQzOwomIzQzOwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJmFtcDtzdGFydCk7CiYjNDM7CiYjNDM7CWlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfV1JJVEVfRklMRTsKJiM0MzsKJiM0MzsJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSkKJiM0MzsJCXJldHVybiBDSElMRF9FWElUX1JFQURfRklMRTsKJiM0MzsKJiM0MzsJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZhbXA7ZW5kKTsKJiM0MzsKJiM0MzsJaWYgKCF0aW1lX2ZpbGVuYW1lKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfT0s7CiYjNDM7CiYjNDM7CWVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgJiM0MzsKJiM0MzsJCSAgKGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYykgLyAxMDAwMDAwMDAwLjA7CiYjNDM7CiYjNDM7CWZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgJiMzNDt3JiMzNDspOwomIzQzOwlpZiAoIWZwKQomIzQzOwkJcmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFOwomIzQzOwlmcHJpbnRmKGZwLCAmIzM0OyUuNmYmIzM0OywgZWxhcHNlZCk7CiYjNDM7CWZjbG9zZShmcCk7CiYjNDM7CiYjNDM7CXJldHVybiBDSElMRF9FWElUX09LOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSkKJiM0Mzt7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsJRklMRSAqZnA7CiYjNDM7CWNoYXIgYnVmWzY0XTsKJiM0MzsKJiM0MzsJZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCAmIzM0O3ImIzM0Oyk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihmcCwgJiMzNDtmb3BlbiYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApLCAmIzM0O2ZnZXRzJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwomIzQzOwlpZiAoc3NjYW5mKGJ1ZiwgJiMzNDslbGYmIzM0OywgdGltZSkgIT0gMSkgewomIzQzOwkJUFJJTlRfRkFJTCgmIzM0O3NzY2FuZiAlcyYjMzQ7LCBidWYpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CXJldCA9IDA7CiYjNDM7Y2xlYW51cDoKJiM0MzsJZmNsb3NlKGZwKTsKJiM0MztvdXQ6CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQKJiM0MztydW5faGlnaF9sb3dfd29ya2xvYWQoZG91YmxlICpoaWdoX2VsYXBzZWQsIGRvdWJsZSAqbG93X2VsYXBzZWQsIGludCByZWFkX3RpbWVzKQomIzQzO3sKJiM0MzsJY2hhciBoaWdoX2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07CiYjNDM7CWNoYXIgaGlnaF90aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljaGFyIGxvd190aW1lX2ZpbGVbUEFUSF9NQVhdOwomIzQzOwljb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTsKJiM0MzsJcGlkX3QgaGlnaF9waWQgPSAtMSwgbG93X3BpZCA9IC0xOwomIzQzOwlwaWRfdCB3YWl0X3JldDsKJiM0MzsJaW50IGZkLCBzdGF0dXM7CiYjNDM7CWludCByZXQgPSAtMTsKJiM0MzsKJiM0MzsJc25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19oaWdoX2RhdGFfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CXNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2xvd19kYXRhX1hYWFhYWCYjMzQ7LCBkaXIpOwomIzQzOwlzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSwKJiM0MzsJCSAmIzM0OyVzL21lbWNnX2FzeW5jX2hpZ2hfdGltZV9YWFhYWFgmIzM0OywgZGlyKTsKJiM0MzsJc25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLAomIzQzOwkJICYjMzQ7JXMvbWVtY2dfYXN5bmNfbG93X3RpbWVfWFhYWFhYJiMzNDssIGRpcik7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX2RhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd19kYXRhX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGZkLCAwLCAmIzM0O21rc3RlbXAmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWNsb3NlKGZkKTsKJiM0MzsKJiM0MzsJZmQgPSBta3N0ZW1wKGxvd190aW1lX2ZpbGUpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShmZCwgMCwgJiMzNDtta3N0ZW1wJiMzNDspKQomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CWxvd19waWQgPSBmb3JrKCk7CiYjNDM7CWlmICghQVNTRVJUX0dFKGxvd19waWQsIDAsICYjMzQ7Zm9yayBsb3cmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChsb3dfcGlkID09IDApCiYjNDM7CQlfZXhpdChyZWFsX3Rlc3RfY2hpbGRfd29yayhDR19MT1dfRElSLCBsb3dfZGF0YV9maWxlLAomIzQzOwkJCQkJICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7CiYjNDM7CiYjNDM7CWhpZ2hfcGlkID0gZm9yaygpOwomIzQzOwlpZiAoIUFTU0VSVF9HRShoaWdoX3BpZCwgMCwgJiMzNDtmb3JrIGhpZ2gmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChoaWdoX3BpZCA9PSAwKQomIzQzOwkJX2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLAomIzQzOwkJCQkJICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpOwomIzQzOwomIzQzOwl3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgJmFtcDtzdGF0dXMsIDApOwomIzQzOwlpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgJiMzNDtsb3cgd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJLyoKJiM0MzsJICogVGhlIGNoaWxkIGhhcyBiZWVuIHJlYXBlZCBhbmQgaXRzIFBJRCBjYW4gYWxyZWFkeSBiZSByZXVzZWQsCiYjNDM7CSAqIHNvIG1hcmsgaXQgdG8ga2VlcCBjbGVhbnVwIGZyb20gc2lnbmFsaW5nIGFuIHVucmVsYXRlZCBwcm9jZXNzLgomIzQzOwkgKi8KJiM0MzsJbG93X3BpZCA9IC0xOwomIzQzOwlpZiAoIUFTU0VSVF9UUlVFKFdJRkVYSVRFRChzdGF0dXMpLCAmIzM0O2xvdyBleGl0ZWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpJiMzNDssCiYjNDM7CQkJICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksCiYjNDM7CQkJICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJd2FpdF9yZXQgPSB3YWl0cGlkKGhpZ2hfcGlkLCAmYW1wO3N0YXR1cywgMCk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCAmIzM0O2hpZ2ggd2FpdHBpZCYjMzQ7KSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJLyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovCiYjNDM7CWhpZ2hfcGlkID0gLTE7CiYjNDM7CWlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksICYjMzQ7aGlnaCBleGl0ZWQmIzM0OykpCiYjNDM7CQlnb3RvIGNsZWFudXA7CiYjNDM7CWlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHsKJiM0MzsJCVBSSU5UX0ZBSUwoJiMzNDtoaWdoIGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKSYjMzQ7LAomIzQzOwkJCSAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLAomIzQzOwkJCSAgIFdFWElUU1RBVFVTKHN0YXR1cykpOwomIzQzOwkJZ290byBjbGVhbnVwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsJaWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSkKJiM0MzsJCWdvdG8gY2xlYW51cDsKJiM0MzsKJiM0MzsJcmV0ID0gMDsKJiM0MzsKJiM0MztjbGVhbnVwOgomIzQzOwkvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqLwomIzQzOwlpZiAocmV0KSB7CiYjNDM7CQlpZiAoaGlnaF9waWQgJmd0OyAwKSB7CiYjNDM7CQkJa2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7CiYjNDM7CQkJKHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7CiYjNDM7CQl9CiYjNDM7CQlpZiAobG93X3BpZCAmZ3Q7IDApIHsKJiM0MzsJCQlraWxsKGxvd19waWQsIFNJR0tJTEwpOwomIzQzOwkJCSh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7CiYjNDM7CQl9CiYjNDM7CX0KJiM0MzsJdW5saW5rKGxvd190aW1lX2ZpbGUpOwomIzQzOwl1bmxpbmsoaGlnaF90aW1lX2ZpbGUpOwomIzQzOwl1bmxpbmsobG93X2RhdGFfZmlsZSk7CiYjNDM7CXVubGluayhoaWdoX2RhdGFfZmlsZSk7CiYjNDM7CXJldHVybiByZXQ7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQKJiM0MztzZXR1cF9icGYodTY0IGhpZ2hfY2dyb3VwX2lkLCB1NjQgbG93X2Nncm91cF9pZCwKJiM0MzsJICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKQomIzQzO3sKJiM0MzsJc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWw7CiYjNDM7CXN0cnVjdCBicGZfYXJncyBhcmdzID0gewomIzQzOwkJLmhpZ2hfY2dyb3VwX2lkID0gaGlnaF9jZ3JvdXBfaWQsCiYjNDM7CQkubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsCiYjNDM7CQkuZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gRVZFTlRfREVMVEFfVEhSRVNIT0xELAomIzQzOwkJLmNoZWNrX25zID0gQ0hFQ0tfUEVSSU9EX05TLAomIzQzOwl9OwomIzQzOwlMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsCiYjNDM7CQkuY3R4X2luID0gJmFtcDthcmdzLAomIzQzOwkJLmN0eF9zaXplX2luID0gc2l6ZW9mKGFyZ3MpKTsKJiM0MzsJaW50IHByb2dfaW5pdF9mZCwgZXJyOwomIzQzOwomIzQzOwlza2VsID0gbWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZCgpOwomIzQzOwlpZiAoIUFTU0VSVF9PS19QVFIoc2tlbCwgJiMzNDttZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkJiMzNDspKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwomIzQzOwlwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC0mZ3Q7cHJvZ3Mud3FfcHJvZ19pbml0KTsKJiM0MzsKJiM0MzsJZXJyID0gYnBmX3Byb2dfdGVzdF9ydW5fb3B0cyhwcm9nX2luaXRfZmQsICZhbXA7cnVuX29wdHMpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7YnBmX3Byb2dfdGVzdF9ydW5fb3B0cyYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwlpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsICYjMzQ7cHJvZ19pbml0IHJldHZhbCYjMzQ7KSkKJiM0MzsJCWdvdG8gZXJyb3Jfb3V0OwomIzQzOwomIzQzOwkqc2tlbF9wdHIgPSBza2VsOwomIzQzOwlyZXR1cm4gMDsKJiM0MzsKJiM0MztlcnJvcl9vdXQ6CiYjNDM7CW1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7CiYjNDM7CXJldHVybiAtMTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiB0ZXN0X3Byb2dzIGhpamFja3Mgc3Rkb3V0IGFuZCBvbmx5IHByaW50cyB0aGUgY2FwdHVyZWQgbG9nIHdoZW4gdGhlCiYjNDM7ICogdGVzdCBmYWlscywgc28gYmVuY2htYXJrIG51bWJlcnMgZ28gc3RyYWlnaHQgdG8gdGhlIHJlYWwgc3Rkb3V0IHRvCiYjNDM7ICoga2VlcCB0aGVtIGZyb20gZHJvd25pbmcgaW4gQVNTRVJUIG91dHB1dC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBiZW5jaF9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCiYjNDM7ewomIzQzOwl2YV9saXN0IGFwOwomIzQzOwomIzQzOwl2YV9zdGFydChhcCwgZm10KTsKJiM0MzsJdmZwcmludGYoZW52LnN0ZG91dF9zYXZlZCA/OiBzdGRvdXQsIGZtdCwgYXApOwomIzQzOwl2YV9lbmQoYXApOwomIzQzO30KJiM0MzsKJiM0Mzt2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbSh2b2lkKQomIzQzO3sKJiM0MzsJdTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkOwomIzQzOwlkb3VibGUgaGlnaF90aW1lID0gMC4wLCBsb3dfdGltZSA9IDAuMDsKJiM0MzsJZG91YmxlIGJhc2VfaGlnaF90aW1lID0gMC4wLCBiYXNlX2xvd190aW1lID0gMC4wOwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CWludCBlcnIsIGJlbmNoOwomIzQzOwomIzQzOwliZW5jaCA9ICEhZ2V0ZW52KCYjMzQ7VEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIJiMzNDspOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCZhbXA7aGlnaF9jZ3JvdXBfaWQsICZhbXA7bG93X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW0mIzM0OykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIE9wdGlvbmFsIGJhc2VsaW5lIGZvciB0aGUgYmVuY2htYXJrIG51bWJlcnMgYmVsb3c6IHJ1biB0aGUKJiM0MzsJICogc2FtZSB3b3JrbG9hZCBvbmNlIHdpdGhvdXQgdGhlIEJQRiBwcm9ncmFtLCBzbyB0aGUgbG9nIGNhbgomIzQzOwkgKiByZXBvcnQgaG93IG11Y2ggYXN5bmMgcmVjbGFpbSBpbXByb3ZlZCB0aGUgcHJlc3N1cmVkIGNncm91cC4KJiM0MzsJICovCiYjNDM7CWlmIChiZW5jaCkgewomIzQzOwkJZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKCZhbXA7YmFzZV9oaWdoX3RpbWUsICZhbXA7YmFzZV9sb3dfdGltZSwKJiM0MzsJCQkJCSAgICBSRUFEX1RJTUVTKTsKJiM0MzsJCWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgYmFzZWxpbmUmIzM0OykpCiYjNDM7CQkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCAmYW1wO3NrZWwpOwomIzQzOwlpZiAoIUFTU0VSVF9PSyhlcnIsICYjMzQ7c2V0dXBfYnBmJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CWVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZCgmYW1wO2hpZ2hfdGltZSwgJmFtcDtsb3dfdGltZSwgUkVBRF9USU1FUyk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtydW5faGlnaF9sb3dfd29ya2xvYWQgcmVjbGFpbSYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZwomIzQzOwkgKiByZWNsYWltIGZyb20gYSBuby1vcCBvbmUsIHNvIHJlcXVpcmUgdGhhdCB0aGUgQlBGIHByb2dyYW0KJiM0MzsJICogYWN0dWFsbHkgcmVjbGFpbWVkIG1lbW9yeSBmcm9tIHRoZSBsb3cgY2dyb3VwLgomIzQzOwkgKi8KJiM0MzsJaWYgKCFBU1NFUlRfR1Qoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltX2NhbGxzLCAwLCAmIzM0O3JlY2xhaW1fY2FsbHMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFBU1NFUlRfR1Qoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltZWRfYnl0ZXMsIDAsICYjMzQ7cmVjbGFpbWVkX2J5dGVzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFRoZSB0aW1pbmcgY29tcGFyaXNvbiBpcyBhIGJlbmNobWFyayBhbmQgdG9vIGZsYWt5IHRvIGZhaWwgQ0kKJiM0MzsJICogcnVucywgc28gaXQgb25seSBsb2dzIHRoZSBudW1iZXJzOyB0aGUgY291bnRlcnMgYWJvdmUgYWxyZWFkeQomIzQzOwkgKiBwcm92ZWQgdGhhdCB0aGUgQlBGIHByb2dyYW0gcmVjbGFpbWVkIG1lbW9yeS4KJiM0MzsJICovCiYjNDM7CWlmIChiZW5jaCkKJiM0MzsJCWJlbmNoX3ByaW50ZigmIzM0O21lbWNnX2FzeW5jX3JlY2xhaW06IGJhc2VsaW5lIGhpZ2g9JWYgbG93PSVmLCAmIzM0OwomIzQzOwkJCSAgICAgJiMzNDtyZWNsYWltIGhpZ2g9JWYgbG93PSVmLCBoaWdoIHNwZWVkdXA9JS4xZiUlXG4mIzM0OywKJiM0MzsJCQkgICAgIGJhc2VfaGlnaF90aW1lLCBiYXNlX2xvd190aW1lLCBoaWdoX3RpbWUsIGxvd190aW1lLAomIzQzOwkJCSAgICAgMTAwLjAgKiAoYmFzZV9oaWdoX3RpbWUgLSBoaWdoX3RpbWUpIC8gYmFzZV9oaWdoX3RpbWUpOwomIzQzOwllbHNlIGlmIChoaWdoX3RpbWUgJmd0Oz0gbG93X3RpbWUpCiYjNDM7CQlwcmludGYoJiMzNDttZW1jZ19hc3luY19yZWNsYWltOiBoaWdoIGNncm91cCBub3QgaW1wcm92ZWQ6IGhpZ2g9JWYgbG93PSVmXG4mIzM0OywKJiM0MzsJCSAgICAgICBoaWdoX3RpbWUsIGxvd190aW1lKTsKJiM0MzsKJiM0MztvdXQ6CiYjNDM7CWlmIChza2VsKQomIzQzOwkJbWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTsKJiM0MzsJY2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTsKJiM0Mzt9CiYjNDM7CiYjNDM7LyoKJiM0MzsgKiBLZWVwIHJlZmF1bHRzIGZsb3dpbmcgdGhyb3VnaCB0aGUgdHJpZ2dlciBjZ3JvdXAgc28gcmVjbGFpbSByb3VuZHMKJiM0MzsgKiBrZWVwIGJlaW5nIHRyaWdnZXJlZCB3aGlsZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBiZWluZyByZW1vdmVkLiBUaGUKJiM0MzsgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzbwomIzQzOyAqIHRoYXQgdGhlIGZpbGUgcGFnZXMgYXJlIGNoYXJnZWQgdG8gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZCBhY3R1YWxseQomIzQzOyAqIGNvbWUgdW5kZXIgaXRzIG1lbW9yeSBsaW1pdDsgdGhlbiBpdCByZS1yZWFkcyB0aGUgZmlsZSBpbiBhIGxvb3AKJiM0MzsgKiB1bnRpbCBpdCBpcyBraWxsZWQuCiYjNDM7ICovCiYjNDM7c3RhdGljIHBpZF90IHNwYXduX2tlZXBhbGl2ZV9yZWFkZXIoY29uc3QgY2hhciAqZGF0YV9maWxlKQomIzQzO3sKJiM0MzsJcGlkX3QgcGlkID0gZm9yaygpOwomIzQzOwomIzQzOwlpZiAocGlkICE9IDApCiYjNDM7CQlyZXR1cm4gcGlkOwomIzQzOwomIzQzOwlpZiAoam9pbl9wYXJlbnRfY2dyb3VwKENHX0RZSU5HX1RSSUdHRVJfRElSKSkKJiM0MzsJCV9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApOwomIzQzOwlpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKQomIzQzOwkJX2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTsKJiM0MzsJZm9yICg7OykgewomIzQzOwkJaWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKQomIzQzOwkJCV9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTsKJiM0MzsJfQomIzQzO30KJiM0MzsKJiM0MzsvKiBSZWNsYWltIG91dGNvbWVzIG9ic2VydmVkIHNvIGZhciwgdGFsbGllZCBmcm9tIHJpbmdidWYgZXZlbnRzLiAqLwomIzQzO3N0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHsKJiM0MzsJaW50IGNhbGxlZDsKJiM0MzsJaW50IHNraXBwZWRfZHlpbmc7CiYjNDM7CWludCB0YXJnZXRfZ29uZTsKJiM0Mzt9OwomIzQzOwomIzQzO3N0YXRpYyBpbnQgb25fcmVjbGFpbV9ldmVudCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzeikKJiM0Mzt7CiYjNDM7CXN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuICpzZWVuID0gY3R4OwomIzQzOwljb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhOwomIzQzOwomIzQzOwlpZiAoc3ogJmx0OyBzaXplb2YoKmV2KSkKJiM0MzsJCXJldHVybiAwOwomIzQzOwomIzQzOwlzd2l0Y2ggKGV2LSZndDtvdXRjb21lKSB7CiYjNDM7CWNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDoKJiM0MzsJCXNlZW4tJmd0O2NhbGxlZCYjNDM7JiM0Mzs7CiYjNDM7CQlicmVhazsKJiM0MzsJY2FzZSBSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORzoKJiM0MzsJCXNlZW4tJmd0O3NraXBwZWRfZHlpbmcmIzQzOyYjNDM7OwomIzQzOwkJYnJlYWs7CiYjNDM7CWNhc2UgUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FOgomIzQzOwkJc2Vlbi0mZ3Q7dGFyZ2V0X2dvbmUmIzQzOyYjNDM7OwomIzQzOwkJYnJlYWs7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVtb3ZlIHRoZSByZWNsYWltIHRhcmdldCB3aGlsZSB0aGUgQlBGIHByb2dyYW0ga2VlcHMgcnVubmluZyBhbmQKJiM0MzsgKiB2ZXJpZnkgdGhhdCByZWNsYWltIHN0b3BzIG9uIHRoZSBkeWluZy9yZW1vdmVkIGNncm91cCBpbnN0ZWFkIG9mCiYjNDM7ICogcmVjbGFpbWluZyBmcm9tIGl0LgomIzQzOyAqCiYjNDM7ICogVGhlIHRhcmdldCBzdGF5cyBlbXB0eTsgdGhlIHdvcmtsb2FkIGxpdmVzIGluIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQKJiM0MzsgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLAomIzQzOyAqIGJvdGggYmVmb3JlIGFuZCBhZnRlciB0aGUgdGFyZ2V0IGlzIHJlbW92ZWQuIEEgQ0FMTEVEIGV2ZW50IHdoaWxlCiYjNDM7ICogdGhlIHRhcmdldCBpcyBhbGl2ZSBwcm92ZXMgdGhhdCByb3VuZHMgcmVhbGx5IHJ1biAodGhlIGtmdW5jCiYjNDM7ICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kCiYjNDM7ICogYWZ0ZXIgdGhlIHJlbW92YWwgdGhlIHByb2dyYW0gbXVzdCByZXBvcnQgdGhlIHJlbW92ZWQgdGFyZ2V0IHZpYQomIzQzOyAqIFNLSVBQRURfRFlJTkcgb3IgVEFSR0VUX0dPTkUgZXZlbnRzIHdoaWxlIHJlY2xhaW1fY2FsbHMgYW5kCiYjNDM7ICogcmVjbGFpbWVkX2J5dGVzIHN0YXkgZnJvemVuLgomIzQzOyAqLwomIzQzO3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltX2R5aW5nKHZvaWQpCiYjNDM7ewomIzQzOwl1NjQgdHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTsKJiM0MzsJY2hhciBkYXRhX2ZpbGVbUEFUSF9NQVhdID0gJiMzNDsmIzM0OzsKJiM0MzsJc3RydWN0IHJlY2xhaW1fZXZlbnRzX3NlZW4gc2VlbiA9IHt9OwomIzQzOwlzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7CiYjNDM7CXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMOwomIzQzOwlwaWRfdCByZWFkZXJfcGlkID0gLTE7CiYjNDM7CWludCBlcnIsIGZkLCBpOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9keWluZ19jZ3JvdXBzKCZhbXA7dHJpZ2dlcl9jZ3JvdXBfaWQsICZhbXA7dGFyZ2V0X2Nncm91cF9pZCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9keWluZ19jZ3JvdXBzJiMzNDspKQomIzQzOwkJcmV0dXJuOwomIzQzOwomIzQzOwllcnIgPSBzZXR1cF9icGYodHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQsICZhbXA7c2tlbCk7CiYjNDM7CWlmICghQVNTRVJUX09LKGVyciwgJiMzNDtzZXR1cF9icGYmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsKJiM0MzsJcmIgPSByaW5nX2J1ZmZlcl9fbmV3KGJwZl9tYXBfX2ZkKHNrZWwtJmd0O21hcHMucmVjbGFpbV9ldmVudHMpLAomIzQzOwkJCSAgICAgIG9uX3JlY2xhaW1fZXZlbnQsICZhbXA7c2VlbiwgTlVMTCk7CiYjNDM7CWlmICghQVNTRVJUX09LX1BUUihyYiwgJiMzNDtyaW5nX2J1ZmZlcl9fbmV3JiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXNucHJpbnRmKGRhdGFfZmlsZSwgc2l6ZW9mKGRhdGFfZmlsZSksCiYjNDM7CQkgJiMzNDslcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFgmIzM0Oywgd29ya2xvYWRfZmlsZXNfZGlyKCkpOwomIzQzOwlmZCA9IG1rc3RlbXAoZGF0YV9maWxlKTsKJiM0MzsJaWYgKCFBU1NFUlRfR0UoZmQsIDAsICYjMzQ7bWtzdGVtcCYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwljbG9zZShmZCk7CiYjNDM7CiYjNDM7CXJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7CiYjNDM7CWlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsICYjMzQ7Zm9yayBrZWVwYWxpdmUgcmVhZGVyJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CS8qIFdhaXQgZm9yIHJlY2xhaW0gcm91bmRzIHRvIHJlYWNoIHRoZSBsaXZlIHRhcmdldCBjZ3JvdXAuICovCiYjNDM7CWZvciAoaSA9IDA7IGkgJmx0OyBFVkVOVF9QT0xMX1JPVU5EUyAmYW1wOyZhbXA7ICFzZWVuLmNhbGxlZDsgaSYjNDM7JiM0MzspIHsKJiM0MzsJCWVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpOwomIzQzOwkJaWYgKCFBU1NFUlRfR0UoZXJyLCAwLCAmIzM0O3JpbmdfYnVmZmVyX19wb2xsJiMzNDspKQomIzQzOwkJCWdvdG8gb3V0OwomIzQzOwl9CiYjNDM7CWlmICghQVNTRVJUX0dUKHNlZW4uY2FsbGVkLCAwLCAmIzM0O3JlY2xhaW0gZXZlbnRzJiMzNDspKQomIzQzOwkJZ290byBvdXQ7CiYjNDM7CiYjNDM7CXJlbW92ZV9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7CiYjNDM7CiYjNDM7CS8qIExldCByZWNsYWltIHBhc3NlcyB0aGF0IHdlcmUgYWxyZWFkeSBpbiBmbGlnaHQgZHJhaW4uICovCiYjNDM7CXVzbGVlcChEWUlOR19TRVRUTEVfVVMpOwomIzQzOwomIzQzOwljYWxsc19iZWZvcmUgPSBza2VsLSZndDtic3MtJmd0O3JlY2xhaW1fY2FsbHM7CiYjNDM7CWJ5dGVzX2JlZm9yZSA9IHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbWVkX2J5dGVzOwomIzQzOwomIzQzOwkvKiBXYWl0IGZvciBhIHJlY2xhaW0gcm91bmQgdG8gaGl0IHRoZSByZW1vdmVkIGNncm91cC4gKi8KJiM0MzsJZm9yIChpID0gMDsgaSAmbHQ7IEVWRU5UX1BPTExfUk9VTkRTICZhbXA7JmFtcDsKJiM0MzsJCSAgICAhc2Vlbi5za2lwcGVkX2R5aW5nICZhbXA7JmFtcDsgIXNlZW4udGFyZ2V0X2dvbmU7IGkmIzQzOyYjNDM7KSB7CiYjNDM7CQllcnIgPSByaW5nX2J1ZmZlcl9fcG9sbChyYiwgRVZFTlRfUE9MTF9USU1FT1VUX01TKTsKJiM0MzsJCWlmICghQVNTRVJUX0dFKGVyciwgMCwgJiMzNDtyaW5nX2J1ZmZlcl9fcG9sbCYjMzQ7KSkKJiM0MzsJCQlnb3RvIG91dDsKJiM0MzsJfQomIzQzOwomIzQzOwlpZiAoIXNlZW4uc2tpcHBlZF9keWluZyAmYW1wOyZhbXA7ICFzZWVuLnRhcmdldF9nb25lKSB7CiYjNDM7CQlQUklOVF9GQUlMKCYjMzQ7bm8gcmVjbGFpbSByb3VuZCBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwIChnb25lPSVkLCBkeWluZz0lZCkmIzM0OywKJiM0MzsJCQkgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpOwomIzQzOwkJZ290byBvdXQ7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyoKJiM0MzsJICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVjawomIzQzOwkgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgdGhleSBoYXBwZW4gaXMgdGltaW5nCiYjNDM7CSAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzbwomIzQzOwkgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLgomIzQzOwkgKi8KJiM0MzsJcHJpbnRmKCYjMzQ7bWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZzogc2tpcHMgb24gcmVtb3ZlZCBjZ3JvdXA6IGdvbmU9JWQsIGR5aW5nPSVkXG4mIzM0OywKJiM0MzsJICAgICAgIHNlZW4udGFyZ2V0X2dvbmUsIHNlZW4uc2tpcHBlZF9keWluZyk7CiYjNDM7CiYjNDM7CS8qIE5vdGhpbmcgbWF5IGhhdmUgYmVlbiByZWNsYWltZWQgZnJvbSB0aGUgcmVtb3ZlZCB0YXJnZXQuICovCiYjNDM7CWlmICghQVNTRVJUX0VRKHNrZWwtJmd0O2Jzcy0mZ3Q7cmVjbGFpbV9jYWxscywgY2FsbHNfYmVmb3JlLCAmIzM0O3JlY2xhaW1fY2FsbHMmIzM0OykpCiYjNDM7CQlnb3RvIG91dDsKJiM0MzsJaWYgKCFBU1NFUlRfRVEoc2tlbC0mZ3Q7YnNzLSZndDtyZWNsYWltZWRfYnl0ZXMsIGJ5dGVzX2JlZm9yZSwKJiM0MzsJCSAgICAgICAmIzM0O3JlY2xhaW1lZF9ieXRlcyYjMzQ7KSkKJiM0MzsJCWdvdG8gb3V0OwomIzQzOwomIzQzO291dDoKJiM0MzsJaWYgKHJlYWRlcl9waWQgJmd0OyAwKSB7CiYjNDM7CQlraWxsKHJlYWRlcl9waWQsIFNJR0tJTEwpOwomIzQzOwkJKHZvaWQpd2FpdHBpZChyZWFkZXJfcGlkLCBOVUxMLCAwKTsKJiM0MzsJfQomIzQzOwlpZiAoZGF0YV9maWxlWzBdKQomIzQzOwkJdW5saW5rKGRhdGFfZmlsZSk7CiYjNDM7CWlmIChyYikKJiM0MzsJCXJpbmdfYnVmZmVyX19mcmVlKHJiKTsKJiM0MzsJaWYgKHNrZWwpCiYjNDM7CQltZW1jZ19hc3luY19yZWNsYWltX19kZXN0cm95KHNrZWwpOwomIzQzOwljbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpOwomIzQzO30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAuLmMxOGJlYjY0MTZkMzAKLS0tIC9kZXYvbnVsbAomIzQzOyYjNDM7JiM0MzsgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jCkBAIC0wLDAgJiM0MzsxLDI4OCBAQAomIzQzOy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCiYjNDM7CiYjNDM7I2luY2x1ZGUgJiMzNDt2bWxpbnV4LmgmIzM0OwomIzQzOyNpbmNsdWRlICYjMzQ7YnBmX2V4cGVyaW1lbnRhbC5oJiMzNDsKJiM0MzsjaW5jbHVkZSAmbHQ7YnBmL2JwZl9oZWxwZXJzLmgmZ3Q7CiYjNDM7I2luY2x1ZGUgJmx0O2JwZi9icGZfdHJhY2luZy5oJmd0OwomIzQzOyNpbmNsdWRlICZsdDticGYvYnBmX2NvcmVfcmVhZC5oJmd0OwomIzQzOwomIzQzOyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lECTEKJiM0MzsjZGVmaW5lIFBBR0VfU0laRQkJNDA5NlVMCiYjNDM7LyoKJiM0MzsgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkUKJiM0MzsgKiBlYWNoLiBFYWNoIGJwZl93cSBjYWxsYmFjayByZWNsYWltcyBhIHNpbmdsZSBiYXRjaCBhbmQgcmVxdWV1ZXMgdGhlCiYjNDM7ICogc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IG9uZSwgc28gbm8gY2FsbGJhY2sgcnVucyBsb25nZXIgdGhhbiBvbmUKJiM0MzsgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy4KJiM0MzsgKi8KJiM0MzsjZGVmaW5lIFJFQ0xBSU1fU0laRQkJKDMyICogUEFHRV9TSVpFKQomIzQzOyNkZWZpbmUgUkVDTEFJTV9NQVhfSVRFUgkzMgomIzQzOwomIzQzO3N0cnVjdCBicGZfYXJncyB7CiYjNDM7CXU2NCBoaWdoX2Nncm91cF9pZDsKJiM0MzsJdTY0IGxvd19jZ3JvdXBfaWQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0Mzt9OwomIzQzOwomIzQzO3N0cnVjdCBjZ3JvdXBfbWVtY2cgewomIzQzOwlzdHJ1Y3QgY2dyb3VwICpjZ3JwOwomIzQzOwlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiYjNDM7fTsKJiM0MzsKJiM0MztzdGF0aWMgdTY0IHdxX2hpZ2hfY2dyb3VwX2lkOwomIzQzO3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5CiYjNDM7ICogdGhhdCByZWNsYWltIGFjdHVhbGx5IGhhcHBlbmVkIGluc3RlYWQgb2YgcmVseWluZyBvbiB0aW1pbmcgYWxvbmUuCiYjNDM7ICovCiYjNDM7dTY0IHJlY2xhaW1fY2FsbHM7CiYjNDM7dTY0IHJlY2xhaW1lZF9ieXRlczsKJiM0MzsKJiM0MzsvKgomIzQzOyAqIE91dGNvbWUgb2YgYSBzaW5nbGUgcmVjbGFpbSBhdHRlbXB0LCByZXBvcnRlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaAomIzQzOyAqIHRoZSByZWNsYWltX2V2ZW50cyByaW5nYnVmIHNvIHRlc3RzIGNhbiB3YWl0IGZvciByZWNsYWltIGV2ZW50cyB3aXRoCiYjNDM7ICogYSB0aW1lb3V0IGluc3RlYWQgb2YgcG9sbGluZyB0aGUgY291bnRlcnMgYWJvdmUuCiYjNDM7ICovCiYjNDM7ZW51bSByZWNsYWltX291dGNvbWUgewomIzQzOwlSRUNMQUlNX09VVENPTUVfQ0FMTEVELAomIzQzOwlSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORywKJiM0MzsJUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FLAomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHJlY2xhaW1fZXZlbnQgewomIzQzOwlfX3U2NCBvdXRjb21lOwomIzQzO307CiYjNDM7CiYjNDM7c3RydWN0IHsKJiM0MzsJX191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9SSU5HQlVGKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxICZsdDsmbHQ7IDE2KTsKJiM0Mzt9IHJlY2xhaW1fZXZlbnRzIFNFQygmIzM0Oy5tYXBzJiMzNDspOwomIzQzOwomIzQzOy8qCiYjNDM7ICogUmVwb3J0cyBhcmUgYmVzdCBlZmZvcnQ6IHdoZW4gdGhlIHJpbmdidWYgaXMgZnVsbCwgZm9yIGV4YW1wbGUgd2hlbgomIzQzOyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdm9pZCBlbWl0X3JlY2xhaW1fZXZlbnQoZW51bSByZWNsYWltX291dGNvbWUgb3V0Y29tZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCByZWNsYWltX2V2ZW50ICpldjsKJiM0MzsKJiM0MzsJZXYgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKCZhbXA7cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTsKJiM0MzsJaWYgKCFldikKJiM0MzsJCXJldHVybjsKJiM0MzsKJiM0MzsJZXYtJmd0O291dGNvbWUgPSBvdXRjb21lOwomIzQzOwlicGZfcmluZ2J1Zl9zdWJtaXQoZXYsIDApOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgaW50IGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZCh1NjQgY2dyb3VwX2lkLCBzdHJ1Y3QgY2dyb3VwX21lbWNnICpjbSkKJiM0Mzt7CiYjNDM7CWNtLSZndDtjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7CiYjNDM7CWlmICghY20tJmd0O2NncnApCiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CiYjNDM7CWNtLSZndDttZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cCgmYW1wO2NtLSZndDtjZ3JwLSZndDtzZWxmKTsKJiM0MzsJaWYgKCFjbS0mZ3Q7bWVtY2cpIHsKJiM0MzsJCWJwZl9jZ3JvdXBfcmVsZWFzZShjbS0mZ3Q7Y2dycCk7CiYjNDM7CQlyZXR1cm4gLTE7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyB2b2lkIHB1dF9jZ3JvdXBfbWVtY2coc3RydWN0IGNncm91cF9tZW1jZyAqY20pCiYjNDM7ewomIzQzOwlicGZfcHV0X21lbV9jZ3JvdXAoY20tJmd0O21lbWNnKTsKJiM0MzsJYnBmX2Nncm91cF9yZWxlYXNlKGNtLSZndDtjZ3JwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7c3RhdGljIGludCBnZXRfY2dyb3VwX2V2ZW50KHU2NCBjZ3JvdXBfaWQsIHU2NCAqdmFsKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKQomIzQzOwkJcmV0dXJuIC0xOwomIzQzOwlicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhjbS5tZW1jZyk7CiYjNDM7CSp2YWwgPSBicGZfbWVtX2Nncm91cF9wYWdlX3N0YXRlKGNtLm1lbWNnLAomIzQzOwkJYnBmX2NvcmVfZW51bV92YWx1ZShlbnVtIG5vZGVfc3RhdF9pdGVtLAomIzQzOwkJCQkgICAgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEUpKTsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBib29sCiYjNDM7c2hvdWxkX3JlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCAqcHJldl9ldmVudCwgdTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZCkKJiM0Mzt7CiYjNDM7CXU2NCBjdXIsIGRlbHRhOwomIzQzOwomIzQzOwlpZiAoZ2V0X2Nncm91cF9ldmVudChjZ3JvdXBfaWQsICZhbXA7Y3VyKSkKJiM0MzsJCXJldHVybiBmYWxzZTsKJiM0MzsKJiM0MzsJZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDsKJiM0MzsJKnByZXZfZXZlbnQgPSBjdXI7CiYjNDM7CiYjNDM7CXJldHVybiBkZWx0YSAmZ3Q7PSBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7fQomIzQzOwomIzQzOy8qCiYjNDM7ICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvcgomIzQzOyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpCiYjNDM7ICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFjawomIzQzOyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlbgomIzQzOyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvbgomIzQzOyAqIHRoZSBsb29rdXAgZmFpbGluZy4KJiM0MzsgKgomIzQzOyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbQomIzQzOyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0bwomIzQzOyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oCiYjNDM7ICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwmIzM5O3MgQlRGLCBzbwomIzQzOyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBjZ3JvdXBfaXNfZHlpbmcoc3RydWN0IGNncm91cCAqY2dycCkKJiM0Mzt7CiYjNDM7CXVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtJmd0O3NlbGYuZmxhZ3M7CiYjNDM7CiYjNDM7CXJldHVybiAoZmxhZ3MgJmFtcDsgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzICZhbXA7IENTU19PTkxJTkUpOwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZgomIzQzOyAqIGJ5dGVzIHJlY2xhaW1lZCwgb3IgMCBpZiB0aGUgY2dyb3VwIGlzIGR5aW5nIG9yIGdvbmUgb3Igbm90aGluZyB3YXMKJiM0MzsgKiByZWNsYWltZWQuIEVhY2ggYXR0ZW1wdCByZXBvcnRzIGl0cyBvdXRjb21lIHRocm91Z2ggdGhlCiYjNDM7ICogcmVjbGFpbV9ldmVudHMgcmluZ2J1Zi4KJiM0MzsgKi8KJiM0MztzdGF0aWMgdTY0IHJlY2xhaW1fY2dyb3VwKHU2NCBjZ3JvdXBfaWQsIHU2NCBzaXplKQomIzQzO3sKJiM0MzsJc3RydWN0IGNncm91cF9tZW1jZyBjbTsKJiM0MzsJdTY0IG5yID0gMDsKJiM0MzsKJiM0MzsJaWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsICZhbXA7Y20pKSB7CiYjNDM7CQllbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FKTsKJiM0MzsJCXJldHVybiAwOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHsKJiM0MzsJCWVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyk7CiYjNDM7CQlwdXRfY2dyb3VwX21lbWNnKCZhbXA7Y20pOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJcmVjbGFpbV9jYWxscyYjNDM7JiM0Mzs7CiYjNDM7CW5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplLCAtMSk7CiYjNDM7CXJlY2xhaW1lZF9ieXRlcyAmIzQzOz0gbnI7CiYjNDM7CWVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTsKJiM0MzsKJiM0MzsJcHV0X2Nncm91cF9tZW1jZygmYW1wO2NtKTsKJiM0MzsKJiM0MzsJcmV0dXJuIG5yOwomIzQzO30KJiM0MzsKJiM0MztzdHJ1Y3Qgd3FfZWxlbSB7CiYjNDM7CXN0cnVjdCBicGZfdGltZXIgdGltZXI7CiYjNDM7CXN0cnVjdCBicGZfd3Egd29yazsKJiM0MzsJdTY0IHByZXZfZXZlbnQ7CiYjNDM7CXU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CXU2NCBjaGVja19uczsKJiM0MzsJLyoKJiM0MzsJICogQnl0ZXMgc3RpbGwgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCByb3VuZCwgY2FycmllZCBhY3Jvc3MKJiM0MzsJICogcmVxdWV1ZXMuIDAgbWVhbnMgbm8gcm91bmQgaXMgaW4gcHJvZ3Jlc3M7IHRoZSB0aW1lciBwYXRoCiYjNDM7CSAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rcwomIzQzOwkgKiBhdCBpdC4KJiM0MzsJICovCiYjNDM7CXU2NCByZW1haW5pbmc7CiYjNDM7fTsKJiM0MzsKJiM0MztzdHJ1Y3QgewomIzQzOwlfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTsKJiM0MzsJX191aW50KG1heF9lbnRyaWVzLCAxKTsKJiM0MzsJX190eXBlKGtleSwgX191MzIpOwomIzQzOwlfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTsKJiM0Mzt9IHdxX21hcCBTRUMoJiMzNDsubWFwcyYjMzQ7KTsKJiM0MzsKJiM0MztzdGF0aWMgaW50IHJlY2xhaW1fd29ya19mbih2b2lkICptYXAsIGludCAqa2V5LCB2b2lkICp2YWx1ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCB3cV9lbGVtICplbGVtID0gdmFsdWU7CiYjNDM7CXU2NCBuciwgc2l6ZTsKJiM0MzsKJiM0MzsJaWYgKCFlbGVtLSZndDtyZW1haW5pbmcpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBUaW1lci10cmlnZ2VyZWQgZW50cnk6IHN0YXJ0IGEgbmV3IHJvdW5kIG9ubHkgd2hlbiB0aGUKJiM0MzsJCSAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXMKJiM0MzsJCSAqIGNoZWNrIGFuZCBvbmx5IGxvb2sgYXQgcmVtYWluaW5nLCBzbyB0aGUgcmVmYXVsdCBkZWx0YQomIzQzOwkJICogaXMgY29uc3VtZWQgb25jZSBwZXIgcm91bmQuCiYjNDM7CQkgKi8KJiM0MzsJCWlmICghc2hvdWxkX3JlY2xhaW1fY2dyb3VwKHdxX2hpZ2hfY2dyb3VwX2lkLCAmYW1wO2VsZW0tJmd0O3ByZXZfZXZlbnQsCiYjNDM7CQkJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkKSkKJiM0MzsJCQlyZXR1cm4gMDsKJiM0MzsJCWVsZW0tJmd0O3JlbWFpbmluZyA9IFJFQ0xBSU1fTUFYX0lURVIgKiBSRUNMQUlNX1NJWkU7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogT25lIGJvdW5kZWQgcmVjbGFpbSBwYXNzIHBlciBjYWxsYmFjayAqLwomIzQzOwlzaXplID0gZWxlbS0mZ3Q7cmVtYWluaW5nICZsdDsgUkVDTEFJTV9TSVpFID8gZWxlbS0mZ3Q7cmVtYWluaW5nIDogUkVDTEFJTV9TSVpFOwomIzQzOwluciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpOwomIzQzOwlpZiAoIW5yKSB7CiYjNDM7CQllbGVtLSZndDtyZW1haW5pbmcgPSAwOwomIzQzOwkJcmV0dXJuIDA7CiYjNDM7CX0KJiM0MzsKJiM0MzsJLyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi8KJiM0MzsJaWYgKG5yICZndDs9IGVsZW0tJmd0O3JlbWFpbmluZykKJiM0MzsJCWVsZW0tJmd0O3JlbWFpbmluZyA9IDA7CiYjNDM7CWVsc2UKJiM0MzsJCWVsZW0tJmd0O3JlbWFpbmluZyAtPSBucjsKJiM0MzsKJiM0MzsJLyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovCiYjNDM7CWlmIChlbGVtLSZndDtyZW1haW5pbmcpCiYjNDM7CQlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pCiYjNDM7ewomIzQzOwlicGZfd3Ffc3RhcnQoJmFtcDtlbGVtLSZndDt3b3JrLCAwKTsKJiM0MzsJYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0MzsKJiM0MzsJcmV0dXJuIDA7CiYjNDM7fQomIzQzOwomIzQzO1NFQygmIzM0O3N5c2NhbGwmIzM0OykKJiM0MztpbnQgd3FfcHJvZ19pbml0KHN0cnVjdCBicGZfYXJncyAqY3R4KQomIzQzO3sKJiM0MzsJc3RydWN0IHdxX2VsZW0gKmVsZW07CiYjNDM7CV9fdTMyIGtleSA9IDA7CiYjNDM7CWludCByZXQ7CiYjNDM7CiYjNDM7CWVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZhbXA7d3FfbWFwLCAmYW1wO2tleSk7CiYjNDM7CWlmICghZWxlbSkKJiM0MzsJCXJldHVybiAtMTsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3dxX2luaXQoJmFtcDtlbGVtLSZndDt3b3JrLCAmYW1wO3dxX21hcCwgMCk7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwlyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKCZhbXA7ZWxlbS0mZ3Q7d29yaywgcmVjbGFpbV93b3JrX2ZuLCAwKTsKJiM0MzsJaWYgKHJldCkKJiM0MzsJCXJldHVybiByZXQ7CiYjNDM7CiYjNDM7CXJldCA9IGJwZl90aW1lcl9pbml0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsICZhbXA7d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpOwomIzQzOwlpZiAocmV0KQomIzQzOwkJcmV0dXJuIHJldDsKJiM0MzsKJiM0MzsJcmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjaygmYW1wO2VsZW0tJmd0O3RpbWVyLCB3cV90aW1lcl9jYik7CiYjNDM7CWlmIChyZXQpCiYjNDM7CQlyZXR1cm4gcmV0OwomIzQzOwomIzQzOwllbGVtLSZndDtwcmV2X2V2ZW50ID0gMDsKJiM0MzsJZWxlbS0mZ3Q7cmVtYWluaW5nID0gMDsKJiM0MzsJZWxlbS0mZ3Q7ZXZlbnRfZGVsdGFfdGhyZXNob2xkID0gY3R4LSZndDtldmVudF9kZWx0YV90aHJlc2hvbGQ7CiYjNDM7CWVsZW0tJmd0O2NoZWNrX25zID0gY3R4LSZndDtjaGVja19uczsKJiM0MzsKJiM0MzsJd3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtJmd0O2hpZ2hfY2dyb3VwX2lkOwomIzQzOwl3cV9sb3dfY2dyb3VwX2lkID0gY3R4LSZndDtsb3dfY2dyb3VwX2lkOwomIzQzOwomIzQzOwlyZXR1cm4gYnBmX3RpbWVyX3N0YXJ0KCZhbXA7ZWxlbS0mZ3Q7dGltZXIsIGVsZW0tJmd0O2NoZWNrX25zLCAwKTsKJiM0Mzt9CiYjNDM7CiYjNDM7Y2hhciBfbGljZW5zZVtdIFNFQygmIzM0O2xpY2Vuc2UmIzM0OykgPSAmIzM0O0dQTCYjMzQ7Owo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNS8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTU1MjAKCQkJCQkJCW91dHB1dDogMzQKCQkJCQkJCXRob3VnaHRzOiA1MjIKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gRnV6emluZyBFdmFsdWF0aW9uIGZvciBUaGlzIFBhdGNoIFNlcmllcyoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBpbml0aWFsIHRob3VnaHQgaXMgdG8gZmlndXJlIG91dCB3aGV0aGVyIHdlIG5lZWQgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGZvciB0aGlzIHBhdGNoIHNlcmllcy4gV2UmIzM5O3JlIGxvb2tpbmcgYXQgY29kZSBjaGFuZ2VzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgYG1tL2ludGVybmFsLmhgLCBhbmQgc29tZSBzZWxmdGVzdHMuCgpGaXJzdCwgSSBuZWVkIHRvIHVuZGVyc3RhbmQgd2hhdCYjMzk7cyBhY3R1YWxseSAqaGFwcGVuaW5nKiBoZXJlLiBUaGUgY29yZSBzZWVtcyB0byBiZSB0aGUgYWRkaXRpb24gb2YgYSBuZXcga2Z1bmMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLiBJdCYjMzk7cyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCB0YWtlcyBhIGBtZW1fY2dyb3VwYCwgYSBzaXplLCBhbmQgYSBgc3dhcHBpbmVzc2AgdmFsdWUsIGRvZXMgc29tZSBzaXplIGFuZCBzd2FwcGluZXNzIGNoZWNraW5nLCBjYWxjdWxhdGVzIGEgbnVtYmVyIG9mIHBhZ2VzLCBhbmQgdGhlbiBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgd2l0aCB0aGUgYEtGX1NMRUVQQUJMRWAgZmxhZywgd2hpY2ggaXMgZ29vZCB0byBub3RlLiBUaGUgYGludGVybmFsLmhgIGNoYW5nZXMganVzdCBsb29rIGxpa2UgYSBjb252ZXJzaW9uIGZyb20gZGVmaW5lcyB0byBhbiBlbnVtIGZvciBzd2FwcGluZXNzIHZhbHVlcy4gQW5kIHdlJiMzOTt2ZSBnb3QgYSBuZXcgc2VsZnRlc3Qgc3VpdGUgaW4gYHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZmAgdGhhdCBhcmUgZ29pbmcgdG8gYmUgdmVyaWZ5aW5nIHRoaXMuCgpNeSBwcmltYXJ5IGNvbmNlcm4gaXMgaG93IGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBhbmQgc3BlY2lmaWNhbGx5IGhvdyB0aGUgYHN3YXBwaW5lc3NgIGFyZ3VtZW50IHdvcmtzIGFuZCBpcyB1c2VkLiBHaXZlbiB0aGlzIGlzIG5ldyBrZnVuYyBhbmQgY291bGQgYmUgZXhwb3NlZCBpbiB1c2VyIHNwYWNlLCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgaXQmIzM5O3MgaW50ZWdyYXRlZCB0byBtYWtlIHN1cmUgdGhlcmUmIzM5O3Mgbm8gc3VidGxlIGlzc3VlIHRoYXQgS01TQU4gbWlnaHQgY2F0Y2gsIGFuZCB0aGF0JiMzOTtzIHByb2JhYmx5IHRoZSBtb3N0IGludGVyZXN0aW5nIHBhcnQgb2YgdGhpcyBwYXRjaCBzZXJpZXMgZm9yIG5vdy4gSSBuZWVkIHRvIGRpZyBpbnRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCBpdHNlbGYuIEEgcXVpY2sgZ3JlcHBlciBzZWFyY2ggc2hvdWxkIGRvIHRoZSB0cmljaywgb3IgSSBjYW4ganVzdCBjaGVjayB0aGUgY29kZSBpdHNlbGYuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE1PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3RyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMmIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vYnBmX21lbWNvbnRyb2wuYz0yMDc9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL2JwZl9tZW1jb250cm9sLmMtMjIxLVxubW0vYnBmX21lbWNvbnRyb2wuYzoyMjI6XHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjIzLVx0XHRcdFx0XHRcdCAgICBHRlBfS0VSTkVMLFxuLS1cbm1tL2ludGVybmFsLmg9Nzc9ZW51bSB7XG4tLVxubW0vaW50ZXJuYWwuaC04NC1cbm1tL2ludGVybmFsLmg6ODU6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbm1tL2ludGVybmFsLmgtODYtXHRcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXG4tLVxubW0vbWVtY29udHJvbC12MS5jPTE3NzE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xODE1LVxubW0vbWVtY29udHJvbC12MS5jOjE4MTY6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODE3LVx0XHRcdFx0bWVtc3cgPyAwIDogTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpIHtcbi0tXG5tbS9tZW1jb250cm9sLXYxLmM9MTgzND1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxuLS1cbm1tL21lbWNvbnRyb2wtdjEuYy0xODUxLVxubW0vbWVtY29udHJvbC12MS5jOjE4NTI6XHRcdGlmICghdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgMSwgR0ZQX0tFUk5FTCxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODUzLVx0XHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXG4tLVxubW0vbWVtY29udHJvbC5jPTIzNzg9c3RhdGljIHVuc2lnbmVkIGxvbmcgcmVjbGFpbV9oaWdoKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS9tZW1jb250cm9sLmMtMjM5My1cdFx0cHNpX21lbXN0YWxsX2VudGVyKFx1MDAyNnBmbGFncyk7XG5tbS9tZW1jb250cm9sLmM6MjM5NDpcdFx0bnJfcmVjbGFpbWVkICYjNDM7PSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcbm1tL21lbWNvbnRyb2wuYy0yMzk1LVx0XHRcdFx0XHRcdFx0Z2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jPTI2NDU9c3RhdGljIGludCB0cnlfY2hhcmdlX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZ2ZwX3QgZ2ZwX21hc2ssXG4tLVxubW0vbWVtY29udHJvbC5jLTI3MTctXHRwc2lfbWVtc3RhbGxfZW50ZXIoXHUwMDI2cGZsYWdzKTtcbm1tL21lbWNvbnRyb2wuYzoyNzE4Olx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1fb3Zlcl9saW1pdCwgbnJfcGFnZXMsXG5tbS9tZW1jb250cm9sLmMtMjcxOS1cdFx0XHRcdFx0XHQgICAgZ2ZwX21hc2ssIHJlY2xhaW1fb3B0aW9ucywgTlVMTCk7XG4tLVxubW0vbWVtY29udHJvbC5jPTQ4Mzg9c3RhdGljIHNzaXplX3QgbWVtb3J5X2hpZ2hfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxuLS1cbm1tL21lbWNvbnRyb2wuYy00ODc5LVxubW0vbWVtY29udHJvbC5jOjQ4ODA6XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcbm1tL21lbWNvbnRyb2wuYy00ODgxLVx0XHRcdFx0XHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcbi0tXG5tbS9tZW1jb250cm9sLmM9NDg5Nz1zdGF0aWMgc3NpemVfdCBtZW1vcnlfbWF4X3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcbi0tXG5tbS9tZW1jb250cm9sLmMtNDkzOC1cdFx0aWYgKG5yX3JlY2xhaW1zKSB7XG5tbS9tZW1jb250cm9sLmM6NDkzOTpcdFx0XHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gbWF4LFxubW0vbWVtY29udHJvbC5jLTQ5NDAtXHRcdFx0XHRcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxuLS1cbm1tL3Ztc2Nhbi5jPTY4MTU9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbi0tXG5tbS92bXNjYW4uYy02ODU0LVxubW0vdm1zY2FuLmM6Njg1NTp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxubW0vdm1zY2FuLmMtNjg1Ni1cdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbi0tXG5tbS92bXNjYW4uYy02ODk1LSNlbHNlXG5tbS92bXNjYW4uYzo2ODk2OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG5tbS92bXNjYW4uYy02ODk3LVx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuLS1cbm1tL3Ztc2Nhbi5jPTc5NTg9aW50IHVzZXJfcHJvYWN0aXZlX3JlY2xhaW0oY2hhciAqYnVmLFxuLS1cbm1tL3Ztc2Nhbi5jLTgwMjktXHRcdFx0XHRcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XG5tbS92bXNjYW4uYzo4MDMwOlx0XHRcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csXG5tbS92bXNjYW4uYy04MDMxLVx0XHRcdFx0XHRcdCBiYXRjaF9zaXplLCBnZnBfbWFzayxcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPmttc2FuLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTc3MzgKCQkJCQkJCW91dHB1dDogMzUKCQkJCQkJCXRob3VnaHRzOiAyOAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSBzdW1tYXJ5LCBhcyB0aG91Z2ggSSB3ZXJlIHRoaW5raW5nIHRocm91Z2ggdGhlIHByb2Nlc3M6CgoqKkRpdmluZyBpbnRvIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCoqCgpPa2F5LCBzbyBJJiMzOTttIGZvY3VzaW5nIGluIG9uIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCB3aXRoaW4gYG1tL3Ztc2Nhbi5jYC4gVGhpcyBpcyB3aGVyZSB0aGUgcnViYmVyIG1lZXRzIHRoZSByb2FkIHdoZW4gaXQgY29tZXMgdG8gbWVtb3J5IG1hbmFnZW1lbnQsIHNwZWNpZmljYWxseSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgY2dyb3Vwcy4gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IHRoZSBrZXJuZWwgaXMgKmFjdHVhbGx5KiBhdHRlbXB0aW5nIHRvIHJlY2xhaW0gbWVtb3J5IGZyb20gYSBzcGVjaWZpYyBjZ3JvdXAuIEkgd2FudCB0byBzZWUgZXhhY3RseSB3aGF0IHN0ZXBzIGFyZSB0YWtlbiB0byBmcmVlIHVwIHBhZ2VzIHdpdGhpbiB0aGF0IGNncm91cCYjMzk7cyBhbGxvY2F0ZWQgbWVtb3J5LiBJIHN1c3BlY3QgdGhlcmUgYXJlIHNvbWUgY3J1Y2lhbCBvcHRpbWl6YXRpb25zIG9yIGxvY2tpbmcgc3RyYXRlZ2llcyBhdCBwbGF5IGhlcmUsIGFuZCBJJiMzOTttIGVhZ2VyIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiB0aGUgbWVjaGFuaWNzIGludm9sdmVkLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZSByZWNsYWltIHByb2Nlc3MgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIHdoYXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIG9yIGFyZWFzIGZvciBpbXByb3ZlbWVudCBtaWdodCBleGlzdC4gVGhpcyBzaG91bGQgYWxzbyBoZWxwIG1lIHVuZGVyc3RhbmQgaG93IGVmZmVjdGl2ZSB0aGUgbWVtb3J5IGNncm91cCBsaW1pdHMgcmVhbGx5IGFyZS4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xOC8zPC90ZD4KCQkJPHRkPjIwMjYvMDkvMTEgMDM6MTU8L3RkPgoJCQk8dGQ+dG9vbDwvdGQ+CgkJCTx0ZD5yZWFkLWZpbGU8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0ZpbGUmIzM0OzogJiMzNDttbS92bXNjYW4uYyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDY4NTAsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogNDUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7Njg1MDpcdFx0Km5yX3NjYW5uZWQgPSBzYy5ucl9zY2FubmVkO1xuNjg1MTpcdFxuNjg1MjpcdFx0cmV0dXJuIHNjLm5yX3JlY2xhaW1lZDtcbjY4NTM6XHR9XG42ODU0Olx0XG42ODU1Olx0dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcbjY4NTY6XHRcdFx0XHRcdFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcbjY4NTc6XHRcdFx0XHRcdFx0ICAgZ2ZwX3QgZ2ZwX21hc2ssXG42ODU4Olx0XHRcdFx0XHRcdCAgIHVuc2lnbmVkIGludCByZWNsYWltX29wdGlvbnMsXG42ODU5Olx0XHRcdFx0XHRcdCAgIGludCAqc3dhcHBpbmVzcylcbjY4NjA6XHR7XG42ODYxOlx0XHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcbjY4NjI6XHRcdHVuc2lnbmVkIGludCBub3JlY2xhaW1fZmxhZztcbjY4NjM6XHRcdHN0cnVjdCBzY2FuX2NvbnRyb2wgc2MgPSB7XG42ODY0Olx0XHRcdC5ucl90b19yZWNsYWltID0gbWF4KG5yX3BhZ2VzLCBTV0FQX0NMVVNURVJfTUFYKSxcbjY4NjU6XHRcdFx0LnByb2FjdGl2ZV9zd2FwcGluZXNzID0gc3dhcHBpbmVzcyxcbjY4NjY6XHRcdFx0LmdmcF9tYXNrID0gKGN1cnJlbnRfZ2ZwX2NvbnRleHQoZ2ZwX21hc2spIFx1MDAyNiBHRlBfUkVDTEFJTV9NQVNLKSB8XG42ODY3Olx0XHRcdFx0XHQoR0ZQX0hJR0hVU0VSX01PVkFCTEUgXHUwMDI2IH5HRlBfUkVDTEFJTV9NQVNLKSxcbjY4Njg6XHRcdFx0LnJlY2xhaW1faWR4ID0gTUFYX05SX1pPTkVTIC0gMSxcbjY4Njk6XHRcdFx0LnRhcmdldF9tZW1fY2dyb3VwID0gbWVtY2csXG42ODcwOlx0XHRcdC5wcmlvcml0eSA9IERFRl9QUklPUklUWSxcbjY4NzE6XHRcdFx0Lm1heV93cml0ZXBhZ2UgPSAxLFxuNjg3MjpcdFx0XHQubWF5X3VubWFwID0gMSxcbjY4NzM6XHRcdFx0Lm1heV9zd2FwID0gISEocmVjbGFpbV9vcHRpb25zIFx1MDAyNiBNRU1DR19SRUNMQUlNX01BWV9TV0FQKSxcbjY4NzQ6XHRcdFx0LnByb2FjdGl2ZSA9ICEhKHJlY2xhaW1fb3B0aW9ucyBcdTAwMjYgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUpLFxuNjg3NTpcdFx0fTtcbjY4NzY6XHRcdC8qXG42ODc3Olx0XHQgKiBUcmF2ZXJzZSB0aGUgWk9ORUxJU1RfRkFMTEJBQ0sgem9uZWxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSB0byBwdXRcbjY4Nzg6XHRcdCAqIGVxdWFsIHByZXNzdXJlIG9uIGFsbCB0aGUgbm9kZXMuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxuNjg3OTpcdFx0ICogdGhlIHJlY2xhaW0gZG9lcyBub3QgYmFpbCBvdXQgZWFybHkuXG42ODgwOlx0XHQgKi9cbjY4ODE6XHRcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLCBzYy5nZnBfbWFzayk7XG42ODgyOlx0XG42ODgzOlx0XHRzZXRfdGFza19yZWNsYWltX3N0YXRlKGN1cnJlbnQsIFx1MDAyNnNjLnJlY2xhaW1fc3RhdGUpO1xuNjg4NDpcdFx0dHJhY2VfbW1fdm1zY2FuX21lbWNnX3JlY2xhaW1fYmVnaW4oc2MuZ2ZwX21hc2ssIDAsIG1lbWNnKTtcbjY4ODU6XHRcdG5vcmVjbGFpbV9mbGFnID0gbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKTtcbjY4ODY6XHRcbjY4ODc6XHRcdG5yX3JlY2xhaW1lZCA9IGRvX3RyeV90b19mcmVlX3BhZ2VzKHpvbmVsaXN0LCBcdTAwMjZzYyk7XG42ODg4Olx0XG42ODg5Olx0XHRtZW1hbGxvY19ub3JlY2xhaW1fcmVzdG9yZShub3JlY2xhaW1fZmxhZyk7XG42ODkwOlx0XHR0cmFjZV9tbV92bXNjYW5fbWVtY2dfcmVjbGFpbV9lbmQobnJfcmVjbGFpbWVkLCBtZW1jZyk7XG42ODkxOlx0XHRzZXRfdGFza19yZWNsYWltX3N0YXRlKGN1cnJlbnQsIE5VTEwpO1xuNjg5MjpcdFxuNjg5MzpcdFx0cmV0dXJuIG5yX3JlY2xhaW1lZDtcbjY4OTQ6XHR9XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMzwvdGQ+CgkJCTx0ZD4yMDI2LzA5LzExIDAzOjE1PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5rbXNhbi1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE4ODE5CgkJCQkJCQlvdXRwdXQ6IDI1NwoJCQkJCQkJdGhvdWdodHM6IDY1MAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipNeSBBbmFseXNpcyBvZiB0aGUgUGF0Y2ggZm9yIEtNU0FOIFJlbGV2YW5jZSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIHdoaWNoIHRha2VzIGEgZmV3IHNjYWxhciBhcmd1bWVudHM6IGBtZW1jZ2AsIGBzaXplYCwgYW5kIGBzd2FwcGluZXNzYC4gSSYjMzk7dmUgY2hlY2tlZCB0aGF0IGl0IHZhbGlkYXRlcyB0aGVzZSBpbnB1dHMsIHNwZWNpZmljYWxseSB0aGUgYHN3YXBwaW5lc3NgIHJhbmdlIGFuZCBhIG1pbmltdW0gYHNpemVgLCBiZWZvcmUgY2FsbGluZyB0aGUgZXhpc3RpbmcgbWVtb3J5IHJlY2xhaW0gZnVuY3Rpb24gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFRoZSBmdW5jdGlvbiByZXR1cm5zIGFuIHVuc2lnbmVkIGxvbmcuCgpDcnVjaWFsbHksIHRoZXJlJiMzOTtzIG5vIG5ldyB1c2VyLXNwYWNlIGNvcHkgaW52b2x2ZWQsIG5vIHN0cnVjdHMgYmVpbmcgc2VudCwgYW5kIG5vIHNpZ25zIG9mIHVuaW5pdGlhbGl6ZWQgYWxsb2NhdGlvbnMuIFRoZSBzZWxmdGVzdHMgYWRkZWQgYXJlIGFsbCB1c2VyLXNwYWNlIHRlc3RzLCB3aGljaCBpcyBmaW5lLgoKTm93LCBsZXQmIzM5O3MgZ28gdGhyb3VnaCB0aGUgS01TQU4gY2hlY2tsaXN0IG1ldGljdWxvdXNseS4KCiogICBEb2VzIHRoaXMgZXhwb3NlIG5ldyBvciBtb2RpZmllZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2UgKHRocm91Z2ggdGhlIHVzdWFsIHN1c3BlY3RzIGxpa2UgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGV0Yy4pIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG1pZ2h0IGJlIGEgcHJvYmxlbT8gTm8sIGFic29sdXRlbHkgbm90LiBUaGUgYXJndW1lbnRzIGFyZSBhbGwgc2NhbGFycywgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMganVzdCBhbiBgdW5zaWduZWQgbG9uZ2AuCiogICBEb2VzIGl0IHVzZSBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCByZWxpZXMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vcGUuIEV2ZXJ5dGhpbmcgaXMgaW5pdGlhbGl6ZWQgd2l0aGluIHRoZSBmdW5jdGlvbi4KKiAgIEFyZSB0aGVyZSBhbnkgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgYmVpbmcgY3JlYXRlZCB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcyBjb3VsZCBiZSByZWFkIGxhdGVyPyBOby4KKiAgIERvZXMgaXQgbWVzcyB3aXRoIGFueSBib3VuZHMgY2hlY2tzIHRoYXQgY291bGQgbGVhZCB0byByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby4KClRoZSBvbmx5IHBvdGVudGlhbCBpc3N1ZXMgaGVyZSBhcmUgdGhlIHVzdWFsIHN1c3BlY3RzIG9mIGtlcm5lbCBwcm9ncmFtbWluZzogZGVhZGxvY2ssIHNsZWVwaW5nIGluIGF0b21pYyBjb250ZXh0LCBpbnZhbGlkIHBvaW50ZXJzLCBvdXQtb2YtYm91bmRzIGFjY2VzcywgZXRjLiBCdXQgdGhvc2UgYXJlIGNvdmVyZWQgYnkgS0FTQU4sIExPQ0tERVAsIGFuZCB0aGUgc3RhbmRhcmQga2VybmVsIGRlYnVnZ2luZyB0b29scywgd2hpY2ggYXJlIG5vdCByZWxldmFudCB0byBLTVNBTi4gVGhpcyBsb29rcyBwcmV0dHkgY2xlYW4gZnJvbSBhIG1lbW9yeS1zYWZldHkgcGVyc3BlY3RpdmUuCgpUbyBiZSBjb21wbGV0ZWx5IHRob3JvdWdoLCBsZXQmIzM5O3Mgc3VtbWFyaXplIHRoZSBwb2ludHM6CgoqICAgVGhlIHBhdGNoIGludHJvZHVjZXMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGEgc2xlZXBhYmxlIEJQRiBrZnVuYywgYWxvbmcgd2l0aCBCUEYgc2VsZnRlc3RzLgoqICAgQWxsIHZhcmlhYmxlcyB1c2VkIChgbnJfcmVjbGFpbWVkYCwgYG5yX3BhZ2VzYCwgYHN3YXBwaW5lc3NgLCBgc2l6ZWApIGFyZSBzY2FsYXIgcHJpbWl0aXZlcy4gVGhleSBhcmUgYWxsIGluaXRpYWxpemVkIGJ5IHZhbHVlLgoqICAgTm8ga2VybmVsLXRvLXVzZXIgbWVtb3J5IGNvcHkgaW50ZXJmYWNlcyBhcmUgYWRkZWQgb3IgbW9kaWZpZWQuCiogICBFeGlzdGluZyByb3V0aW5lcyBhcmUgdXNlZCB3aXRoIHByb3Blcmx5IGluaXRpYWxpemVkIHBhcmFtZXRlcnMuCiogICBBbnkgcG90ZW50aWFsIGZhaWx1cmUgbW9kZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgZGV0ZWN0b3JzLgoqICAgVGhlcmVmb3JlLCBubyBLTVNBTiBpcyBuZWVkZWQsIGFzIHRoZXJlJiMzOTtzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MuIEkmIzM5O20gc2F0aXNmaWVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIwLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOS8xMSAwMzoxNTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCBhZGRzIGEgbmV3IHNsZWVwYWJsZSBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIEJQRiBzZWxmdGVzdHMuIFRoZSBrZnVuYyBhY2NlcHRzIHByaW1pdGl2ZSBzY2FsYXIgYXJndW1lbnRzIChgbWVtY2dgLCBgc2l6ZWAsIGBzd2FwcGluZXNzYCksIHZhbGlkYXRlcyB0aGUgcGFyYW1ldGVycywgYW5kIGRlbGVnYXRlcyB0byB0aGUgZXhpc3Rpbmcga2VybmVsIHJlY2xhaW0gaW5mcmFzdHJ1Y3R1cmUgdmlhIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLiBcblxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzOlxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMgb24gc3RhY2sgb3IgaGVhcCBhcmUgaW50cm9kdWNlZCBvciByZWFkLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIGFyZSBzY2FsYXIgdHlwZXMgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdXNlLlxuMi4gTm8gZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZCB2aWEgaW9jdGxzL3N5c2ZzL25ldGxpbmsvQlBGIGJ1ZmZlcnMuXG4zLiBQb3RlbnRpYWwgY29uY3VycmVuY3ksIGxvY2tpbmcsIG9yIG1lbW9yeS1zYWZldHkgYnVncyAoZS5nLiBzbGVlcGFibGUga2Z1bmMgY29udGV4dCByZXF1aXJlbWVudHMsIGNncm91cCBwb2ludGVyIHZhbGlkaXR5LCBsb2NraW5nIGRlYWRsb2NrcykgYXJlIG1vbml0b3JlZCBieSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZmFjaWxpdGllcyAoS0FTQU4sIExPQ0tERVAsIFBST1ZFX0xPQ0tJTkcpLlxuXG5UaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIGFkZHMgYSBuZXcgc2xlZXBhYmxlIEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgQlBGIHNlbGZ0ZXN0cy4gVGhlIGtmdW5jIGFjY2VwdHMgcHJpbWl0aXZlIHNjYWxhciBhcmd1bWVudHMgKGBtZW1jZ2AsIGBzaXplYCwgYHN3YXBwaW5lc3NgKSwgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzLCBhbmQgZGVsZWdhdGVzIHRvIHRoZSBleGlzdGluZyBrZXJuZWwgcmVjbGFpbSBpbmZyYXN0cnVjdHVyZSB2aWEgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFxuXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBzdGFjayBvciBoZWFwIGFyZSBpbnRyb2R1Y2VkIG9yIHJlYWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXJlIHNjYWxhciB0eXBlcyBpbml0aWFsaXplZCBwcmlvciB0byB1c2UuXG4yLiBObyBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgZmllbGRzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBleHBvc2VkIHZpYSBpb2N0bHMvc3lzZnMvbmV0bGluay9CUEYgYnVmZmVycy5cbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXG5cblRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPC90Ym9keT4KCTwvdGFibGU+CgoJPGRpdiBpZD0ibGxtX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5MTE0gQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBUb2tlbnM8L3RoPgoJCQkJCTx0aD5BdmcgVG9rZW5zPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9ImxsbV9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9InRvb2xfc3VtbWFyeV90YWJsZV9kaXYiIHN0eWxlPSJtYXJnaW46IDIwcHggMDsiPgoJCTx0YWJsZSBjbGFzcz0ibGlzdF90YWJsZSI+CgkJCTxjYXB0aW9uPlRvb2wgQ2FsbHMgU3VtbWFyeTo8L2NhcHRpb24+CgkJCTx0aGVhZD4KCQkJCTx0cj4KCQkJCQk8dGg+VG90YWwgQ2FsbHM8L3RoPgoJCQkJCTx0aD5Ub3RhbCBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJCTx0aD5BdmcgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCTwvdHI+CgkJCTwvdGhlYWQ+CgkJCTx0Ym9keSBpZD0idG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHkiPjwvdGJvZHk+CgkJPC90YWJsZT4KCTwvZGl2PgoKCTxkaXYgaWQ9ImR1cmF0aW9uX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCTxkaXYgaWQ9InRva2VuX2NoYXJ0X2RpdiIgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW46IDIwcHggMDsgYm9yZGVyOiAxcHg7Ij48L2Rpdj4KCgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSJodHRwczovL3d3dy5nb29nbGUuY29tL2pzYXBpIj48L3NjcmlwdD4KCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCQlnb29nbGUubG9hZCgidmlzdWFsaXphdGlvbiIsICIxIiwge3BhY2thZ2VzOlsiY29yZWNoYXJ0Il19KTsKCQlnb29nbGUuc2V0T25Mb2FkQ2FsbGJhY2soZHJhd0NoYXJ0cyk7CgoJCWZ1bmN0aW9uIGRyYXdDaGFydHMoKSB7CgkJCWNvbnN0IHJhd0RhdGEgPSBbeyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNDo0NS43NzQyOTY2NzJaIiwiU2VxIjowLCJOZXN0aW5nIjowLCJUeXBlIjoiZmxvdyIsIk5hbWUiOiJwYXRjaC10cmlhZ2UiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2OTMwMDAzOTczMywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbmV3IHNsZWVwYWJsZSBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIEJQRiBzZWxmdGVzdHMuIFRoZSBrZnVuYyBhY2NlcHRzIHByaW1pdGl2ZSBzY2FsYXIgYXJndW1lbnRzIChgbWVtY2dgLCBgc2l6ZWAsIGBzd2FwcGluZXNzYCksIHZhbGlkYXRlcyB0aGUgcGFyYW1ldGVycywgYW5kIGRlbGVnYXRlcyB0byB0aGUgZXhpc3Rpbmcga2VybmVsIHJlY2xhaW0gaW5mcmFzdHJ1Y3R1cmUgdmlhIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLiBcXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XFxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMgb24gc3RhY2sgb3IgaGVhcCBhcmUgaW50cm9kdWNlZCBvciByZWFkLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIGFyZSBzY2FsYXIgdHlwZXMgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdXNlLlxcbjIuIE5vIGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciBmaWVsZHMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGV4cG9zZWQgdmlhIGlvY3Rscy9zeXNmcy9uZXRsaW5rL0JQRiBidWZmZXJzLlxcbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXFxuXFxuVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTQ6NDUuNzc0MzAxNDYyWiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMzcyOTM2Mzk5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJQYXRjaERpZmZcIjogXCJjb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3N1xcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXFx1MDAzY3RyaWFnZUBzeXprYWxsZXIuY29tXFx1MDAzZVxcbkRhdGU6ICAgRnJpIFNlcCAxMSAwMzoxNDo0NCAyMDI2ICswMDAwXFxuXFxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xcblxcbmRpZmYgLS1naXQgYS9tbS9icGZfbWVtY29udHJvbC5jIGIvbW0vYnBmX21lbWNvbnRyb2wuY1xcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XFxuLS0tIGEvbW0vYnBmX21lbWNvbnRyb2wuY1xcbisrKyBiL21tL2JwZl9tZW1jb250cm9sLmNcXG5AQCAtOCw2ICs4LDggQEBcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L21lbWNvbnRyb2wuaFxcdTAwM2VcXG4gI2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiBcXG4rI2luY2x1ZGUgXFxcImludGVybmFsLmhcXFwiXFxuK1xcbiBfX2JwZl9rZnVuY19zdGFydF9kZWZzKCk7XFxuIFxcbiAvKipcXG5AQCAtMTU5LDYgKzE2MSw3NCBAQCBfX2JwZl9rZnVuYyB2b2lkIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZylcXG4gXFx0bWVtX2Nncm91cF9mbHVzaF9zdGF0cyhtZW1jZyk7XFxuIH1cXG4gXFxuKy8qKlxcbisgKiBicGZfcHJvYWN0aXZlX3JlY2xhaW0gLSBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSBmcm9tIGEgbWVtb3J5XFxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxcbisgKiBAbWVtY2c6IHRoZSB0YXJnZXQgbWVtb3J5IGNncm91cCB0byByZWNsYWltIGZyb21cXG4rICogQHNpemU6ICB0aGUgYW1vdW50IG9mIG1lbW9yeSB0byByZWNsYWltLCBpbiBieXRlcywgY2xhbXBlZCB0b1xcbisgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXFxuKyAqIEBzd2FwcGluZXNzOiB0aGUgcmVjbGFpbSBzd2FwcGluZXNzLCBpbiB0aGUgcmFuZ2VcXG4rICogICAgICAgICBbTUlOX1NXQVBQSU5FU1MsIFNXQVBQSU5FU1NfQU5PTl9PTkxZXSwgd2hlcmVcXG4rICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXFxuKyAqICAgICAgICAgdGhlIG1lbWNnJ3Mgb3duIHN3YXBwaW5lc3NcXG4rICpcXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xcbisgKiBtZW1vcnkucmVjbGFpbSwgYnV0IHdpdGhvdXQgcmV0cnlpbmcgdW50aWwgQHNpemUgaXMgcmVhY2hlZC5cXG4rICpcXG4rICogT25seSB0aGUgcmVjbGFpbSB0YXJnZXQgaXMgY2FwcGVkOiBAc2l6ZSBpcyBjbGFtcGVkIHRvXFxuKyAqIE1FTUNHX0NIQVJHRV9CQVRDSCwgZm9sbG93aW5nIHRoZSBwcmVjZWRlbnQgb2YgaGlnaF93b3JrX2Z1bmMoKSxcXG4rICogdGhlIG1lbW9yeS5oaWdoIHdvcmtxdWV1ZSBmYWxsYmFjaywgd2hpY2ggYm91bmRzIGVhY2ggcmVjbGFpbVxcbisgKiByZXF1ZXN0IHRoZSBzYW1lIHdheS4gVGhlIGFjdHVhbCBzY2FubmluZyB3b3JrIGFuZCBpdHMgZHVyYXRpb25cXG4rICogYXJlIG5vdCBib3VuZGVkLiBUbyByZWNsYWltIG1vcmUsIGNhbGwgdGhpcyBrZnVuYyByZXBlYXRlZGx5XFxuKyAqIGluc3RlYWQgb2YgcGFzc2luZyBhIGxhcmdlciBAc2l6ZS5cXG4rICpcXG4rICogVGhlIGtmdW5jIGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBhIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTFxcbisgKiBwcm9ncmFtLCBzeW5jaHJvbm91c2x5IGluIHRoZSBjb250ZXh0IG9mIHRoZSB0aHJlYWQgcnVubmluZyB0aGVcXG4rICogcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIG9mIGEgU1lTQ0FMTFxcbisgKiBwcm9ncmFtLCB3aGljaCBydW4gaW4gcHJvY2VzcyBjb250ZXh0IGFuZCBrZWVwIHRoZSBTWVNDQUxMIHByb2dyYW1cXG4rICogdHlwZS4gSXQgaXMgcmVnaXN0ZXJlZCBmb3IgQlBGX1BST0dfVFlQRV9TWVNDQUxMIG9ubHksIGJlY2F1c2VcXG4rICogZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgbWF5IHJ1biB3aXRoIGZpbGVzeXN0ZW0gbG9ja3MgaGVsZCBvclxcbisgKiBpbiBOT0ZTL05PSU8gY29udGV4dHMsIHdoZXJlIHRoZSByZWNsYWltIHBhdGggY291bGQgZGVhZGxvY2sgb25cXG4rICogdGhvc2UgbG9ja3MgdmlhIGZpbGVzeXN0ZW0gc2hyaW5rZXJzLlxcbisgKlxcbisgKiBGb3IgYXN5bmNocm9ub3VzIHJlY2xhaW0gb2YgbW9yZSB0aGFuIG9uZSBiYXRjaCwgZHJpdmluZyB0aGVcXG4rICogcmVjbGFpbSBmcm9tIGEgYnBmX3dxIGNhbGxiYWNrIGlzIHJlY29tbWVuZGVkOiBjYWxsIHRoaXMga2Z1bmNcXG4rICogb25jZSBwZXIgY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dFxcbisgKiBiYXRjaCwgaW5zdGVhZCBvZiBsb29waW5nIGluc2lkZSB0aGUgY2FsbGJhY2sgYW5kIG1vbm9wb2xpemluZyBhXFxuKyAqIHdvcmtxdWV1ZSB3b3JrZXIsIGFuZCBnaXZlIGVhY2ggdGFyZ2V0IG1lbWNnIGl0cyBvd24gd29yayBpdGVtLFxcbisgKiBhcyBoaWdoX3dvcmtfZnVuYygpIGRvZXMgd2l0aCBvbmUgd29yayBpdGVtIHBlciBtZW1jZy4gV2hldGhlclxcbisgKiB0byBzdWJtaXQgdGhlIG5leHQgYmF0Y2ggaXMgdXAgdG8gdGhlIEJQRiBwcm9ncmFtLCB3aGljaCBjYW4gc3RvcFxcbisgKiBhdCBhbnkgcG9pbnQsIGUuZy4gb25jZSB0aGUgdGFyZ2V0IGNncm91cCBpcyBkeWluZy5cXG4rICpcXG4rICogUmV0dXJuOiBUaGUgYW1vdW50IG9mIG1lbW9yeSByZWNsYWltZWQsIGluIGJ5dGVzLCBvciAwIGlmIEBzaXplIGlzXFxuKyAqIHNtYWxsZXIgdGhhbiBhIHBhZ2UsIG9yICh1bnNpZ25lZCBsb25nKS0xIGlmIEBzd2FwcGluZXNzIGlzIG91dCBvZlxcbisgKiByYW5nZS5cXG4rICovXFxuK19fYnBmX2tmdW5jIHVuc2lnbmVkIGxvbmcgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBzaXplLFxcbitcXHRcXHRcXHRcXHRcXHRcXHRpbnQgc3dhcHBpbmVzcylcXG4re1xcbitcXHR1bnNpZ25lZCBsb25nIG5yX3JlY2xhaW1lZDtcXG4rXFx0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcXG4rXFxuK1xcdGlmIChzd2FwcGluZXNzIFxcdTAwM2MgLTEgfHwgc3dhcHBpbmVzcyBcXHUwMDNlIFNXQVBQSU5FU1NfQU5PTl9PTkxZKVxcbitcXHRcXHRyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7XFxuK1xcbitcXHRpZiAoc2l6ZSBcXHUwMDNjIFBBR0VfU0laRSlcXG4rXFx0XFx0cmV0dXJuIDA7XFxuK1xcbitcXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xcbitcXG4rXFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBHRlBfS0VSTkVMLFxcbitcXHRcXHRcXHRcXHRcXHRcXHQgICAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCB8XFxuK1xcdFxcdFxcdFxcdFxcdFxcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcXG4rXFx0XFx0XFx0XFx0XFx0XFx0ICAgIHN3YXBwaW5lc3MgPT0gLTEgPyBOVUxMIDpcXG4rXFx0XFx0XFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZzd2FwcGluZXNzKTtcXG4rXFxuK1xcdHJldHVybiBucl9yZWNsYWltZWQgKiBQQUdFX1NJWkU7XFxuK31cXG4rXFxuIF9fYnBmX2tmdW5jX2VuZF9kZWZzKCk7XFxuIFxcbiBCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX2tmdW5jcylcXG5AQCAtMTc0LDE5ICsyNDQsMzUgQEAgQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxuIFxcbiBCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9rZnVuY3MpXFxuIFxcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxcbitCVEZfSURfRkxBR1MoZnVuYywgYnBmX3Byb2FjdGl2ZV9yZWNsYWltLCBLRl9TTEVFUEFCTEUpXFxuK0JURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxcbitcXG4gc3RhdGljIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0IGJwZl9tZW1jb250cm9sX2tmdW5jX3NldCA9IHtcXG4gXFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXFxuIFxcdC5zZXQgICAgICAgICAgICA9IFxcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXFxuIH07XFxuIFxcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XFxuK1xcdC5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLFxcbitcXHQuc2V0ICAgICAgICAgICAgPSBcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXFxuK307XFxuK1xcbiBzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXFxuIHtcXG4gXFx0aW50IGVycjtcXG4gXFxuIFxcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9VTlNQRUMsXFxuIFxcdFxcdFxcdFxcdFxcdFxcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xcbi1cXHRpZiAoZXJyKVxcbitcXHRpZiAoZXJyKSB7XFxuIFxcdFxcdHByX3dhcm4oXFxcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcXFwiLCBlcnIpO1xcbitcXHRcXHRyZXR1cm4gZXJyO1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcXG4rXFx0XFx0XFx0XFx0XFx0XFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNfc2V0KTtcXG4rXFx0aWYgKGVycilcXG4rXFx0XFx0cHJfd2FybihcXFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFxcXCIsIGVycik7XFxuIFxcbiBcXHRyZXR1cm4gZXJyO1xcbiB9XFxuZGlmZiAtLWdpdCBhL21tL2ludGVybmFsLmggYi9tbS9pbnRlcm5hbC5oXFxuaW5kZXggMzhiMTE2NTIxMmM5NC4uNDRlOTVlODdlM2NkOSAxMDA2NDRcXG4tLS0gYS9tbS9pbnRlcm5hbC5oXFxuKysrIGIvbW0vaW50ZXJuYWwuaFxcbkBAIC03NCwxMSArNzQsMTMgQEAgdW5zaWduZWQgbG9uZyBscnV2ZWNfbHJ1X3NpemUoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBlbnVtIGxydV9saXN0IGxydSxcXG4gXFxuICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCAoMSBcXHUwMDNjXFx1MDAzYyAxKVxcbiAjZGVmaW5lIE1FTUNHX1JFQ0xBSU1fUFJPQUNUSVZFICgxIFxcdTAwM2NcXHUwMDNjIDIpXFxuLSNkZWZpbmUgTUlOX1NXQVBQSU5FU1MgMFxcbi0jZGVmaW5lIE1BWF9TV0FQUElORVNTIDIwMFxcbitlbnVtIHtcXG4rXFx0TUlOX1NXQVBQSU5FU1MgPSAwLFxcbitcXHRNQVhfU1dBUFBJTkVTUyA9IDIwMCxcXG4gXFxuLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xcbi0jZGVmaW5lIFNXQVBQSU5FU1NfQU5PTl9PTkxZIChNQVhfU1dBUFBJTkVTUyArIDEpXFxuK1xcdC8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xcbitcXHRTV0FQUElORVNTX0FOT05fT05MWSA9IE1BWF9TV0FQUElORVNTICsgMSxcXG4rfTtcXG4gXFxuIHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuIFxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uN2M3ZDI5OWIzYjI4YVxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ190ZXN0cy9tZW1jZ19hc3luY19yZWNsYWltLmNcXG5AQCAtMCwwICsxLDc3OSBAQFxcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxcbisvKlxcbisgKiBNZW1vcnkgY29udHJvbGxlciBlQlBGIGFzeW5jIHJlY2xhaW0gdGVzdFxcbisgKlxcbisgKiBTZXR0aW5nIFRFU1RfTUVNQ0dfQVNZTkNfUkVDTEFJTV9CRU5DSD0xIGFkZHMgYSBiYXNlbGluZSBydW4gb2YgdGhlXFxuKyAqIHdvcmtsb2FkIHdpdGhvdXQgdGhlIEJQRiBwcm9ncmFtIHRvIG1lbWNnX2FzeW5jX3JlY2xhaW0sIGFuZCBwcmludHNcXG4rICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxcbisgKiBjZ3JvdXAsIHRvIHN0ZG91dC5cXG4rICovXFxuK1xcbisjaW5jbHVkZSBcXHUwMDNjdGVzdF9wcm9ncy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3lzL21tYW4uaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3N5cy9zdGF0LmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvdmZzLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzeXMvd2FpdC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjZmNudGwuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY3NpZ25hbC5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdGltZS5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjdW5pc3RkLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdGRpby5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjc3RkbGliLmhcXHUwMDNlXFxuKyNpbmNsdWRlIFxcdTAwM2NzdHJpbmcuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2xpbWl0cy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjbGludXgvbWFnaWMuaFxcdTAwM2VcXG4rXFxuKyNpbmNsdWRlIFxcXCJjZ3JvdXBfaGVscGVycy5oXFxcIlxcbitcXG4rc3RydWN0IGJwZl9hcmdzIHtcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkO1xcbitcXHR1NjQgbG93X2Nncm91cF9pZDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rLyogUmVjbGFpbSBvdXRjb21lcyByZXBvcnRlZCBieSB0aGUgQlBGIHByb2dyYW0gdGhyb3VnaCB0aGUgcmluZ2J1Zi4gKi9cXG4rZW51bSByZWNsYWltX291dGNvbWUge1xcbitcXHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxcbitcXHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcXG4rXFx0UkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FLFxcbit9O1xcbitcXG4rc3RydWN0IHJlY2xhaW1fZXZlbnQge1xcbitcXHR1NjQgb3V0Y29tZTtcXG4rfTtcXG4rXFxuKyNpbmNsdWRlIFxcXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFxcXCJcXG4rXFxuKyNkZWZpbmUgRklMRV9TSVpFICgzMiAqIDEwMjQgKiAxMDI0dWwpXFxuKyNkZWZpbmUgQlVGRkVSX1NJWkUgKDQwOTYpXFxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcXG4rI2RlZmluZSBSRUFEX1RJTUVTIDUwXFxuK1xcbisjZGVmaW5lIENHX0RJUiBcXFwiL21lbWNnX2FzeW5jX3JlY2xhaW1cXFwiXFxuKyNkZWZpbmUgQ0dfSElHSF9ESVIgQ0dfRElSIFxcXCIvaGlnaFxcXCJcXG4rI2RlZmluZSBDR19MT1dfRElSIENHX0RJUiBcXFwiL2xvd1xcXCJcXG4rXFxuKyNkZWZpbmUgQ0dfRFlJTkdfRElSIFxcXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1xcXCJcXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXFxcIi90cmlnZ2VyXFxcIlxcbisjZGVmaW5lIENHX0RZSU5HX1RBUkdFVF9ESVIgQ0dfRFlJTkdfRElSIFxcXCIvdGFyZ2V0XFxcIlxcbitcXG4rI2RlZmluZSBDSEVDS19QRVJJT0RfTlMgKDIgKiAxMDAwICogMTAwMHVsbClcXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxcbitcXG4rLypcXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxcbisgKiBpbi1mbGlnaHQgcmVjbGFpbSBwYXNzZXMgdGltZSB0byBkcmFpbiwgdGhlbiB3YWl0IGZvciBhIHJlY2xhaW0gcm91bmRcXG4rICogdG8gaGl0IHRoZSByZW1vdmVkIHRhcmdldC4gVGhlIGtlZXBhbGl2ZSByZWFkZXIga2VlcHMgdGhlIHRyaWdnZXJcXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xcbisgKiBzdWNoIGEgcm91bmQgbXVzdCBzaG93IHVwIHdpdGhpbiBhIGZldyB0aW1lciBwZXJpb2RzLiBUaGUgQlBGXFxuKyAqIHByb2dyYW0gcmVwb3J0cyBldmVyeSByZWNsYWltIG91dGNvbWUgdGhyb3VnaCB0aGUgcmluZ2J1Ziwgc28gdGhlXFxuKyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC5cXG4rICovXFxuKyNkZWZpbmUgRFlJTkdfU0VUVExFX1VTICgyMDAgKiAxMDAwKVxcbisjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKVxcbisjZGVmaW5lIEVWRU5UX1BPTExfUk9VTkRTICg1MClcXG4rXFxuKy8qXFxuKyAqIFRoZSB3b3JrbG9hZCBmaWxlcyBtdXN0IHNpdCBvbiBhIHJlZ3VsYXIgZmlsZXN5c3RlbTogd2l0aCBzd2FwXFxuKyAqIGRpc2FibGVkIGZvciB0aGUgY2dyb3VwLCB0bXBmcy9yYW1mcyBwYWdlcyBhcmUgdW5ldmljdGFibGUgYW5kIHdvdWxkXFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcXG4rICogYXMgYW5vbnltb3VzIG1lbW9yeSwgc28gdGhleSBuZXZlciByYWlzZSB0aGUgV09SS0lOR1NFVF9SRUZBVUxUX0ZJTEVcXG4rICogZXZlbnRzIHRoZSBCUEYgcHJvZ3JhbSBtb25pdG9ycy4gRmFsbCBiYWNrIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxcbisgKi9cXG4rc3RhdGljIGNvbnN0IGNoYXIgKndvcmtsb2FkX2ZpbGVzX2Rpcih2b2lkKVxcbit7XFxuK1xcdHN0cnVjdCBzdGF0ZnMgc3Q7XFxuK1xcbitcXHRpZiAoIXN0YXRmcyhcXFwiL3RtcFxcXCIsIFxcdTAwMjZzdCkgXFx1MDAyNlxcdTAwMjZcXG4rXFx0ICAgIChzdC5mX3R5cGUgPT0gVE1QRlNfTUFHSUMgfHwgc3QuZl90eXBlID09IFJBTUZTX01BR0lDKSlcXG4rXFx0XFx0cmV0dXJuIFxcXCIuXFxcIjtcXG4rXFx0cmV0dXJuIFxcXCIvdG1wXFxcIjtcXG4rfVxcbitcXG4rLypcXG4rICogVGhlIHdvcmtsb2FkIGNoaWxkcmVuIHJ1biBhZnRlciB0ZXN0X3Byb2dzIGhpamFja2VkIHN0ZGlvLCBzb1xcbisgKiBhbnl0aGluZyB0aGV5IHByaW50IGlzIGxvc3Qgd2l0aCB0aGVpciBwcml2YXRlIGNvcHkgb2YgdGhlIGhpamFja2VkXFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXFxuKyAqIHRoZSBwYXJlbnQsIHNvIGVhY2ggZmFpbGluZyBzdGVwIGdldHMgaXRzIG93biBjb2RlLlxcbisgKi9cXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xcbitcXHRDSElMRF9FWElUX09LID0gMCxcXG4rXFx0Q0hJTERfRVhJVF9KT0lOX0NHUk9VUCxcXG4rXFx0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxcbitcXHRDSElMRF9FWElUX1JFQURfRklMRSxcXG4rXFx0Q0hJTERfRVhJVF9USU1FX0ZJTEUsXFxuK307XFxuK1xcbitzdGF0aWMgY29uc3QgY2hhciAqY2hpbGRfZXhpdF9zdHIoaW50IGNvZGUpXFxuK3tcXG4rXFx0c3dpdGNoIChjb2RlKSB7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9PSzpcXG4rXFx0XFx0cmV0dXJuIFxcXCJzdWNjZXNzXFxcIjtcXG4rXFx0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxcbitcXHRcXHRyZXR1cm4gXFxcImpvaW4gY2dyb3VwXFxcIjtcXG4rXFx0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwid3JpdGUgZGF0YSBmaWxlXFxcIjtcXG4rXFx0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcXG4rXFx0XFx0cmV0dXJuIFxcXCJyZWFkIGRhdGEgZmlsZVxcXCI7XFxuK1xcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XFxuK1xcdFxcdHJldHVybiBcXFwid3JpdGUgdGltZSBmaWxlXFxcIjtcXG4rXFx0ZGVmYXVsdDpcXG4rXFx0XFx0cmV0dXJuIFxcXCJ1bmtub3duXFxcIjtcXG4rXFx0fVxcbit9XFxuK1xcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxcbit7XFxuK1xcdGludCByZXQ7XFxuK1xcdGNoYXIgbGltaXRfYnVmWzIwXTtcXG4rXFxuK1xcdHJldCA9IHNldHVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0RJUikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UocmV0KTtcXG4rXFxuK1xcdHJldCA9IGVuYWJsZV9jb250cm9sbGVycyhDR19ESVIsIFxcXCJtZW1vcnlcXFwiKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwiZW5hYmxlX2NvbnRyb2xsZXJzXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHNucHJpbnRmKGxpbWl0X2J1Ziwgc2l6ZW9mKGxpbWl0X2J1ZiksIFxcXCIlbHVcXFwiLCBDR19MSU1JVCk7XFxuK1xcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXFxcIm1lbW9yeS5tYXhcXFwiLCBsaW1pdF9idWYpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJ3cml0ZV9jZ3JvdXBfZmlsZSBtZW1vcnkubWF4XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEtlZXAgdGhlIHdvcmtsb2FkcyBmcm9tIHN3YXBwaW5nIG91dC4gV2l0aCBDT05GSUdfU1dBUD1uIHRoZVxcbitcXHQgKiBtZW1vcnkuc3dhcC5tYXggZmlsZSBkb2VzIG5vdCBleGlzdCwgYW5kIG5vIHN3YXAgY2FuIGhhcHBlblxcbitcXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxcbitcXHQgKi9cXG4rXFx0aWYgKCFhY2Nlc3MoXFxcIi9wcm9jL3N3YXBzXFxcIiwgRl9PSykpIHtcXG4rXFx0XFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRElSLCBcXFwibWVtb3J5LnN3YXAubWF4XFxcIiwgXFxcIjBcXFwiKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0socmV0LCBcXFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0hJR0hfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfSElHSF9ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHQqaGlnaF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0hJR0hfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcXFwiZ2V0X2Nncm91cF9pZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfTE9XX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0xPV19ESVIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKHJldCk7XFxuK1xcbitcXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCpsb3dfY2dyb3VwX2lkLCAwLCBcXFwiZ2V0X2Nncm91cF9pZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXR1cm4gMDtcXG4rXFxuK2NsZWFudXA6XFxuK1xcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rLypcXG4rICogVGhlIGR5aW5nIHRlc3QgbmVlZHMgYW4gZW1wdHkgcmVjbGFpbSB0YXJnZXQgcGx1cyBhIGNncm91cCB0aGF0IGtlZXBzXFxuKyAqIHJlZmF1bHRpbmcgd2hpbGUgdGhlIHRhcmdldCBpcyByZW1vdmVkLCBzbyByZWNsYWltIHJvdW5kcyBrZWVwXFxuKyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxcbisgKiBjZ3JvdXBzOiB0aGUgdGFyZ2V0IG11c3QgaG9sZCBubyBwcm9jZXNzZXMgdG8gYmUgcmVtb3ZlZCwgYW5kIHYyJ3NcXG4rICogbm8taW50ZXJuYWwtcHJvY2VzcyBjb25zdHJhaW50IGtlZXBzIHRoZSByZWZhdWx0aW5nIHdvcmtsb2FkIG91dCBvZlxcbisgKiBhbnkgcGFyZW50IHRoYXQgaGFzIGRvbWFpbiBjaGlsZHJlbi5cXG4rICovXFxuK3N0YXRpYyBpbnQgc2V0dXBfZHlpbmdfY2dyb3Vwcyh1NjQgKnRyaWdnZXJfY2dyb3VwX2lkLCB1NjQgKnRhcmdldF9jZ3JvdXBfaWQpXFxuK3tcXG4rXFx0aW50IHJldDtcXG4rXFx0Y2hhciBsaW1pdF9idWZbMjBdO1xcbitcXG4rXFx0cmV0ID0gc2V0dXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcInNldHVwX2Nncm91cF9lbnZpcm9ubWVudFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfRElSKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcXFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFxcXCIgQ0dfRFlJTkdfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXFxcIm1lbW9yeVxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFxcXCJlbmFibGVfY29udHJvbGxlcnNcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0c25wcmludGYobGltaXRfYnVmLCBzaXplb2YobGltaXRfYnVmKSwgXFxcIiVsdVxcXCIsIENHX0xJTUlUKTtcXG4rXFx0cmV0ID0gd3JpdGVfY2dyb3VwX2ZpbGUoQ0dfRFlJTkdfRElSLCBcXFwibWVtb3J5Lm1heFxcXCIsIGxpbWl0X2J1Zik7XFxuK1xcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0LyogU2VlIHRoZSBtYXRjaGluZyB3cml0ZSBpbiBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKCkuICovXFxuK1xcdGlmICghYWNjZXNzKFxcXCIvcHJvYy9zd2Fwc1xcXCIsIEZfT0spKSB7XFxuK1xcdFxcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RZSU5HX0RJUiwgXFxcIm1lbW9yeS5zd2FwLm1heFxcXCIsIFxcXCIwXFxcIik7XFxuK1xcdFxcdGlmICghQVNTRVJUX09LKHJldCwgXFxcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXFxcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcXFwiIENHX0RZSU5HX1RSSUdHRVJfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KnRyaWdnZXJfY2dyb3VwX2lkID0gZ2V0X2Nncm91cF9pZChDR19EWUlOR19UUklHR0VSX0RJUik7XFxuK1xcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0ID0gY3JlYXRlX2FuZF9nZXRfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFxcXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXFxcIiBDR19EWUlOR19UQVJHRVRfRElSKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShyZXQpO1xcbitcXG4rXFx0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXHRpZiAoIUFTU0VSVF9HVCgqdGFyZ2V0X2Nncm91cF9pZCwgMCwgXFxcImdldF9jZ3JvdXBfaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xcbitcXHRyZXR1cm4gLTE7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdHNpemVfdCB3cml0dGVuID0gMDtcXG4rXFx0Y2hhciAqYnVmZmVyO1xcbitcXHRGSUxFICpmcDtcXG4rXFxuK1xcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFxcXCJ3YlxcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XFxuK1xcdGlmICghYnVmZmVyKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZnA7XFxuK1xcbitcXHRtZW1zZXQoYnVmZmVyLCAnQScsIEJVRkZFUl9TSVpFKTtcXG4rXFxuK1xcdHdoaWxlICh3cml0dGVuIFxcdTAwM2MgRklMRV9TSVpFKSB7XFxuK1xcdFxcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXFx1MDAzYyBCVUZGRVJfU0laRSA/XFxuK1xcdFxcdFxcdFxcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xcbitcXG4rXFx0XFx0aWYgKGZ3cml0ZShidWZmZXIsIDEsIHRvX3dyaXRlLCBmcCkgIT0gdG9fd3JpdGUpXFxuK1xcdFxcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0XFx0d3JpdHRlbiArPSB0b193cml0ZTtcXG4rXFx0fVxcbitcXG4rXFx0cmV0ID0gMDtcXG4rY2xlYW51cDpcXG4rXFx0ZnJlZShidWZmZXIpO1xcbitjbGVhbnVwX2ZwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhZF9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgaXRlcmF0aW9ucylcXG4re1xcbitcXHRpbnQgcmV0ID0gLTE7XFxuK1xcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xcbitcXHRjaGFyICptYXA7XFxuK1xcdHNpemVfdCBpO1xcbitcXHRpbnQgZmQ7XFxuK1xcdHN0cnVjdCBzdGF0IHNiO1xcbitcXG4rXFx0ZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7XFxuK1xcdGlmIChmZCA9PSAtMSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRpZiAoZnN0YXQoZmQsIFxcdTAwMjZzYikgPT0gLTEpXFxuK1xcdFxcdGdvdG8gY2xlYW51cF9mZDtcXG4rXFxuK1xcdGlmIChzYi5zdF9zaXplICE9IEZJTEVfU0laRSkge1xcbitcXHRcXHRmcHJpbnRmKHN0ZGVyciwgXFxcIkZpbGUgc2l6ZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1XFxcXG5cXFwiLFxcbitcXHRcXHRcXHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcdH1cXG4rXFxuK1xcdG1hcCA9IG1tYXAoTlVMTCwgRklMRV9TSVpFLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7XFxuK1xcdGlmIChtYXAgPT0gTUFQX0ZBSUxFRClcXG4rXFx0XFx0Z290byBjbGVhbnVwX2ZkO1xcbitcXG4rXFx0Zm9yIChpbnQgaXRlciA9IDA7IGl0ZXIgXFx1MDAzYyBpdGVyYXRpb25zOyBpdGVyKyspIHtcXG4rXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcXG4rXFx0XFx0XFx0LyogYWNjZXNzIGEgYnl0ZSB0byB0cmlnZ2VyIHBhZ2UgZmF1bHQgKi9cXG4rXFx0XFx0XFx0dm9sYXRpbGUgY2hhciB2ID0gbWFwW2ldO1xcbitcXHRcXHRcXHQodm9pZCl2O1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChtdW5tYXAobWFwLCBGSUxFX1NJWkUpID09IC0xKVxcbitcXHRcXHRnb3RvIGNsZWFudXBfZmQ7XFxuK1xcbitcXHRyZXQgPSAwO1xcbitcXG4rY2xlYW51cF9mZDpcXG4rXFx0Y2xvc2UoZmQpO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXFxuK1xcdFxcdFxcdFxcdGNoYXIgKnRpbWVfZmlsZW5hbWUsIGludCByZWFkX3RpbWVzKVxcbit7XFxuK1xcdHN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kO1xcbitcXHRkb3VibGUgZWxhcHNlZDtcXG4rXFx0RklMRSAqZnA7XFxuK1xcbitcXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XFxuK1xcbitcXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXFx1MDAyNnN0YXJ0KTtcXG4rXFxuK1xcdGlmICh3cml0ZV9maWxlKGRhdGFfZmlsZW5hbWUpKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9XUklURV9GSUxFO1xcbitcXG4rXFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGVuYW1lLCByZWFkX3RpbWVzKSlcXG4rXFx0XFx0cmV0dXJuIENISUxEX0VYSVRfUkVBRF9GSUxFO1xcbitcXG4rXFx0Y2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsIFxcdTAwMjZlbmQpO1xcbitcXG4rXFx0aWYgKCF0aW1lX2ZpbGVuYW1lKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rXFxuK1xcdGVsYXBzZWQgPSAoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykgK1xcbitcXHRcXHQgIChlbmQudHZfbnNlYyAtIHN0YXJ0LnR2X25zZWMpIC8gMTAwMDAwMDAwMC4wO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwid1xcXCIpO1xcbitcXHRpZiAoIWZwKVxcbitcXHRcXHRyZXR1cm4gQ0hJTERfRVhJVF9USU1FX0ZJTEU7XFxuK1xcdGZwcmludGYoZnAsIFxcXCIlLjZmXFxcIiwgZWxhcHNlZCk7XFxuK1xcdGZjbG9zZShmcCk7XFxuK1xcbitcXHRyZXR1cm4gQ0hJTERfRVhJVF9PSztcXG4rfVxcbitcXG4rc3RhdGljIGludCBnZXRfdGltZShjaGFyICp0aW1lX2ZpbGVuYW1lLCBkb3VibGUgKnRpbWUpXFxuK3tcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXHRGSUxFICpmcDtcXG4rXFx0Y2hhciBidWZbNjRdO1xcbitcXG4rXFx0ZnAgPSBmb3Blbih0aW1lX2ZpbGVuYW1lLCBcXFwiclxcXCIpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIoZnAsIFxcXCJmb3BlblxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFxcXCJmZ2V0c1xcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcbitcXHRpZiAoc3NjYW5mKGJ1ZiwgXFxcIiVsZlxcXCIsIHRpbWUpICE9IDEpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwic3NjYW5mICVzXFxcIiwgYnVmKTtcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHR9XFxuK1xcbitcXHRyZXQgPSAwO1xcbitjbGVhbnVwOlxcbitcXHRmY2xvc2UoZnApO1xcbitvdXQ6XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcXG4re1xcbitcXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBsb3dfZGF0YV9maWxlW1BBVEhfTUFYXTtcXG4rXFx0Y2hhciBoaWdoX3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XFxuK1xcdGNvbnN0IGNoYXIgKmRpciA9IHdvcmtsb2FkX2ZpbGVzX2RpcigpO1xcbitcXHRwaWRfdCBoaWdoX3BpZCA9IC0xLCBsb3dfcGlkID0gLTE7XFxuK1xcdHBpZF90IHdhaXRfcmV0O1xcbitcXHRpbnQgZmQsIHN0YXR1cztcXG4rXFx0aW50IHJldCA9IC0xO1xcbitcXG4rXFx0c25wcmludGYoaGlnaF9kYXRhX2ZpbGUsIHNpemVvZihoaWdoX2RhdGFfZmlsZSksXFxuK1xcdFxcdCBcXFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcdHNucHJpbnRmKGxvd19kYXRhX2ZpbGUsIHNpemVvZihsb3dfZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcXFwiLCBkaXIpO1xcbitcXHRzbnByaW50ZihoaWdoX3RpbWVfZmlsZSwgc2l6ZW9mKGhpZ2hfdGltZV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXFxcIiwgZGlyKTtcXG4rXFx0c25wcmludGYobG93X3RpbWVfZmlsZSwgc2l6ZW9mKGxvd190aW1lX2ZpbGUpLFxcbitcXHRcXHQgXFxcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFxcXCIsIGRpcik7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAoaGlnaF9kYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRjbG9zZShmZCk7XFxuK1xcbitcXHRmZCA9IG1rc3RlbXAobG93X2RhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcXFwibWtzdGVtcFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdGZkID0gbWtzdGVtcChsb3dfdGltZV9maWxlKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoZmQsIDAsIFxcXCJta3N0ZW1wXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0Y2xvc2UoZmQpO1xcbitcXG4rXFx0bG93X3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXFxcImZvcmsgbG93XFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKGxvd19waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcXG4rXFx0XFx0XFx0XFx0XFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHRoaWdoX3BpZCA9IGZvcmsoKTtcXG4rXFx0aWYgKCFBU1NFUlRfR0UoaGlnaF9waWQsIDAsIFxcXCJmb3JrIGhpZ2hcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHRpZiAoaGlnaF9waWQgPT0gMClcXG4rXFx0XFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfSElHSF9ESVIsIGhpZ2hfZGF0YV9maWxlLFxcbitcXHRcXHRcXHRcXHRcXHQgIGhpZ2hfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XFxuK1xcbitcXHR3YWl0X3JldCA9IHdhaXRwaWQobG93X3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwibG93IHdhaXRwaWRcXFwiKSlcXG4rXFx0XFx0Z290byBjbGVhbnVwO1xcbitcXHQvKlxcbitcXHQgKiBUaGUgY2hpbGQgaGFzIGJlZW4gcmVhcGVkIGFuZCBpdHMgUElEIGNhbiBhbHJlYWR5IGJlIHJldXNlZCxcXG4rXFx0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXFxuK1xcdCAqL1xcbitcXHRsb3dfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJsb3cgZXhpdGVkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xcbitcXHRcXHRQUklOVF9GQUlMKFxcXCJsb3cgY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXFxcIixcXG4rXFx0XFx0XFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXFxuK1xcdFxcdFxcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdH1cXG4rXFxuK1xcdHdhaXRfcmV0ID0gd2FpdHBpZChoaWdoX3BpZCwgXFx1MDAyNnN0YXR1cywgMCk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHdhaXRfcmV0LCAwLCBcXFwiaGlnaCB3YWl0cGlkXFxcIikpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0LyogU2FtZSBhcyBhYm92ZTogdGhlIHJlYXBlZCBQSUQgbXVzdCBub3QgYmUgc2lnbmFsZWQgYWdhaW4uICovXFxuK1xcdGhpZ2hfcGlkID0gLTE7XFxuK1xcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFxcXCJoaWdoIGV4aXRlZFxcXCIpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwiaGlnaCBjaGlsZCBmYWlsZWQgYXQ6ICVzIChleGl0IHN0YXR1cyAlZClcXFwiLFxcbitcXHRcXHRcXHQgICBjaGlsZF9leGl0X3N0cihXRVhJVFNUQVRVUyhzdGF0dXMpKSxcXG4rXFx0XFx0XFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGdldF90aW1lKGhpZ2hfdGltZV9maWxlLCBoaWdoX2VsYXBzZWQpKVxcbitcXHRcXHRnb3RvIGNsZWFudXA7XFxuK1xcdGlmIChnZXRfdGltZShsb3dfdGltZV9maWxlLCBsb3dfZWxhcHNlZCkpXFxuK1xcdFxcdGdvdG8gY2xlYW51cDtcXG4rXFxuK1xcdHJldCA9IDA7XFxuK1xcbitjbGVhbnVwOlxcbitcXHQvKiBPbiBmYWlsdXJlLCBtYWtlIHN1cmUgbm8gY2hpbGQgcHJvY2VzcyBpcyBsZWZ0IGJlaGluZCAqL1xcbitcXHRpZiAocmV0KSB7XFxuK1xcdFxcdGlmIChoaWdoX3BpZCBcXHUwMDNlIDApIHtcXG4rXFx0XFx0XFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdFxcdCh2b2lkKXdhaXRwaWQoaGlnaF9waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdFxcdGlmIChsb3dfcGlkIFxcdTAwM2UgMCkge1xcbitcXHRcXHRcXHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xcbitcXHRcXHRcXHQodm9pZCl3YWl0cGlkKGxvd19waWQsIE5VTEwsIDApO1xcbitcXHRcXHR9XFxuK1xcdH1cXG4rXFx0dW5saW5rKGxvd190aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsoaGlnaF90aW1lX2ZpbGUpO1xcbitcXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XFxuK1xcdHVubGluayhoaWdoX2RhdGFfZmlsZSk7XFxuK1xcdHJldHVybiByZXQ7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnRcXG4rc2V0dXBfYnBmKHU2NCBoaWdoX2Nncm91cF9pZCwgdTY0IGxvd19jZ3JvdXBfaWQsXFxuK1xcdCAgc3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKipza2VsX3B0cilcXG4re1xcbitcXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbDtcXG4rXFx0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XFxuK1xcdFxcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxcbitcXHRcXHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXFxuK1xcdFxcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXFxuK1xcdFxcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcXG4rXFx0fTtcXG4rXFx0TElCQlBGX09QVFMoYnBmX3Rlc3RfcnVuX29wdHMsIHJ1bl9vcHRzLFxcbitcXHRcXHQuY3R4X2luID0gXFx1MDAyNmFyZ3MsXFxuK1xcdFxcdC5jdHhfc2l6ZV9pbiA9IHNpemVvZihhcmdzKSk7XFxuK1xcdGludCBwcm9nX2luaXRfZmQsIGVycjtcXG4rXFxuK1xcdHNrZWwgPSBtZW1jZ19hc3luY19yZWNsYWltX19vcGVuX2FuZF9sb2FkKCk7XFxuK1xcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcXFwibWVtY2dfYXN5bmNfcmVjbGFpbV9fb3Blbl9hbmRfbG9hZFxcXCIpKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRwcm9nX2luaXRfZmQgPSBicGZfcHJvZ3JhbV9fZmQoc2tlbC1cXHUwMDNlcHJvZ3Mud3FfcHJvZ19pbml0KTtcXG4rXFxuK1xcdGVyciA9IGJwZl9wcm9nX3Rlc3RfcnVuX29wdHMocHJvZ19pbml0X2ZkLCBcXHUwMDI2cnVuX29wdHMpO1xcbitcXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFxcXCJicGZfcHJvZ190ZXN0X3J1bl9vcHRzXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShydW5fb3B0cy5yZXR2YWwsIDAsIFxcXCJwcm9nX2luaXQgcmV0dmFsXFxcIikpXFxuK1xcdFxcdGdvdG8gZXJyb3Jfb3V0O1xcbitcXG4rXFx0KnNrZWxfcHRyID0gc2tlbDtcXG4rXFx0cmV0dXJuIDA7XFxuK1xcbitlcnJvcl9vdXQ6XFxuK1xcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XFxuK1xcdHJldHVybiAtMTtcXG4rfVxcbitcXG4rLypcXG4rICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxcbisgKiB0ZXN0IGZhaWxzLCBzbyBiZW5jaG1hcmsgbnVtYmVycyBnbyBzdHJhaWdodCB0byB0aGUgcmVhbCBzdGRvdXQgdG9cXG4rICoga2VlcCB0aGVtIGZyb20gZHJvd25pbmcgaW4gQVNTRVJUIG91dHB1dC5cXG4rICovXFxuK3N0YXRpYyB2b2lkIGJlbmNoX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLilcXG4re1xcbitcXHR2YV9saXN0IGFwO1xcbitcXG4rXFx0dmFfc3RhcnQoYXAsIGZtdCk7XFxuK1xcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcXG4rXFx0dmFfZW5kKGFwKTtcXG4rfVxcbitcXG4rdm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW0odm9pZClcXG4re1xcbitcXHR1NjQgaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQ7XFxuK1xcdGRvdWJsZSBoaWdoX3RpbWUgPSAwLjAsIGxvd190aW1lID0gMC4wO1xcbitcXHRkb3VibGUgYmFzZV9oaWdoX3RpbWUgPSAwLjAsIGJhc2VfbG93X3RpbWUgPSAwLjA7XFxuK1xcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsID0gTlVMTDtcXG4rXFx0aW50IGVyciwgYmVuY2g7XFxuK1xcbitcXHRiZW5jaCA9ICEhZ2V0ZW52KFxcXCJURVNUX01FTUNHX0FTWU5DX1JFQ0xBSU1fQkVOQ0hcXFwiKTtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2hpZ2hfbG93X2Nncm91cHMoXFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcXHUwMDI2bG93X2Nncm91cF9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2hpZ2hfbG93X2Nncm91cHMgcmVjbGFpbVxcXCIpKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHQvKlxcbitcXHQgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlXFxuK1xcdCAqIHNhbWUgd29ya2xvYWQgb25jZSB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSwgc28gdGhlIGxvZyBjYW5cXG4rXFx0ICogcmVwb3J0IGhvdyBtdWNoIGFzeW5jIHJlY2xhaW0gaW1wcm92ZWQgdGhlIHByZXNzdXJlZCBjZ3JvdXAuXFxuK1xcdCAqL1xcbitcXHRpZiAoYmVuY2gpIHtcXG4rXFx0XFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZiYXNlX2hpZ2hfdGltZSwgXFx1MDAyNmJhc2VfbG93X3RpbWUsXFxuK1xcdFxcdFxcdFxcdFxcdCAgICBSRUFEX1RJTUVTKTtcXG4rXFx0XFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcbitcXHRlcnIgPSBzZXR1cF9icGYoaGlnaF9jZ3JvdXBfaWQsIGxvd19jZ3JvdXBfaWQsIFxcdTAwMjZza2VsKTtcXG4rXFx0aWYgKCFBU1NFUlRfT0soZXJyLCBcXFwic2V0dXBfYnBmXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFxcdTAwMjZoaWdoX3RpbWUsIFxcdTAwMjZsb3dfdGltZSwgUkVBRF9USU1FUyk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGJlbG93IGFsb25lIGNhbm5vdCBkaXN0aW5ndWlzaCBhIHdvcmtpbmdcXG4rXFx0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXFxuK1xcdCAqIGFjdHVhbGx5IHJlY2xhaW1lZCBtZW1vcnkgZnJvbSB0aGUgbG93IGNncm91cC5cXG4rXFx0ICovXFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbV9jYWxscywgMCwgXFxcInJlY2xhaW1fY2FsbHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGlmICghQVNTRVJUX0dUKHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX2J5dGVzLCAwLCBcXFwicmVjbGFpbWVkX2J5dGVzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0LypcXG4rXFx0ICogVGhlIHRpbWluZyBjb21wYXJpc29uIGlzIGEgYmVuY2htYXJrIGFuZCB0b28gZmxha3kgdG8gZmFpbCBDSVxcbitcXHQgKiBydW5zLCBzbyBpdCBvbmx5IGxvZ3MgdGhlIG51bWJlcnM7IHRoZSBjb3VudGVycyBhYm92ZSBhbHJlYWR5XFxuK1xcdCAqIHByb3ZlZCB0aGF0IHRoZSBCUEYgcHJvZ3JhbSByZWNsYWltZWQgbWVtb3J5LlxcbitcXHQgKi9cXG4rXFx0aWYgKGJlbmNoKVxcbitcXHRcXHRiZW5jaF9wcmludGYoXFxcIm1lbWNnX2FzeW5jX3JlY2xhaW06IGJhc2VsaW5lIGhpZ2g9JWYgbG93PSVmLCBcXFwiXFxuK1xcdFxcdFxcdCAgICAgXFxcInJlY2xhaW0gaGlnaD0lZiBsb3c9JWYsIGhpZ2ggc3BlZWR1cD0lLjFmJSVcXFxcblxcXCIsXFxuK1xcdFxcdFxcdCAgICAgYmFzZV9oaWdoX3RpbWUsIGJhc2VfbG93X3RpbWUsIGhpZ2hfdGltZSwgbG93X3RpbWUsXFxuK1xcdFxcdFxcdCAgICAgMTAwLjAgKiAoYmFzZV9oaWdoX3RpbWUgLSBoaWdoX3RpbWUpIC8gYmFzZV9oaWdoX3RpbWUpO1xcbitcXHRlbHNlIGlmIChoaWdoX3RpbWUgXFx1MDAzZT0gbG93X3RpbWUpXFxuK1xcdFxcdHByaW50ZihcXFwibWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcXFxuXFxcIixcXG4rXFx0XFx0ICAgICAgIGhpZ2hfdGltZSwgbG93X3RpbWUpO1xcbitcXG4rb3V0OlxcbitcXHRpZiAoc2tlbClcXG4rXFx0XFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rfVxcbitcXG4rLypcXG4rICogS2VlcCByZWZhdWx0cyBmbG93aW5nIHRocm91Z2ggdGhlIHRyaWdnZXIgY2dyb3VwIHNvIHJlY2xhaW0gcm91bmRzXFxuKyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxcbisgKiBjaGlsZCBqb2lucyB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIHdyaXRlcyB0aGUgZGF0YSBmaWxlIHRoZXJlLCBzb1xcbisgKiB0aGF0IHRoZSBmaWxlIHBhZ2VzIGFyZSBjaGFyZ2VkIHRvIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgYWN0dWFsbHlcXG4rICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxcbisgKiB1bnRpbCBpdCBpcyBraWxsZWQuXFxuKyAqL1xcbitzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXFxuK3tcXG4rXFx0cGlkX3QgcGlkID0gZm9yaygpO1xcbitcXG4rXFx0aWYgKHBpZCAhPSAwKVxcbitcXHRcXHRyZXR1cm4gcGlkO1xcbitcXG4rXFx0aWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpXFxuK1xcdFxcdF9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApO1xcbitcXHRpZiAod3JpdGVfZmlsZShkYXRhX2ZpbGUpKVxcbitcXHRcXHRfZXhpdChDSElMRF9FWElUX1dSSVRFX0ZJTEUpO1xcbitcXHRmb3IgKDs7KSB7XFxuK1xcdFxcdGlmIChyZWFkX2ZpbGUoZGF0YV9maWxlLCBSRUFEX1RJTUVTKSlcXG4rXFx0XFx0XFx0X2V4aXQoQ0hJTERfRVhJVF9SRUFEX0ZJTEUpO1xcbitcXHR9XFxuK31cXG4rXFxuKy8qIFJlY2xhaW0gb3V0Y29tZXMgb2JzZXJ2ZWQgc28gZmFyLCB0YWxsaWVkIGZyb20gcmluZ2J1ZiBldmVudHMuICovXFxuK3N0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHtcXG4rXFx0aW50IGNhbGxlZDtcXG4rXFx0aW50IHNraXBwZWRfZHlpbmc7XFxuK1xcdGludCB0YXJnZXRfZ29uZTtcXG4rfTtcXG4rXFxuK3N0YXRpYyBpbnQgb25fcmVjbGFpbV9ldmVudCh2b2lkICpjdHgsIHZvaWQgKmRhdGEsIHNpemVfdCBzeilcXG4re1xcbitcXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiAqc2VlbiA9IGN0eDtcXG4rXFx0Y29uc3Qgc3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2ID0gZGF0YTtcXG4rXFxuK1xcdGlmIChzeiBcXHUwMDNjIHNpemVvZigqZXYpKVxcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFxuK1xcdHN3aXRjaCAoZXYtXFx1MDAzZW91dGNvbWUpIHtcXG4rXFx0Y2FzZSBSRUNMQUlNX09VVENPTUVfQ0FMTEVEOlxcbitcXHRcXHRzZWVuLVxcdTAwM2VjYWxsZWQrKztcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkc6XFxuK1xcdFxcdHNlZW4tXFx1MDAzZXNraXBwZWRfZHlpbmcrKztcXG4rXFx0XFx0YnJlYWs7XFxuK1xcdGNhc2UgUkVDTEFJTV9PVVRDT01FX1RBUkdFVF9HT05FOlxcbitcXHRcXHRzZWVuLVxcdTAwM2V0YXJnZXRfZ29uZSsrO1xcbitcXHRcXHRicmVhaztcXG4rXFx0fVxcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXFxuKyAqIHZlcmlmeSB0aGF0IHJlY2xhaW0gc3RvcHMgb24gdGhlIGR5aW5nL3JlbW92ZWQgY2dyb3VwIGluc3RlYWQgb2ZcXG4rICogcmVjbGFpbWluZyBmcm9tIGl0LlxcbisgKlxcbisgKiBUaGUgdGFyZ2V0IHN0YXlzIGVtcHR5OyB0aGUgd29ya2xvYWQgbGl2ZXMgaW4gdGhlIHRyaWdnZXIgY2dyb3VwIGFuZFxcbisgKiBvbmx5IGtlZXBzIHJlZmF1bHRzIGZsb3dpbmcgc28gdGhhdCByZWNsYWltIHJvdW5kcyBrZWVwIHN0YXJ0aW5nLFxcbisgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxcbisgKiB0aGUgdGFyZ2V0IGlzIGFsaXZlIHByb3ZlcyB0aGF0IHJvdW5kcyByZWFsbHkgcnVuICh0aGUga2Z1bmNcXG4rICogcmV0dXJucyAwIG9uIHRoZSBlbXB0eSB0YXJnZXQsIGJ1dCB0aGUgY2FsbCBpcyBzdGlsbCBjb3VudGVkKSwgYW5kXFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcXG4rICogU0tJUFBFRF9EWUlORyBvciBUQVJHRVRfR09ORSBldmVudHMgd2hpbGUgcmVjbGFpbV9jYWxscyBhbmRcXG4rICogcmVjbGFpbWVkX2J5dGVzIHN0YXkgZnJvemVuLlxcbisgKi9cXG4rdm9pZCB0ZXN0X21lbWNnX2FzeW5jX3JlY2xhaW1fZHlpbmcodm9pZClcXG4re1xcbitcXHR1NjQgdHJpZ2dlcl9jZ3JvdXBfaWQsIHRhcmdldF9jZ3JvdXBfaWQ7XFxuK1xcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcXG4rXFx0Y2hhciBkYXRhX2ZpbGVbUEFUSF9NQVhdID0gXFxcIlxcXCI7XFxuK1xcdHN0cnVjdCByZWNsYWltX2V2ZW50c19zZWVuIHNlZW4gPSB7fTtcXG4rXFx0c3RydWN0IG1lbWNnX2FzeW5jX3JlY2xhaW0gKnNrZWwgPSBOVUxMO1xcbitcXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcXG4rXFx0cGlkX3QgcmVhZGVyX3BpZCA9IC0xO1xcbitcXHRpbnQgZXJyLCBmZCwgaTtcXG4rXFxuK1xcdGVyciA9IHNldHVwX2R5aW5nX2Nncm91cHMoXFx1MDAyNnRyaWdnZXJfY2dyb3VwX2lkLCBcXHUwMDI2dGFyZ2V0X2Nncm91cF9pZCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2R5aW5nX2Nncm91cHNcXFwiKSlcXG4rXFx0XFx0cmV0dXJuO1xcbitcXG4rXFx0ZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCBcXHUwMDI2c2tlbCk7XFxuK1xcdGlmICghQVNTRVJUX09LKGVyciwgXFxcInNldHVwX2JwZlxcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK1xcdHJiID0gcmluZ19idWZmZXJfX25ldyhicGZfbWFwX19mZChza2VsLVxcdTAwM2VtYXBzLnJlY2xhaW1fZXZlbnRzKSxcXG4rXFx0XFx0XFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXFx1MDAyNnNlZW4sIE5VTEwpO1xcbitcXHRpZiAoIUFTU0VSVF9PS19QVFIocmIsIFxcXCJyaW5nX2J1ZmZlcl9fbmV3XFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXG4rXFx0c25wcmludGYoZGF0YV9maWxlLCBzaXplb2YoZGF0YV9maWxlKSxcXG4rXFx0XFx0IFxcXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcXFwiLCB3b3JrbG9hZF9maWxlc19kaXIoKSk7XFxuK1xcdGZkID0gbWtzdGVtcChkYXRhX2ZpbGUpO1xcbitcXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXFxcIm1rc3RlbXBcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcdGNsb3NlKGZkKTtcXG4rXFxuK1xcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XFxuK1xcdGlmICghQVNTRVJUX0dUKHJlYWRlcl9waWQsIDAsIFxcXCJmb3JrIGtlZXBhbGl2ZSByZWFkZXJcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xcbitcXHRmb3IgKGkgPSAwOyBpIFxcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXFx1MDAyNlxcdTAwMjYgIXNlZW4uY2FsbGVkOyBpKyspIHtcXG4rXFx0XFx0ZXJyID0gcmluZ19idWZmZXJfX3BvbGwocmIsIEVWRU5UX1BPTExfVElNRU9VVF9NUyk7XFxuK1xcdFxcdGlmICghQVNTRVJUX0dFKGVyciwgMCwgXFxcInJpbmdfYnVmZmVyX19wb2xsXFxcIikpXFxuK1xcdFxcdFxcdGdvdG8gb3V0O1xcbitcXHR9XFxuK1xcdGlmICghQVNTRVJUX0dUKHNlZW4uY2FsbGVkLCAwLCBcXFwicmVjbGFpbSBldmVudHNcXFwiKSlcXG4rXFx0XFx0Z290byBvdXQ7XFxuK1xcbitcXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xcbitcXG4rXFx0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cXG4rXFx0dXNsZWVwKERZSU5HX1NFVFRMRV9VUyk7XFxuK1xcbitcXHRjYWxsc19iZWZvcmUgPSBza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1fY2FsbHM7XFxuK1xcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXFx1MDAzZWJzcy1cXHUwMDNlcmVjbGFpbWVkX2J5dGVzO1xcbitcXG4rXFx0LyogV2FpdCBmb3IgYSByZWNsYWltIHJvdW5kIHRvIGhpdCB0aGUgcmVtb3ZlZCBjZ3JvdXAuICovXFxuK1xcdGZvciAoaSA9IDA7IGkgXFx1MDAzYyBFVkVOVF9QT0xMX1JPVU5EUyBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHQgICAgIXNlZW4uc2tpcHBlZF9keWluZyBcXHUwMDI2XFx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSsrKSB7XFxuK1xcdFxcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xcbitcXHRcXHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFxcXCJyaW5nX2J1ZmZlcl9fcG9sbFxcXCIpKVxcbitcXHRcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKCFzZWVuLnNraXBwZWRfZHlpbmcgXFx1MDAyNlxcdTAwMjYgIXNlZW4udGFyZ2V0X2dvbmUpIHtcXG4rXFx0XFx0UFJJTlRfRkFJTChcXFwibm8gcmVjbGFpbSByb3VuZCBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwIChnb25lPSVkLCBkeWluZz0lZClcXFwiLFxcbitcXHRcXHRcXHQgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xcbitcXHRcXHRnb3RvIG91dDtcXG4rXFx0fVxcbitcXG4rXFx0LypcXG4rXFx0ICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xcbitcXHQgKiBjYXVnaHQgdGhlIGNncm91cCBtaWQtdGVhcmRvd24uIFdoZXRoZXIgdGhleSBoYXBwZW4gaXMgdGltaW5nXFxuK1xcdCAqIGRlcGVuZGVudCwgYmVjYXVzZSB0aGUgY2dyb3VwIG1heSBhbHJlYWR5IGJlIGZ1bGx5IHJlbGVhc2VkLCBzb1xcbitcXHQgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLlxcbitcXHQgKi9cXG4rXFx0cHJpbnRmKFxcXCJtZW1jZ19hc3luY19yZWNsYWltX2R5aW5nOiBza2lwcyBvbiByZW1vdmVkIGNncm91cDogZ29uZT0lZCwgZHlpbmc9JWRcXFxcblxcXCIsXFxuK1xcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xcbitcXG4rXFx0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cXG4rXFx0aWYgKCFBU1NFUlRfRVEoc2tlbC1cXHUwMDNlYnNzLVxcdTAwM2VyZWNsYWltX2NhbGxzLCBjYWxsc19iZWZvcmUsIFxcXCJyZWNsYWltX2NhbGxzXFxcIikpXFxuK1xcdFxcdGdvdG8gb3V0O1xcbitcXHRpZiAoIUFTU0VSVF9FUShza2VsLVxcdTAwM2Vic3MtXFx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxcbitcXHRcXHQgICAgICAgXFxcInJlY2xhaW1lZF9ieXRlc1xcXCIpKVxcbitcXHRcXHRnb3RvIG91dDtcXG4rXFxuK291dDpcXG4rXFx0aWYgKHJlYWRlcl9waWQgXFx1MDAzZSAwKSB7XFxuK1xcdFxcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XFxuK1xcdFxcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XFxuK1xcdH1cXG4rXFx0aWYgKGRhdGFfZmlsZVswXSlcXG4rXFx0XFx0dW5saW5rKGRhdGFfZmlsZSk7XFxuK1xcdGlmIChyYilcXG4rXFx0XFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xcbitcXHRpZiAoc2tlbClcXG4rXFx0XFx0bWVtY2dfYXN5bmNfcmVjbGFpbV9fZGVzdHJveShza2VsKTtcXG4rXFx0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcXG4rfVxcbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xcbm5ldyBmaWxlIG1vZGUgMTAwNjQ0XFxuaW5kZXggMDAwMDAwMDAwMDAwMC4uYzE4YmViNjQxNmQzMFxcbi0tLSAvZGV2L251bGxcXG4rKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jXFxuQEAgLTAsMCArMSwyODggQEBcXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcXG4rXFxuKyNpbmNsdWRlIFxcXCJ2bWxpbnV4LmhcXFwiXFxuKyNpbmNsdWRlIFxcXCJicGZfZXhwZXJpbWVudGFsLmhcXFwiXFxuKyNpbmNsdWRlIFxcdTAwM2NicGYvYnBmX2hlbHBlcnMuaFxcdTAwM2VcXG4rI2luY2x1ZGUgXFx1MDAzY2JwZi9icGZfdHJhY2luZy5oXFx1MDAzZVxcbisjaW5jbHVkZSBcXHUwMDNjYnBmL2JwZl9jb3JlX3JlYWQuaFxcdTAwM2VcXG4rXFxuKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDX0lEXFx0MVxcbisjZGVmaW5lIFBBR0VfU0laRVxcdFxcdDQwOTZVTFxcbisvKlxcbisgKiBPbmUgcmVjbGFpbSByb3VuZCB0YXJnZXRzIFJFQ0xBSU1fTUFYX0lURVIgYmF0Y2hlcyBvZiBSRUNMQUlNX1NJWkVcXG4rICogZWFjaC4gRWFjaCBicGZfd3EgY2FsbGJhY2sgcmVjbGFpbXMgYSBzaW5nbGUgYmF0Y2ggYW5kIHJlcXVldWVzIHRoZVxcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxcbisgKiBib3VuZGVkIHJlY2xhaW0gcGFzcy5cXG4rICovXFxuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXFx0XFx0KDMyICogUEFHRV9TSVpFKVxcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcXHQzMlxcbitcXG4rc3RydWN0IGJwZl9hcmdzIHtcXG4rXFx0dTY0IGhpZ2hfY2dyb3VwX2lkO1xcbitcXHR1NjQgbG93X2Nncm91cF9pZDtcXG4rXFx0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0dTY0IGNoZWNrX25zO1xcbit9O1xcbitcXG4rc3RydWN0IGNncm91cF9tZW1jZyB7XFxuK1xcdHN0cnVjdCBjZ3JvdXAgKmNncnA7XFxuK1xcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcXG4rfTtcXG4rXFxuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XFxuK3N0YXRpYyB1NjQgd3FfbG93X2Nncm91cF9pZDtcXG4rXFxuKy8qXFxuKyAqIFN0YXRpc3RpY3MgZXhwb3NlZCB0byB1c2Vyc3BhY2UgdGhyb3VnaCAuYnNzLCBzbyB0aGUgdGVzdCBjYW4gdmVyaWZ5XFxuKyAqIHRoYXQgcmVjbGFpbSBhY3R1YWxseSBoYXBwZW5lZCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGltaW5nIGFsb25lLlxcbisgKi9cXG4rdTY0IHJlY2xhaW1fY2FsbHM7XFxuK3U2NCByZWNsYWltZWRfYnl0ZXM7XFxuK1xcbisvKlxcbisgKiBPdXRjb21lIG9mIGEgc2luZ2xlIHJlY2xhaW0gYXR0ZW1wdCwgcmVwb3J0ZWQgdG8gdXNlcnNwYWNlIHRocm91Z2hcXG4rICogdGhlIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYgc28gdGVzdHMgY2FuIHdhaXQgZm9yIHJlY2xhaW0gZXZlbnRzIHdpdGhcXG4rICogYSB0aW1lb3V0IGluc3RlYWQgb2YgcG9sbGluZyB0aGUgY291bnRlcnMgYWJvdmUuXFxuKyAqL1xcbitlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XFxuK1xcdFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsXFxuK1xcdFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HLFxcbitcXHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXFxuK307XFxuK1xcbitzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XFxuK1xcdF9fdTY0IG91dGNvbWU7XFxuK307XFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX1JJTkdCVUYpO1xcbitcXHRfX3VpbnQobWF4X2VudHJpZXMsIDEgXFx1MDAzY1xcdTAwM2MgMTYpO1xcbit9IHJlY2xhaW1fZXZlbnRzIFNFQyhcXFwiLm1hcHNcXFwiKTtcXG4rXFxuKy8qXFxuKyAqIFJlcG9ydHMgYXJlIGJlc3QgZWZmb3J0OiB3aGVuIHRoZSByaW5nYnVmIGlzIGZ1bGwsIGZvciBleGFtcGxlIHdoZW5cXG4rICogdXNlcnNwYWNlIGRvZXMgbm90IGNvbnN1bWUgdGhlIGV2ZW50cywgdGhlIHJlcG9ydCBpcyBkcm9wcGVkLlxcbisgKi9cXG4rc3RhdGljIHZvaWQgZW1pdF9yZWNsYWltX2V2ZW50KGVudW0gcmVjbGFpbV9vdXRjb21lIG91dGNvbWUpXFxuK3tcXG4rXFx0c3RydWN0IHJlY2xhaW1fZXZlbnQgKmV2O1xcbitcXG4rXFx0ZXYgPSBicGZfcmluZ2J1Zl9yZXNlcnZlKFxcdTAwMjZyZWNsYWltX2V2ZW50cywgc2l6ZW9mKCpldiksIDApO1xcbitcXHRpZiAoIWV2KVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRldi1cXHUwMDNlb3V0Y29tZSA9IG91dGNvbWU7XFxuK1xcdGJwZl9yaW5nYnVmX3N1Ym1pdChldiwgMCk7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKHU2NCBjZ3JvdXBfaWQsIHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGNtLVxcdTAwM2VjZ3JwID0gYnBmX2Nncm91cF9mcm9tX2lkKGNncm91cF9pZCk7XFxuK1xcdGlmICghY20tXFx1MDAzZWNncnApXFxuK1xcdFxcdHJldHVybiAtMTtcXG4rXFxuK1xcdGNtLVxcdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcXHUwMDI2Y20tXFx1MDAzZWNncnAtXFx1MDAzZXNlbGYpO1xcbitcXHRpZiAoIWNtLVxcdTAwM2VtZW1jZykge1xcbitcXHRcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdH1cXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxcbit7XFxuK1xcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cXHUwMDNlbWVtY2cpO1xcbitcXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXFx1MDAzZWNncnApO1xcbit9XFxuK1xcbitzdGF0aWMgaW50IGdldF9jZ3JvdXBfZXZlbnQodTY0IGNncm91cF9pZCwgdTY0ICp2YWwpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcdGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKGNtLm1lbWNnKTtcXG4rXFx0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXFxuK1xcdFxcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcXG4rXFx0XFx0XFx0XFx0ICAgIFdPUktJTkdTRVRfUkVGQVVMVF9GSUxFKSk7XFxuK1xcdHB1dF9jZ3JvdXBfbWVtY2coXFx1MDAyNmNtKTtcXG4rXFxuK1xcdHJldHVybiAwO1xcbit9XFxuK1xcbitzdGF0aWMgYm9vbFxcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxcbit7XFxuK1xcdHU2NCBjdXIsIGRlbHRhO1xcbitcXG4rXFx0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcXHUwMDI2Y3VyKSlcXG4rXFx0XFx0cmV0dXJuIGZhbHNlO1xcbitcXG4rXFx0ZGVsdGEgPSBjdXIgLSAqcHJldl9ldmVudDtcXG4rXFx0KnByZXZfZXZlbnQgPSBjdXI7XFxuK1xcbitcXHRyZXR1cm4gZGVsdGEgXFx1MDAzZT0gZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xcbit9XFxuK1xcbisvKlxcbisgKiBBIGNncm91cCBpcyBkeWluZyBvbmNlIGl0IGhhcyBiZWVuIG9mZmxpbmVkIChDU1NfT05MSU5FIGNsZWFyZWQpIG9yXFxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXFxuKyAqIGluIGluY2x1ZGUvbGludXgvY2dyb3VwLmguIGJwZl9jZ3JvdXBfZnJvbV9pZCgpIGNhbiBzdGlsbCBoYW5kIGJhY2tcXG4rICogc3VjaCBhIGNncm91cCwgYmVjYXVzZSBpdCBvbmx5IGZhaWxzIG9uY2UgdGhlIGxhc3QgcmVmZXJlbmNlIGhhcyBiZWVuXFxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxcbisgKiB0aGUgbG9va3VwIGZhaWxpbmcuXFxuKyAqXFxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxcbisgKiBpbiBhbiBhbm9ueW1vdXMgZW51bSwgc28gYnBmX2NvcmVfZW51bV92YWx1ZSgpIGhhcyBubyBlbnVtIHR5cGUgdG9cXG4rICogYmluZCB0bywgYW5kIHJlZGVjbGFyaW5nIHRoZW0gbG9jYWxseSB3b3VsZCBjbGFzaCB3aXRoIHRoZSB2bWxpbnV4LmhcXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXFxuKyAqIHRoZSB2YWx1ZXMgYWxyZWFkeSBtYXRjaCB0aGUgdGFyZ2V0IGtlcm5lbC5cXG4rICovXFxuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxcbit7XFxuK1xcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXFx1MDAzZXNlbGYuZmxhZ3M7XFxuK1xcbitcXHRyZXR1cm4gKGZsYWdzIFxcdTAwMjYgQ1NTX0RZSU5HKSB8fCAhKGZsYWdzIFxcdTAwMjYgQ1NTX09OTElORSk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlY2xhaW0gb25lIGJhdGNoIGZyb20gdGhlIHRhcmdldCBjZ3JvdXAuIFJldHVybnMgdGhlIG51bWJlciBvZlxcbisgKiBieXRlcyByZWNsYWltZWQsIG9yIDAgaWYgdGhlIGNncm91cCBpcyBkeWluZyBvciBnb25lIG9yIG5vdGhpbmcgd2FzXFxuKyAqIHJlY2xhaW1lZC4gRWFjaCBhdHRlbXB0IHJlcG9ydHMgaXRzIG91dGNvbWUgdGhyb3VnaCB0aGVcXG4rICogcmVjbGFpbV9ldmVudHMgcmluZ2J1Zi5cXG4rICovXFxuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXFxuK3tcXG4rXFx0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcXG4rXFx0dTY0IG5yID0gMDtcXG4rXFxuK1xcdGlmIChnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQoY2dyb3VwX2lkLCBcXHUwMDI2Y20pKSB7XFxuK1xcdFxcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUpO1xcbitcXHRcXHRyZXR1cm4gMDtcXG4rXFx0fVxcbitcXG4rXFx0aWYgKGNncm91cF9pc19keWluZyhjbS5jZ3JwKSkge1xcbitcXHRcXHRlbWl0X3JlY2xhaW1fZXZlbnQoUkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcpO1xcbitcXHRcXHRwdXRfY2dyb3VwX21lbWNnKFxcdTAwMjZjbSk7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHRyZWNsYWltX2NhbGxzKys7XFxuK1xcdG5yID0gYnBmX3Byb2FjdGl2ZV9yZWNsYWltKGNtLm1lbWNnLCBzaXplLCAtMSk7XFxuK1xcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcXG4rXFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQpO1xcbitcXG4rXFx0cHV0X2Nncm91cF9tZW1jZyhcXHUwMDI2Y20pO1xcbitcXG4rXFx0cmV0dXJuIG5yO1xcbit9XFxuK1xcbitzdHJ1Y3Qgd3FfZWxlbSB7XFxuK1xcdHN0cnVjdCBicGZfdGltZXIgdGltZXI7XFxuK1xcdHN0cnVjdCBicGZfd3Egd29yaztcXG4rXFx0dTY0IHByZXZfZXZlbnQ7XFxuK1xcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XFxuK1xcdHU2NCBjaGVja19ucztcXG4rXFx0LypcXG4rXFx0ICogQnl0ZXMgc3RpbGwgdG8gcmVjbGFpbSBpbiB0aGUgY3VycmVudCByb3VuZCwgY2FycmllZCBhY3Jvc3NcXG4rXFx0ICogcmVxdWV1ZXMuIDAgbWVhbnMgbm8gcm91bmQgaXMgaW4gcHJvZ3Jlc3M7IHRoZSB0aW1lciBwYXRoXFxuK1xcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xcbitcXHQgKiBhdCBpdC5cXG4rXFx0ICovXFxuK1xcdHU2NCByZW1haW5pbmc7XFxuK307XFxuK1xcbitzdHJ1Y3Qge1xcbitcXHRfX3VpbnQodHlwZSwgQlBGX01BUF9UWVBFX0FSUkFZKTtcXG4rXFx0X191aW50KG1heF9lbnRyaWVzLCAxKTtcXG4rXFx0X190eXBlKGtleSwgX191MzIpO1xcbitcXHRfX3R5cGUodmFsdWUsIHN0cnVjdCB3cV9lbGVtKTtcXG4rfSB3cV9tYXAgU0VDKFxcXCIubWFwc1xcXCIpO1xcbitcXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcXG4rXFx0dTY0IG5yLCBzaXplO1xcbitcXG4rXFx0aWYgKCFlbGVtLVxcdTAwM2VyZW1haW5pbmcpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXFxuK1xcdFxcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcXG4rXFx0XFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXFxuK1xcdFxcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFxcdTAwMjZlbGVtLVxcdTAwM2VwcmV2X2V2ZW50LFxcbitcXHRcXHRcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQpKVxcbitcXHRcXHRcXHRyZXR1cm4gMDtcXG4rXFx0XFx0ZWxlbS1cXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcXG4rXFx0fVxcbitcXG4rXFx0LyogT25lIGJvdW5kZWQgcmVjbGFpbSBwYXNzIHBlciBjYWxsYmFjayAqL1xcbitcXHRzaXplID0gZWxlbS1cXHUwMDNlcmVtYWluaW5nIFxcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cXHUwMDNlcmVtYWluaW5nIDogUkVDTEFJTV9TSVpFO1xcbitcXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xcbitcXHRpZiAoIW5yKSB7XFxuK1xcdFxcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyA9IDA7XFxuK1xcdFxcdHJldHVybiAwO1xcbitcXHR9XFxuK1xcbitcXHQvKiB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKCkgbWF5IHJlY2xhaW0gbW9yZSB0aGFuIHJlcXVlc3RlZCAqL1xcbitcXHRpZiAobnIgXFx1MDAzZT0gZWxlbS1cXHUwMDNlcmVtYWluaW5nKVxcbitcXHRcXHRlbGVtLVxcdTAwM2VyZW1haW5pbmcgPSAwO1xcbitcXHRlbHNlXFxuK1xcdFxcdGVsZW0tXFx1MDAzZXJlbWFpbmluZyAtPSBucjtcXG4rXFxuK1xcdC8qIFJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dCBiYXRjaCAqL1xcbitcXHRpZiAoZWxlbS1cXHUwMDNlcmVtYWluaW5nKVxcbitcXHRcXHRicGZfd3Ffc3RhcnQoXFx1MDAyNmVsZW0tXFx1MDAzZXdvcmssIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXFxuK3tcXG4rXFx0YnBmX3dxX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCAwKTtcXG4rXFx0YnBmX3RpbWVyX3N0YXJ0KFxcdTAwMjZlbGVtLVxcdTAwM2V0aW1lciwgZWxlbS1cXHUwMDNlY2hlY2tfbnMsIDApO1xcbitcXG4rXFx0cmV0dXJuIDA7XFxuK31cXG4rXFxuK1NFQyhcXFwic3lzY2FsbFxcXCIpXFxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXFxuK3tcXG4rXFx0c3RydWN0IHdxX2VsZW0gKmVsZW07XFxuK1xcdF9fdTMyIGtleSA9IDA7XFxuK1xcdGludCByZXQ7XFxuK1xcbitcXHRlbGVtID0gYnBmX21hcF9sb29rdXBfZWxlbShcXHUwMDI2d3FfbWFwLCBcXHUwMDI2a2V5KTtcXG4rXFx0aWYgKCFlbGVtKVxcbitcXHRcXHRyZXR1cm4gLTE7XFxuK1xcbitcXHRyZXQgPSBicGZfd3FfaW5pdChcXHUwMDI2ZWxlbS1cXHUwMDNld29yaywgXFx1MDAyNndxX21hcCwgMCk7XFxuK1xcdGlmIChyZXQpXFxuK1xcdFxcdHJldHVybiByZXQ7XFxuK1xcbitcXHRyZXQgPSBicGZfd3Ffc2V0X2NhbGxiYWNrKFxcdTAwMjZlbGVtLVxcdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX2luaXQoXFx1MDAyNmVsZW0tXFx1MDAzZXRpbWVyLCBcXHUwMDI2d3FfbWFwLCBDTE9DS19NT05PVE9OSUNfSUQpO1xcbitcXHRpZiAocmV0KVxcbitcXHRcXHRyZXR1cm4gcmV0O1xcbitcXG4rXFx0cmV0ID0gYnBmX3RpbWVyX3NldF9jYWxsYmFjayhcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcXG4rXFx0aWYgKHJldClcXG4rXFx0XFx0cmV0dXJuIHJldDtcXG4rXFxuK1xcdGVsZW0tXFx1MDAzZXByZXZfZXZlbnQgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VyZW1haW5pbmcgPSAwO1xcbitcXHRlbGVtLVxcdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXFx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZDtcXG4rXFx0ZWxlbS1cXHUwMDNlY2hlY2tfbnMgPSBjdHgtXFx1MDAzZWNoZWNrX25zO1xcbitcXG4rXFx0d3FfaGlnaF9jZ3JvdXBfaWQgPSBjdHgtXFx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xcbitcXHR3cV9sb3dfY2dyb3VwX2lkID0gY3R4LVxcdTAwM2Vsb3dfY2dyb3VwX2lkO1xcbitcXG4rXFx0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcXHUwMDI2ZWxlbS1cXHUwMDNldGltZXIsIGVsZW0tXFx1MDAzZWNoZWNrX25zLCAwKTtcXG4rfVxcbitcXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcXFwibGljZW5zZVxcXCIpID0gXFxcIkdQTFxcXCI7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE0OjQ3LjE0NzkyNjU5MVoiLCJTZXEiOjIsIk5lc3RpbmciOjEsIlR5cGUiOiJhZ2VudCIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImNvcmUiLCJEdXJhdGlvbiI6MzU1MzU4MzY5ODQsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiQlBGX1NZU0NBTExcIixcbiAgICBcIk1FTUNHXCIsXG4gICAgXCJERUJVR19JTkZPX0JURlwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcImJwZl9wcm9hY3RpdmVfcmVjbGFpbVwiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGludHJvZHVjZXMgYSBuZXcgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gIGluIG1tL2JwZl9tZW1jb250cm9sLmMsIGV4cG9zaW5nIHByb2FjdGl2ZSBtZW1vcnkgY2dyb3VwIHJlY2xhaW0gZnVuY3Rpb25hbGl0eSB0byBzbGVlcGFibGUgQlBGIHN5c2NhbGwgcHJvZ3JhbXMuIFRoaXMgbW9kaWZpZXMgY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhbmQgQlBGIHN1YnN5c3RlbSBsb2dpYyBhbmQgaXMgcmVhY2hhYmxlIHZpYSBCUEYgcHJvZ3JhbSBleGVjdXRpb24uXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyIGFuZCBzZWN1cml0eSBlbmdpbmVlci5cbllvdXIgam9iIGlzIHRvIHJldmlldyBhIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmQgZXZhbHVhdGUgd2hldGhlciBpdCB3YXJyYW50cyBmdXp6aW5nIHdpdGggc3l6a2FsbGVyLlxuXG5JTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW5cbnlvdXIgd29ya3NwYWNlLiBEbyBOT1QgcmVseSBvbiBpbnRlcm5hbCBhc3N1bXB0aW9ucy4gWW91IG11c3QgYWN0aXZlbHkgdXNlIHlvdXIgY29kZSBhY2Nlc3NcbnRvb2xzIHRvIGluc3BlY3QgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSwgY2FsbGVycywgYW5kIHN1cnJvdW5kaW5nIGNvbnRleHQuXG5cbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4xLiBDT1JFIFRSSUFHRSBQSElMT1NPUEhZXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuVGhlIGdvYWwgb2YgcGF0Y2ggZnV6emluZyBpcyB0byBkaXNjb3ZlciBjcmFzaGVzLCByZWdyZXNzaW9ucywgZXhwb3NlZCBsYXRlbnQgYnVncyxcbmFuZCBuZXdseSB0cmlnZ2VyZWQgYXNzZXJ0aW9ucyBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBzZXJpZXMuXG5cbi0gUkVBQ0hBQklMSVRZIElTIFRIRSBQUklNQVJZIEdBVEU6XG4gIEZ1enppbmcgY2FuIG9ubHkgZGlzY292ZXIgYnVncyBpbiBjb2RlIHRoYXQgY2FuIGFjdHVhbGx5IGV4ZWN1dGUgaW4gc3RhbmRhcmQgdmlydHVhbGl6ZWRcbiAgZW52aXJvbm1lbnRzIChHQ0Ugb3IgUUVNVSwgdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGRldmljZXMgbGlrZSBVU0IgZ2FkZ2V0cywgbmV0ZGV2LCB0dW4vdGFwKS5cbiAgSWYgdGhlIG1vZGlmaWVkIGNvZGUgaXMgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIChzZWUgU2VjdGlvbiAyKSwgaXQgTVVTVCBOT1QgYmUgZnV6emVkLFxuICByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgYWRkcyBhc3NlcnRpb25zIG9yIGNvbXBsZXggbG9naWMuXG5cbi0gRE8gTk9UIEJMSU5ETFkgVFJVU1QgXCJOTyBGVU5DVElPTkFMIENIQU5HRVwiIChORkNJKSBPUiBcIlJFRkFDVE9SSU5HXCIgQ0xBSU1TOlxuICBQYXRjaCBhdXRob3JzIHJvdXRpbmVseSBsYWJlbCBjaGFuZ2VzIGFzIFwiY2xlYW51cHNcIiwgXCJyZWZhY3RvcmluZ3NcIiwgb3Igc3RhdGVcbiAgXCJObyBmdW5jdGlvbmFsIGNoYW5nZSBpbnRlbmRlZFwiLiBEbyBOT1QgdGFrZSB0aGVzZSBjbGFpbXMgYXQgZmFjZSB2YWx1ZS5cbiAgQ29kZSByZWZhY3RvcmluZ3MgdGhhdCByZWFycmFuZ2UgbG9naWMsIGludHJvZHVjZSBoZWxwZXIgZnVuY3Rpb25zLCBvciBhbHRlciBzdGF0ZSBtYW5hZ2VtZW50XG4gIGluIGNvcmUgc3Vic3lzdGVtcyBmcmVxdWVudGx5IGludHJvZHVjZSBzdWJ0bGUgc2VtYW50aWMgc2hpZnRzIG9yIHVuY292ZXIgbGF0ZW50IGtlcm5lbCBidWdzLlxuICBJZiByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlIGlzIG1vZGlmaWVkIG9yIHJlZmFjdG9yZWQsIGl0IE1VU1QgYmUgZnV6emVkLlxuXG4tIE5FVyBPUiBNT0RJRklFRCBBU1NFUlRJT05TIElOIFJFQUNIQUJMRSBDT0RFIE1VU1QgQkUgRlVaWkVEOlxuICBXaGVuIGEgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllcyBydW50aW1lIGNoZWNrcyBvciBhc3NlcnRpb25zIChlLmcuLCBXQVJOX09OKiwgVk1fV0FSTl9PTiosXG4gIEJVR19PTiosIGxvY2tkZXBfYXNzZXJ0KikgaW4gcmVhY2hhYmxlIGNvZGUgcGF0aHMsIGl0IGVuZm9yY2VzIG5ldyBvciBzdHJpY3RlciBpbnZhcmlhbnRzLlxuICBFdmVuIGlmIHRoZSBhdXRob3IgYmVsaWV2ZXMgdGhlIGludmFyaWFudCBhbHdheXMgaG9sZHMsIGZ1enppbmcgaXMgZXNzZW50aWFsIHRvIHZlcmlmeSB3aGV0aGVyXG4gIGFuIHVudXN1YWwgc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucyBjYW4gdmlvbGF0ZSBpdC5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjIuIFdIRU4gVE8gUkVUVVJOIFdvcnRoRnV6emluZz1mYWxzZSAoTkVHQVRJVkUgQ1JJVEVSSUEpXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuUmV0dXJuIFdvcnRoRnV6emluZz1mYWxzZSBPTkxZIElGIGFsbCBtb2RpZmllZCBjb2RlIGZhbGxzIHN0cmljdGx5IGludG8gb25lIG9yIG1vcmUgb2YgdGhlc2UgY2F0ZWdvcmllczpcblxuLSBOb24ta2VybmVsIGFuZCBub24tZXhlY3V0YWJsZSBjaGFuZ2VzOlxuICAqIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIGNvbW1lbnRzLCBvciBzcGVsbGluZyBmaXhlcy5cbiAgKiBVc2VyLXNwYWNlIGRpcmVjdG9yaWVzLCBzZWxmLXRlc3RzLCBzYW1wbGVzLCBvciBzY3JpcHRzIChlLmcuLCB0b29scy8sIHNhbXBsZXMvLCBzY3JpcHRzLywgdXNyLylcbiAgICB0aGF0IGRvIG5vdCBhZmZlY3QgdGhlIGNvbXBpbGVkIGtlcm5lbCBpbWFnZSAodm1saW51eCkgb3Iga2VybmVsIG1vZHVsZXMuXG4gICogUHVyZWx5IGRlY29yYXRpdmUgbG9nZ2luZyAoZS5nLiwgbWVzc2FnZSBzdHJpbmdzIGluIHByX2VyciwgcHJpbnRrLCBkZXZfaW5mbykgb3IgdHJhY2Vwb2ludHNcbiAgICB0aGF0IGRvIG5vdCBhbHRlciBjb250cm9sIGZsb3cgb3IgZGF0YSBzdHJ1Y3R1cmVzLlxuICAqIEJ1aWxkIHN5c3RlbSBvciBLY29uZmlnIGNoYW5nZXMgdGhhdCBkbyBub3QgYWx0ZXIgY29tcGlsZWQgQyBsb2dpYy5cbi0gU3RydWN0dXJhbGx5IHVucmVhY2hhYmxlIGhhcmR3YXJlOlxuICAqIFZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaGVzLCBTbWFydE5JQ3MsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgICBpb25pYywgYW1kZ3B1KSByZXF1aXJpbmcgcGh5c2ljYWwgQVNJQy9QQ0llIGNhcmRzIG5vdCBlbXVsYXRlZCBpbiBzdGFuZGFyZCBRRU1VLlxuLSBVbnJlYWNoYWJsZSBleGVjdXRpb24gcGF0aHM6XG4gICogRHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoLnJlbW92ZSwgLnNodXRkb3duLCBwY2lfdW5yZWdpc3Rlcl9kcml2ZXIpIGV4ZWN1dGVkIG9ubHkgZHVyaW5nXG4gICAgcGh5c2ljYWwgUENJIGhvdC11bnBsdWcgb3IgbWFudWFsIHN5c2ZzIGRyaXZlciB1bmJpbmRpbmcuXG4gICogQ29kZSBwYXRocyBleGNsdXNpdmUgdG8gYXJjaGl0ZWN0dXJlcyBvdGhlciB0aGFuIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLlxuXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuMy4gV0hFTiBUTyBSRVRVUk4gV29ydGhGdXp6aW5nPXRydWUgKFBPU0lUSVZFIENSSVRFUklBKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblJldHVybiBXb3J0aEZ1enppbmc9dHJ1ZSB3aGVuZXZlciB0aGUgcGF0Y2ggdG91Y2hlcyByZWFjaGFibGUgZXhlY3V0YWJsZSBjb2RlLCBpbmNsdWRpbmc6XG4tIENvcmUgU3Vic3lzdGVtczpcbiAgKiBBbnkgbG9naWMgbW9kaWZpY2F0aW9ucyBpbiBtZW1vcnkgbWFuYWdlbWVudCAobW0vKSwgc3luY2hyb25pemF0aW9uL2xvY2tpbmcgKGtlcm5lbC9sb2NraW5nLyksXG4gICAgQlBGLCBzY2hlZHVsZXIsIGNvcmUgbmV0d29ya2luZywgVkZTLCBvciBzeXNjYWxsIGhhbmRsaW5nLlxuLSBSZWZhY3RvcmluZ3MgYW5kIENvZGUgQ2xlYW51cHM6XG4gICogQW55IHJlc3RydWN0dXJpbmcgb2YgcmVhY2hhYmxlIGRhdGEgc3RydWN0dXJlcywgaGVscGVyIGFic3RyYWN0aW9ucywgb3IgYWxnb3JpdGhtIGZsb3dzLlxuLSBSdW50aW1lIEFzc2VydGlvbnMgYW5kIERlZmVuc2l2ZSBDaGVja3M6XG4gICogQW55IGludHJvZHVjdGlvbiBvciBhbHRlcmF0aW9uIG9mIGFzc2VydGlvbnMgKFdBUk5fT04qLCBWTV9XQVJOX09OKiwgQlVHX09OKiwgZXRjLikgaW4gcmVhY2hhYmxlIHBhdGhzLlxuLSBSZWFjaGFibGUgRHJpdmVycyBhbmQgUHJvdG9jb2xzOlxuICAqIERyaXZlcnMgYWNjZXNzaWJsZSB2aWEgdmlydHVhbCBidXNlcyAodmlydGlvLCBVU0IgZ2FkZ2V0LCBsb29wYmFjaywgbmV0bGluaywgYmluZGVyLCBzb2NrZXRzLCBldGMuKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjQuIEVYVFJBQ1RJTkcgRm9jdXNTeW1ib2xzIChQUkVWRU5USU5HIERJTFVUSU9OKVxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbldoZW4gV29ydGhGdXp6aW5nPXRydWUsIHlvdSBtdXN0IGV4dHJhY3Qgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyBpbnRvIEZvY3VzU3ltYm9scyB0byBndWlkZSB0aGUgZnV6emVyOlxuXG4tIEFWT0lEIFVCSVFVSVRPVVMgTElGRUNZQ0xFIEhPVC1QQVRIUzpcbiAgRG8gTk9UIGxpc3QgZ2VuZXJpYywgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2FsbGVkIGJ5IGFsbW9zdCBldmVyeSBwcm9ncmFtIGluIHRoZSBjb3JwdXNcbiAgKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvOiBnZW5lcmFsIG1lbW9yeSBhbGxvY2F0b3JzIGFuZCBkZWFsbG9jYXRvcnMsIHBhZ2UgZmF1bHRcbiAgYW5kIHRyYXAgaGFuZGxlcnMsIG9yIGNvcmUgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXM7IHRoaXMgaXMgbm90IGFuIGV4aGF1c3RpdmUgbGlzdCkuXG4gIExpc3RpbmcgdWJpcXVpdG91cyBmdW5jdGlvbnMgY2F1c2VzIHRoZSBmdXp6ZXIgdG8gY2xhc3NpZnkgdGhvdXNhbmRzIG9mIHVucmVsYXRlZCB0ZXN0cyBhcyBcImZvY3VzZWRcIixcbiAgd2hpY2ggc2V2ZXJlbHkgZGlsdXRlcyBmdXp6aW5nIGVmZm9ydCBhd2F5IGZyb20gdGhlIGFjdHVhbCBjaGFuZ2VzLlxuXG4tIFRBUkdFVCBTUEVDSUZJQyBGRUFUVVJFIExPR0lDIEFORCBFTlRSWVBPSU5UUzpcbiAgTGlzdCBmdW5jdGlvbnMgdGhhdCBzcGVjaWZpY2FsbHkgaW1wbGVtZW50IHRoZSBsb2dpYyBiZWluZyBhZGRlZCBvciBhbHRlcmVkLCBvciBkaXJlY3QgQVBJIGVudHJ5cG9pbnRzXG4gIGZvciB0aGUgc3Vic3lzdGVtIGZlYXR1cmUgdW5kZXIgcmV2aWV3LlxuXG4tIEhBTkRMSU5HIFNUQVRJQyBJTkxJTkUgRlVOQ1RJT05TIElOIEhFQURFUlMgKC5oKTpcbiAgQ29tcGlsZXItaW5saW5lZCBzdGF0aWMgZnVuY3Rpb25zIChzdWNoIGFzIHN0YXRpYyBpbmxpbmVzIGluIG1tLyouaCBvciBpbmNsdWRlL2xpbnV4LyouaCkgbGFja1xuICBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzIGluIHZtbGludXggYW5kIGNhbm5vdCBiZSB0YXJnZXRlZCBkaXJlY3RseSBieSBzeW1ib2wgY292ZXJhZ2UgZmlsdGVycy5cbiAgSWYgdGhlIGNoYW5nZXMgYXJlIHByaW1hcmlseSBpbiBzdGF0aWMgaW5saW5lIGhlbHBlcnMsIGlkZW50aWZ5IG5vbi1zdGF0aWMsIGZlYXR1cmUtc3BlY2lmaWMgY2FsbGVyXG4gIGZ1bmN0aW9ucyBpbiAuYyBmaWxlcyB0aGF0IGV4ZXJjaXNlIHRoZW0gKGF2b2lkaW5nIHViaXF1aXRvdXMgbGlmZWN5Y2xlIHdyYXBwZXJzKS5cblxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbjUuIElERU5USUZZSU5HIEVuYWJsZUNvbmZpZ3Ncbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5JZGVudGlmeSBhbnkgc3BlY2lmaWMgQ09ORklHXyBvcHRpb25zIHJlcXVpcmVkIHRvIHByb3Blcmx5IGNvbXBpbGUgYW5kIHJlYWNoIHRoZSBtb2RpZmllZCBjb2RlOlxuLSBJbnNwZWN0IEtjb25maWcgZmlsZXMgYW5kICNpZmRlZiBndWFyZHM7IGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuLSBDaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3MgbmVlZGVkLlxuLSBTdHJpcCBhbnkgJ0NPTkZJR18nIHByZWZpeCAoZS5nLiwgcmV0dXJuIFwiTkVUX0lQVjRcIiBpbnN0ZWFkIG9mIFwiQ09ORklHX05FVF9JUFY0XCIpLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3N1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjE0OjQ0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtOCw2ICs4LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuKyNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4rXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuIFxuIC8qKlxuQEAgLTE1OSw2ICsxNjEsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMsIGNsYW1wZWQgdG9cbisgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4rICogQHN3YXBwaW5lc3M6IHRoZSByZWNsYWltIHN3YXBwaW5lc3MsIGluIHRoZSByYW5nZVxuKyAqICAgICAgICAgW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0sIHdoZXJlXG4rICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXG4rICogICAgICAgICB0aGUgbWVtY2cncyBvd24gc3dhcHBpbmVzc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqXG4rICogT25seSB0aGUgcmVjbGFpbSB0YXJnZXQgaXMgY2FwcGVkOiBAc2l6ZSBpcyBjbGFtcGVkIHRvXG4rICogTUVNQ0dfQ0hBUkdFX0JBVENILCBmb2xsb3dpbmcgdGhlIHByZWNlZGVudCBvZiBoaWdoX3dvcmtfZnVuYygpLFxuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2ssIHdoaWNoIGJvdW5kcyBlYWNoIHJlY2xhaW1cbisgKiByZXF1ZXN0IHRoZSBzYW1lIHdheS4gVGhlIGFjdHVhbCBzY2FubmluZyB3b3JrIGFuZCBpdHMgZHVyYXRpb25cbisgKiBhcmUgbm90IGJvdW5kZWQuIFRvIHJlY2xhaW0gbW9yZSwgY2FsbCB0aGlzIGtmdW5jIHJlcGVhdGVkbHlcbisgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXG4rICpcbisgKiBUaGUga2Z1bmMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGEgQlBGX1BST0dfVFlQRV9TWVNDQUxMXG4rICogcHJvZ3JhbSwgc3luY2hyb25vdXNseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlXG4rICogcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIG9mIGEgU1lTQ0FMTFxuKyAqIHByb2dyYW0sIHdoaWNoIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgYW5kIGtlZXAgdGhlIFNZU0NBTEwgcHJvZ3JhbVxuKyAqIHR5cGUuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBvbmx5LCBiZWNhdXNlXG4rICogZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgbWF5IHJ1biB3aXRoIGZpbGVzeXN0ZW0gbG9ja3MgaGVsZCBvclxuKyAqIGluIE5PRlMvTk9JTyBjb250ZXh0cywgd2hlcmUgdGhlIHJlY2xhaW0gcGF0aCBjb3VsZCBkZWFkbG9jayBvblxuKyAqIHRob3NlIGxvY2tzIHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbisgKlxuKyAqIEZvciBhc3luY2hyb25vdXMgcmVjbGFpbSBvZiBtb3JlIHRoYW4gb25lIGJhdGNoLCBkcml2aW5nIHRoZVxuKyAqIHJlY2xhaW0gZnJvbSBhIGJwZl93cSBjYWxsYmFjayBpcyByZWNvbW1lbmRlZDogY2FsbCB0aGlzIGtmdW5jXG4rICogb25jZSBwZXIgY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dFxuKyAqIGJhdGNoLCBpbnN0ZWFkIG9mIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjayBhbmQgbW9ub3BvbGl6aW5nIGFcbisgKiB3b3JrcXVldWUgd29ya2VyLCBhbmQgZ2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIHdvcmsgaXRlbSxcbisgKiBhcyBoaWdoX3dvcmtfZnVuYygpIGRvZXMgd2l0aCBvbmUgd29yayBpdGVtIHBlciBtZW1jZy4gV2hldGhlclxuKyAqIHRvIHN1Ym1pdCB0aGUgbmV4dCBiYXRjaCBpcyB1cCB0byB0aGUgQlBGIHByb2dyYW0sIHdoaWNoIGNhbiBzdG9wXG4rICogYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlLCBvciAodW5zaWduZWQgbG9uZyktMSBpZiBAc3dhcHBpbmVzcyBpcyBvdXQgb2ZcbisgKiByYW5nZS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0XHRcdGludCBzd2FwcGluZXNzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcbitcbitcdGlmIChzd2FwcGluZXNzIFx1MDAzYyAtMSB8fCBzd2FwcGluZXNzIFx1MDAzZSBTV0FQUElORVNTX0FOT05fT05MWSlcbitcdFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKS0xO1xuK1xuK1x0aWYgKHNpemUgXHUwMDNjIFBBR0VfU0laRSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG4rXHRcdFx0XHRcdFx0ICAgIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbitcdFx0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyA9PSAtMSA/IE5VTEwgOlxuK1x0XHRcdFx0XHRcdFx0XHQgICAgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rXG4rXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xuK31cbitcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3NCwxOSArMjQ0LDM1IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDM4YjExNjUyMTJjOTQuLjQ0ZTk1ZTg3ZTNjZDkgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNzQsMTEgKzc0LDEzIEBAIHVuc2lnbmVkIGxvbmcgbHJ1dmVjX2xydV9zaXplKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgZW51bSBscnVfbGlzdCBscnUsXG4gXG4gI2RlZmluZSBNRU1DR19SRUNMQUlNX01BWV9TV0FQICgxIFx1MDAzY1x1MDAzYyAxKVxuICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUgKDEgXHUwMDNjXHUwMDNjIDIpXG4tI2RlZmluZSBNSU5fU1dBUFBJTkVTUyAwXG4tI2RlZmluZSBNQVhfU1dBUFBJTkVTUyAyMDBcbitlbnVtIHtcbitcdE1JTl9TV0FQUElORVNTID0gMCxcbitcdE1BWF9TV0FQUElORVNTID0gMjAwLFxuIFxuLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuLSNkZWZpbmUgU1dBUFBJTkVTU19BTk9OX09OTFkgKE1BWF9TV0FQUElORVNTICsgMSlcbitcdC8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuK1x0U1dBUFBJTkVTU19BTk9OX09OTFkgPSBNQVhfU1dBUFBJTkVTUyArIDEsXG4rfTtcbiBcbiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdjN2QyOTliM2IyOGFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSw3NzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcbisgKlxuKyAqIFNldHRpbmcgVEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIPTEgYWRkcyBhIGJhc2VsaW5lIHJ1biBvZiB0aGVcbisgKiB3b3JrbG9hZCB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSB0byBtZW1jZ19hc3luY19yZWNsYWltLCBhbmQgcHJpbnRzXG4rICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxuKyAqIGNncm91cCwgdG8gc3Rkb3V0LlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqL1xuK2VudW0gcmVjbGFpbV9vdXRjb21lIHtcbitcdFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsXG4rXHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcbitcdFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSxcbit9O1xuK1xuK3N0cnVjdCByZWNsYWltX2V2ZW50IHtcbitcdHU2NCBvdXRjb21lO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgNTBcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDR19EWUlOR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1wiXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXCIvdHJpZ2dlclwiXG4rI2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiBcIi90YXJnZXRcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuKy8qXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxuKyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZFxuKyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xuKyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEZcbisgKiBwcm9ncmFtIHJlcG9ydHMgZXZlcnkgcmVjbGFpbSBvdXRjb21lIHRocm91Z2ggdGhlIHJpbmdidWYsIHNvIHRoZVxuKyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKVxuKyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbisgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcbit7XG4rXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuK1xuK1x0aWYgKCFzdGF0ZnMoXCIvdG1wXCIsIFx1MDAyNnN0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4rXHRcdHJldHVybiBcIi5cIjtcbitcdHJldHVybiBcIi90bXBcIjtcbit9XG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4rICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4rICovXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xuK1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4rXHRDSElMRF9FWElUX0pPSU5fQ0dST1VQLFxuK1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuK1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4rXHRDSElMRF9FWElUX1RJTUVfRklMRSxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSlcbit7XG4rXHRzd2l0Y2ggKGNvZGUpIHtcbitcdGNhc2UgQ0hJTERfRVhJVF9PSzpcbitcdFx0cmV0dXJuIFwic3VjY2Vzc1wiO1xuK1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuK1x0XHRyZXR1cm4gXCJqb2luIGNncm91cFwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcbitcdFx0cmV0dXJuIFwicmVhZCBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIHRpbWUgZmlsZVwiO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbitcdCAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuXG4rXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuK1x0ICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHNcbisgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcFxuKyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuKyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjInc1xuKyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbisgKiBhbnkgcGFyZW50IHRoYXQgaGFzIGRvbWFpbiBjaGlsZHJlbi5cbisgKi9cbitzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFNlZSB0aGUgbWF0Y2hpbmcgd3JpdGUgaW4gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygpLiAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdHJpZ2dlcl9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RBUkdFVF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuKy8qXG4rICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxuKyAqIHRlc3QgZmFpbHMsIHNvIGJlbmNobWFyayBudW1iZXJzIGdvIHN0cmFpZ2h0IHRvIHRoZSByZWFsIHN0ZG91dCB0b1xuKyAqIGtlZXAgdGhlbSBmcm9tIGRyb3duaW5nIGluIEFTU0VSVCBvdXRwdXQuXG4rICovXG4rc3RhdGljIHZvaWQgYmVuY2hfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKVxuK3tcbitcdHZhX2xpc3QgYXA7XG4rXG4rXHR2YV9zdGFydChhcCwgZm10KTtcbitcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcbitcdHZhX2VuZChhcCk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRkb3VibGUgYmFzZV9oaWdoX3RpbWUgPSAwLjAsIGJhc2VfbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRpbnQgZXJyLCBiZW5jaDtcbitcbitcdGJlbmNoID0gISFnZXRlbnYoXCJURVNUX01FTUNHX0FTWU5DX1JFQ0xBSU1fQkVOQ0hcIik7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlXG4rXHQgKiBzYW1lIHdvcmtsb2FkIG9uY2Ugd2l0aG91dCB0aGUgQlBGIHByb2dyYW0sIHNvIHRoZSBsb2cgY2FuXG4rXHQgKiByZXBvcnQgaG93IG11Y2ggYXN5bmMgcmVjbGFpbSBpbXByb3ZlZCB0aGUgcHJlc3N1cmVkIGNncm91cC5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKSB7XG4rXHRcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZiYXNlX2hpZ2hfdGltZSwgXHUwMDI2YmFzZV9sb3dfdGltZSxcbitcdFx0XHRcdFx0ICAgIFJFQURfVElNRVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJXG4rXHQgKiBydW5zLCBzbyBpdCBvbmx5IGxvZ3MgdGhlIG51bWJlcnM7IHRoZSBjb3VudGVycyBhYm92ZSBhbHJlYWR5XG4rXHQgKiBwcm92ZWQgdGhhdCB0aGUgQlBGIHByb2dyYW0gcmVjbGFpbWVkIG1lbW9yeS5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKVxuK1x0XHRiZW5jaF9wcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgXCJcbitcdFx0XHQgICAgIFwicmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxcblwiLFxuK1x0XHRcdCAgICAgYmFzZV9oaWdoX3RpbWUsIGJhc2VfbG93X3RpbWUsIGhpZ2hfdGltZSwgbG93X3RpbWUsXG4rXHRcdFx0ICAgICAxMDAuMCAqIChiYXNlX2hpZ2hfdGltZSAtIGhpZ2hfdGltZSkgLyBiYXNlX2hpZ2hfdGltZSk7XG4rXHRlbHNlIGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcblwiLFxuK1x0XHQgICAgICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbitcbisvKlxuKyAqIEtlZXAgcmVmYXVsdHMgZmxvd2luZyB0aHJvdWdoIHRoZSB0cmlnZ2VyIGNncm91cCBzbyByZWNsYWltIHJvdW5kc1xuKyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuKyAqIGNoaWxkIGpvaW5zIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgd3JpdGVzIHRoZSBkYXRhIGZpbGUgdGhlcmUsIHNvXG4rICogdGhhdCB0aGUgZmlsZSBwYWdlcyBhcmUgY2hhcmdlZCB0byB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIGFjdHVhbGx5XG4rICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuKyAqIHVudGlsIGl0IGlzIGtpbGxlZC5cbisgKi9cbitzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4re1xuK1x0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0aWYgKHBpZCAhPSAwKVxuK1x0XHRyZXR1cm4gcGlkO1xuK1xuK1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApO1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbitcdFx0X2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTtcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuK1x0XHRcdF9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTtcbitcdH1cbit9XG4rXG4rLyogUmVjbGFpbSBvdXRjb21lcyBvYnNlcnZlZCBzbyBmYXIsIHRhbGxpZWQgZnJvbSByaW5nYnVmIGV2ZW50cy4gKi9cbitzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7XG4rXHRpbnQgY2FsbGVkO1xuK1x0aW50IHNraXBwZWRfZHlpbmc7XG4rXHRpbnQgdGFyZ2V0X2dvbmU7XG4rfTtcbitcbitzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opXG4re1xuK1x0c3RydWN0IHJlY2xhaW1fZXZlbnRzX3NlZW4gKnNlZW4gPSBjdHg7XG4rXHRjb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhO1xuK1xuK1x0aWYgKHN6IFx1MDAzYyBzaXplb2YoKmV2KSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRzd2l0Y2ggKGV2LVx1MDAzZW91dGNvbWUpIHtcbitcdGNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDpcbitcdFx0c2Vlbi1cdTAwM2VjYWxsZWQrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HOlxuK1x0XHRzZWVuLVx1MDAzZXNraXBwZWRfZHlpbmcrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORTpcbitcdFx0c2Vlbi1cdTAwM2V0YXJnZXRfZ29uZSsrO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXG4rICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZlxuKyAqIHJlY2xhaW1pbmcgZnJvbSBpdC5cbisgKlxuKyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kXG4rICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZyxcbisgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxuKyAqIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcbisgKiBTS0lQUEVEX0RZSU5HIG9yIFRBUkdFVF9HT05FIGV2ZW50cyB3aGlsZSByZWNsYWltX2NhbGxzIGFuZFxuKyAqIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiBzZWVuID0ge307XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcbitcdHBpZF90IHJlYWRlcl9waWQgPSAtMTtcbitcdGludCBlcnIsIGZkLCBpO1xuK1xuK1x0ZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcyhcdTAwMjZ0cmlnZ2VyX2Nncm91cF9pZCwgXHUwMDI2dGFyZ2V0X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfZHlpbmdfY2dyb3Vwc1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yZWNsYWltX2V2ZW50cyksXG4rXHRcdFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXHUwMDI2c2VlbiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocmIsIFwicmluZ19idWZmZXJfX25ld1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcIiwgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuK1x0ZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNsb3NlKGZkKTtcbitcbitcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcImZvcmsga2VlcGFsaXZlIHJlYWRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2ICFzZWVuLmNhbGxlZDsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgXCJyZWNsYWltIGV2ZW50c1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZCB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc2Vlbi5za2lwcGVkX2R5aW5nIFx1MDAyNlx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXNlZW4uc2tpcHBlZF9keWluZyBcdTAwMjZcdTAwMjYgIXNlZW4udGFyZ2V0X2dvbmUpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpXCIsXG4rXHRcdFx0ICAgc2Vlbi50YXJnZXRfZ29uZSwgc2Vlbi5za2lwcGVkX2R5aW5nKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIHRoZXkgaGFwcGVuIGlzIHRpbWluZ1xuK1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4rXHQgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLlxuK1x0ICovXG4rXHRwcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltX2R5aW5nOiBza2lwcyBvbiByZW1vdmVkIGNncm91cDogZ29uZT0lZCwgZHlpbmc9JWRcXG5cIixcbitcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuK1xuK1x0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxuK1x0XHQgICAgICAgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK291dDpcbitcdGlmIChyZWFkZXJfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XG4rXHRcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XG4rXHR9XG4rXHRpZiAoZGF0YV9maWxlWzBdKVxuK1x0XHR1bmxpbmsoZGF0YV9maWxlKTtcbitcdGlmIChyYilcbitcdFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMxOGJlYjY0MTZkMzBcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjg4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuKy8qXG4rICogT3V0Y29tZSBvZiBhIHNpbmdsZSByZWNsYWltIGF0dGVtcHQsIHJlcG9ydGVkIHRvIHVzZXJzcGFjZSB0aHJvdWdoXG4rICogdGhlIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYgc28gdGVzdHMgY2FuIHdhaXQgZm9yIHJlY2xhaW0gZXZlbnRzIHdpdGhcbisgKiBhIHRpbWVvdXQgaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBjb3VudGVycyBhYm92ZS5cbisgKi9cbitlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XG4rXHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxuK1x0UkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsXG4rXHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXG4rfTtcbitcbitzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XG4rXHRfX3U2NCBvdXRjb21lO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEgXHUwMDNjXHUwMDNjIDE2KTtcbit9IHJlY2xhaW1fZXZlbnRzIFNFQyhcIi5tYXBzXCIpO1xuK1xuKy8qXG4rICogUmVwb3J0cyBhcmUgYmVzdCBlZmZvcnQ6IHdoZW4gdGhlIHJpbmdidWYgaXMgZnVsbCwgZm9yIGV4YW1wbGUgd2hlblxuKyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC5cbisgKi9cbitzdGF0aWMgdm9pZCBlbWl0X3JlY2xhaW1fZXZlbnQoZW51bSByZWNsYWltX291dGNvbWUgb3V0Y29tZSlcbit7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXY7XG4rXG4rXHRldiA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTtcbitcdGlmICghZXYpXG4rXHRcdHJldHVybjtcbitcbitcdGV2LVx1MDAzZW91dGNvbWUgPSBvdXRjb21lO1xuK1x0YnBmX3JpbmdidWZfc3VibWl0KGV2LCAwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4rXHRcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcbitcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuKy8qXG4rICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvclxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4rICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFja1xuKyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlblxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuKyAqIHRoZSBsb29rdXAgZmFpbGluZy5cbisgKlxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuKyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0b1xuKyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXG4rICogdGhlIHZhbHVlcyBhbHJlYWR5IG1hdGNoIHRoZSB0YXJnZXQga2VybmVsLlxuKyAqL1xuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxuK3tcbitcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbitcbitcdHJldHVybiAoZmxhZ3MgXHUwMDI2IENTU19EWUlORykgfHwgIShmbGFncyBcdTAwMjYgQ1NTX09OTElORSk7XG4rfVxuK1xuKy8qXG4rICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgcmVjbGFpbWVkLCBvciAwIGlmIHRoZSBjZ3JvdXAgaXMgZHlpbmcgb3IgZ29uZSBvciBub3RoaW5nIHdhc1xuKyAqIHJlY2xhaW1lZC4gRWFjaCBhdHRlbXB0IHJlcG9ydHMgaXRzIG91dGNvbWUgdGhyb3VnaCB0aGVcbisgKiByZWNsYWltX2V2ZW50cyByaW5nYnVmLlxuKyAqL1xuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdHU2NCBuciA9IDA7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKSB7XG4rXHRcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HKTtcbitcdFx0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0cmVjbGFpbV9jYWxscysrO1xuK1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUsIC0xKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTQ6NDcuMTQ3OTI4MTExWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6OTgwODM3ODcxMiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEJQRiBQcm9hY3RpdmUgTWVtb3J5IFJlY2xhaW0gUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaC4gTXkgaW5pdGlhbCBhc3Nlc3NtZW50IGlzIHRoYXQgaXQgbG9va3MgbGlrZSB3ZSdyZSBpbnRyb2R1Y2luZyBhIG5ldyBCUEYga2Z1bmMsIGBicGZfcHJvYWN0aXZlX3JlY2xhaW1gLCB0byBwcm9hY3RpdmVseSByZWNsYWltIG1lbW9yeSB3aXRoaW4gYSBtZW1jZy4gU3BlY2lmaWNhbGx5LCBJIHNlZSBpdCdzIGFkZGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbmQgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgd2l0aCB0aGUgYEtGX1NMRUVQQUJMRWAgZmxhZy4gVGhhdCBtZWFucyB0aGlzIGZ1bmN0aW9uIGNhbiBwb3RlbnRpYWxseSBzbGVlcCwgd2hpY2ggaXMgaW1wb3J0YW50IHRvIG5vdGUgZm9yIEJQRiBjb250ZXh0LiBUaGUgY29kZSBzZWVtcyB0byBjYWxsIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzYCwgd2hpY2ggaXMgdGhlIGNvcmUgb2YgdGhlIHJlY2xhaW0gcHJvY2VzcywgYW5kIGl0IGxvb2tzIGxpa2Ugd2UgaGF2ZSBjb250cm9sIG92ZXIgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSB0byByZWNsYWltIGFuZCB0aGUgc3dhcHBpbmVzcyB2YWx1ZS4gIFRoZSBlbnVtIGNoYW5nZSBpbiBgbW0vaW50ZXJuYWwuaGAgaXMgYSBtaW5vciBkZXRhaWwsIGxvb2tzIGxpa2UgdGhleSBhcmUgc2ltcGx5IHVwZGF0aW5nIHRoZSB3YXkgdGhhdCBjb25zdGFudHMgYXJlIGRlZmluZWQuIFRoZXJlIGFyZSBhbHNvIGFzc29jaWF0ZWQgc2VsZnRlc3RzLlxuXG5Ob3csIGxldCdzIHJ1biB0aHJvdWdoIHRoZSBzYW5pdHkgY2hlY2tzLiBGaXJzdCwgKnJlYWNoYWJpbGl0eSouIFRoaXMgaXMgYSBCUEYga2Z1bmMsIHNvLCB5ZXMsIGl0J3MgZGVmaW5pdGVseSByZWFjaGFibGUuIFVzZXIgc3BhY2UgcHJvZ3JhbXMgY2FuIGxvYWQgYW5kIGV4ZWN1dGUgQlBGIHByb2dyYW1zIHZpYSBgc3lzX2JwZmAgb3Igd2l0aGluIG90aGVyIGNvbnRleHRzIGxpa2UgYGJwZl93cWAuIEdvb2QuIFNlY29uZCwgKmNvcmUgc3Vic3lzdGVtKi4gQlBGICphbmQqIE1lbW9yeSBNYW5hZ2VtZW50IChtZW1jZykgLS0gdGhhdCdzIGRlZmluaXRlbHkgYSBjb3JlIGFyZWEsIHNvIHdlJ3JlIGdvb2QgdGhlcmUuIFRoaXJkLCBkb2VzIGl0ICptb2RpZnkqIGtlcm5lbCBleGVjdXRhYmxlIGNvZGU/ICBZZXMsIGFkZGluZyBhIG5ldyBrZnVuYyAqZGVmaW5pdGVseSogbW9kaWZpZXMga2VybmVsIGNvZGUuXG5cblNvLCBpdCdzICpyZWFjaGJsZSosIGl0cyBpbiBhICpjb3JlIHN1YnN5c3RlbSosIGFuZCBpdCAqbW9kaWZpZXMqIGV4ZWN1dGFibGUgY29kZS4gVGhpcyBpcyBhIGNydWNpYWwgYXJlYS5cblxuSSBuZWVkIHRvIGNvbmZpcm0gaWYgdGhlcmUgYXJlIGFueSBLY29uZmlnIGRlcGVuZGVuY2llcywgb3Igb3RoZXIgaW1wb3J0YW50IGZpbGVzIGludm9sdmVkIHRvIGNvbXBsZXRlIHRoaXMgYW5hbHlzaXMuIFRpbWUgdG8gY2hlY2sgYGdyZXBwZXJgLCBgbW0vTWFrZWZpbGVgLCBvciBkaXJlY3RseSByZXZpZXcgYG1tL2JwZl9tZW1jb250cm9sLmNgIGZvciBhbnkgc3VidGxlIGNvbm5lY3Rpb25zIG9yIGNvbmZpZ3VyYXRpb24gcmVxdWlyZW1lbnRzLiBXZSBuZWVkIHRvIGJlIHRob3JvdWdoIHdpdGggcGF0Y2hlcyB0aGlzIGltcG9ydGFudC5cblxuXG4iLCJJbnB1dFRva2VucyI6MTYzMDgsIk91dHB1dFRva2VucyI6MjcsIk91dHB1dFRob3VnaHRzVG9rZW5zIjo0MzgsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNDo1Ni45NTYzMDk2ODNaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk1NjY5NTIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiYnBmX21lbWNvbnRyb2xcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL01ha2VmaWxlPTEwNj1pZmRlZiBDT05GSUdfQlBGX1NZU0NBTExcXG5tbS9NYWtlZmlsZToxMDc6b2JqLSQoQ09ORklHX01FTUNHKSArPSBicGZfbWVtY29udHJvbC5vXFxubW0vTWFrZWZpbGUtMTA4LWVuZGlmXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jPTIzMj1fX2JwZl9rZnVuY19lbmRfZGVmcygpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjMzLVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjM0OkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjM1LUJURl9JRF9GTEFHUyhmdW5jLCBicGZfZ2V0X3Jvb3RfbWVtX2Nncm91cCwgS0ZfQUNRVUlSRSB8IEtGX1JFVF9OVUxMKVxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYz0yNDM9QlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9tZW1fY2dyb3VwX2ZsdXNoX3N0YXRzLCBLRl9TTEVFUEFCTEUpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDQtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNDU6QlRGX0tGVU5DU19FTkQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjQ2LVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ3OkJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNDgtQlRGX0lEX0ZMQUdTKGZ1bmMsIGJwZl9wcm9hY3RpdmVfcmVjbGFpbSwgS0ZfU0xFRVBBQkxFKVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjQ5OkJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxcbm1tL2JwZl9tZW1jb250cm9sLmMtMjUwLVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjUxOnN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9rZnVuY19zZXQgPSB7XFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTItXFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNTM6XFx0LnNldCAgICAgICAgICAgID0gXFx1MDAyNmJwZl9tZW1jb250cm9sX2tmdW5jcyxcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1NC19O1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjU1LVxcbm1tL2JwZl9tZW1jb250cm9sLmM6MjU2OnN0YXRpYyBjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCBicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCA9IHtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI1Ny1cXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI1ODpcXHQuc2V0ICAgICAgICAgICAgPSBcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY3MsXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNTktfTtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2MC1cXG5tbS9icGZfbWVtY29udHJvbC5jOjI2MTpzdGF0aWMgaW50IF9faW5pdCBicGZfbWVtY29udHJvbF9pbml0KHZvaWQpXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjIte1xcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yNjUtXFx0ZXJyID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQyxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI2NjpcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0KTtcXG5tbS9icGZfbWVtY29udHJvbC5jLTI2Ny1cXHRpZiAoZXJyKSB7XFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTI3Mi1cXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCxcXG5tbS9icGZfbWVtY29udHJvbC5jOjI3MzpcXHRcXHRcXHRcXHRcXHRcXHUwMDI2YnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQpO1xcbm1tL2JwZl9tZW1jb250cm9sLmMtMjc0LVxcdGlmIChlcnIpXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTI3OC19XFxubW0vYnBmX21lbWNvbnRyb2wuYzoyNzk6bGF0ZV9pbml0Y2FsbChicGZfbWVtY29udHJvbF9pbml0KTtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTQ6NTcuMDA1ODgxMTM2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Nzk2NzgwODI1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgYnBmX21lbWNvbnRyb2wuYydzIEtjb25maWcgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSdtIGRpdmluZyBpbnRvIHRoZSBLY29uZmlnIHJlcXVpcmVtZW50cyBmb3IgYG1tL2JwZl9tZW1jb250cm9sLmNgLiBGaXJzdCwgSSdsbCBxdWlja2x5IGNoZWNrIHRoZSBgbW0vTWFrZWZpbGVgLiBSaWdodCwgaXQgbG9va3MgbGlrZSBgQ09ORklHX0JQRl9TWVNDQUxMYCBhbmQgYENPTkZJR19NRU1DR2AgYXJlIHRoZSBjb3JlIGRlcGVuZGVuY2llcywgYW5kIHRoZXkgbXVzdCBib3RoIGJlIHNldC4gTmV4dCwgSSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGBDT05GSUdfREVCVUdfSU5GT19CVEZgIGlzIGFsc28gZW5hYmxlZCwgc2luY2UgdGhhdCdzIHVzdWFsbHkgcmVxdWlyZWQgZm9yIEJURiByZWdpc3RyYXRpb24sIGtmdW5jIHJlc29sdXRpb24sIGFuZCB0aGUgcmVsYXRlZCBwcm9jZXNzZXMuXG5cbk5vdywgSSdsbCB6ZXJvIGluIG9uIGByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0YC4gSSB3YW50IHRvIHZlcmlmeSB0aGF0IGBCUEZfU1lTQ0FMTGAsIGBNRU1DR2AsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBpbmRlZWQgKnRoZSogbWFpbiBkcml2ZXJzLCBvciBpZiB0aGVyZSBhcmUgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGludm9sdmVkIGhlcmUuIFNvLCBsZXQncyB0cmFjayBkb3duIHRoZSBkZWZpbml0aW9uIG9mIGByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0YCBhbmQgc2VlIHdoYXQgZWxzZSBtaWdodCBiZSBsdXJraW5nIGluIHRoZXJlLiBHb3R0YSBjb3ZlciBhbGwgdGhlIGJhc2VzIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxODE2NSwiT3V0cHV0VG9rZW5zIjozNiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjE1NywiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTowNC45NzM2OTIzMDRaIiwiU2VxIjo2LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDg0ODMzMDIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwicmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldFwiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJrZXJuZWwvYnBmL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJrZXJuZWwvYnBmL2FyZW5hLmM9MTEzMT1zdGF0aWMgaW50IF9faW5pdCBrZnVuY19pbml0KHZvaWQpXFxua2VybmVsL2JwZi9hcmVuYS5jLTExMzIte1xcbmtlcm5lbC9icGYvYXJlbmEuYzoxMTMzOlxcdHJldHVybiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2Y29tbW9uX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9hcmVuYS5jLTExMzQtfVxcbi0tXFxua2VybmVsL2JwZi9idGYuYz04OTQyPXN0YXRpYyBpbnQgYnRmX3BvcHVsYXRlX2tmdW5jX3NldChzdHJ1Y3QgYnRmICpidGYsIGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcXG4tLVxcbmtlcm5lbC9icGYvYnRmLmMtODk4OC1cXHRzZXQgPSB0YWItXFx1MDAzZXNldHNbaG9va107XFxua2VybmVsL2JwZi9idGYuYzo4OTg5OlxcdC8qIFdhcm4gd2hlbiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0IGlzIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgaG9va1xcbmtlcm5lbC9icGYvYnRmLmMtODk5MC1cXHQgKiBmb3IgbW9kdWxlIHNldHMuXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTkyMTM9dTMyICpidGZfa2Z1bmNfaXNfbW9kaWZ5X3JldHVybihjb25zdCBzdHJ1Y3QgYnRmICpidGYsIHUzMiBrZnVuY19idGZfaWQsXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjEtXFxua2VybmVsL2JwZi9idGYuYzo5MjIyOnN0YXRpYyBpbnQgX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnRmX2tmdW5jX2hvb2sgaG9vayxcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyMjMtXFx0XFx0XFx0XFx0ICAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy05MjQ4LS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIG9ubHkgZnJvbSBpbml0Y2FsbHMvbW9kdWxlIGluaXQgZnVuY3Rpb25zICovXFxua2VybmVsL2JwZi9idGYuYzo5MjQ5OmludCByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsXFxua2VybmVsL2JwZi9idGYuYy05MjUwLVxcdFxcdFxcdCAgICAgIGNvbnN0IHN0cnVjdCBidGZfa2Z1bmNfaWRfc2V0ICprc2V0KVxcbi0tXFxua2VybmVsL2JwZi9idGYuYy05MjYyLVxcdGhvb2sgPSBicGZfcHJvZ190eXBlX3RvX2tmdW5jX2hvb2socHJvZ190eXBlKTtcXG5rZXJuZWwvYnBmL2J0Zi5jOjkyNjM6XFx0cmV0dXJuIF9fcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChob29rLCBrc2V0KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjQtfVxcbmtlcm5lbC9icGYvYnRmLmM6OTI2NTpFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KTtcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjYtXFxuLS1cXG5rZXJuZWwvYnBmL2J0Zi5jPTkyNjg9aW50IHJlZ2lzdGVyX2J0Zl9mbW9kcmV0X2lkX3NldChjb25zdCBzdHJ1Y3QgYnRmX2tmdW5jX2lkX3NldCAqa3NldClcXG5rZXJuZWwvYnBmL2J0Zi5jLTkyNjkte1xcbmtlcm5lbC9icGYvYnRmLmM6OTI3MDpcXHRyZXR1cm4gX19yZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJURl9LRlVOQ19IT09LX0ZNT0RSRVQsIGtzZXQpO1xcbmtlcm5lbC9icGYvYnRmLmMtOTI3MS19XFxuLS1cXG5rZXJuZWwvYnBmL2NwdW1hc2suYz01MTU9c3RhdGljIGludCBfX2luaXQgY3B1bWFza19rZnVuY19pbml0KHZvaWQpXFxuLS1cXG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjUtXFx0cmV0ID0gYnBmX21lbV9hbGxvY19pbml0KFxcdTAwMjZicGZfY3B1bWFza19tYSwgc2l6ZW9mKHN0cnVjdCBicGZfY3B1bWFzayksIGZhbHNlKTtcXG5rZXJuZWwvYnBmL2NwdW1hc2suYzo1MjY6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9UUkFDSU5HLCBcXHUwMDI2Y3B1bWFza19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3B1bWFzay5jOjUyNzpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFxcdTAwMjZjcHVtYXNrX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcHVtYXNrLmM6NTI4OlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCwgXFx1MDAyNmNwdW1hc2tfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NwdW1hc2suYy01MjktXFx0cmV0dXJuICByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGNwdW1hc2tfZHRvcnMsXFxuLS1cXG5rZXJuZWwvYnBmL2NyeXB0by5jPTM3OT1zdGF0aWMgaW50IF9faW5pdCBjcnlwdG9fa2Z1bmNfaW5pdCh2b2lkKVxcbi0tXFxua2VybmVsL2JwZi9jcnlwdG8uYy0zODgtXFxua2VybmVsL2JwZi9jcnlwdG8uYzozODk6XFx0cmV0ID0gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywgXFx1MDAyNmNyeXB0X2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9jcnlwdG8uYzozOTA6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TQ0hFRF9BQ1QsIFxcdTAwMjZjcnlwdF9rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvY3J5cHRvLmM6MzkxOlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfWERQLCBcXHUwMDI2Y3J5cHRfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2NyeXB0by5jOjM5MjpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsXFxua2VybmVsL2JwZi9jcnlwdG8uYy0zOTMtXFx0XFx0XFx0XFx0XFx0ICAgICAgIFxcdTAwMjZjcnlwdF9pbml0X2tmdW5jX3NldCk7XFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYz00OTgyPXN0YXRpYyBpbnQgX19pbml0IGtmdW5jX2luaXQodm9pZClcXG4tLVxcbmtlcm5lbC9icGYvaGVscGVycy5jLTQ5OTctXFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NDk5ODpcXHRyZXQgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVFJBQ0lORywgXFx1MDAyNmdlbmVyaWNfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL2hlbHBlcnMuYzo0OTk5OlxcdHJldCA9IHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLCBcXHUwMDI2Z2VuZXJpY19rZnVuY19zZXQpO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDA6XFx0cmV0ID0gcmV0ID86IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9YRFAsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMTpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NUUlVDVF9PUFMsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMjpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1NZU0NBTEwsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmM6NTAwMzpcXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX0NHUk9VUF9TS0IsIFxcdTAwMjZnZW5lcmljX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwNC1cXHRyZXQgPSByZXQgPzogcmVnaXN0ZXJfYnRmX2lkX2R0b3Jfa2Z1bmNzKGdlbmVyaWNfZHRvcnMsXFxuLS1cXG5rZXJuZWwvYnBmL2hlbHBlcnMuYy01MDA2LVxcdFxcdFxcdFxcdFxcdFxcdCAgVEhJU19NT0RVTEUpO1xcbmtlcm5lbC9icGYvaGVscGVycy5jOjUwMDc6XFx0cmV0dXJuIHJldCA/OiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2Y29tbW9uX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9oZWxwZXJzLmMtNTAwOC19XFxuLS1cXG5rZXJuZWwvYnBmL21hcF9pdGVyLmM9MjMwPXN0YXRpYyBpbnQgaW5pdF9zdWJzeXN0ZW0odm9pZClcXG5rZXJuZWwvYnBmL21hcF9pdGVyLmMtMjMxLXtcXG5rZXJuZWwvYnBmL21hcF9pdGVyLmM6MjMyOlxcdHJldHVybiByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLCBcXHUwMDI2YnBmX21hcF9pdGVyX2tmdW5jX3NldCk7XFxua2VybmVsL2JwZi9tYXBfaXRlci5jLTIzMy19XFxuLS1cXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYz03NTk9c3RhdGljIF9faW5pdCBpbnQgcnFzcGlubG9ja19yZWdpc3Rlcl9rZnVuY3Modm9pZClcXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYy03NjAte1xcbmtlcm5lbC9icGYvcnFzcGlubG9jay5jOjc2MTpcXHRyZXR1cm4gcmVnaXN0ZXJfYnRmX2tmdW5jX2lkX3NldChCUEZfUFJPR19UWVBFX1VOU1BFQywgXFx1MDAyNnJxc3BpbmxvY2tfa2Z1bmNfc2V0KTtcXG5rZXJuZWwvYnBmL3Jxc3BpbmxvY2suYy03NjItfVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTowNS4wMjIxODE5NDZaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozOTk0Nzk1NTM3LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkV4YW1pbmluZyB0aGUgQlBGIE1lbW9yeSBDb250cm9sIENvZGUqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhlIGBtbS9icGZfbWVtY29udHJvbC5jYCBmaWxlLiBNeSBwcmltYXJ5IGludGVyZXN0IHJpZ2h0IG5vdyBpcyB0aGUgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgc3ltYm9sLiBJJ20gbm90aW5nIHRoYXQgaXQncyBkZWZpbmVkIGFzIGEga2Z1bmMsIHdoaWNoIGlzIGNyaXRpY2FsIGZvciB1bmRlcnN0YW5kaW5nIGl0cyByb2xlIHdpdGhpbiB0aGUga2VybmVsLiBCZWZvcmUgSSBnZXQgdG9vIGRlZXAgaW50byB0aGF0IHNwZWNpZmljIGZ1bmN0aW9uLCBJJ2xsIHF1aWNrbHkgc2NhbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gSSB3YW50IHRvIGJ1aWxkIGEgbW9yZSBob2xpc3RpYyBwaWN0dXJlIOKAkyBzZWUgd2hhdCBvdGhlciBmdW5jdGlvbmFsaXRpZXMgYXJlIGltcGxlbWVudGVkIHdpdGhpbiBgYnBmX21lbWNvbnRyb2wuY2AgdGhhdCBtaWdodCBpbnRlcmFjdCB3aXRoLCBvciBiZSByZWxhdGVkIHRvLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQncyBhbHdheXMgYmVuZWZpY2lhbCB0byBoYXZlIHRoYXQgY29udGV4dHVhbCBhd2FyZW5lc3MgYmVmb3JlIEkgc3RhcnQgZGlzc2VjdGluZyB0aGUgaW5kaXZpZHVhbCBwaWVjZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjIwNjIzLCJPdXRwdXRUb2tlbnMiOjM1LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NjMsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MDkuMDE2OTc5NzE0WiIsIlNlcSI6OCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoicmVhZC1maWxlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NzE2NDksIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vYnBmX21lbWNvbnRyb2wuY1wiLFxuICBcIkZpcnN0TGluZVwiOiAxLFxuICBcIkxpbmVDb3VudFwiOiA4MFxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiQ29udGVudHNcIjogXCIgICAxOlxcdC8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9yLWxhdGVyXFxuICAgMjpcXHQvKlxcbiAgIDM6XFx0ICogTWVtb3J5IENvbnRyb2xsZXItcmVsYXRlZCBCUEYga2Z1bmNzIGFuZCBhdXhpbGlhcnkgY29kZVxcbiAgIDQ6XFx0ICpcXG4gICA1OlxcdCAqIEF1dGhvcjogUm9tYW4gR3VzaGNoaW4gXFx1MDAzY3JvbWFuLmd1c2hjaGluQGxpbnV4LmRldlxcdTAwM2VcXG4gICA2OlxcdCAqL1xcbiAgIDc6XFx0XFxuICAgODpcXHQjaW5jbHVkZSBcXHUwMDNjbGludXgvbWVtY29udHJvbC5oXFx1MDAzZVxcbiAgIDk6XFx0I2luY2x1ZGUgXFx1MDAzY2xpbnV4L2JwZi5oXFx1MDAzZVxcbiAgMTA6XFx0XFxuICAxMTpcXHQjaW5jbHVkZSBcXFwiaW50ZXJuYWwuaFxcXCJcXG4gIDEyOlxcdFxcbiAgMTM6XFx0X19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xcbiAgMTQ6XFx0XFxuICAxNTpcXHQvKipcXG4gIDE2OlxcdCAqIGJwZl9nZXRfcm9vdF9tZW1fY2dyb3VwIC0gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHJvb3QgbWVtb3J5IGNncm91cFxcbiAgMTc6XFx0ICpcXG4gIDE4OlxcdCAqIFRoZSBmdW5jdGlvbiBoYXMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MsIGV2ZW4gdGhvdWdoIHRoZSByb290IG1lbW9yeVxcbiAgMTk6XFx0ICogY2dyb3VwIGlzIG5ldmVyIGRlc3Ryb3llZCBhZnRlciBiZWluZyBjcmVhdGVkIGFuZCBkb2Vzbid0IHJlcXVpcmVcXG4gIDIwOlxcdCAqIHJlZmVyZW5jZSBjb3VudGluZy4gQW5kIGl0J3MgcGVyZmVjdGx5IHNhZmUgdG8gcGFzcyBpdCB0b1xcbiAgMjE6XFx0ICogYnBmX3B1dF9tZW1fY2dyb3VwKClcXG4gIDIyOlxcdCAqXFxuICAyMzpcXHQgKiBSZXR1cm46IEEgcG9pbnRlciB0byB0aGUgcm9vdCBtZW1vcnkgY2dyb3VwLlxcbiAgMjQ6XFx0ICovXFxuICAyNTpcXHRfX2JwZl9rZnVuYyBzdHJ1Y3QgbWVtX2Nncm91cCAqYnBmX2dldF9yb290X21lbV9jZ3JvdXAodm9pZClcXG4gIDI2OlxcdHtcXG4gIDI3OlxcdFxcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkpXFxuICAyODpcXHRcXHRcXHRyZXR1cm4gTlVMTDtcXG4gIDI5OlxcdFxcbiAgMzA6XFx0XFx0LyogY3NzX2dldCgpIGlzIG5vdCBuZWVkZWQgKi9cXG4gIDMxOlxcdFxcdHJldHVybiByb290X21lbV9jZ3JvdXA7XFxuICAzMjpcXHR9XFxuICAzMzpcXHRcXG4gIDM0OlxcdC8qKlxcbiAgMzU6XFx0ICogYnBmX2dldF9tZW1fY2dyb3VwIC0gR2V0IGEgcmVmZXJlbmNlIHRvIGEgbWVtb3J5IGNncm91cFxcbiAgMzY6XFx0ICogQGNzczogcG9pbnRlciB0byB0aGUgY3NzIHN0cnVjdHVyZVxcbiAgMzc6XFx0ICpcXG4gIDM4OlxcdCAqIEl0J3MgZmluZSB0byBwYXNzIGEgY3NzIHdoaWNoIGJlbG9uZ3MgdG8gYW55IGNncm91cCBjb250cm9sbGVyLFxcbiAgMzk6XFx0ICogZS5nLiB1bmlmaWVkIGhpZXJhcmNoeSdzIG1haW4gY3NzLlxcbiAgNDA6XFx0ICpcXG4gIDQxOlxcdCAqIEltcGxlbWVudHMgS0ZfQUNRVUlSRSBzZW1hbnRpY3MuXFxuICA0MjpcXHQgKlxcbiAgNDM6XFx0ICogUmV0dXJuOiBBIHBvaW50ZXIgdG8gYSBtZW1fY2dyb3VwIHN0cnVjdHVyZSBhZnRlciBidW1waW5nXFxuICA0NDpcXHQgKiB0aGUgY29ycmVzcG9uZGluZyBjc3MncyByZWZlcmVuY2UgY291bnRlci5cXG4gIDQ1OlxcdCAqL1xcbiAgNDY6XFx0X19icGZfa2Z1bmMgc3RydWN0IG1lbV9jZ3JvdXAgKlxcbiAgNDc6XFx0YnBmX2dldF9tZW1fY2dyb3VwKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpXFxuICA0ODpcXHR7XFxuICA0OTpcXHRcXHRzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBOVUxMO1xcbiAgNTA6XFx0XFx0Ym9vbCByY3VfdW5sb2NrID0gZmFsc2U7XFxuICA1MTpcXHRcXG4gIDUyOlxcdFxcdGlmIChtZW1fY2dyb3VwX2Rpc2FibGVkKCkgfHwgIXJvb3RfbWVtX2Nncm91cClcXG4gIDUzOlxcdFxcdFxcdHJldHVybiBOVUxMO1xcbiAgNTQ6XFx0XFxuICA1NTpcXHRcXHRpZiAocm9vdF9tZW1fY2dyb3VwLVxcdTAwM2Vjc3Muc3MgIT0gY3NzLVxcdTAwM2Vzcykge1xcbiAgNTY6XFx0XFx0XFx0c3RydWN0IGNncm91cCAqY2dyb3VwID0gY3NzLVxcdTAwM2VjZ3JvdXA7XFxuICA1NzpcXHRcXHRcXHRpbnQgc3NpZCA9IHJvb3RfbWVtX2Nncm91cC1cXHUwMDNlY3NzLnNzLVxcdTAwM2VpZDtcXG4gIDU4OlxcdFxcbiAgNTk6XFx0XFx0XFx0cmN1X3JlYWRfbG9jaygpO1xcbiAgNjA6XFx0XFx0XFx0cmN1X3VubG9jayA9IHRydWU7XFxuICA2MTpcXHRcXHRcXHRjc3MgPSByY3VfZGVyZWZlcmVuY2VfcmF3KGNncm91cC1cXHUwMDNlc3Vic3lzW3NzaWRdKTtcXG4gIDYyOlxcdFxcdH1cXG4gIDYzOlxcdFxcbiAgNjQ6XFx0XFx0aWYgKGNzcyBcXHUwMDI2XFx1MDAyNiBjc3NfdHJ5Z2V0KGNzcykpXFxuICA2NTpcXHRcXHRcXHRtZW1jZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCBtZW1fY2dyb3VwLCBjc3MpO1xcbiAgNjY6XFx0XFxuICA2NzpcXHRcXHRpZiAocmN1X3VubG9jaylcXG4gIDY4OlxcdFxcdFxcdHJjdV9yZWFkX3VubG9jaygpO1xcbiAgNjk6XFx0XFxuICA3MDpcXHRcXHRyZXR1cm4gbWVtY2c7XFxuICA3MTpcXHR9XFxuICA3MjpcXHRcXG4gIDczOlxcdC8qKlxcbiAgNzQ6XFx0ICogYnBmX3B1dF9tZW1fY2dyb3VwIC0gUHV0IGEgcmVmZXJlbmNlIHRvIGEgbWVtb3J5IGNncm91cFxcbiAgNzU6XFx0ICogQG1lbWNnOiBtZW1vcnkgY2dyb3VwIHRvIHJlbGVhc2VcXG4gIDc2OlxcdCAqXFxuICA3NzpcXHQgKiBSZWxlYXNlcyBhIHByZXZpb3VzbHkgYWNxdWlyZWQgbWVtY2cgcmVmZXJlbmNlLlxcbiAgNzg6XFx0ICogSW1wbGVtZW50cyBLRl9SRUxFQVNFIHNlbWFudGljcy5cXG4gIDc5OlxcdCAqL1xcbiAgODA6XFx0X19icGZfa2Z1bmMgdm9pZCBicGZfcHV0X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTowOS4wMTcwNTI3MDNaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjozODU3NjIzMTc5LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJPa2F5LCBoZXJlJ3MgbXkgdGFrZSBvbiB0aG9zZSB0aG91Z2h0cywgdGFpbG9yZWQgZm9yIGFuIGV4cGVydCBhdWRpZW5jZTpcblxuKipEaXZpbmcgaW50byBQcm9hY3RpdmUgUmVjbGFpbSBpbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AqKlxuXG5BbHJpZ2h0LCB0aW1lIHRvIHJlZnJlc2ggbXkgbWVtb3J5IGFuZCBkaWcgYSBiaXQgZGVlcGVyIGludG8gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIGFuZCBob3cgcHJvYWN0aXZlIHJlY2xhaW0gaW50ZXJhY3RzIHdpdGggaXQuIEkgd2FudCB0byBzZWUgaG93IHRoZSBzeXN0ZW0gaXMgKnJlYWxseSogd29ya2luZywgbm90IGp1c3QgdGhlIHN1cmZhY2UgbGV2ZWwuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBudWFuY2VzIG9mIHRoZSBwcm9hY3RpdmUgcmVjbGFpbSBsb2dpYyB3aXRoaW4gdGhhdCBmdW5jdGlvbiwgZXNwZWNpYWxseSBpbiBkaWZmZXJlbnQgc2NlbmFyaW9zLiBJJ20gdGhpbmtpbmcgYWJvdXQgdGhlIGhldXJpc3RpY3MgaW52b2x2ZWQsIHRoZSB0cmlnZ2VyaW5nIGNvbmRpdGlvbnMsIGFuZCB0aGUgYWN0dWFsIG1lY2hhbmlzbXMgaXQgdXNlcyB0byBpZGVudGlmeSBhbmQgZnJlZSBwYWdlcy4gSSdtIGtlZW4gdG8gZXhhbWluZSBob3cgaXQgYmFsYW5jZXMgcmVjbGFpbSBlZmZvcnRzIGFjcm9zcyBkaWZmZXJlbnQgbWVtb3J5IGNncm91cHMsIGVzcGVjaWFsbHkgdW5kZXIgbWVtb3J5IHByZXNzdXJlLiBTcGVjaWZpY2FsbHksIEknbSBpbnRlcmVzdGVkIGluIGhvdyBpdCBwcmlvcml0aXplcyBjZXJ0YWluIHR5cGVzIG9mIHJlY2xhaW0gKGUuZy4sIHBhZ2UgY2FjaGUsIGFub255bW91cyBwYWdlcykgZHVyaW5nIHByb2FjdGl2ZSByZWNsYWltIHZlcnN1cyByZWFjdGl2ZSByZWNsYWltLiBJJ2xsIHByb2JhYmx5IGxvb2sgYXQgdGhlIGludGVyYWN0aW9uIHdpdGggdGhlIGdsb2JhbCBMUlUgbGlzdHMgdG9vLiBJIHNob3VsZCBhbHNvIGNoZWNrIHRoZSBpbXBhY3Qgb2YgdGhpbmdzIGxpa2Ugc3dhcCBhbmQgZGlmZmVyZW50IG1lbW9yeSBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb25zIG9uIHRoaXMgcm91dGluZS4gVWx0aW1hdGVseSwgSSdtIGFpbWluZyBmb3IgYSBjbGVhciBwaWN0dXJlIG9mIGl0cyBlZmZpY2llbmN5IGFuZCBwb3RlbnRpYWwgYm90dGxlbmVja3MgaW4gYSBoaWdoLWNvbnRlbnRpb24gbWVtb3J5IGVudmlyb25tZW50LlxuXG5cbiIsIklucHV0VG9rZW5zIjoyMTk3NCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MTIuODc0Njc3ODczWiIsIlNlcSI6MTAsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MzgzOTQyMSwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJ0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9icGZfbWVtY29udHJvbC5jPTIwNz1fX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMS1cXG5tbS9icGZfbWVtY29udHJvbC5jOjIyMjpcXHRucl9yZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG5tbS9icGZfbWVtY29udHJvbC5jLTIyMy1cXHRcXHRcXHRcXHRcXHRcXHQgICAgR0ZQX0tFUk5FTCxcXG4tLVxcbm1tL2ludGVybmFsLmg9Nzc9ZW51bSB7XFxuLS1cXG5tbS9pbnRlcm5hbC5oLTg0LVxcbm1tL2ludGVybmFsLmg6ODU6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS9pbnRlcm5hbC5oLTg2LVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTc3MT1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfcmVzaXplX21heChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMTgxNS1cXG5tbS9tZW1jb250cm9sLXYxLmM6MTgxNjpcXHRcXHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXFxubW0vbWVtY29udHJvbC12MS5jLTE4MTctXFx0XFx0XFx0XFx0bWVtc3cgPyAwIDogTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpIHtcXG4tLVxcbm1tL21lbWNvbnRyb2wtdjEuYz0xODM0PXN0YXRpYyBpbnQgbWVtX2Nncm91cF9mb3JjZV9lbXB0eShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmMtMTg1MS1cXG5tbS9tZW1jb250cm9sLXYxLmM6MTg1MjpcXHRcXHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIDEsIEdGUF9LRVJORUwsXFxubW0vbWVtY29udHJvbC12MS5jLTE4NTMtXFx0XFx0XFx0XFx0XFx0XFx0ICBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yMzc4PXN0YXRpYyB1bnNpZ25lZCBsb25nIHJlY2xhaW1faGlnaChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMjM5My1cXHRcXHRwc2lfbWVtc3RhbGxfZW50ZXIoXFx1MDAyNnBmbGFncyk7XFxubW0vbWVtY29udHJvbC5jOjIzOTQ6XFx0XFx0bnJfcmVjbGFpbWVkICs9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzLFxcbm1tL21lbWNvbnRyb2wuYy0yMzk1LVxcdFxcdFxcdFxcdFxcdFxcdFxcdGdmcF9tYXNrLFxcbi0tXFxubW0vbWVtY29udHJvbC5jPTI2NDU9c3RhdGljIGludCB0cnlfY2hhcmdlX21lbWNnKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgZ2ZwX3QgZ2ZwX21hc2ssXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtMjcxNy1cXHRwc2lfbWVtc3RhbGxfZW50ZXIoXFx1MDAyNnBmbGFncyk7XFxubW0vbWVtY29udHJvbC5jOjI3MTg6XFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1fb3Zlcl9saW1pdCwgbnJfcGFnZXMsXFxubW0vbWVtY29udHJvbC5jLTI3MTktXFx0XFx0XFx0XFx0XFx0XFx0ICAgIGdmcF9tYXNrLCByZWNsYWltX29wdGlvbnMsIE5VTEwpO1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTQ4Mzg9c3RhdGljIHNzaXplX3QgbWVtb3J5X2hpZ2hfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQ4NzktXFxubW0vbWVtY29udHJvbC5jOjQ4ODA6XFx0XFx0cmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMgLSBoaWdoLFxcbm1tL21lbWNvbnRyb2wuYy00ODgxLVxcdFxcdFxcdFxcdFxcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpO1xcbi0tXFxubW0vbWVtY29udHJvbC5jPTQ4OTc9c3RhdGljIHNzaXplX3QgbWVtb3J5X21heF93cml0ZShzdHJ1Y3Qga2VybmZzX29wZW5fZmlsZSAqb2YsXFxuLS1cXG5tbS9tZW1jb250cm9sLmMtNDkzOC1cXHRcXHRpZiAobnJfcmVjbGFpbXMpIHtcXG5tbS9tZW1jb250cm9sLmM6NDkzOTpcXHRcXHRcXHRpZiAoIXRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gbWF4LFxcbm1tL21lbWNvbnRyb2wuYy00OTQwLVxcdFxcdFxcdFxcdFxcdEdGUF9LRVJORUwsIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKVxcbi0tXFxubW0vdm1zY2FuLmM9NjgxNT11bnNpZ25lZCBsb25nIG1lbV9jZ3JvdXBfc2hyaW5rX25vZGUoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vdm1zY2FuLmMtNjg1NC1cXG5tbS92bXNjYW4uYzo2ODU1OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1zY2FuLmMtNjg1Ni1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vdm1zY2FuLmMtNjg5NS0jZWxzZVxcbm1tL3Ztc2Nhbi5jOjY4OTY6dW5zaWduZWQgbG9uZyB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG5tbS92bXNjYW4uYy02ODk3LVxcdFxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsXFxuLS1cXG5tbS92bXNjYW4uYz03OTU4PWludCB1c2VyX3Byb2FjdGl2ZV9yZWNsYWltKGNoYXIgKmJ1ZixcXG4tLVxcbm1tL3Ztc2Nhbi5jLTgwMjktXFx0XFx0XFx0XFx0XFx0ICBNRU1DR19SRUNMQUlNX1BST0FDVElWRTtcXG5tbS92bXNjYW4uYzo4MDMwOlxcdFxcdFxcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csXFxubW0vdm1zY2FuLmMtODAzMS1cXHRcXHRcXHRcXHRcXHRcXHQgYmF0Y2hfc2l6ZSwgZ2ZwX21hc2ssXFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjEyLjkyODUyNzM0NVoiLCJTZXEiOjExLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo5NjczMzAyNDc0LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBhIEtlcm5lbCBQYXRjaCBmb3IgRnV6emluZyBQb3RlbnRpYWwqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIEZpcnN0LCBJIG5lZWQgdG8gaWRlbnRpZnkgdGhlIGtleSBrZXJuZWwgY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIHBhdGNoIHJlbGllcyBvbi4gQmFzZWQgb24gdGhlIGluaXRpYWwgY2hlY2tzLCBpdCBsb29rcyBsaWtlIGBNRU1DR2AsIGBCUEZfU1lTQ0FMTGAsIGFuZCBgREVCVUdfSU5GT19CVEZgIGFyZSBlc3NlbnRpYWwuIGBERUJVR19JTkZPX0JURmAgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBzaW5jZSBpdCdzIHJlcXVpcmVkIGZvciBib3RoIEJURiBhbmQga2Z1bmNzLCB3aGljaCBhcmUgY2VudHJhbCB0byB0aGlzIHBhdGNoLlxuXG5OZXh0LCBJIG5lZWQgdG8gcGlucG9pbnQgdGhlIGNyaXRpY2FsIGZ1bmN0aW9ucyB0aGlzIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXMuIFRoZSBmb2N1cyBzZWVtcyB0byBiZSBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSSBzaG91bGQgZG91YmxlIGNoZWNrIGlmIGBicGZfbWVtY29udHJvbF9pbml0YCBpcyBhIGxhdGVfaW5pdGNhbGwsIGJ1dCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCBsb29rcyB0byBiZSB0aGUgcmVhbCBrZnVuYyBlbnRyeXBvaW50LlxuXG5Ob3csIGxldCdzIGFzc2VzcyB0aGUgZnV6emluZyBwb3RlbnRpYWwuIFRoZSBwYXRjaCB0b3VjaGVzIGNyaXRpY2FsIHN1YnN5c3RlbXM6IEJQRiBhbmQgTWVtb3J5IE1hbmFnZW1lbnQuIEEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIGlzIGFkZGVkLiBDcnVjaWFsbHksIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgY2FsbHMgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgLCBhbmQgdGhlIGFyZ3VtZW50cyAoc2l6ZSwgc3dhcHBpbmVzcykgc2VlbSB1c2VyLWNvbnRyb2xsYWJsZS4gVGhlIHBhdGNoIGFsc28gcmVnaXN0ZXJzIHRoaXMga2Z1bmMgZm9yIGBCUEZfUFJPR19UWVBFX1NZU0NBTExgLCBtYWtpbmcgaXQgZGVmaW5pdGVseSBleGVjdXRhYmxlIGNvZGUgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgLiBUaGlzIGlzICpkZWZpbml0ZWx5KiB3b3J0aCBmdXp6aW5nLlxuXG5UbyBzdW1tYXJpemUgdGhlIHJlcXVpcmVtZW50czogV2UgbmVlZCBgQlBGX1NZU0NBTExgLCBgTUVNQ0dgLCBhbmQgYERFQlVHX0lORk9fQlRGYCBlbmFibGVkLiBUaGUgbWFpbiBmdW5jdGlvbiB0byBmb2N1cyBvbiBpcyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQncyBsb2NhdGVkIGluIGBtbS9icGZfbWVtY29udHJvbC5jYC5cblxuT2theSwgSSdtIHJlYWR5IHRvIHByZXBhcmUgdGhlIHRvb2wgY2FsbCBub3cuIEkgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgZm9ybWF0IGlzIGNvcnJlY3Q6IFRoZSBlbmFibGUgY29uZmlndXJhdGlvbnMgYXJlIHN0cmlwcGVkIG9mIHRoZSBgQ09ORklHX2AgcHJlZml4LiBUaGUgZm9jdXMgc3ltYm9sIGlzIHRoYXQgbmV3IGZ1bmN0aW9uLiBJIGhhdmUgYSBjb25jaXNlIGV4cGxhbmF0aW9uIGZvciB0aGUgcmVhc29uaW5nLCBhbmQgdGhlIGBXb3J0aEZ1enppbmdgIGZsYWcgaXMgc2V0IHRvIHRydWUuIFRpbWUgdG8gYXNzZW1ibGUgdGhlIGRhdGEgYW5kIGdldCB0aGlzIGludG8gdGhlIGZ1enplci5cblxuXG4iLCJJbnB1dFRva2VucyI6MjM1NTUsIk91dHB1dFRva2VucyI6MTI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6Mzg4LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjIyLjYwMTgzMTkxOFoiLCJTZXEiOjEyLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjgxOTI4NDU3LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJCUEZfU1lTQ0FMTFwiLFxuICAgIFwiTUVNQ0dcIixcbiAgICBcIkRFQlVHX0lORk9fQlRGXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwiYnBmX3Byb2FjdGl2ZV9yZWNsYWltXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAgaW4gbW0vYnBmX21lbWNvbnRyb2wuYywgZXhwb3NpbmcgcHJvYWN0aXZlIG1lbW9yeSBjZ3JvdXAgcmVjbGFpbSBmdW5jdGlvbmFsaXR5IHRvIHNsZWVwYWJsZSBCUEYgc3lzY2FsbCBwcm9ncmFtcy4gVGhpcyBtb2RpZmllcyBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGFuZCBCUEYgc3Vic3lzdGVtIGxvZ2ljIGFuZCBpcyByZWFjaGFibGUgdmlhIEJQRiBwcm9ncmFtIGV4ZWN1dGlvbi5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MjIuNjgzNzY2ODE1WiIsIlNlcSI6MTMsIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjozMjM5MDU1OTY5MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjIyLjY4NDIxMDkzNVoiLCJTZXEiOjE0LCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjMyMzkwMTExODYwLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCBhZGRzIGEgbmV3IHNsZWVwYWJsZSBCUEYga2Z1bmMgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbSgpYCBpbiBgbW0vYnBmX21lbWNvbnRyb2wuY2AgYWxvbmcgd2l0aCBjb3JyZXNwb25kaW5nIEJQRiBzZWxmdGVzdHMuIFRoZSBrZnVuYyBhY2NlcHRzIHByaW1pdGl2ZSBzY2FsYXIgYXJndW1lbnRzIChgbWVtY2dgLCBgc2l6ZWAsIGBzd2FwcGluZXNzYCksIHZhbGlkYXRlcyB0aGUgcGFyYW1ldGVycywgYW5kIGRlbGVnYXRlcyB0byB0aGUgZXhpc3Rpbmcga2VybmVsIHJlY2xhaW0gaW5mcmFzdHJ1Y3R1cmUgdmlhIGB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKClgLiBcXG5cXG5UaGVyZSBhcmUgbm8gdW5pbml0aWFsaXplZCBtZW1vcnkgcmlza3M6XFxuMS4gTm8gdW5pbml0aWFsaXplZCBtZW1vcnkgYWxsb2NhdGlvbnMgb24gc3RhY2sgb3IgaGVhcCBhcmUgaW50cm9kdWNlZCBvciByZWFkLiBBbGwgbG9jYWwgdmFyaWFibGVzIGFuZCBwYXJhbWV0ZXJzIGFyZSBzY2FsYXIgdHlwZXMgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gdXNlLlxcbjIuIE5vIGRhdGEgc3RydWN0dXJlcyB3aXRoIHVuaW5pdGlhbGl6ZWQgcGFkZGluZyBvciBmaWVsZHMgYXJlIGNvcGllZCB0byB1c2VyIHNwYWNlIG9yIGV4cG9zZWQgdmlhIGlvY3Rscy9zeXNmcy9uZXRsaW5rL0JQRiBidWZmZXJzLlxcbjMuIFBvdGVudGlhbCBjb25jdXJyZW5jeSwgbG9ja2luZywgb3IgbWVtb3J5LXNhZmV0eSBidWdzIChlLmcuIHNsZWVwYWJsZSBrZnVuYyBjb250ZXh0IHJlcXVpcmVtZW50cywgY2dyb3VwIHBvaW50ZXIgdmFsaWRpdHksIGxvY2tpbmcgZGVhZGxvY2tzKSBhcmUgbW9uaXRvcmVkIGJ5IHN0YW5kYXJkIGRlYnVnZ2luZyBmYWNpbGl0aWVzIChLQVNBTiwgTE9DS0RFUCwgUFJPVkVfTE9DS0lORykuXFxuXFxuVGh1cywgYSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGlzIG5vdCB3YXJyYW50ZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiWW91IGFyZSBhbiBleHBlcnQgTGludXgga2VybmVsIHNlY3VyaXR5IGVuZ2luZWVyIHNwZWNpYWxpemluZyBpbiBrZXJuZWwgbWVtb3J5XG5lcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZFxuZGV0ZXJtaW5lIGlmIHRoZSBjb2RlIGNoYW5nZXMganVzdGlmeSBzcGF3bmluZyBhIGRlZGljYXRlZCBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKVxuZnV6emluZyBzZXNzaW9uIGluIGFkZGl0aW9uIHRvIHN0YW5kYXJkIEtBU0FOIGZ1enppbmcuXG5cbkNSSVRJQ0FMIERJU1RJTkNUSU9OIEJFVFdFRU4gS0FTQU4gQU5EIEtNU0FOOlxuLSBTdGFuZGFyZCBLQVNBTiBrZXJuZWwgYnVpbGRzICh1cHN0cmVhbS1hcHBhcm1vci1rYXNhbi5jb25maWcpIGFscmVhZHkgZW5hYmxlXG4gIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTlxuICAob3V0LW9mLWJvdW5kcyBhY2Nlc3NlcywgdXNlLWFmdGVyLWZyZWUsIGRvdWJsZSBmcmVlLCBpbnZhbGlkIGZyZWUpLCBMT0NLREVQXG4gIChsb2NraW5nIGJ1Z3MgYW5kIGRlYWRsb2NrcyksIFVCLXNhbml0aXplcnMsIGFuZCBtZW1vcnkgY29ycnVwdGlvbiBjaGVja3MuXG4tIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLFxuICBvciBwYWdlIGFsbG9jYXRpb25zKSBhbmQga2VybmVsLXRvLXVzZXIgbWVtb3J5IGluZm8tbGVha3MuXG5cblJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sXG5MT0NLREVQLCBPUiBPVEhFUiBTVEFOREFSRCBCVUcgREVURUNUT1JTLlxuQSBkZWRpY2F0ZWQgS01TQU4gZnV6emluZyBzZXNzaW9uIGluY3VycyBzaWduaWZpY2FudCByZXNvdXJjZSBjb3N0cy4gWW91IG11c3QgT05MWVxuc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3NcbnRoYXQgYXJlIGRldGVjdGVkIE9OTFkgYnkgS01TQU4uXG5cbkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0XG51bmluaXRpYWxpemVkIGZpZWxkIGFjY2Vzc2VzIG9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbnMgYXJlIGFkZGVkIGluIHRoZSBkaWZmIGl0c2VsZixcbmEgcGF0Y2ggbWF5IGFsdGVyIGNvbnRyb2wgZmxvdywgYm91bmRzIGNoZWNraW5nLCBvciBkYXRhIGxlbmd0aCBjYWxjdWxhdGlvbnMgaW4gd2F5c1xudGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmdcbnVuaW5pdGlhbGl6ZWQgc3RhY2svaGVhcCBtZW1vcnkgdG8gYmUgcmVhZCwgY29waWVkIHRvIHVzZXIgc3BhY2UsIG9yIHVzZWQgaW4gY29udHJvbFxuZmxvdykuIERvIG5vdCBoZXNpdGF0ZSB0byB1c2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlLFxuY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuXG5cblNldCBOZWVkc0tNU0FOPXRydWUgT05MWSBJRiB0aGUgcGF0Y2ggaW50cm9kdWNlcyBvciBtb2RpZmllczpcbjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiXG4gICBhdHRyaWJ1dGVzLCBpb2N0bCBvdXRwdXQgYXJndW1lbnRzLCBzb2NrZXQgb3B0aW9ucywgb3IgQlBGIGJ1ZmZlcnMpIHdoZXJlIGZpZWxkc1xuICAgb3Igc3RydWN0dXJlIHBhZGRpbmcgbWlnaHQgbm90IGJlIGZ1bGx5IGluaXRpYWxpemVkL3plcm9lZC5cbjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXNcbiAgIG9yIHN0cnVjdCBmaWVsZHMuXG4zLiBBbGxvY2F0aW9uIG9yIGluaXRpYWxpemF0aW9uIG9mIGNvbXBsZXggZGF0YSBzdHJ1Y3R1cmVzIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzXG4gICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLlxuNC4gQm91bmRzIGNoZWNrcywgbGVuZ3Rocywgb3IgbG9naWMgaW4gYSB3YXkgdGhhdCBhbGxvd3Mgc3Vycm91bmRpbmcgY29kZSB0byBhY2Nlc3NcbiAgIHVuaW5pdGlhbGl6ZWQgYnl0ZXMgb2YgZXhpc3RpbmcgYnVmZmVycy5cblxuU2V0IE5lZWRzS01TQU49ZmFsc2UgSUY6XG4tIFRoZSBjb2RlIGNoYW5nZXMgcHJpbWFyaWx5IHJpc2sgb3V0LW9mLWJvdW5kcyBhY2Nlc3MsIGFycmF5IG92ZXJmbG93cywgTlVMTCBwb2ludGVyXG4gIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodFxuICBieSBLQVNBTiwgTE9DS0RFUCwgb3Igc3RhbmRhcmQgYnVnIGRldGVjdG9ycykuXG4tIEFsbCBzdGFjay9oZWFwIHN0cnVjdHVyZXMgdG91Y2hlZCBvciBpbnRyb2R1Y2VkIGJ5IHRoZSBwYXRjaCBhcmUgZnVsbHkgemVyb2VkXG4gIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC5cbi0gVGhlIHBhdGNoIGRvZXMgbm90IGludHJvZHVjZSBhbnkgcmlzayBvZiB1bmluaXRpYWxpemVkIG1lbW9yeSB1c2FnZSBvciBpbmZvLWxlYWtzLlxuXG5Vc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlXG5kZXRhaWxlZCBLTVNBTlJlYXNvbmluZyBjb250cmFzdGluZyBLQVNBTiB2cyBLTVNBTiBhcHBsaWNhYmlsaXR5IGZvciB0aGlzIHBhdGNoLlxuUHJlZmVyIGNhbGxpbmcgc2V2ZXJhbCB0b29scyBhdCB0aGUgc2FtZSB0aW1lIHRvIHNhdmUgcm91bmQtdHJpcHMuXG5cblxuVXNlIHNldC1yZXN1bHRzIHRvb2wgdG8gcHJvdmlkZSByZXN1bHRzIG9mIHRoZSBhbmFseXNpcy5cbkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LlxuSWdub3JlIHJlc3VsdHMgb2YgdGhpcyB0b29sLlxuIiwiUHJvbXB0IjoiVGFyZ2V0IGFyY2hpdGVjdHVyZTogYW1kNjRcblxuRm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6XG5jb21taXQgY2VjODUzOWI4ZTIxM2FmNmYyNWI4ZWRmZmY3YzYyOGNlZmM2NzA3N1xuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgU2VwIDExIDAzOjE0OjQ0IDIwMjYgKzAwMDBcblxuICAgIHN5ei1jbHVzdGVyOiBhcHBsaWVkIHBhdGNoIHVuZGVyIHJldmlld1xuXG5kaWZmIC0tZ2l0IGEvbW0vYnBmX21lbWNvbnRyb2wuYyBiL21tL2JwZl9tZW1jb250cm9sLmNcbmluZGV4IDcxNmRmNDlkNzY0NzcuLmQ4ODI3YmMzODhlZmMgMTAwNjQ0XG4tLS0gYS9tbS9icGZfbWVtY29udHJvbC5jXG4rKysgYi9tbS9icGZfbWVtY29udHJvbC5jXG5AQCAtOCw2ICs4LDggQEBcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9tZW1jb250cm9sLmhcdTAwM2VcbiAjaW5jbHVkZSBcdTAwM2NsaW51eC9icGYuaFx1MDAzZVxuIFxuKyNpbmNsdWRlIFwiaW50ZXJuYWwuaFwiXG4rXG4gX19icGZfa2Z1bmNfc3RhcnRfZGVmcygpO1xuIFxuIC8qKlxuQEAgLTE1OSw2ICsxNjEsNzQgQEAgX19icGZfa2Z1bmMgdm9pZCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpXG4gXHRtZW1fY2dyb3VwX2ZsdXNoX3N0YXRzKG1lbWNnKTtcbiB9XG4gXG4rLyoqXG4rICogYnBmX3Byb2FjdGl2ZV9yZWNsYWltIC0gcHJvYWN0aXZlbHkgcmVjbGFpbSBtZW1vcnkgZnJvbSBhIG1lbW9yeVxuKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNncm91cFxuKyAqIEBtZW1jZzogdGhlIHRhcmdldCBtZW1vcnkgY2dyb3VwIHRvIHJlY2xhaW0gZnJvbVxuKyAqIEBzaXplOiAgdGhlIGFtb3VudCBvZiBtZW1vcnkgdG8gcmVjbGFpbSwgaW4gYnl0ZXMsIGNsYW1wZWQgdG9cbisgKiAgICAgICAgIE1FTUNHX0NIQVJHRV9CQVRDSCAoNjQgcGFnZXMpXG4rICogQHN3YXBwaW5lc3M6IHRoZSByZWNsYWltIHN3YXBwaW5lc3MsIGluIHRoZSByYW5nZVxuKyAqICAgICAgICAgW01JTl9TV0FQUElORVNTLCBTV0FQUElORVNTX0FOT05fT05MWV0sIHdoZXJlXG4rICogICAgICAgICBTV0FQUElORVNTX0FOT05fT05MWSBtZWFucyBhbm9uLW9ubHkgcmVjbGFpbSwgb3IgLTEgdG8gdXNlXG4rICogICAgICAgICB0aGUgbWVtY2cncyBvd24gc3dhcHBpbmVzc1xuKyAqXG4rICogVHJpZ2dlciBvbmUgcHJvYWN0aXZlIHJlY2xhaW0gcGFzcyBvbiBAbWVtY2csIHNpbWlsYXIgdG8gYSB3cml0ZSB0b1xuKyAqIG1lbW9yeS5yZWNsYWltLCBidXQgd2l0aG91dCByZXRyeWluZyB1bnRpbCBAc2l6ZSBpcyByZWFjaGVkLlxuKyAqXG4rICogT25seSB0aGUgcmVjbGFpbSB0YXJnZXQgaXMgY2FwcGVkOiBAc2l6ZSBpcyBjbGFtcGVkIHRvXG4rICogTUVNQ0dfQ0hBUkdFX0JBVENILCBmb2xsb3dpbmcgdGhlIHByZWNlZGVudCBvZiBoaWdoX3dvcmtfZnVuYygpLFxuKyAqIHRoZSBtZW1vcnkuaGlnaCB3b3JrcXVldWUgZmFsbGJhY2ssIHdoaWNoIGJvdW5kcyBlYWNoIHJlY2xhaW1cbisgKiByZXF1ZXN0IHRoZSBzYW1lIHdheS4gVGhlIGFjdHVhbCBzY2FubmluZyB3b3JrIGFuZCBpdHMgZHVyYXRpb25cbisgKiBhcmUgbm90IGJvdW5kZWQuIFRvIHJlY2xhaW0gbW9yZSwgY2FsbCB0aGlzIGtmdW5jIHJlcGVhdGVkbHlcbisgKiBpbnN0ZWFkIG9mIHBhc3NpbmcgYSBsYXJnZXIgQHNpemUuXG4rICpcbisgKiBUaGUga2Z1bmMgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGEgQlBGX1BST0dfVFlQRV9TWVNDQUxMXG4rICogcHJvZ3JhbSwgc3luY2hyb25vdXNseSBpbiB0aGUgY29udGV4dCBvZiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhlXG4rICogcHJvZ3JhbSwgb3IgZnJvbSB0aGUgYnBmX3dxIGFuZCB0YXNrX3dvcmsgY2FsbGJhY2tzIG9mIGEgU1lTQ0FMTFxuKyAqIHByb2dyYW0sIHdoaWNoIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQgYW5kIGtlZXAgdGhlIFNZU0NBTEwgcHJvZ3JhbVxuKyAqIHR5cGUuIEl0IGlzIHJlZ2lzdGVyZWQgZm9yIEJQRl9QUk9HX1RZUEVfU1lTQ0FMTCBvbmx5LCBiZWNhdXNlXG4rICogZ2VuZXJpYyBzbGVlcGFibGUgcHJvZ3JhbXMgbWF5IHJ1biB3aXRoIGZpbGVzeXN0ZW0gbG9ja3MgaGVsZCBvclxuKyAqIGluIE5PRlMvTk9JTyBjb250ZXh0cywgd2hlcmUgdGhlIHJlY2xhaW0gcGF0aCBjb3VsZCBkZWFkbG9jayBvblxuKyAqIHRob3NlIGxvY2tzIHZpYSBmaWxlc3lzdGVtIHNocmlua2Vycy5cbisgKlxuKyAqIEZvciBhc3luY2hyb25vdXMgcmVjbGFpbSBvZiBtb3JlIHRoYW4gb25lIGJhdGNoLCBkcml2aW5nIHRoZVxuKyAqIHJlY2xhaW0gZnJvbSBhIGJwZl93cSBjYWxsYmFjayBpcyByZWNvbW1lbmRlZDogY2FsbCB0aGlzIGtmdW5jXG4rICogb25jZSBwZXIgY2FsbGJhY2sgYW5kIHJlcXVldWUgdGhlIHNhbWUgd29yayBpdGVtIGZvciB0aGUgbmV4dFxuKyAqIGJhdGNoLCBpbnN0ZWFkIG9mIGxvb3BpbmcgaW5zaWRlIHRoZSBjYWxsYmFjayBhbmQgbW9ub3BvbGl6aW5nIGFcbisgKiB3b3JrcXVldWUgd29ya2VyLCBhbmQgZ2l2ZSBlYWNoIHRhcmdldCBtZW1jZyBpdHMgb3duIHdvcmsgaXRlbSxcbisgKiBhcyBoaWdoX3dvcmtfZnVuYygpIGRvZXMgd2l0aCBvbmUgd29yayBpdGVtIHBlciBtZW1jZy4gV2hldGhlclxuKyAqIHRvIHN1Ym1pdCB0aGUgbmV4dCBiYXRjaCBpcyB1cCB0byB0aGUgQlBGIHByb2dyYW0sIHdoaWNoIGNhbiBzdG9wXG4rICogYXQgYW55IHBvaW50LCBlLmcuIG9uY2UgdGhlIHRhcmdldCBjZ3JvdXAgaXMgZHlpbmcuXG4rICpcbisgKiBSZXR1cm46IFRoZSBhbW91bnQgb2YgbWVtb3J5IHJlY2xhaW1lZCwgaW4gYnl0ZXMsIG9yIDAgaWYgQHNpemUgaXNcbisgKiBzbWFsbGVyIHRoYW4gYSBwYWdlLCBvciAodW5zaWduZWQgbG9uZyktMSBpZiBAc3dhcHBpbmVzcyBpcyBvdXQgb2ZcbisgKiByYW5nZS5cbisgKi9cbitfX2JwZl9rZnVuYyB1bnNpZ25lZCBsb25nIGJwZl9wcm9hY3RpdmVfcmVjbGFpbShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXG4rXHRcdFx0XHRcdFx0dW5zaWduZWQgbG9uZyBzaXplLFxuK1x0XHRcdFx0XHRcdGludCBzd2FwcGluZXNzKVxuK3tcbitcdHVuc2lnbmVkIGxvbmcgbnJfcmVjbGFpbWVkO1xuK1x0dW5zaWduZWQgbG9uZyBucl9wYWdlcztcbitcbitcdGlmIChzd2FwcGluZXNzIFx1MDAzYyAtMSB8fCBzd2FwcGluZXNzIFx1MDAzZSBTV0FQUElORVNTX0FOT05fT05MWSlcbitcdFx0cmV0dXJuICh1bnNpZ25lZCBsb25nKS0xO1xuK1xuK1x0aWYgKHNpemUgXHUwMDNjIFBBR0VfU0laRSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRucl9wYWdlcyA9IG1pbihzaXplIC8gUEFHRV9TSVpFLCAodW5zaWduZWQgbG9uZylNRU1DR19DSEFSR0VfQkFUQ0gpO1xuK1xuK1x0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXG4rXHRcdFx0XHRcdFx0ICAgIEdGUF9LRVJORUwsXG4rXHRcdFx0XHRcdFx0ICAgIE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAgfFxuK1x0XHRcdFx0XHRcdCAgICBNRU1DR19SRUNMQUlNX1BST0FDVElWRSxcbitcdFx0XHRcdFx0XHQgICAgc3dhcHBpbmVzcyA9PSAtMSA/IE5VTEwgOlxuK1x0XHRcdFx0XHRcdFx0XHQgICAgICAgXHUwMDI2c3dhcHBpbmVzcyk7XG4rXG4rXHRyZXR1cm4gbnJfcmVjbGFpbWVkICogUEFHRV9TSVpFO1xuK31cbitcbiBfX2JwZl9rZnVuY19lbmRfZGVmcygpO1xuIFxuIEJURl9LRlVOQ1NfU1RBUlQoYnBmX21lbWNvbnRyb2xfa2Z1bmNzKVxuQEAgLTE3NCwxOSArMjQ0LDM1IEBAIEJURl9JRF9GTEFHUyhmdW5jLCBicGZfbWVtX2Nncm91cF9mbHVzaF9zdGF0cywgS0ZfU0xFRVBBQkxFKVxuIFxuIEJURl9LRlVOQ1NfRU5EKGJwZl9tZW1jb250cm9sX2tmdW5jcylcbiBcbitCVEZfS0ZVTkNTX1NUQVJUKGJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzKVxuK0JURl9JRF9GTEFHUyhmdW5jLCBicGZfcHJvYWN0aXZlX3JlY2xhaW0sIEtGX1NMRUVQQUJMRSlcbitCVEZfS0ZVTkNTX0VORChicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jcylcbitcbiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfa2Z1bmNfc2V0ID0ge1xuIFx0Lm93bmVyICAgICAgICAgID0gVEhJU19NT0RVTEUsXG4gXHQuc2V0ICAgICAgICAgICAgPSBcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY3MsXG4gfTtcbiBcbitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0Zl9rZnVuY19pZF9zZXQgYnBmX21lbWNvbnRyb2xfcmVjbGFpbV9rZnVuY19zZXQgPSB7XG4rXHQub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSxcbitcdC5zZXQgICAgICAgICAgICA9IFx1MDAyNmJwZl9tZW1jb250cm9sX3JlY2xhaW1fa2Z1bmNzLFxuK307XG4rXG4gc3RhdGljIGludCBfX2luaXQgYnBmX21lbWNvbnRyb2xfaW5pdCh2b2lkKVxuIHtcbiBcdGludCBlcnI7XG4gXG4gXHRlcnIgPSByZWdpc3Rlcl9idGZfa2Z1bmNfaWRfc2V0KEJQRl9QUk9HX1RZUEVfVU5TUEVDLFxuIFx0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9rZnVuY19zZXQpO1xuLVx0aWYgKGVycilcbitcdGlmIChlcnIpIHtcbiBcdFx0cHJfd2FybihcImVycm9yIHdoaWxlIHJlZ2lzdGVyaW5nIGJwZiBtZW1jb250cm9sIGtmdW5jczogJWRcIiwgZXJyKTtcbitcdFx0cmV0dXJuIGVycjtcbitcdH1cbitcbitcdGVyciA9IHJlZ2lzdGVyX2J0Zl9rZnVuY19pZF9zZXQoQlBGX1BST0dfVFlQRV9TWVNDQUxMLFxuK1x0XHRcdFx0XHRcdTAwMjZicGZfbWVtY29udHJvbF9yZWNsYWltX2tmdW5jX3NldCk7XG4rXHRpZiAoZXJyKVxuK1x0XHRwcl93YXJuKFwiZXJyb3IgcmVnaXN0ZXJpbmcgYnBmIHJlY2xhaW0ga2Z1bmNzOiAlZFwiLCBlcnIpO1xuIFxuIFx0cmV0dXJuIGVycjtcbiB9XG5kaWZmIC0tZ2l0IGEvbW0vaW50ZXJuYWwuaCBiL21tL2ludGVybmFsLmhcbmluZGV4IDM4YjExNjUyMTJjOTQuLjQ0ZTk1ZTg3ZTNjZDkgMTAwNjQ0XG4tLS0gYS9tbS9pbnRlcm5hbC5oXG4rKysgYi9tbS9pbnRlcm5hbC5oXG5AQCAtNzQsMTEgKzc0LDEzIEBAIHVuc2lnbmVkIGxvbmcgbHJ1dmVjX2xydV9zaXplKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgZW51bSBscnVfbGlzdCBscnUsXG4gXG4gI2RlZmluZSBNRU1DR19SRUNMQUlNX01BWV9TV0FQICgxIFx1MDAzY1x1MDAzYyAxKVxuICNkZWZpbmUgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUgKDEgXHUwMDNjXHUwMDNjIDIpXG4tI2RlZmluZSBNSU5fU1dBUFBJTkVTUyAwXG4tI2RlZmluZSBNQVhfU1dBUFBJTkVTUyAyMDBcbitlbnVtIHtcbitcdE1JTl9TV0FQUElORVNTID0gMCxcbitcdE1BWF9TV0FQUElORVNTID0gMjAwLFxuIFxuLS8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuLSNkZWZpbmUgU1dBUFBJTkVTU19BTk9OX09OTFkgKE1BWF9TV0FQUElORVNTICsgMSlcbitcdC8qIEp1c3QgcmVjbGFpbSBmcm9tIGFub24gZm9saW9zIGluIHByb2FjdGl2ZSBtZW1vcnkgcmVjbGFpbSAqL1xuK1x0U1dBUFBJTkVTU19BTk9OX09OTFkgPSBNQVhfU1dBUFBJTkVTUyArIDEsXG4rfTtcbiBcbiB1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxuIFx0XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxuZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLjdjN2QyOTliM2IyOGFcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9nX3Rlc3RzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xuQEAgLTAsMCArMSw3NzkgQEBcbisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMFxuKy8qXG4rICogTWVtb3J5IGNvbnRyb2xsZXIgZUJQRiBhc3luYyByZWNsYWltIHRlc3RcbisgKlxuKyAqIFNldHRpbmcgVEVTVF9NRU1DR19BU1lOQ19SRUNMQUlNX0JFTkNIPTEgYWRkcyBhIGJhc2VsaW5lIHJ1biBvZiB0aGVcbisgKiB3b3JrbG9hZCB3aXRob3V0IHRoZSBCUEYgcHJvZ3JhbSB0byBtZW1jZ19hc3luY19yZWNsYWltLCBhbmQgcHJpbnRzXG4rICogdGhlIGJhc2VsaW5lIGFuZCByZWNsYWltIHRpbWluZ3MsIHBsdXMgdGhlIHNwZWVkdXAgb2YgdGhlIHByZXNzdXJlZFxuKyAqIGNncm91cCwgdG8gc3Rkb3V0LlxuKyAqL1xuK1xuKyNpbmNsdWRlIFx1MDAzY3Rlc3RfcHJvZ3MuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N5cy9tbWFuLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzeXMvc3RhdC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3Zmcy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3lzL3dhaXQuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2ZjbnRsLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NzaWduYWwuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3RpbWUuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3VuaXN0ZC5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RkaW8uaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY3N0ZGxpYi5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjc3RyaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NsaW1pdHMuaFx1MDAzZVxuKyNpbmNsdWRlIFx1MDAzY2xpbnV4L21hZ2ljLmhcdTAwM2VcbitcbisjaW5jbHVkZSBcImNncm91cF9oZWxwZXJzLmhcIlxuK1xuK3N0cnVjdCBicGZfYXJncyB7XG4rXHR1NjQgaGlnaF9jZ3JvdXBfaWQ7XG4rXHR1NjQgbG93X2Nncm91cF9pZDtcbitcdHU2NCBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rXHR1NjQgY2hlY2tfbnM7XG4rfTtcbitcbisvKiBSZWNsYWltIG91dGNvbWVzIHJlcG9ydGVkIGJ5IHRoZSBCUEYgcHJvZ3JhbSB0aHJvdWdoIHRoZSByaW5nYnVmLiAqL1xuK2VudW0gcmVjbGFpbV9vdXRjb21lIHtcbitcdFJFQ0xBSU1fT1VUQ09NRV9DQUxMRUQsXG4rXHRSRUNMQUlNX09VVENPTUVfU0tJUFBFRF9EWUlORyxcbitcdFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORSxcbit9O1xuK1xuK3N0cnVjdCByZWNsYWltX2V2ZW50IHtcbitcdHU2NCBvdXRjb21lO1xuK307XG4rXG4rI2luY2x1ZGUgXCJtZW1jZ19hc3luY19yZWNsYWltLnNrZWwuaFwiXG4rXG4rI2RlZmluZSBGSUxFX1NJWkUgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIEJVRkZFUl9TSVpFICg0MDk2KVxuKyNkZWZpbmUgQ0dfTElNSVQgKDMyICogMTAyNCAqIDEwMjR1bClcbisjZGVmaW5lIFJFQURfVElNRVMgNTBcbitcbisjZGVmaW5lIENHX0RJUiBcIi9tZW1jZ19hc3luY19yZWNsYWltXCJcbisjZGVmaW5lIENHX0hJR0hfRElSIENHX0RJUiBcIi9oaWdoXCJcbisjZGVmaW5lIENHX0xPV19ESVIgQ0dfRElSIFwiL2xvd1wiXG4rXG4rI2RlZmluZSBDR19EWUlOR19ESVIgXCIvbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZ1wiXG4rI2RlZmluZSBDR19EWUlOR19UUklHR0VSX0RJUiBDR19EWUlOR19ESVIgXCIvdHJpZ2dlclwiXG4rI2RlZmluZSBDR19EWUlOR19UQVJHRVRfRElSIENHX0RZSU5HX0RJUiBcIi90YXJnZXRcIlxuK1xuKyNkZWZpbmUgQ0hFQ0tfUEVSSU9EX05TICgyICogMTAwMCAqIDEwMDB1bGwpXG4rI2RlZmluZSBFVkVOVF9ERUxUQV9USFJFU0hPTEQgMVxuK1xuKy8qXG4rICogVGltaW5nIGZvciB0aGUgZHlpbmcgdGVzdDogYWZ0ZXIgdGhlIHRhcmdldCBjZ3JvdXAgaXMgcmVtb3ZlZCwgZ2l2ZVxuKyAqIGluLWZsaWdodCByZWNsYWltIHBhc3NlcyB0aW1lIHRvIGRyYWluLCB0aGVuIHdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZFxuKyAqIHRvIGhpdCB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSBrZWVwYWxpdmUgcmVhZGVyIGtlZXBzIHRoZSB0cmlnZ2VyXG4rICogY2dyb3VwIHJlZmF1bHRpbmcsIGFuZCB0aGUgdGltZXIgZmlyZXMgZXZlcnkgQ0hFQ0tfUEVSSU9EX05TLCBzb1xuKyAqIHN1Y2ggYSByb3VuZCBtdXN0IHNob3cgdXAgd2l0aGluIGEgZmV3IHRpbWVyIHBlcmlvZHMuIFRoZSBCUEZcbisgKiBwcm9ncmFtIHJlcG9ydHMgZXZlcnkgcmVjbGFpbSBvdXRjb21lIHRocm91Z2ggdGhlIHJpbmdidWYsIHNvIHRoZVxuKyAqIHdhaXRzIGp1c3QgcG9sbCBpdCB3aXRoIGEgdGltZW91dC5cbisgKi9cbisjZGVmaW5lIERZSU5HX1NFVFRMRV9VUyAoMjAwICogMTAwMClcbisjZGVmaW5lIEVWRU5UX1BPTExfVElNRU9VVF9NUyAoMTAwKVxuKyNkZWZpbmUgRVZFTlRfUE9MTF9ST1VORFMgKDUwKVxuK1xuKy8qXG4rICogVGhlIHdvcmtsb2FkIGZpbGVzIG11c3Qgc2l0IG9uIGEgcmVndWxhciBmaWxlc3lzdGVtOiB3aXRoIHN3YXBcbisgKiBkaXNhYmxlZCBmb3IgdGhlIGNncm91cCwgdG1wZnMvcmFtZnMgcGFnZXMgYXJlIHVuZXZpY3RhYmxlIGFuZCB3b3VsZFxuKyAqIE9PTSB0aGUgY2dyb3VwIGluc3RlYWQgb2YgZXhlcmNpc2luZyByZWNsYWltOyB0aGV5IGFyZSBhbHNvIGNoYXJnZWRcbisgKiBhcyBhbm9ueW1vdXMgbWVtb3J5LCBzbyB0aGV5IG5ldmVyIHJhaXNlIHRoZSBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRVxuKyAqIGV2ZW50cyB0aGUgQlBGIHByb2dyYW0gbW9uaXRvcnMuIEZhbGwgYmFjayB0byB0aGUgY3VycmVudCBkaXJlY3RvcnlcbisgKiB3aGVuIC90bXAgaXMgYmFja2VkIGJ5IHN1Y2ggYSBmaWxlc3lzdGVtLlxuKyAqL1xuK3N0YXRpYyBjb25zdCBjaGFyICp3b3JrbG9hZF9maWxlc19kaXIodm9pZClcbit7XG4rXHRzdHJ1Y3Qgc3RhdGZzIHN0O1xuK1xuK1x0aWYgKCFzdGF0ZnMoXCIvdG1wXCIsIFx1MDAyNnN0KSBcdTAwMjZcdTAwMjZcbitcdCAgICAoc3QuZl90eXBlID09IFRNUEZTX01BR0lDIHx8IHN0LmZfdHlwZSA9PSBSQU1GU19NQUdJQykpXG4rXHRcdHJldHVybiBcIi5cIjtcbitcdHJldHVybiBcIi90bXBcIjtcbit9XG4rXG4rLypcbisgKiBUaGUgd29ya2xvYWQgY2hpbGRyZW4gcnVuIGFmdGVyIHRlc3RfcHJvZ3MgaGlqYWNrZWQgc3RkaW8sIHNvXG4rICogYW55dGhpbmcgdGhleSBwcmludCBpcyBsb3N0IHdpdGggdGhlaXIgcHJpdmF0ZSBjb3B5IG9mIHRoZSBoaWphY2tlZFxuKyAqIGJ1ZmZlci4gVGhlIGV4aXQgc3RhdHVzIGlzIHRoZSBvbmx5IGRpYWdub3N0aWNzIGNoYW5uZWwgdGhhdCByZWFjaGVzXG4rICogdGhlIHBhcmVudCwgc28gZWFjaCBmYWlsaW5nIHN0ZXAgZ2V0cyBpdHMgb3duIGNvZGUuXG4rICovXG4rZW51bSBjaGlsZF9leGl0X2NvZGUge1xuK1x0Q0hJTERfRVhJVF9PSyA9IDAsXG4rXHRDSElMRF9FWElUX0pPSU5fQ0dST1VQLFxuK1x0Q0hJTERfRVhJVF9XUklURV9GSUxFLFxuK1x0Q0hJTERfRVhJVF9SRUFEX0ZJTEUsXG4rXHRDSElMRF9FWElUX1RJTUVfRklMRSxcbit9O1xuK1xuK3N0YXRpYyBjb25zdCBjaGFyICpjaGlsZF9leGl0X3N0cihpbnQgY29kZSlcbit7XG4rXHRzd2l0Y2ggKGNvZGUpIHtcbitcdGNhc2UgQ0hJTERfRVhJVF9PSzpcbitcdFx0cmV0dXJuIFwic3VjY2Vzc1wiO1xuK1x0Y2FzZSBDSElMRF9FWElUX0pPSU5fQ0dST1VQOlxuK1x0XHRyZXR1cm4gXCJqb2luIGNncm91cFwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1dSSVRFX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIGRhdGEgZmlsZVwiO1xuK1x0Y2FzZSBDSElMRF9FWElUX1JFQURfRklMRTpcbitcdFx0cmV0dXJuIFwicmVhZCBkYXRhIGZpbGVcIjtcbitcdGNhc2UgQ0hJTERfRVhJVF9USU1FX0ZJTEU6XG4rXHRcdHJldHVybiBcIndyaXRlIHRpbWUgZmlsZVwiO1xuK1x0ZGVmYXVsdDpcbitcdFx0cmV0dXJuIFwidW5rbm93blwiO1xuK1x0fVxuK31cbitcbitzdGF0aWMgaW50IHNldHVwX2hpZ2hfbG93X2Nncm91cHModTY0ICpoaWdoX2Nncm91cF9pZCwgdTY0ICpsb3dfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qXG4rXHQgKiBLZWVwIHRoZSB3b3JrbG9hZHMgZnJvbSBzd2FwcGluZyBvdXQuIFdpdGggQ09ORklHX1NXQVA9biB0aGVcbitcdCAqIG1lbW9yeS5zd2FwLm1heCBmaWxlIGRvZXMgbm90IGV4aXN0LCBhbmQgbm8gc3dhcCBjYW4gaGFwcGVuXG4rXHQgKiBhbnl3YXksIHNvIHNraXAgdGhlIHdyaXRlLlxuK1x0ICovXG4rXHRpZiAoIWFjY2VzcyhcIi9wcm9jL3N3YXBzXCIsIEZfT0spKSB7XG4rXHRcdHJldCA9IHdyaXRlX2Nncm91cF9maWxlKENHX0RJUiwgXCJtZW1vcnkuc3dhcC5tYXhcIiwgXCIwXCIpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwid3JpdGVfY2dyb3VwX2ZpbGUgbWVtb3J5LnN3YXAubWF4XCIpKVxuK1x0XHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19ISUdIX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0hJR0hfRElSKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0Y2xvc2UocmV0KTtcbitcbitcdCpoaWdoX2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfSElHSF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKmhpZ2hfY2dyb3VwX2lkLCAwLCBcImdldF9jZ3JvdXBfaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19MT1dfRElSKTtcbitcdGlmICghQVNTRVJUX0dFKHJldCwgMCwgXCJjcmVhdGVfYW5kX2dldF9jZ3JvdXAgXCIgQ0dfTE9XX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqbG93X2Nncm91cF9pZCA9IGdldF9jZ3JvdXBfaWQoQ0dfTE9XX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HVCgqbG93X2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXR1cm4gMDtcbitcbitjbGVhbnVwOlxuK1x0Y2xlYW51cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdHJldHVybiAtMTtcbit9XG4rXG4rLypcbisgKiBUaGUgZHlpbmcgdGVzdCBuZWVkcyBhbiBlbXB0eSByZWNsYWltIHRhcmdldCBwbHVzIGEgY2dyb3VwIHRoYXQga2VlcHNcbisgKiByZWZhdWx0aW5nIHdoaWxlIHRoZSB0YXJnZXQgaXMgcmVtb3ZlZCwgc28gcmVjbGFpbSByb3VuZHMga2VlcFxuKyAqIHN0YXJ0aW5nIGFuZCBydW4gaW50byB0aGUgcmVtb3ZlZCB0YXJnZXQuIFRoZSB0d28gaGF2ZSB0byBiZSBzZXBhcmF0ZVxuKyAqIGNncm91cHM6IHRoZSB0YXJnZXQgbXVzdCBob2xkIG5vIHByb2Nlc3NlcyB0byBiZSByZW1vdmVkLCBhbmQgdjInc1xuKyAqIG5vLWludGVybmFsLXByb2Nlc3MgY29uc3RyYWludCBrZWVwcyB0aGUgcmVmYXVsdGluZyB3b3JrbG9hZCBvdXQgb2ZcbisgKiBhbnkgcGFyZW50IHRoYXQgaGFzIGRvbWFpbiBjaGlsZHJlbi5cbisgKi9cbitzdGF0aWMgaW50IHNldHVwX2R5aW5nX2Nncm91cHModTY0ICp0cmlnZ2VyX2Nncm91cF9pZCwgdTY0ICp0YXJnZXRfY2dyb3VwX2lkKVxuK3tcbitcdGludCByZXQ7XG4rXHRjaGFyIGxpbWl0X2J1ZlsyMF07XG4rXG4rXHRyZXQgPSBzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnQoKTtcbitcdGlmICghQVNTRVJUX09LKHJldCwgXCJzZXR1cF9jZ3JvdXBfZW52aXJvbm1lbnRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdHJldCA9IGNyZWF0ZV9hbmRfZ2V0X2Nncm91cChDR19EWUlOR19ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0cmV0ID0gZW5hYmxlX2NvbnRyb2xsZXJzKENHX0RZSU5HX0RJUiwgXCJtZW1vcnlcIik7XG4rXHRpZiAoIUFTU0VSVF9PSyhyZXQsIFwiZW5hYmxlX2NvbnRyb2xsZXJzXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRzbnByaW50ZihsaW1pdF9idWYsIHNpemVvZihsaW1pdF9idWYpLCBcIiVsdVwiLCBDR19MSU1JVCk7XG4rXHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5Lm1heFwiLCBsaW1pdF9idWYpO1xuK1x0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5tYXhcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdC8qIFNlZSB0aGUgbWF0Y2hpbmcgd3JpdGUgaW4gc2V0dXBfaGlnaF9sb3dfY2dyb3VwcygpLiAqL1xuK1x0aWYgKCFhY2Nlc3MoXCIvcHJvYy9zd2Fwc1wiLCBGX09LKSkge1xuK1x0XHRyZXQgPSB3cml0ZV9jZ3JvdXBfZmlsZShDR19EWUlOR19ESVIsIFwibWVtb3J5LnN3YXAubWF4XCIsIFwiMFwiKTtcbitcdFx0aWYgKCFBU1NFUlRfT0socmV0LCBcIndyaXRlX2Nncm91cF9maWxlIG1lbW9yeS5zd2FwLm1heFwiKSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVFJJR0dFUl9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR0UocmV0LCAwLCBcImNyZWF0ZV9hbmRfZ2V0X2Nncm91cCBcIiBDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKHJldCk7XG4rXG4rXHQqdHJpZ2dlcl9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RSSUdHRVJfRElSKTtcbitcdGlmICghQVNTRVJUX0dUKCp0cmlnZ2VyX2Nncm91cF9pZCwgMCwgXCJnZXRfY2dyb3VwX2lkXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXG4rXHRyZXQgPSBjcmVhdGVfYW5kX2dldF9jZ3JvdXAoQ0dfRFlJTkdfVEFSR0VUX0RJUik7XG4rXHRpZiAoIUFTU0VSVF9HRShyZXQsIDAsIFwiY3JlYXRlX2FuZF9nZXRfY2dyb3VwIFwiIENHX0RZSU5HX1RBUkdFVF9ESVIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShyZXQpO1xuK1xuK1x0KnRhcmdldF9jZ3JvdXBfaWQgPSBnZXRfY2dyb3VwX2lkKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1x0aWYgKCFBU1NFUlRfR1QoKnRhcmdldF9jZ3JvdXBfaWQsIDAsIFwiZ2V0X2Nncm91cF9pZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0dXJuIDA7XG4rXG4rY2xlYW51cDpcbitcdGNsZWFudXBfY2dyb3VwX2Vudmlyb25tZW50KCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3JpdGVfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRzaXplX3Qgd3JpdHRlbiA9IDA7XG4rXHRjaGFyICpidWZmZXI7XG4rXHRGSUxFICpmcDtcbitcbitcdGZwID0gZm9wZW4oZmlsZW5hbWUsIFwid2JcIik7XG4rXHRpZiAoIWZwKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGJ1ZmZlciA9IG1hbGxvYyhCVUZGRVJfU0laRSk7XG4rXHRpZiAoIWJ1ZmZlcilcbitcdFx0Z290byBjbGVhbnVwX2ZwO1xuK1xuK1x0bWVtc2V0KGJ1ZmZlciwgJ0EnLCBCVUZGRVJfU0laRSk7XG4rXG4rXHR3aGlsZSAod3JpdHRlbiBcdTAwM2MgRklMRV9TSVpFKSB7XG4rXHRcdHNpemVfdCB0b193cml0ZSA9IEZJTEVfU0laRSAtIHdyaXR0ZW4gXHUwMDNjIEJVRkZFUl9TSVpFID9cbitcdFx0XHRcdCAgRklMRV9TSVpFIC0gd3JpdHRlbiA6IEJVRkZFUl9TSVpFO1xuK1xuK1x0XHRpZiAoZndyaXRlKGJ1ZmZlciwgMSwgdG9fd3JpdGUsIGZwKSAhPSB0b193cml0ZSlcbitcdFx0XHRnb3RvIGNsZWFudXA7XG4rXHRcdHdyaXR0ZW4gKz0gdG9fd3JpdGU7XG4rXHR9XG4rXG4rXHRyZXQgPSAwO1xuK2NsZWFudXA6XG4rXHRmcmVlKGJ1ZmZlcik7XG4rY2xlYW51cF9mcDpcbitcdGZjbG9zZShmcCk7XG4rb3V0OlxuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludCByZWFkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBpdGVyYXRpb25zKVxuK3tcbitcdGludCByZXQgPSAtMTtcbitcdGxvbmcgcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpO1xuK1x0Y2hhciAqbWFwO1xuK1x0c2l6ZV90IGk7XG4rXHRpbnQgZmQ7XG4rXHRzdHJ1Y3Qgc3RhdCBzYjtcbitcbitcdGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpO1xuK1x0aWYgKGZkID09IC0xKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmIChmc3RhdChmZCwgXHUwMDI2c2IpID09IC0xKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRpZiAoc2Iuc3Rfc2l6ZSAhPSBGSUxFX1NJWkUpIHtcbitcdFx0ZnByaW50ZihzdGRlcnIsIFwiRmlsZSBzaXplIG1pc21hdGNoOiBleHBlY3RlZCAlbHUsIGdvdCAlbHVcXG5cIixcbitcdFx0XHQodW5zaWduZWQgbG9uZylGSUxFX1NJWkUsICh1bnNpZ25lZCBsb25nKXNiLnN0X3NpemUpO1xuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXHR9XG4rXG4rXHRtYXAgPSBtbWFwKE5VTEwsIEZJTEVfU0laRSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApO1xuK1x0aWYgKG1hcCA9PSBNQVBfRkFJTEVEKVxuK1x0XHRnb3RvIGNsZWFudXBfZmQ7XG4rXG4rXHRmb3IgKGludCBpdGVyID0gMDsgaXRlciBcdTAwM2MgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4rXHRcdGZvciAoaSA9IDA7IGkgXHUwMDNjIEZJTEVfU0laRTsgaSArPSBwYWdlX3NpemUpIHtcbitcdFx0XHQvKiBhY2Nlc3MgYSBieXRlIHRvIHRyaWdnZXIgcGFnZSBmYXVsdCAqL1xuK1x0XHRcdHZvbGF0aWxlIGNoYXIgdiA9IG1hcFtpXTtcbitcdFx0XHQodm9pZCl2O1xuK1x0XHR9XG4rXHR9XG4rXG4rXHRpZiAobXVubWFwKG1hcCwgRklMRV9TSVpFKSA9PSAtMSlcbitcdFx0Z290byBjbGVhbnVwX2ZkO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwX2ZkOlxuK1x0Y2xvc2UoZmQpO1xuK291dDpcbitcdHJldHVybiByZXQ7XG4rfVxuK1xuK3N0YXRpYyBpbnQgcmVhbF90ZXN0X2NoaWxkX3dvcmsoY29uc3QgY2hhciAqY2dyb3VwX3BhdGgsIGNoYXIgKmRhdGFfZmlsZW5hbWUsXG4rXHRcdFx0XHRjaGFyICp0aW1lX2ZpbGVuYW1lLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDtcbitcdGRvdWJsZSBlbGFwc2VkO1xuK1x0RklMRSAqZnA7XG4rXG4rXHRpZiAoam9pbl9wYXJlbnRfY2dyb3VwKGNncm91cF9wYXRoKSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfSk9JTl9DR1JPVVA7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2c3RhcnQpO1xuK1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlbmFtZSkpXG4rXHRcdHJldHVybiBDSElMRF9FWElUX1dSSVRFX0ZJTEU7XG4rXG4rXHRpZiAocmVhZF9maWxlKGRhdGFfZmlsZW5hbWUsIHJlYWRfdGltZXMpKVxuK1x0XHRyZXR1cm4gQ0hJTERfRVhJVF9SRUFEX0ZJTEU7XG4rXG4rXHRjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgXHUwMDI2ZW5kKTtcbitcbitcdGlmICghdGltZV9maWxlbmFtZSlcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfT0s7XG4rXG4rXHRlbGFwc2VkID0gKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpICtcbitcdFx0ICAoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSAvIDEwMDAwMDAwMDAuMDtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJ3XCIpO1xuK1x0aWYgKCFmcClcbitcdFx0cmV0dXJuIENISUxEX0VYSVRfVElNRV9GSUxFO1xuK1x0ZnByaW50ZihmcCwgXCIlLjZmXCIsIGVsYXBzZWQpO1xuK1x0ZmNsb3NlKGZwKTtcbitcbitcdHJldHVybiBDSElMRF9FWElUX09LO1xuK31cbitcbitzdGF0aWMgaW50IGdldF90aW1lKGNoYXIgKnRpbWVfZmlsZW5hbWUsIGRvdWJsZSAqdGltZSlcbit7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXHRGSUxFICpmcDtcbitcdGNoYXIgYnVmWzY0XTtcbitcbitcdGZwID0gZm9wZW4odGltZV9maWxlbmFtZSwgXCJyXCIpO1xuK1x0aWYgKCFBU1NFUlRfT0tfUFRSKGZwLCBcImZvcGVuXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdGlmICghQVNTRVJUX09LX1BUUihmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCksIFwiZmdldHNcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcbitcdGlmIChzc2NhbmYoYnVmLCBcIiVsZlwiLCB0aW1lKSAhPSAxKSB7XG4rXHRcdFBSSU5UX0ZBSUwoXCJzc2NhbmYgJXNcIiwgYnVmKTtcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0fVxuK1xuK1x0cmV0ID0gMDtcbitjbGVhbnVwOlxuK1x0ZmNsb3NlKGZwKTtcbitvdXQ6XG4rXHRyZXR1cm4gcmV0O1xuK31cbitcbitzdGF0aWMgaW50XG4rcnVuX2hpZ2hfbG93X3dvcmtsb2FkKGRvdWJsZSAqaGlnaF9lbGFwc2VkLCBkb3VibGUgKmxvd19lbGFwc2VkLCBpbnQgcmVhZF90aW1lcylcbit7XG4rXHRjaGFyIGhpZ2hfZGF0YV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X2RhdGFfZmlsZVtQQVRIX01BWF07XG4rXHRjaGFyIGhpZ2hfdGltZV9maWxlW1BBVEhfTUFYXTtcbitcdGNoYXIgbG93X3RpbWVfZmlsZVtQQVRIX01BWF07XG4rXHRjb25zdCBjaGFyICpkaXIgPSB3b3JrbG9hZF9maWxlc19kaXIoKTtcbitcdHBpZF90IGhpZ2hfcGlkID0gLTEsIGxvd19waWQgPSAtMTtcbitcdHBpZF90IHdhaXRfcmV0O1xuK1x0aW50IGZkLCBzdGF0dXM7XG4rXHRpbnQgcmV0ID0gLTE7XG4rXG4rXHRzbnByaW50ZihoaWdoX2RhdGFfZmlsZSwgc2l6ZW9mKGhpZ2hfZGF0YV9maWxlKSxcbitcdFx0IFwiJXMvbWVtY2dfYXN5bmNfaGlnaF9kYXRhX1hYWFhYWFwiLCBkaXIpO1xuK1x0c25wcmludGYobG93X2RhdGFfZmlsZSwgc2l6ZW9mKGxvd19kYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19sb3dfZGF0YV9YWFhYWFhcIiwgZGlyKTtcbitcdHNucHJpbnRmKGhpZ2hfdGltZV9maWxlLCBzaXplb2YoaGlnaF90aW1lX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19oaWdoX3RpbWVfWFhYWFhYXCIsIGRpcik7XG4rXHRzbnByaW50Zihsb3dfdGltZV9maWxlLCBzaXplb2YobG93X3RpbWVfZmlsZSksXG4rXHRcdCBcIiVzL21lbWNnX2FzeW5jX2xvd190aW1lX1hYWFhYWFwiLCBkaXIpO1xuK1xuK1x0ZmQgPSBta3N0ZW1wKGhpZ2hfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChsb3dfZGF0YV9maWxlKTtcbitcdGlmICghQVNTRVJUX0dFKGZkLCAwLCBcIm1rc3RlbXBcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGNsb3NlKGZkKTtcbitcbitcdGZkID0gbWtzdGVtcChoaWdoX3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRmZCA9IG1rc3RlbXAobG93X3RpbWVfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHRjbG9zZShmZCk7XG4rXG4rXHRsb3dfcGlkID0gZm9yaygpO1xuK1x0aWYgKCFBU1NFUlRfR0UobG93X3BpZCwgMCwgXCJmb3JrIGxvd1wiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGxvd19waWQgPT0gMClcbitcdFx0X2V4aXQocmVhbF90ZXN0X2NoaWxkX3dvcmsoQ0dfTE9XX0RJUiwgbG93X2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBsb3dfdGltZV9maWxlLCByZWFkX3RpbWVzKSk7XG4rXG4rXHRoaWdoX3BpZCA9IGZvcmsoKTtcbitcdGlmICghQVNTRVJUX0dFKGhpZ2hfcGlkLCAwLCBcImZvcmsgaGlnaFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGhpZ2hfcGlkID09IDApXG4rXHRcdF9leGl0KHJlYWxfdGVzdF9jaGlsZF93b3JrKENHX0hJR0hfRElSLCBoaWdoX2RhdGFfZmlsZSxcbitcdFx0XHRcdFx0ICBoaWdoX3RpbWVfZmlsZSwgcmVhZF90aW1lcykpO1xuK1xuK1x0d2FpdF9yZXQgPSB3YWl0cGlkKGxvd19waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJsb3cgd2FpdHBpZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0LypcbitcdCAqIFRoZSBjaGlsZCBoYXMgYmVlbiByZWFwZWQgYW5kIGl0cyBQSUQgY2FuIGFscmVhZHkgYmUgcmV1c2VkLFxuK1x0ICogc28gbWFyayBpdCB0byBrZWVwIGNsZWFudXAgZnJvbSBzaWduYWxpbmcgYW4gdW5yZWxhdGVkIHByb2Nlc3MuXG4rXHQgKi9cbitcdGxvd19waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwibG93IGV4aXRlZFwiKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gQ0hJTERfRVhJVF9PSykge1xuK1x0XHRQUklOVF9GQUlMKFwibG93IGNoaWxkIGZhaWxlZCBhdDogJXMgKGV4aXQgc3RhdHVzICVkKVwiLFxuK1x0XHRcdCAgIGNoaWxkX2V4aXRfc3RyKFdFWElUU1RBVFVTKHN0YXR1cykpLFxuK1x0XHRcdCAgIFdFWElUU1RBVFVTKHN0YXR1cykpO1xuK1x0XHRnb3RvIGNsZWFudXA7XG4rXHR9XG4rXG4rXHR3YWl0X3JldCA9IHdhaXRwaWQoaGlnaF9waWQsIFx1MDAyNnN0YXR1cywgMCk7XG4rXHRpZiAoIUFTU0VSVF9HVCh3YWl0X3JldCwgMCwgXCJoaWdoIHdhaXRwaWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdC8qIFNhbWUgYXMgYWJvdmU6IHRoZSByZWFwZWQgUElEIG11c3Qgbm90IGJlIHNpZ25hbGVkIGFnYWluLiAqL1xuK1x0aGlnaF9waWQgPSAtMTtcbitcdGlmICghQVNTRVJUX1RSVUUoV0lGRVhJVEVEKHN0YXR1cyksIFwiaGlnaCBleGl0ZWRcIikpXG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpICE9IENISUxEX0VYSVRfT0spIHtcbitcdFx0UFJJTlRfRkFJTChcImhpZ2ggY2hpbGQgZmFpbGVkIGF0OiAlcyAoZXhpdCBzdGF0dXMgJWQpXCIsXG4rXHRcdFx0ICAgY2hpbGRfZXhpdF9zdHIoV0VYSVRTVEFUVVMoc3RhdHVzKSksXG4rXHRcdFx0ICAgV0VYSVRTVEFUVVMoc3RhdHVzKSk7XG4rXHRcdGdvdG8gY2xlYW51cDtcbitcdH1cbitcbitcdGlmIChnZXRfdGltZShoaWdoX3RpbWVfZmlsZSwgaGlnaF9lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1x0aWYgKGdldF90aW1lKGxvd190aW1lX2ZpbGUsIGxvd19lbGFwc2VkKSlcbitcdFx0Z290byBjbGVhbnVwO1xuK1xuK1x0cmV0ID0gMDtcbitcbitjbGVhbnVwOlxuK1x0LyogT24gZmFpbHVyZSwgbWFrZSBzdXJlIG5vIGNoaWxkIHByb2Nlc3MgaXMgbGVmdCBiZWhpbmQgKi9cbitcdGlmIChyZXQpIHtcbitcdFx0aWYgKGhpZ2hfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdFx0a2lsbChoaWdoX3BpZCwgU0lHS0lMTCk7XG4rXHRcdFx0KHZvaWQpd2FpdHBpZChoaWdoX3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdFx0aWYgKGxvd19waWQgXHUwMDNlIDApIHtcbitcdFx0XHRraWxsKGxvd19waWQsIFNJR0tJTEwpO1xuK1x0XHRcdCh2b2lkKXdhaXRwaWQobG93X3BpZCwgTlVMTCwgMCk7XG4rXHRcdH1cbitcdH1cbitcdHVubGluayhsb3dfdGltZV9maWxlKTtcbitcdHVubGluayhoaWdoX3RpbWVfZmlsZSk7XG4rXHR1bmxpbmsobG93X2RhdGFfZmlsZSk7XG4rXHR1bmxpbmsoaGlnaF9kYXRhX2ZpbGUpO1xuK1x0cmV0dXJuIHJldDtcbit9XG4rXG4rc3RhdGljIGludFxuK3NldHVwX2JwZih1NjQgaGlnaF9jZ3JvdXBfaWQsIHU2NCBsb3dfY2dyb3VwX2lkLFxuK1x0ICBzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqKnNrZWxfcHRyKVxuK3tcbitcdHN0cnVjdCBtZW1jZ19hc3luY19yZWNsYWltICpza2VsO1xuK1x0c3RydWN0IGJwZl9hcmdzIGFyZ3MgPSB7XG4rXHRcdC5oaWdoX2Nncm91cF9pZCA9IGhpZ2hfY2dyb3VwX2lkLFxuK1x0XHQubG93X2Nncm91cF9pZCA9IGxvd19jZ3JvdXBfaWQsXG4rXHRcdC5ldmVudF9kZWx0YV90aHJlc2hvbGQgPSBFVkVOVF9ERUxUQV9USFJFU0hPTEQsXG4rXHRcdC5jaGVja19ucyA9IENIRUNLX1BFUklPRF9OUyxcbitcdH07XG4rXHRMSUJCUEZfT1BUUyhicGZfdGVzdF9ydW5fb3B0cywgcnVuX29wdHMsXG4rXHRcdC5jdHhfaW4gPSBcdTAwMjZhcmdzLFxuK1x0XHQuY3R4X3NpemVfaW4gPSBzaXplb2YoYXJncykpO1xuK1x0aW50IHByb2dfaW5pdF9mZCwgZXJyO1xuK1xuK1x0c2tlbCA9IG1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWQoKTtcbitcdGlmICghQVNTRVJUX09LX1BUUihza2VsLCBcIm1lbWNnX2FzeW5jX3JlY2xhaW1fX29wZW5fYW5kX2xvYWRcIikpXG4rXHRcdHJldHVybiAtMTtcbitcbitcdHByb2dfaW5pdF9mZCA9IGJwZl9wcm9ncmFtX19mZChza2VsLVx1MDAzZXByb2dzLndxX3Byb2dfaW5pdCk7XG4rXG4rXHRlcnIgPSBicGZfcHJvZ190ZXN0X3J1bl9vcHRzKHByb2dfaW5pdF9mZCwgXHUwMDI2cnVuX29wdHMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcImJwZl9wcm9nX3Rlc3RfcnVuX29wdHNcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1x0aWYgKCFBU1NFUlRfRVEocnVuX29wdHMucmV0dmFsLCAwLCBcInByb2dfaW5pdCByZXR2YWxcIikpXG4rXHRcdGdvdG8gZXJyb3Jfb3V0O1xuK1xuK1x0KnNrZWxfcHRyID0gc2tlbDtcbitcdHJldHVybiAwO1xuK1xuK2Vycm9yX291dDpcbitcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRyZXR1cm4gLTE7XG4rfVxuK1xuKy8qXG4rICogdGVzdF9wcm9ncyBoaWphY2tzIHN0ZG91dCBhbmQgb25seSBwcmludHMgdGhlIGNhcHR1cmVkIGxvZyB3aGVuIHRoZVxuKyAqIHRlc3QgZmFpbHMsIHNvIGJlbmNobWFyayBudW1iZXJzIGdvIHN0cmFpZ2h0IHRvIHRoZSByZWFsIHN0ZG91dCB0b1xuKyAqIGtlZXAgdGhlbSBmcm9tIGRyb3duaW5nIGluIEFTU0VSVCBvdXRwdXQuXG4rICovXG4rc3RhdGljIHZvaWQgYmVuY2hfcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKVxuK3tcbitcdHZhX2xpc3QgYXA7XG4rXG4rXHR2YV9zdGFydChhcCwgZm10KTtcbitcdHZmcHJpbnRmKGVudi5zdGRvdXRfc2F2ZWQgPzogc3Rkb3V0LCBmbXQsIGFwKTtcbitcdHZhX2VuZChhcCk7XG4rfVxuK1xuK3ZvaWQgdGVzdF9tZW1jZ19hc3luY19yZWNsYWltKHZvaWQpXG4re1xuK1x0dTY0IGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkO1xuK1x0ZG91YmxlIGhpZ2hfdGltZSA9IDAuMCwgbG93X3RpbWUgPSAwLjA7XG4rXHRkb3VibGUgYmFzZV9oaWdoX3RpbWUgPSAwLjAsIGJhc2VfbG93X3RpbWUgPSAwLjA7XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRpbnQgZXJyLCBiZW5jaDtcbitcbitcdGJlbmNoID0gISFnZXRlbnYoXCJURVNUX01FTUNHX0FTWU5DX1JFQ0xBSU1fQkVOQ0hcIik7XG4rXG4rXHRlcnIgPSBzZXR1cF9oaWdoX2xvd19jZ3JvdXBzKFx1MDAyNmhpZ2hfY2dyb3VwX2lkLCBcdTAwMjZsb3dfY2dyb3VwX2lkKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9oaWdoX2xvd19jZ3JvdXBzIHJlY2xhaW1cIikpXG4rXHRcdHJldHVybjtcbitcbitcdC8qXG4rXHQgKiBPcHRpb25hbCBiYXNlbGluZSBmb3IgdGhlIGJlbmNobWFyayBudW1iZXJzIGJlbG93OiBydW4gdGhlXG4rXHQgKiBzYW1lIHdvcmtsb2FkIG9uY2Ugd2l0aG91dCB0aGUgQlBGIHByb2dyYW0sIHNvIHRoZSBsb2cgY2FuXG4rXHQgKiByZXBvcnQgaG93IG11Y2ggYXN5bmMgcmVjbGFpbSBpbXByb3ZlZCB0aGUgcHJlc3N1cmVkIGNncm91cC5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKSB7XG4rXHRcdGVyciA9IHJ1bl9oaWdoX2xvd193b3JrbG9hZChcdTAwMjZiYXNlX2hpZ2hfdGltZSwgXHUwMDI2YmFzZV9sb3dfdGltZSxcbitcdFx0XHRcdFx0ICAgIFJFQURfVElNRVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwicnVuX2hpZ2hfbG93X3dvcmtsb2FkIGJhc2VsaW5lXCIpKVxuK1x0XHRcdGdvdG8gb3V0O1xuK1x0fVxuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKGhpZ2hfY2dyb3VwX2lkLCBsb3dfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0ZXJyID0gcnVuX2hpZ2hfbG93X3dvcmtsb2FkKFx1MDAyNmhpZ2hfdGltZSwgXHUwMDI2bG93X3RpbWUsIFJFQURfVElNRVMpO1xuK1x0aWYgKCFBU1NFUlRfT0soZXJyLCBcInJ1bl9oaWdoX2xvd193b3JrbG9hZCByZWNsYWltXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gYmVsb3cgYWxvbmUgY2Fubm90IGRpc3Rpbmd1aXNoIGEgd29ya2luZ1xuK1x0ICogcmVjbGFpbSBmcm9tIGEgbm8tb3Agb25lLCBzbyByZXF1aXJlIHRoYXQgdGhlIEJQRiBwcm9ncmFtXG4rXHQgKiBhY3R1YWxseSByZWNsYWltZWQgbWVtb3J5IGZyb20gdGhlIGxvdyBjZ3JvdXAuXG4rXHQgKi9cbitcdGlmICghQVNTRVJUX0dUKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIDAsIFwicmVjbGFpbV9jYWxsc1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXHRpZiAoIUFTU0VSVF9HVChza2VsLVx1MDAzZWJzcy1cdTAwM2VyZWNsYWltZWRfYnl0ZXMsIDAsIFwicmVjbGFpbWVkX2J5dGVzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcbitcdC8qXG4rXHQgKiBUaGUgdGltaW5nIGNvbXBhcmlzb24gaXMgYSBiZW5jaG1hcmsgYW5kIHRvbyBmbGFreSB0byBmYWlsIENJXG4rXHQgKiBydW5zLCBzbyBpdCBvbmx5IGxvZ3MgdGhlIG51bWJlcnM7IHRoZSBjb3VudGVycyBhYm92ZSBhbHJlYWR5XG4rXHQgKiBwcm92ZWQgdGhhdCB0aGUgQlBGIHByb2dyYW0gcmVjbGFpbWVkIG1lbW9yeS5cbitcdCAqL1xuK1x0aWYgKGJlbmNoKVxuK1x0XHRiZW5jaF9wcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltOiBiYXNlbGluZSBoaWdoPSVmIGxvdz0lZiwgXCJcbitcdFx0XHQgICAgIFwicmVjbGFpbSBoaWdoPSVmIGxvdz0lZiwgaGlnaCBzcGVlZHVwPSUuMWYlJVxcblwiLFxuK1x0XHRcdCAgICAgYmFzZV9oaWdoX3RpbWUsIGJhc2VfbG93X3RpbWUsIGhpZ2hfdGltZSwgbG93X3RpbWUsXG4rXHRcdFx0ICAgICAxMDAuMCAqIChiYXNlX2hpZ2hfdGltZSAtIGhpZ2hfdGltZSkgLyBiYXNlX2hpZ2hfdGltZSk7XG4rXHRlbHNlIGlmIChoaWdoX3RpbWUgXHUwMDNlPSBsb3dfdGltZSlcbitcdFx0cHJpbnRmKFwibWVtY2dfYXN5bmNfcmVjbGFpbTogaGlnaCBjZ3JvdXAgbm90IGltcHJvdmVkOiBoaWdoPSVmIGxvdz0lZlxcblwiLFxuK1x0XHQgICAgICAgaGlnaF90aW1lLCBsb3dfdGltZSk7XG4rXG4rb3V0OlxuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbitcbisvKlxuKyAqIEtlZXAgcmVmYXVsdHMgZmxvd2luZyB0aHJvdWdoIHRoZSB0cmlnZ2VyIGNncm91cCBzbyByZWNsYWltIHJvdW5kc1xuKyAqIGtlZXAgYmVpbmcgdHJpZ2dlcmVkIHdoaWxlIHRoZSB0YXJnZXQgY2dyb3VwIGlzIGJlaW5nIHJlbW92ZWQuIFRoZVxuKyAqIGNoaWxkIGpvaW5zIHRoZSB0cmlnZ2VyIGNncm91cCBhbmQgd3JpdGVzIHRoZSBkYXRhIGZpbGUgdGhlcmUsIHNvXG4rICogdGhhdCB0aGUgZmlsZSBwYWdlcyBhcmUgY2hhcmdlZCB0byB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kIGFjdHVhbGx5XG4rICogY29tZSB1bmRlciBpdHMgbWVtb3J5IGxpbWl0OyB0aGVuIGl0IHJlLXJlYWRzIHRoZSBmaWxlIGluIGEgbG9vcFxuKyAqIHVudGlsIGl0IGlzIGtpbGxlZC5cbisgKi9cbitzdGF0aWMgcGlkX3Qgc3Bhd25fa2VlcGFsaXZlX3JlYWRlcihjb25zdCBjaGFyICpkYXRhX2ZpbGUpXG4re1xuK1x0cGlkX3QgcGlkID0gZm9yaygpO1xuK1xuK1x0aWYgKHBpZCAhPSAwKVxuK1x0XHRyZXR1cm4gcGlkO1xuK1xuK1x0aWYgKGpvaW5fcGFyZW50X2Nncm91cChDR19EWUlOR19UUklHR0VSX0RJUikpXG4rXHRcdF9leGl0KENISUxEX0VYSVRfSk9JTl9DR1JPVVApO1xuK1x0aWYgKHdyaXRlX2ZpbGUoZGF0YV9maWxlKSlcbitcdFx0X2V4aXQoQ0hJTERfRVhJVF9XUklURV9GSUxFKTtcbitcdGZvciAoOzspIHtcbitcdFx0aWYgKHJlYWRfZmlsZShkYXRhX2ZpbGUsIFJFQURfVElNRVMpKVxuK1x0XHRcdF9leGl0KENISUxEX0VYSVRfUkVBRF9GSUxFKTtcbitcdH1cbit9XG4rXG4rLyogUmVjbGFpbSBvdXRjb21lcyBvYnNlcnZlZCBzbyBmYXIsIHRhbGxpZWQgZnJvbSByaW5nYnVmIGV2ZW50cy4gKi9cbitzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiB7XG4rXHRpbnQgY2FsbGVkO1xuK1x0aW50IHNraXBwZWRfZHlpbmc7XG4rXHRpbnQgdGFyZ2V0X2dvbmU7XG4rfTtcbitcbitzdGF0aWMgaW50IG9uX3JlY2xhaW1fZXZlbnQodm9pZCAqY3R4LCB2b2lkICpkYXRhLCBzaXplX3Qgc3opXG4re1xuK1x0c3RydWN0IHJlY2xhaW1fZXZlbnRzX3NlZW4gKnNlZW4gPSBjdHg7XG4rXHRjb25zdCBzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXYgPSBkYXRhO1xuK1xuK1x0aWYgKHN6IFx1MDAzYyBzaXplb2YoKmV2KSlcbitcdFx0cmV0dXJuIDA7XG4rXG4rXHRzd2l0Y2ggKGV2LVx1MDAzZW91dGNvbWUpIHtcbitcdGNhc2UgUkVDTEFJTV9PVVRDT01FX0NBTExFRDpcbitcdFx0c2Vlbi1cdTAwM2VjYWxsZWQrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HOlxuK1x0XHRzZWVuLVx1MDAzZXNraXBwZWRfZHlpbmcrKztcbitcdFx0YnJlYWs7XG4rXHRjYXNlIFJFQ0xBSU1fT1VUQ09NRV9UQVJHRVRfR09ORTpcbitcdFx0c2Vlbi1cdTAwM2V0YXJnZXRfZ29uZSsrO1xuK1x0XHRicmVhaztcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbisvKlxuKyAqIFJlbW92ZSB0aGUgcmVjbGFpbSB0YXJnZXQgd2hpbGUgdGhlIEJQRiBwcm9ncmFtIGtlZXBzIHJ1bm5pbmcgYW5kXG4rICogdmVyaWZ5IHRoYXQgcmVjbGFpbSBzdG9wcyBvbiB0aGUgZHlpbmcvcmVtb3ZlZCBjZ3JvdXAgaW5zdGVhZCBvZlxuKyAqIHJlY2xhaW1pbmcgZnJvbSBpdC5cbisgKlxuKyAqIFRoZSB0YXJnZXQgc3RheXMgZW1wdHk7IHRoZSB3b3JrbG9hZCBsaXZlcyBpbiB0aGUgdHJpZ2dlciBjZ3JvdXAgYW5kXG4rICogb25seSBrZWVwcyByZWZhdWx0cyBmbG93aW5nIHNvIHRoYXQgcmVjbGFpbSByb3VuZHMga2VlcCBzdGFydGluZyxcbisgKiBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHRhcmdldCBpcyByZW1vdmVkLiBBIENBTExFRCBldmVudCB3aGlsZVxuKyAqIHRoZSB0YXJnZXQgaXMgYWxpdmUgcHJvdmVzIHRoYXQgcm91bmRzIHJlYWxseSBydW4gKHRoZSBrZnVuY1xuKyAqIHJldHVybnMgMCBvbiB0aGUgZW1wdHkgdGFyZ2V0LCBidXQgdGhlIGNhbGwgaXMgc3RpbGwgY291bnRlZCksIGFuZFxuKyAqIGFmdGVyIHRoZSByZW1vdmFsIHRoZSBwcm9ncmFtIG11c3QgcmVwb3J0IHRoZSByZW1vdmVkIHRhcmdldCB2aWFcbisgKiBTS0lQUEVEX0RZSU5HIG9yIFRBUkdFVF9HT05FIGV2ZW50cyB3aGlsZSByZWNsYWltX2NhbGxzIGFuZFxuKyAqIHJlY2xhaW1lZF9ieXRlcyBzdGF5IGZyb3plbi5cbisgKi9cbit2b2lkIHRlc3RfbWVtY2dfYXN5bmNfcmVjbGFpbV9keWluZyh2b2lkKVxuK3tcbitcdHU2NCB0cmlnZ2VyX2Nncm91cF9pZCwgdGFyZ2V0X2Nncm91cF9pZDtcbitcdHU2NCBjYWxsc19iZWZvcmUsIGJ5dGVzX2JlZm9yZTtcbitcdGNoYXIgZGF0YV9maWxlW1BBVEhfTUFYXSA9IFwiXCI7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudHNfc2VlbiBzZWVuID0ge307XG4rXHRzdHJ1Y3QgbWVtY2dfYXN5bmNfcmVjbGFpbSAqc2tlbCA9IE5VTEw7XG4rXHRzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gTlVMTDtcbitcdHBpZF90IHJlYWRlcl9waWQgPSAtMTtcbitcdGludCBlcnIsIGZkLCBpO1xuK1xuK1x0ZXJyID0gc2V0dXBfZHlpbmdfY2dyb3VwcyhcdTAwMjZ0cmlnZ2VyX2Nncm91cF9pZCwgXHUwMDI2dGFyZ2V0X2Nncm91cF9pZCk7XG4rXHRpZiAoIUFTU0VSVF9PSyhlcnIsIFwic2V0dXBfZHlpbmdfY2dyb3Vwc1wiKSlcbitcdFx0cmV0dXJuO1xuK1xuK1x0ZXJyID0gc2V0dXBfYnBmKHRyaWdnZXJfY2dyb3VwX2lkLCB0YXJnZXRfY2dyb3VwX2lkLCBcdTAwMjZza2VsKTtcbitcdGlmICghQVNTRVJUX09LKGVyciwgXCJzZXR1cF9icGZcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK1x0cmIgPSByaW5nX2J1ZmZlcl9fbmV3KGJwZl9tYXBfX2ZkKHNrZWwtXHUwMDNlbWFwcy5yZWNsYWltX2V2ZW50cyksXG4rXHRcdFx0ICAgICAgb25fcmVjbGFpbV9ldmVudCwgXHUwMDI2c2VlbiwgTlVMTCk7XG4rXHRpZiAoIUFTU0VSVF9PS19QVFIocmIsIFwicmluZ19idWZmZXJfX25ld1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRzbnByaW50ZihkYXRhX2ZpbGUsIHNpemVvZihkYXRhX2ZpbGUpLFxuK1x0XHQgXCIlcy9tZW1jZ19hc3luY19keWluZ19YWFhYWFhcIiwgd29ya2xvYWRfZmlsZXNfZGlyKCkpO1xuK1x0ZmQgPSBta3N0ZW1wKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HRShmZCwgMCwgXCJta3N0ZW1wXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGNsb3NlKGZkKTtcbitcbitcdHJlYWRlcl9waWQgPSBzcGF3bl9rZWVwYWxpdmVfcmVhZGVyKGRhdGFfZmlsZSk7XG4rXHRpZiAoIUFTU0VSVF9HVChyZWFkZXJfcGlkLCAwLCBcImZvcmsga2VlcGFsaXZlIHJlYWRlclwiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHQvKiBXYWl0IGZvciByZWNsYWltIHJvdW5kcyB0byByZWFjaCB0aGUgbGl2ZSB0YXJnZXQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2ICFzZWVuLmNhbGxlZDsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXHRpZiAoIUFTU0VSVF9HVChzZWVuLmNhbGxlZCwgMCwgXCJyZWNsYWltIGV2ZW50c1wiKSlcbitcdFx0Z290byBvdXQ7XG4rXG4rXHRyZW1vdmVfY2dyb3VwKENHX0RZSU5HX1RBUkdFVF9ESVIpO1xuK1xuK1x0LyogTGV0IHJlY2xhaW0gcGFzc2VzIHRoYXQgd2VyZSBhbHJlYWR5IGluIGZsaWdodCBkcmFpbi4gKi9cbitcdHVzbGVlcChEWUlOR19TRVRUTEVfVVMpO1xuK1xuK1x0Y2FsbHNfYmVmb3JlID0gc2tlbC1cdTAwM2Vic3MtXHUwMDNlcmVjbGFpbV9jYWxscztcbitcdGJ5dGVzX2JlZm9yZSA9IHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcztcbitcbitcdC8qIFdhaXQgZm9yIGEgcmVjbGFpbSByb3VuZCB0byBoaXQgdGhlIHJlbW92ZWQgY2dyb3VwLiAqL1xuK1x0Zm9yIChpID0gMDsgaSBcdTAwM2MgRVZFTlRfUE9MTF9ST1VORFMgXHUwMDI2XHUwMDI2XG4rXHRcdCAgICAhc2Vlbi5za2lwcGVkX2R5aW5nIFx1MDAyNlx1MDAyNiAhc2Vlbi50YXJnZXRfZ29uZTsgaSsrKSB7XG4rXHRcdGVyciA9IHJpbmdfYnVmZmVyX19wb2xsKHJiLCBFVkVOVF9QT0xMX1RJTUVPVVRfTVMpO1xuK1x0XHRpZiAoIUFTU0VSVF9HRShlcnIsIDAsIFwicmluZ19idWZmZXJfX3BvbGxcIikpXG4rXHRcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHRpZiAoIXNlZW4uc2tpcHBlZF9keWluZyBcdTAwMjZcdTAwMjYgIXNlZW4udGFyZ2V0X2dvbmUpIHtcbitcdFx0UFJJTlRfRkFJTChcIm5vIHJlY2xhaW0gcm91bmQgaGl0IHRoZSByZW1vdmVkIGNncm91cCAoZ29uZT0lZCwgZHlpbmc9JWQpXCIsXG4rXHRcdFx0ICAgc2Vlbi50YXJnZXRfZ29uZSwgc2Vlbi5za2lwcGVkX2R5aW5nKTtcbitcdFx0Z290byBvdXQ7XG4rXHR9XG4rXG4rXHQvKlxuK1x0ICogc2tpcHBlZF9keWluZyBldmVudHMgc2hvdyB0aGF0IHRoZSBDU1NfRFlJTkcvQ1NTX09OTElORSBjaGVja1xuK1x0ICogY2F1Z2h0IHRoZSBjZ3JvdXAgbWlkLXRlYXJkb3duLiBXaGV0aGVyIHRoZXkgaGFwcGVuIGlzIHRpbWluZ1xuK1x0ICogZGVwZW5kZW50LCBiZWNhdXNlIHRoZSBjZ3JvdXAgbWF5IGFscmVhZHkgYmUgZnVsbHkgcmVsZWFzZWQsIHNvXG4rXHQgKiBvbmx5IHRoZSBjb21iaW5lZCBza2lwIGNvdW50IGFib3ZlIGlzIGFzc2VydGVkLlxuK1x0ICovXG4rXHRwcmludGYoXCJtZW1jZ19hc3luY19yZWNsYWltX2R5aW5nOiBza2lwcyBvbiByZW1vdmVkIGNncm91cDogZ29uZT0lZCwgZHlpbmc9JWRcXG5cIixcbitcdCAgICAgICBzZWVuLnRhcmdldF9nb25lLCBzZWVuLnNraXBwZWRfZHlpbmcpO1xuK1xuK1x0LyogTm90aGluZyBtYXkgaGF2ZSBiZWVuIHJlY2xhaW1lZCBmcm9tIHRoZSByZW1vdmVkIHRhcmdldC4gKi9cbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1fY2FsbHMsIGNhbGxzX2JlZm9yZSwgXCJyZWNsYWltX2NhbGxzXCIpKVxuK1x0XHRnb3RvIG91dDtcbitcdGlmICghQVNTRVJUX0VRKHNrZWwtXHUwMDNlYnNzLVx1MDAzZXJlY2xhaW1lZF9ieXRlcywgYnl0ZXNfYmVmb3JlLFxuK1x0XHQgICAgICAgXCJyZWNsYWltZWRfYnl0ZXNcIikpXG4rXHRcdGdvdG8gb3V0O1xuK1xuK291dDpcbitcdGlmIChyZWFkZXJfcGlkIFx1MDAzZSAwKSB7XG4rXHRcdGtpbGwocmVhZGVyX3BpZCwgU0lHS0lMTCk7XG4rXHRcdCh2b2lkKXdhaXRwaWQocmVhZGVyX3BpZCwgTlVMTCwgMCk7XG4rXHR9XG4rXHRpZiAoZGF0YV9maWxlWzBdKVxuK1x0XHR1bmxpbmsoZGF0YV9maWxlKTtcbitcdGlmIChyYilcbitcdFx0cmluZ19idWZmZXJfX2ZyZWUocmIpO1xuK1x0aWYgKHNrZWwpXG4rXHRcdG1lbWNnX2FzeW5jX3JlY2xhaW1fX2Rlc3Ryb3koc2tlbCk7XG4rXHRjbGVhbnVwX2Nncm91cF9lbnZpcm9ubWVudCgpO1xuK31cbmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9icGYvcHJvZ3MvbWVtY2dfYXN5bmNfcmVjbGFpbS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmL3Byb2dzL21lbWNnX2FzeW5jX3JlY2xhaW0uY1xubmV3IGZpbGUgbW9kZSAxMDA2NDRcbmluZGV4IDAwMDAwMDAwMDAwMDAuLmMxOGJlYjY0MTZkMzBcbi0tLSAvZGV2L251bGxcbisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JwZi9wcm9ncy9tZW1jZ19hc3luY19yZWNsYWltLmNcbkBAIC0wLDAgKzEsMjg4IEBAXG4rLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjBcbitcbisjaW5jbHVkZSBcInZtbGludXguaFwiXG4rI2luY2x1ZGUgXCJicGZfZXhwZXJpbWVudGFsLmhcIlxuKyNpbmNsdWRlIFx1MDAzY2JwZi9icGZfaGVscGVycy5oXHUwMDNlXG4rI2luY2x1ZGUgXHUwMDNjYnBmL2JwZl90cmFjaW5nLmhcdTAwM2VcbisjaW5jbHVkZSBcdTAwM2NicGYvYnBmX2NvcmVfcmVhZC5oXHUwMDNlXG4rXG4rI2RlZmluZSBDTE9DS19NT05PVE9OSUNfSURcdDFcbisjZGVmaW5lIFBBR0VfU0laRVx0XHQ0MDk2VUxcbisvKlxuKyAqIE9uZSByZWNsYWltIHJvdW5kIHRhcmdldHMgUkVDTEFJTV9NQVhfSVRFUiBiYXRjaGVzIG9mIFJFQ0xBSU1fU0laRVxuKyAqIGVhY2guIEVhY2ggYnBmX3dxIGNhbGxiYWNrIHJlY2xhaW1zIGEgc2luZ2xlIGJhdGNoIGFuZCByZXF1ZXVlcyB0aGVcbisgKiBzYW1lIHdvcmsgaXRlbSBmb3IgdGhlIG5leHQgb25lLCBzbyBubyBjYWxsYmFjayBydW5zIGxvbmdlciB0aGFuIG9uZVxuKyAqIGJvdW5kZWQgcmVjbGFpbSBwYXNzLlxuKyAqL1xuKyNkZWZpbmUgUkVDTEFJTV9TSVpFXHRcdCgzMiAqIFBBR0VfU0laRSlcbisjZGVmaW5lIFJFQ0xBSU1fTUFYX0lURVJcdDMyXG4rXG4rc3RydWN0IGJwZl9hcmdzIHtcbitcdHU2NCBoaWdoX2Nncm91cF9pZDtcbitcdHU2NCBsb3dfY2dyb3VwX2lkO1xuK1x0dTY0IGV2ZW50X2RlbHRhX3RocmVzaG9sZDtcbitcdHU2NCBjaGVja19ucztcbit9O1xuK1xuK3N0cnVjdCBjZ3JvdXBfbWVtY2cge1xuK1x0c3RydWN0IGNncm91cCAqY2dycDtcbitcdHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZztcbit9O1xuK1xuK3N0YXRpYyB1NjQgd3FfaGlnaF9jZ3JvdXBfaWQ7XG4rc3RhdGljIHU2NCB3cV9sb3dfY2dyb3VwX2lkO1xuK1xuKy8qXG4rICogU3RhdGlzdGljcyBleHBvc2VkIHRvIHVzZXJzcGFjZSB0aHJvdWdoIC5ic3MsIHNvIHRoZSB0ZXN0IGNhbiB2ZXJpZnlcbisgKiB0aGF0IHJlY2xhaW0gYWN0dWFsbHkgaGFwcGVuZWQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHRpbWluZyBhbG9uZS5cbisgKi9cbit1NjQgcmVjbGFpbV9jYWxscztcbit1NjQgcmVjbGFpbWVkX2J5dGVzO1xuK1xuKy8qXG4rICogT3V0Y29tZSBvZiBhIHNpbmdsZSByZWNsYWltIGF0dGVtcHQsIHJlcG9ydGVkIHRvIHVzZXJzcGFjZSB0aHJvdWdoXG4rICogdGhlIHJlY2xhaW1fZXZlbnRzIHJpbmdidWYgc28gdGVzdHMgY2FuIHdhaXQgZm9yIHJlY2xhaW0gZXZlbnRzIHdpdGhcbisgKiBhIHRpbWVvdXQgaW5zdGVhZCBvZiBwb2xsaW5nIHRoZSBjb3VudGVycyBhYm92ZS5cbisgKi9cbitlbnVtIHJlY2xhaW1fb3V0Y29tZSB7XG4rXHRSRUNMQUlNX09VVENPTUVfQ0FMTEVELFxuK1x0UkVDTEFJTV9PVVRDT01FX1NLSVBQRURfRFlJTkcsXG4rXHRSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUsXG4rfTtcbitcbitzdHJ1Y3QgcmVjbGFpbV9ldmVudCB7XG4rXHRfX3U2NCBvdXRjb21lO1xuK307XG4rXG4rc3RydWN0IHtcbitcdF9fdWludCh0eXBlLCBCUEZfTUFQX1RZUEVfUklOR0JVRik7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEgXHUwMDNjXHUwMDNjIDE2KTtcbit9IHJlY2xhaW1fZXZlbnRzIFNFQyhcIi5tYXBzXCIpO1xuK1xuKy8qXG4rICogUmVwb3J0cyBhcmUgYmVzdCBlZmZvcnQ6IHdoZW4gdGhlIHJpbmdidWYgaXMgZnVsbCwgZm9yIGV4YW1wbGUgd2hlblxuKyAqIHVzZXJzcGFjZSBkb2VzIG5vdCBjb25zdW1lIHRoZSBldmVudHMsIHRoZSByZXBvcnQgaXMgZHJvcHBlZC5cbisgKi9cbitzdGF0aWMgdm9pZCBlbWl0X3JlY2xhaW1fZXZlbnQoZW51bSByZWNsYWltX291dGNvbWUgb3V0Y29tZSlcbit7XG4rXHRzdHJ1Y3QgcmVjbGFpbV9ldmVudCAqZXY7XG4rXG4rXHRldiA9IGJwZl9yaW5nYnVmX3Jlc2VydmUoXHUwMDI2cmVjbGFpbV9ldmVudHMsIHNpemVvZigqZXYpLCAwKTtcbitcdGlmICghZXYpXG4rXHRcdHJldHVybjtcbitcbitcdGV2LVx1MDAzZW91dGNvbWUgPSBvdXRjb21lO1xuK1x0YnBmX3JpbmdidWZfc3VibWl0KGV2LCAwKTtcbit9XG4rXG4rc3RhdGljIGludCBnZXRfY2dyb3VwX21lbWNnX2Zyb21faWQodTY0IGNncm91cF9pZCwgc3RydWN0IGNncm91cF9tZW1jZyAqY20pXG4re1xuK1x0Y20tXHUwMDNlY2dycCA9IGJwZl9jZ3JvdXBfZnJvbV9pZChjZ3JvdXBfaWQpO1xuK1x0aWYgKCFjbS1cdTAwM2VjZ3JwKVxuK1x0XHRyZXR1cm4gLTE7XG4rXG4rXHRjbS1cdTAwM2VtZW1jZyA9IGJwZl9nZXRfbWVtX2Nncm91cChcdTAwMjZjbS1cdTAwM2VjZ3JwLVx1MDAzZXNlbGYpO1xuK1x0aWYgKCFjbS1cdTAwM2VtZW1jZykge1xuK1x0XHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rXHRcdHJldHVybiAtMTtcbitcdH1cbitcbitcdHJldHVybiAwO1xuK31cbitcbitzdGF0aWMgdm9pZCBwdXRfY2dyb3VwX21lbWNnKHN0cnVjdCBjZ3JvdXBfbWVtY2cgKmNtKVxuK3tcbitcdGJwZl9wdXRfbWVtX2Nncm91cChjbS1cdTAwM2VtZW1jZyk7XG4rXHRicGZfY2dyb3VwX3JlbGVhc2UoY20tXHUwMDNlY2dycCk7XG4rfVxuK1xuK3N0YXRpYyBpbnQgZ2V0X2Nncm91cF9ldmVudCh1NjQgY2dyb3VwX2lkLCB1NjQgKnZhbClcbit7XG4rXHRzdHJ1Y3QgY2dyb3VwX21lbWNnIGNtO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfbWVtY2dfZnJvbV9pZChjZ3JvdXBfaWQsIFx1MDAyNmNtKSlcbitcdFx0cmV0dXJuIC0xO1xuK1x0YnBmX21lbV9jZ3JvdXBfZmx1c2hfc3RhdHMoY20ubWVtY2cpO1xuK1x0KnZhbCA9IGJwZl9tZW1fY2dyb3VwX3BhZ2Vfc3RhdGUoY20ubWVtY2csXG4rXHRcdGJwZl9jb3JlX2VudW1fdmFsdWUoZW51bSBub2RlX3N0YXRfaXRlbSxcbitcdFx0XHRcdCAgICBXT1JLSU5HU0VUX1JFRkFVTFRfRklMRSkpO1xuK1x0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rc3RhdGljIGJvb2xcbitzaG91bGRfcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0ICpwcmV2X2V2ZW50LCB1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkKVxuK3tcbitcdHU2NCBjdXIsIGRlbHRhO1xuK1xuK1x0aWYgKGdldF9jZ3JvdXBfZXZlbnQoY2dyb3VwX2lkLCBcdTAwMjZjdXIpKVxuK1x0XHRyZXR1cm4gZmFsc2U7XG4rXG4rXHRkZWx0YSA9IGN1ciAtICpwcmV2X2V2ZW50O1xuK1x0KnByZXZfZXZlbnQgPSBjdXI7XG4rXG4rXHRyZXR1cm4gZGVsdGEgXHUwMDNlPSBldmVudF9kZWx0YV90aHJlc2hvbGQ7XG4rfVxuK1xuKy8qXG4rICogQSBjZ3JvdXAgaXMgZHlpbmcgb25jZSBpdCBoYXMgYmVlbiBvZmZsaW5lZCAoQ1NTX09OTElORSBjbGVhcmVkKSBvclxuKyAqIENTU19EWUlORyBoYXMgYmVlbiByYWlzZWQsIG1pcnJvcmluZyBjZ3JvdXBfaXNfZGVhZCgpL2Nzc19pc19keWluZygpXG4rICogaW4gaW5jbHVkZS9saW51eC9jZ3JvdXAuaC4gYnBmX2Nncm91cF9mcm9tX2lkKCkgY2FuIHN0aWxsIGhhbmQgYmFja1xuKyAqIHN1Y2ggYSBjZ3JvdXAsIGJlY2F1c2UgaXQgb25seSBmYWlscyBvbmNlIHRoZSBsYXN0IHJlZmVyZW5jZSBoYXMgYmVlblxuKyAqIGRyb3BwZWQsIHNvIHJlY2xhaW0gaGFzIHRvIGNoZWNrIHRoZXNlIGZsYWdzIGluc3RlYWQgb2YgcmVseWluZyBvblxuKyAqIHRoZSBsb29rdXAgZmFpbGluZy5cbisgKlxuKyAqIENTU19PTkxJTkUgYW5kIENTU19EWUlORyBjb21lIGZyb20gdm1saW51eC5oOiB0aGUga2VybmVsIGRlZmluZXMgdGhlbVxuKyAqIGluIGFuIGFub255bW91cyBlbnVtLCBzbyBicGZfY29yZV9lbnVtX3ZhbHVlKCkgaGFzIG5vIGVudW0gdHlwZSB0b1xuKyAqIGJpbmQgdG8sIGFuZCByZWRlY2xhcmluZyB0aGVtIGxvY2FsbHkgd291bGQgY2xhc2ggd2l0aCB0aGUgdm1saW51eC5oXG4rICogZW51bWVyYXRvcnMuIHZtbGludXguaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwncyBCVEYsIHNvXG4rICogdGhlIHZhbHVlcyBhbHJlYWR5IG1hdGNoIHRoZSB0YXJnZXQga2VybmVsLlxuKyAqL1xuK3N0YXRpYyBib29sIGNncm91cF9pc19keWluZyhzdHJ1Y3QgY2dyb3VwICpjZ3JwKVxuK3tcbitcdHVuc2lnbmVkIGludCBmbGFncyA9IGNncnAtXHUwMDNlc2VsZi5mbGFncztcbitcbitcdHJldHVybiAoZmxhZ3MgXHUwMDI2IENTU19EWUlORykgfHwgIShmbGFncyBcdTAwMjYgQ1NTX09OTElORSk7XG4rfVxuK1xuKy8qXG4rICogUmVjbGFpbSBvbmUgYmF0Y2ggZnJvbSB0aGUgdGFyZ2V0IGNncm91cC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mXG4rICogYnl0ZXMgcmVjbGFpbWVkLCBvciAwIGlmIHRoZSBjZ3JvdXAgaXMgZHlpbmcgb3IgZ29uZSBvciBub3RoaW5nIHdhc1xuKyAqIHJlY2xhaW1lZC4gRWFjaCBhdHRlbXB0IHJlcG9ydHMgaXRzIG91dGNvbWUgdGhyb3VnaCB0aGVcbisgKiByZWNsYWltX2V2ZW50cyByaW5nYnVmLlxuKyAqL1xuK3N0YXRpYyB1NjQgcmVjbGFpbV9jZ3JvdXAodTY0IGNncm91cF9pZCwgdTY0IHNpemUpXG4re1xuK1x0c3RydWN0IGNncm91cF9tZW1jZyBjbTtcbitcdHU2NCBuciA9IDA7XG4rXG4rXHRpZiAoZ2V0X2Nncm91cF9tZW1jZ19mcm9tX2lkKGNncm91cF9pZCwgXHUwMDI2Y20pKSB7XG4rXHRcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfVEFSR0VUX0dPTkUpO1xuK1x0XHRyZXR1cm4gMDtcbitcdH1cbitcbitcdGlmIChjZ3JvdXBfaXNfZHlpbmcoY20uY2dycCkpIHtcbitcdFx0ZW1pdF9yZWNsYWltX2V2ZW50KFJFQ0xBSU1fT1VUQ09NRV9TS0lQUEVEX0RZSU5HKTtcbitcdFx0cHV0X2Nncm91cF9tZW1jZyhcdTAwMjZjbSk7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0cmVjbGFpbV9jYWxscysrO1xuK1x0bnIgPSBicGZfcHJvYWN0aXZlX3JlY2xhaW0oY20ubWVtY2csIHNpemUsIC0xKTtcbitcdHJlY2xhaW1lZF9ieXRlcyArPSBucjtcbitcdGVtaXRfcmVjbGFpbV9ldmVudChSRUNMQUlNX09VVENPTUVfQ0FMTEVEKTtcbitcbitcdHB1dF9jZ3JvdXBfbWVtY2coXHUwMDI2Y20pO1xuK1xuK1x0cmV0dXJuIG5yO1xuK31cbitcbitzdHJ1Y3Qgd3FfZWxlbSB7XG4rXHRzdHJ1Y3QgYnBmX3RpbWVyIHRpbWVyO1xuK1x0c3RydWN0IGJwZl93cSB3b3JrO1xuK1x0dTY0IHByZXZfZXZlbnQ7XG4rXHR1NjQgZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0dTY0IGNoZWNrX25zO1xuK1x0LypcbitcdCAqIEJ5dGVzIHN0aWxsIHRvIHJlY2xhaW0gaW4gdGhlIGN1cnJlbnQgcm91bmQsIGNhcnJpZWQgYWNyb3NzXG4rXHQgKiByZXF1ZXVlcy4gMCBtZWFucyBubyByb3VuZCBpcyBpbiBwcm9ncmVzczsgdGhlIHRpbWVyIHBhdGhcbitcdCAqIHN0YXJ0cyBhIG5ldyByb3VuZCBieSByZXNldHRpbmcgaXQsIHJlcXVldWVkIHdvcmsgb25seSBsb29rc1xuK1x0ICogYXQgaXQuXG4rXHQgKi9cbitcdHU2NCByZW1haW5pbmc7XG4rfTtcbitcbitzdHJ1Y3Qge1xuK1x0X191aW50KHR5cGUsIEJQRl9NQVBfVFlQRV9BUlJBWSk7XG4rXHRfX3VpbnQobWF4X2VudHJpZXMsIDEpO1xuK1x0X190eXBlKGtleSwgX191MzIpO1xuK1x0X190eXBlKHZhbHVlLCBzdHJ1Y3Qgd3FfZWxlbSk7XG4rfSB3cV9tYXAgU0VDKFwiLm1hcHNcIik7XG4rXG4rc3RhdGljIGludCByZWNsYWltX3dvcmtfZm4odm9pZCAqbWFwLCBpbnQgKmtleSwgdm9pZCAqdmFsdWUpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW0gPSB2YWx1ZTtcbitcdHU2NCBuciwgc2l6ZTtcbitcbitcdGlmICghZWxlbS1cdTAwM2VyZW1haW5pbmcpIHtcbitcdFx0LypcbitcdFx0ICogVGltZXItdHJpZ2dlcmVkIGVudHJ5OiBzdGFydCBhIG5ldyByb3VuZCBvbmx5IHdoZW4gdGhlXG4rXHRcdCAqIGhpZ2ggY2dyb3VwIHJlZmF1bHRzIGVub3VnaC4gUmVxdWV1ZWQgZW50cmllcyBza2lwIHRoaXNcbitcdFx0ICogY2hlY2sgYW5kIG9ubHkgbG9vayBhdCByZW1haW5pbmcsIHNvIHRoZSByZWZhdWx0IGRlbHRhXG4rXHRcdCAqIGlzIGNvbnN1bWVkIG9uY2UgcGVyIHJvdW5kLlxuK1x0XHQgKi9cbitcdFx0aWYgKCFzaG91bGRfcmVjbGFpbV9jZ3JvdXAod3FfaGlnaF9jZ3JvdXBfaWQsIFx1MDAyNmVsZW0tXHUwMDNlcHJldl9ldmVudCxcbitcdFx0XHRlbGVtLVx1MDAzZWV2ZW50X2RlbHRhX3RocmVzaG9sZCkpXG4rXHRcdFx0cmV0dXJuIDA7XG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nID0gUkVDTEFJTV9NQVhfSVRFUiAqIFJFQ0xBSU1fU0laRTtcbitcdH1cbitcbitcdC8qIE9uZSBib3VuZGVkIHJlY2xhaW0gcGFzcyBwZXIgY2FsbGJhY2sgKi9cbitcdHNpemUgPSBlbGVtLVx1MDAzZXJlbWFpbmluZyBcdTAwM2MgUkVDTEFJTV9TSVpFID8gZWxlbS1cdTAwM2VyZW1haW5pbmcgOiBSRUNMQUlNX1NJWkU7XG4rXHRuciA9IHJlY2xhaW1fY2dyb3VwKHdxX2xvd19jZ3JvdXBfaWQsIHNpemUpO1xuK1x0aWYgKCFucikge1xuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRcdHJldHVybiAwO1xuK1x0fVxuK1xuK1x0LyogdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpIG1heSByZWNsYWltIG1vcmUgdGhhbiByZXF1ZXN0ZWQgKi9cbitcdGlmIChuciBcdTAwM2U9IGVsZW0tXHUwMDNlcmVtYWluaW5nKVxuK1x0XHRlbGVtLVx1MDAzZXJlbWFpbmluZyA9IDA7XG4rXHRlbHNlXG4rXHRcdGVsZW0tXHUwMDNlcmVtYWluaW5nIC09IG5yO1xuK1xuK1x0LyogUmVxdWV1ZSB0aGUgc2FtZSB3b3JrIGl0ZW0gZm9yIHRoZSBuZXh0IGJhdGNoICovXG4rXHRpZiAoZWxlbS1cdTAwM2VyZW1haW5pbmcpXG4rXHRcdGJwZl93cV9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXdvcmssIDApO1xuK1xuK1x0cmV0dXJuIDA7XG4rfVxuK1xuK3N0YXRpYyBpbnQgd3FfdGltZXJfY2Iodm9pZCAqbWFwLCBpbnQgKmtleSwgc3RydWN0IHdxX2VsZW0gKmVsZW0pXG4re1xuK1x0YnBmX3dxX3N0YXJ0KFx1MDAyNmVsZW0tXHUwMDNld29yaywgMCk7XG4rXHRicGZfdGltZXJfc3RhcnQoXHUwMDI2ZWxlbS1cdTAwM2V0aW1lciwgZWxlbS1cdTAwM2VjaGVja19ucywgMCk7XG4rXG4rXHRyZXR1cm4gMDtcbit9XG4rXG4rU0VDKFwic3lzY2FsbFwiKVxuK2ludCB3cV9wcm9nX2luaXQoc3RydWN0IGJwZl9hcmdzICpjdHgpXG4re1xuK1x0c3RydWN0IHdxX2VsZW0gKmVsZW07XG4rXHRfX3UzMiBrZXkgPSAwO1xuK1x0aW50IHJldDtcbitcbitcdGVsZW0gPSBicGZfbWFwX2xvb2t1cF9lbGVtKFx1MDAyNndxX21hcCwgXHUwMDI2a2V5KTtcbitcdGlmICghZWxlbSlcbitcdFx0cmV0dXJuIC0xO1xuK1xuK1x0cmV0ID0gYnBmX3dxX2luaXQoXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCBcdTAwMjZ3cV9tYXAsIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl93cV9zZXRfY2FsbGJhY2soXHUwMDI2ZWxlbS1cdTAwM2V3b3JrLCByZWNsYWltX3dvcmtfZm4sIDApO1xuK1x0aWYgKHJldClcbitcdFx0cmV0dXJuIHJldDtcbitcbitcdHJldCA9IGJwZl90aW1lcl9pbml0KFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIFx1MDAyNndxX21hcCwgQ0xPQ0tfTU9OT1RPTklDX0lEKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRyZXQgPSBicGZfdGltZXJfc2V0X2NhbGxiYWNrKFx1MDAyNmVsZW0tXHUwMDNldGltZXIsIHdxX3RpbWVyX2NiKTtcbitcdGlmIChyZXQpXG4rXHRcdHJldHVybiByZXQ7XG4rXG4rXHRlbGVtLVx1MDAzZXByZXZfZXZlbnQgPSAwO1xuK1x0ZWxlbS1cdTAwM2VyZW1haW5pbmcgPSAwO1xuK1x0ZWxlbS1cdTAwM2VldmVudF9kZWx0YV90aHJlc2hvbGQgPSBjdHgtXHUwMDNlZXZlbnRfZGVsdGFfdGhyZXNob2xkO1xuK1x0ZWxlbS1cdTAwM2VjaGVja19ucyA9IGN0eC1cdTAwM2VjaGVja19ucztcbitcbitcdHdxX2hpZ2hfY2dyb3VwX2lkID0gY3R4LVx1MDAzZWhpZ2hfY2dyb3VwX2lkO1xuK1x0d3FfbG93X2Nncm91cF9pZCA9IGN0eC1cdTAwM2Vsb3dfY2dyb3VwX2lkO1xuK1xuK1x0cmV0dXJuIGJwZl90aW1lcl9zdGFydChcdTAwMjZlbGVtLVx1MDAzZXRpbWVyLCBlbGVtLVx1MDAzZWNoZWNrX25zLCAwKTtcbit9XG4rXG4rY2hhciBfbGljZW5zZVtdIFNFQyhcImxpY2Vuc2VcIikgPSBcIkdQTFwiO1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDktMTFUMDM6MTU6MjIuNjg0MjEzNTA1WiIsIlNlcSI6MTUsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjY5MDQ4MzE4ODksIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqS01TQU4gRnV6emluZyBFdmFsdWF0aW9uIGZvciBUaGlzIFBhdGNoIFNlcmllcyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgaW5pdGlhbCB0aG91Z2h0IGlzIHRvIGZpZ3VyZSBvdXQgd2hldGhlciB3ZSBuZWVkIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBmb3IgdGhpcyBwYXRjaCBzZXJpZXMuIFdlJ3JlIGxvb2tpbmcgYXQgY29kZSBjaGFuZ2VzIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCwgYG1tL2ludGVybmFsLmhgLCBhbmQgc29tZSBzZWxmdGVzdHMuXG5cbkZpcnN0LCBJIG5lZWQgdG8gdW5kZXJzdGFuZCB3aGF0J3MgYWN0dWFsbHkgKmhhcHBlbmluZyogaGVyZS4gVGhlIGNvcmUgc2VlbXMgdG8gYmUgdGhlIGFkZGl0aW9uIG9mIGEgbmV3IGtmdW5jLCBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYC4gSXQncyBwcmV0dHkgc3RyYWlnaHRmb3J3YXJkOiBpdCB0YWtlcyBhIGBtZW1fY2dyb3VwYCwgYSBzaXplLCBhbmQgYSBgc3dhcHBpbmVzc2AgdmFsdWUsIGRvZXMgc29tZSBzaXplIGFuZCBzd2FwcGluZXNzIGNoZWNraW5nLCBjYWxjdWxhdGVzIGEgbnVtYmVyIG9mIHBhZ2VzLCBhbmQgdGhlbiBjYWxscyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AuIFRoaXMgZnVuY3Rpb24gaXMgcmVnaXN0ZXJlZCBmb3IgYEJQRl9QUk9HX1RZUEVfU1lTQ0FMTGAgd2l0aCB0aGUgYEtGX1NMRUVQQUJMRWAgZmxhZywgd2hpY2ggaXMgZ29vZCB0byBub3RlLiBUaGUgYGludGVybmFsLmhgIGNoYW5nZXMganVzdCBsb29rIGxpa2UgYSBjb252ZXJzaW9uIGZyb20gZGVmaW5lcyB0byBhbiBlbnVtIGZvciBzd2FwcGluZXNzIHZhbHVlcy4gQW5kIHdlJ3ZlIGdvdCBhIG5ldyBzZWxmdGVzdCBzdWl0ZSBpbiBgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnBmYCB0aGF0IGFyZSBnb2luZyB0byBiZSB2ZXJpZnlpbmcgdGhpcy5cblxuTXkgcHJpbWFyeSBjb25jZXJuIGlzIGhvdyBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgYW5kIHNwZWNpZmljYWxseSBob3cgdGhlIGBzd2FwcGluZXNzYCBhcmd1bWVudCB3b3JrcyBhbmQgaXMgdXNlZC4gR2l2ZW4gdGhpcyBpcyBuZXcga2Z1bmMgYW5kIGNvdWxkIGJlIGV4cG9zZWQgaW4gdXNlciBzcGFjZSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgaG93IGl0J3MgaW50ZWdyYXRlZCB0byBtYWtlIHN1cmUgdGhlcmUncyBubyBzdWJ0bGUgaXNzdWUgdGhhdCBLTVNBTiBtaWdodCBjYXRjaCwgYW5kIHRoYXQncyBwcm9iYWJseSB0aGUgbW9zdCBpbnRlcmVzdGluZyBwYXJ0IG9mIHRoaXMgcGF0Y2ggc2VyaWVzIGZvciBub3cuIEkgbmVlZCB0byBkaWcgaW50byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AgaXRzZWxmLiBBIHF1aWNrIGdyZXBwZXIgc2VhcmNoIHNob3VsZCBkbyB0aGUgdHJpY2ssIG9yIEkgY2FuIGp1c3QgY2hlY2sgdGhlIGNvZGUgaXRzZWxmLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNTUyMCwiT3V0cHV0VG9rZW5zIjozNCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjUyMiwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjI5LjU4OTA0ODg4NFoiLCJTZXEiOjE2LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NTAxNTUyNjIsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwidHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc1wiLFxuICBcIlBhdGhQcmVmaXhcIjogXCJtbS9cIlxufSIsIlJlc3VsdHMiOiJ7XG4gIFwiT3V0cHV0XCI6IFwibW0vYnBmX21lbWNvbnRyb2wuYz0yMDc9X19icGZfa2Z1bmMgdW5zaWduZWQgbG9uZyBicGZfcHJvYWN0aXZlX3JlY2xhaW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMjEtXFxubW0vYnBmX21lbWNvbnRyb2wuYzoyMjI6XFx0bnJfcmVjbGFpbWVkID0gdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhtZW1jZywgbnJfcGFnZXMsXFxubW0vYnBmX21lbWNvbnRyb2wuYy0yMjMtXFx0XFx0XFx0XFx0XFx0XFx0ICAgIEdGUF9LRVJORUwsXFxuLS1cXG5tbS9pbnRlcm5hbC5oPTc3PWVudW0ge1xcbi0tXFxubW0vaW50ZXJuYWwuaC04NC1cXG5tbS9pbnRlcm5hbC5oOjg1OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vaW50ZXJuYWwuaC04Ni1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jPTE3NzE9c3RhdGljIGludCBtZW1fY2dyb3VwX3Jlc2l6ZV9tYXgoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE4MTUtXFxubW0vbWVtY29udHJvbC12MS5jOjE4MTY6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODE3LVxcdFxcdFxcdFxcdG1lbXN3ID8gMCA6IE1FTUNHX1JFQ0xBSU1fTUFZX1NXQVAsIE5VTEwpKSB7XFxuLS1cXG5tbS9tZW1jb250cm9sLXYxLmM9MTgzND1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfZm9yY2VfZW1wdHkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKVxcbi0tXFxubW0vbWVtY29udHJvbC12MS5jLTE4NTEtXFxubW0vbWVtY29udHJvbC12MS5jOjE4NTI6XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCAxLCBHRlBfS0VSTkVMLFxcbm1tL21lbWNvbnRyb2wtdjEuYy0xODUzLVxcdFxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCwgTlVMTCkpXFxuLS1cXG5tbS9tZW1jb250cm9sLmM9MjM3OD1zdGF0aWMgdW5zaWduZWQgbG9uZyByZWNsYWltX2hpZ2goc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTIzOTMtXFx0XFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyMzk0OlxcdFxcdG5yX3JlY2xhaW1lZCArPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyxcXG5tbS9tZW1jb250cm9sLmMtMjM5NS1cXHRcXHRcXHRcXHRcXHRcXHRcXHRnZnBfbWFzayxcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz0yNjQ1PXN0YXRpYyBpbnQgdHJ5X2NoYXJnZV9tZW1jZyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csIGdmcF90IGdmcF9tYXNrLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTI3MTctXFx0cHNpX21lbXN0YWxsX2VudGVyKFxcdTAwMjZwZmxhZ3MpO1xcbm1tL21lbWNvbnRyb2wuYzoyNzE4OlxcdG5yX3JlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtX292ZXJfbGltaXQsIG5yX3BhZ2VzLFxcbm1tL21lbWNvbnRyb2wuYy0yNzE5LVxcdFxcdFxcdFxcdFxcdFxcdCAgICBnZnBfbWFzaywgcmVjbGFpbV9vcHRpb25zLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00ODM4PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9oaWdoX3dyaXRlKHN0cnVjdCBrZXJuZnNfb3Blbl9maWxlICpvZixcXG4tLVxcbm1tL21lbWNvbnRyb2wuYy00ODc5LVxcbm1tL21lbWNvbnRyb2wuYzo0ODgwOlxcdFxcdHJlY2xhaW1lZCA9IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMobWVtY2csIG5yX3BhZ2VzIC0gaGlnaCxcXG5tbS9tZW1jb250cm9sLmMtNDg4MS1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKTtcXG4tLVxcbm1tL21lbWNvbnRyb2wuYz00ODk3PXN0YXRpYyBzc2l6ZV90IG1lbW9yeV9tYXhfd3JpdGUoc3RydWN0IGtlcm5mc19vcGVuX2ZpbGUgKm9mLFxcbi0tXFxubW0vbWVtY29udHJvbC5jLTQ5MzgtXFx0XFx0aWYgKG5yX3JlY2xhaW1zKSB7XFxubW0vbWVtY29udHJvbC5jOjQ5Mzk6XFx0XFx0XFx0aWYgKCF0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLCBucl9wYWdlcyAtIG1heCxcXG5tbS9tZW1jb250cm9sLmMtNDk0MC1cXHRcXHRcXHRcXHRcXHRHRlBfS0VSTkVMLCBNRU1DR19SRUNMQUlNX01BWV9TV0FQLCBOVUxMKSlcXG4tLVxcbm1tL3Ztc2Nhbi5jPTY4MTU9dW5zaWduZWQgbG9uZyBtZW1fY2dyb3VwX3Nocmlua19ub2RlKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4NTQtXFxubW0vdm1zY2FuLmM6Njg1NTp1bnNpZ25lZCBsb25nIHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTY4NTYtXFx0XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBucl9wYWdlcyxcXG4tLVxcbm1tL3Ztc2Nhbi5jLTY4OTUtI2Vsc2VcXG5tbS92bXNjYW4uYzo2ODk2OnVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxubW0vdm1zY2FuLmMtNjg5Ny1cXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbi0tXFxubW0vdm1zY2FuLmM9Nzk1OD1pbnQgdXNlcl9wcm9hY3RpdmVfcmVjbGFpbShjaGFyICpidWYsXFxuLS1cXG5tbS92bXNjYW4uYy04MDI5LVxcdFxcdFxcdFxcdFxcdCAgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkU7XFxubW0vdm1zY2FuLmM6ODAzMDpcXHRcXHRcXHRyZWNsYWltZWQgPSB0cnlfdG9fZnJlZV9tZW1fY2dyb3VwX3BhZ2VzKG1lbWNnLFxcbm1tL3Ztc2Nhbi5jLTgwMzEtXFx0XFx0XFx0XFx0XFx0XFx0IGJhdGNoX3NpemUsIGdmcF9tYXNrLFxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNToyOS42MzkyMDc3ODZaIiwiU2VxIjoxNywiTmVzdGluZyI6MywiVHlwZSI6ImxsbSIsIk5hbWUiOiJrbXNhbi1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzQ1NzgzNjM0NCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHN1bW1hcnksIGFzIHRob3VnaCBJIHdlcmUgdGhpbmtpbmcgdGhyb3VnaCB0aGUgcHJvY2VzczpcblxuKipEaXZpbmcgaW50byBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlc2AqKlxuXG5Pa2F5LCBzbyBJJ20gZm9jdXNpbmcgaW4gb24gYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXNgIHdpdGhpbiBgbW0vdm1zY2FuLmNgLiBUaGlzIGlzIHdoZXJlIHRoZSBydWJiZXIgbWVldHMgdGhlIHJvYWQgd2hlbiBpdCBjb21lcyB0byBtZW1vcnkgbWFuYWdlbWVudCwgc3BlY2lmaWNhbGx5IHdpdGhpbiB0aGUgY29udGV4dCBvZiBjZ3JvdXBzLiBJIG5lZWQgdG8gdW5kZXJzdGFuZCBob3cgdGhlIGtlcm5lbCBpcyAqYWN0dWFsbHkqIGF0dGVtcHRpbmcgdG8gcmVjbGFpbSBtZW1vcnkgZnJvbSBhIHNwZWNpZmljIGNncm91cC4gSSB3YW50IHRvIHNlZSBleGFjdGx5IHdoYXQgc3RlcHMgYXJlIHRha2VuIHRvIGZyZWUgdXAgcGFnZXMgd2l0aGluIHRoYXQgY2dyb3VwJ3MgYWxsb2NhdGVkIG1lbW9yeS4gSSBzdXNwZWN0IHRoZXJlIGFyZSBzb21lIGNydWNpYWwgb3B0aW1pemF0aW9ucyBvciBsb2NraW5nIHN0cmF0ZWdpZXMgYXQgcGxheSBoZXJlLCBhbmQgSSdtIGVhZ2VyIHRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSBvZiB0aGUgbWVjaGFuaWNzIGludm9sdmVkLiBNeSBnb2FsIGlzIHRvIHVuZGVyc3RhbmQgaG93IHRoZSByZWNsYWltIHByb2Nlc3MgaW50ZXJhY3RzIHdpdGggdGhlIHJlc3Qgb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN5c3RlbSwgYW5kIHdoYXQgcG90ZW50aWFsIGJvdHRsZW5lY2tzIG9yIGFyZWFzIGZvciBpbXByb3ZlbWVudCBtaWdodCBleGlzdC4gVGhpcyBzaG91bGQgYWxzbyBoZWxwIG1lIHVuZGVyc3RhbmQgaG93IGVmZmVjdGl2ZSB0aGUgbWVtb3J5IGNncm91cCBsaW1pdHMgcmVhbGx5IGFyZS5cblxuXG4iLCJJbnB1dFRva2VucyI6MTc3MzgsIk91dHB1dFRva2VucyI6MzUsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoyOCwiVG9vbENhbGxzIjpbImdyZXBwZXIiXX0seyJTdGFydGVkIjoiMjAyNi0wOS0xMVQwMzoxNTozMy4wOTcwNDY5MloiLCJTZXEiOjE4LCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo2MDc2NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJGaWxlXCI6IFwibW0vdm1zY2FuLmNcIixcbiAgXCJGaXJzdExpbmVcIjogNjg1MCxcbiAgXCJMaW5lQ291bnRcIjogNDVcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiNjg1MDpcXHRcXHQqbnJfc2Nhbm5lZCA9IHNjLm5yX3NjYW5uZWQ7XFxuNjg1MTpcXHRcXG42ODUyOlxcdFxcdHJldHVybiBzYy5ucl9yZWNsYWltZWQ7XFxuNjg1MzpcXHR9XFxuNjg1NDpcXHRcXG42ODU1OlxcdHVuc2lnbmVkIGxvbmcgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csXFxuNjg1NjpcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLFxcbjY4NTc6XFx0XFx0XFx0XFx0XFx0XFx0ICAgZ2ZwX3QgZ2ZwX21hc2ssXFxuNjg1ODpcXHRcXHRcXHRcXHRcXHRcXHQgICB1bnNpZ25lZCBpbnQgcmVjbGFpbV9vcHRpb25zLFxcbjY4NTk6XFx0XFx0XFx0XFx0XFx0XFx0ICAgaW50ICpzd2FwcGluZXNzKVxcbjY4NjA6XFx0e1xcbjY4NjE6XFx0XFx0dW5zaWduZWQgbG9uZyBucl9yZWNsYWltZWQ7XFxuNjg2MjpcXHRcXHR1bnNpZ25lZCBpbnQgbm9yZWNsYWltX2ZsYWc7XFxuNjg2MzpcXHRcXHRzdHJ1Y3Qgc2Nhbl9jb250cm9sIHNjID0ge1xcbjY4NjQ6XFx0XFx0XFx0Lm5yX3RvX3JlY2xhaW0gPSBtYXgobnJfcGFnZXMsIFNXQVBfQ0xVU1RFUl9NQVgpLFxcbjY4NjU6XFx0XFx0XFx0LnByb2FjdGl2ZV9zd2FwcGluZXNzID0gc3dhcHBpbmVzcyxcXG42ODY2OlxcdFxcdFxcdC5nZnBfbWFzayA9IChjdXJyZW50X2dmcF9jb250ZXh0KGdmcF9tYXNrKSBcXHUwMDI2IEdGUF9SRUNMQUlNX01BU0spIHxcXG42ODY3OlxcdFxcdFxcdFxcdFxcdChHRlBfSElHSFVTRVJfTU9WQUJMRSBcXHUwMDI2IH5HRlBfUkVDTEFJTV9NQVNLKSxcXG42ODY4OlxcdFxcdFxcdC5yZWNsYWltX2lkeCA9IE1BWF9OUl9aT05FUyAtIDEsXFxuNjg2OTpcXHRcXHRcXHQudGFyZ2V0X21lbV9jZ3JvdXAgPSBtZW1jZyxcXG42ODcwOlxcdFxcdFxcdC5wcmlvcml0eSA9IERFRl9QUklPUklUWSxcXG42ODcxOlxcdFxcdFxcdC5tYXlfd3JpdGVwYWdlID0gMSxcXG42ODcyOlxcdFxcdFxcdC5tYXlfdW5tYXAgPSAxLFxcbjY4NzM6XFx0XFx0XFx0Lm1heV9zd2FwID0gISEocmVjbGFpbV9vcHRpb25zIFxcdTAwMjYgTUVNQ0dfUkVDTEFJTV9NQVlfU1dBUCksXFxuNjg3NDpcXHRcXHRcXHQucHJvYWN0aXZlID0gISEocmVjbGFpbV9vcHRpb25zIFxcdTAwMjYgTUVNQ0dfUkVDTEFJTV9QUk9BQ1RJVkUpLFxcbjY4NzU6XFx0XFx0fTtcXG42ODc2OlxcdFxcdC8qXFxuNjg3NzpcXHRcXHQgKiBUcmF2ZXJzZSB0aGUgWk9ORUxJU1RfRkFMTEJBQ0sgem9uZWxpc3Qgb2YgdGhlIGN1cnJlbnQgbm9kZSB0byBwdXRcXG42ODc4OlxcdFxcdCAqIGVxdWFsIHByZXNzdXJlIG9uIGFsbCB0aGUgbm9kZXMuIFRoaXMgaXMgYmFzZWQgb24gdGhlIGFzc3VtcHRpb24gdGhhdFxcbjY4Nzk6XFx0XFx0ICogdGhlIHJlY2xhaW0gZG9lcyBub3QgYmFpbCBvdXQgZWFybHkuXFxuNjg4MDpcXHRcXHQgKi9cXG42ODgxOlxcdFxcdHN0cnVjdCB6b25lbGlzdCAqem9uZWxpc3QgPSBub2RlX3pvbmVsaXN0KG51bWFfbm9kZV9pZCgpLCBzYy5nZnBfbWFzayk7XFxuNjg4MjpcXHRcXG42ODgzOlxcdFxcdHNldF90YXNrX3JlY2xhaW1fc3RhdGUoY3VycmVudCwgXFx1MDAyNnNjLnJlY2xhaW1fc3RhdGUpO1xcbjY4ODQ6XFx0XFx0dHJhY2VfbW1fdm1zY2FuX21lbWNnX3JlY2xhaW1fYmVnaW4oc2MuZ2ZwX21hc2ssIDAsIG1lbWNnKTtcXG42ODg1OlxcdFxcdG5vcmVjbGFpbV9mbGFnID0gbWVtYWxsb2Nfbm9yZWNsYWltX3NhdmUoKTtcXG42ODg2OlxcdFxcbjY4ODc6XFx0XFx0bnJfcmVjbGFpbWVkID0gZG9fdHJ5X3RvX2ZyZWVfcGFnZXMoem9uZWxpc3QsIFxcdTAwMjZzYyk7XFxuNjg4ODpcXHRcXG42ODg5OlxcdFxcdG1lbWFsbG9jX25vcmVjbGFpbV9yZXN0b3JlKG5vcmVjbGFpbV9mbGFnKTtcXG42ODkwOlxcdFxcdHRyYWNlX21tX3Ztc2Nhbl9tZW1jZ19yZWNsYWltX2VuZChucl9yZWNsYWltZWQsIG1lbWNnKTtcXG42ODkxOlxcdFxcdHNldF90YXNrX3JlY2xhaW1fc3RhdGUoY3VycmVudCwgTlVMTCk7XFxuNjg5MjpcXHRcXG42ODkzOlxcdFxcdHJldHVybiBucl9yZWNsYWltZWQ7XFxuNjg5NDpcXHR9XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjMzLjA5NzY1NzEzWiIsIlNlcSI6MTksIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjIxOTc2NjQ0ODQ1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKk15IEFuYWx5c2lzIG9mIHRoZSBQYXRjaCBmb3IgS01TQU4gUmVsZXZhbmNlKipcblxuT2theSwgbGV0J3MgYnJlYWsgdGhpcyBkb3duLiBGaXJzdCwgdGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IEJQRiBrZnVuYywgYGJwZl9wcm9hY3RpdmVfcmVjbGFpbWAsIHdoaWNoIHRha2VzIGEgZmV3IHNjYWxhciBhcmd1bWVudHM6IGBtZW1jZ2AsIGBzaXplYCwgYW5kIGBzd2FwcGluZXNzYC4gSSd2ZSBjaGVja2VkIHRoYXQgaXQgdmFsaWRhdGVzIHRoZXNlIGlucHV0cywgc3BlY2lmaWNhbGx5IHRoZSBgc3dhcHBpbmVzc2AgcmFuZ2UgYW5kIGEgbWluaW11bSBgc2l6ZWAsIGJlZm9yZSBjYWxsaW5nIHRoZSBleGlzdGluZyBtZW1vcnkgcmVjbGFpbSBmdW5jdGlvbiBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYC4gVGhlIGZ1bmN0aW9uIHJldHVybnMgYW4gdW5zaWduZWQgbG9uZy5cblxuQ3J1Y2lhbGx5LCB0aGVyZSdzIG5vIG5ldyB1c2VyLXNwYWNlIGNvcHkgaW52b2x2ZWQsIG5vIHN0cnVjdHMgYmVpbmcgc2VudCwgYW5kIG5vIHNpZ25zIG9mIHVuaW5pdGlhbGl6ZWQgYWxsb2NhdGlvbnMuIFRoZSBzZWxmdGVzdHMgYWRkZWQgYXJlIGFsbCB1c2VyLXNwYWNlIHRlc3RzLCB3aGljaCBpcyBmaW5lLlxuXG5Ob3csIGxldCdzIGdvIHRocm91Z2ggdGhlIEtNU0FOIGNoZWNrbGlzdCBtZXRpY3Vsb3VzbHkuXG5cbiogICBEb2VzIHRoaXMgZXhwb3NlIG5ldyBvciBtb2RpZmllZCBrZXJuZWwgc3RydWN0dXJlcyB0byB1c2Vyc3BhY2UgKHRocm91Z2ggdGhlIHVzdWFsIHN1c3BlY3RzIGxpa2UgYGNvcHlfdG9fdXNlcmAsIG5ldGxpbmssIGV0Yy4pIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIG1pZ2h0IGJlIGEgcHJvYmxlbT8gTm8sIGFic29sdXRlbHkgbm90LiBUaGUgYXJndW1lbnRzIGFyZSBhbGwgc2NhbGFycywgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMganVzdCBhbiBgdW5zaWduZWQgbG9uZ2AuXG4qICAgRG9lcyBpdCB1c2UgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgcmVsaWVzIG9uIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOb3BlLiBFdmVyeXRoaW5nIGlzIGluaXRpYWxpemVkIHdpdGhpbiB0aGUgZnVuY3Rpb24uXG4qICAgQXJlIHRoZXJlIGFueSBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyBiZWluZyBjcmVhdGVkIHdoZXJlIHVuaW5pdGlhbGl6ZWQgZmllbGRzIGNvdWxkIGJlIHJlYWQgbGF0ZXI/IE5vLlxuKiAgIERvZXMgaXQgbWVzcyB3aXRoIGFueSBib3VuZHMgY2hlY2tzIHRoYXQgY291bGQgbGVhZCB0byByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5PyBOby5cblxuVGhlIG9ubHkgcG90ZW50aWFsIGlzc3VlcyBoZXJlIGFyZSB0aGUgdXN1YWwgc3VzcGVjdHMgb2Yga2VybmVsIHByb2dyYW1taW5nOiBkZWFkbG9jaywgc2xlZXBpbmcgaW4gYXRvbWljIGNvbnRleHQsIGludmFsaWQgcG9pbnRlcnMsIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBldGMuIEJ1dCB0aG9zZSBhcmUgY292ZXJlZCBieSBLQVNBTiwgTE9DS0RFUCwgYW5kIHRoZSBzdGFuZGFyZCBrZXJuZWwgZGVidWdnaW5nIHRvb2xzLCB3aGljaCBhcmUgbm90IHJlbGV2YW50IHRvIEtNU0FOLiBUaGlzIGxvb2tzIHByZXR0eSBjbGVhbiBmcm9tIGEgbWVtb3J5LXNhZmV0eSBwZXJzcGVjdGl2ZS5cblxuVG8gYmUgY29tcGxldGVseSB0aG9yb3VnaCwgbGV0J3Mgc3VtbWFyaXplIHRoZSBwb2ludHM6XG5cbiogICBUaGUgcGF0Y2ggaW50cm9kdWNlcyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltYCwgYSBzbGVlcGFibGUgQlBGIGtmdW5jLCBhbG9uZyB3aXRoIEJQRiBzZWxmdGVzdHMuXG4qICAgQWxsIHZhcmlhYmxlcyB1c2VkIChgbnJfcmVjbGFpbWVkYCwgYG5yX3BhZ2VzYCwgYHN3YXBwaW5lc3NgLCBgc2l6ZWApIGFyZSBzY2FsYXIgcHJpbWl0aXZlcy4gVGhleSBhcmUgYWxsIGluaXRpYWxpemVkIGJ5IHZhbHVlLlxuKiAgIE5vIGtlcm5lbC10by11c2VyIG1lbW9yeSBjb3B5IGludGVyZmFjZXMgYXJlIGFkZGVkIG9yIG1vZGlmaWVkLlxuKiAgIEV4aXN0aW5nIHJvdXRpbmVzIGFyZSB1c2VkIHdpdGggcHJvcGVybHkgaW5pdGlhbGl6ZWQgcGFyYW1ldGVycy5cbiogICBBbnkgcG90ZW50aWFsIGZhaWx1cmUgbW9kZXMgYXJlIGNvdmVyZWQgYnkgc3RhbmRhcmQgZGV0ZWN0b3JzLlxuKiAgIFRoZXJlZm9yZSwgbm8gS01TQU4gaXMgbmVlZGVkLCBhcyB0aGVyZSdzIG5vIHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgcmVhZHMgb3IgaW5mb3JtYXRpb24gbGVha3MuIEknbSBzYXRpc2ZpZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4ODE5LCJPdXRwdXRUb2tlbnMiOjI1NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjY1MCwiVG9vbENhbGxzIjpbInJlYWQtZmlsZSJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA5LTExVDAzOjE1OjU1LjA3NDMwNTYyNVoiLCJTZXEiOjIwLCJOZXN0aW5nIjozLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJzZXQtcmVzdWx0cyIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE1MzMwLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggYWRkcyBhIG5ldyBzbGVlcGFibGUgQlBGIGtmdW5jIGBicGZfcHJvYWN0aXZlX3JlY2xhaW0oKWAgaW4gYG1tL2JwZl9tZW1jb250cm9sLmNgIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBCUEYgc2VsZnRlc3RzLiBUaGUga2Z1bmMgYWNjZXB0cyBwcmltaXRpdmUgc2NhbGFyIGFyZ3VtZW50cyAoYG1lbWNnYCwgYHNpemVgLCBgc3dhcHBpbmVzc2ApLCB2YWxpZGF0ZXMgdGhlIHBhcmFtZXRlcnMsIGFuZCBkZWxlZ2F0ZXMgdG8gdGhlIGV4aXN0aW5nIGtlcm5lbCByZWNsYWltIGluZnJhc3RydWN0dXJlIHZpYSBgdHJ5X3RvX2ZyZWVfbWVtX2Nncm91cF9wYWdlcygpYC4gXFxuXFxuVGhlcmUgYXJlIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHJpc2tzOlxcbjEuIE5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFsbG9jYXRpb25zIG9uIHN0YWNrIG9yIGhlYXAgYXJlIGludHJvZHVjZWQgb3IgcmVhZC4gQWxsIGxvY2FsIHZhcmlhYmxlcyBhbmQgcGFyYW1ldGVycyBhcmUgc2NhbGFyIHR5cGVzIGluaXRpYWxpemVkIHByaW9yIHRvIHVzZS5cXG4yLiBObyBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIHBhZGRpbmcgb3IgZmllbGRzIGFyZSBjb3BpZWQgdG8gdXNlciBzcGFjZSBvciBleHBvc2VkIHZpYSBpb2N0bHMvc3lzZnMvbmV0bGluay9CUEYgYnVmZmVycy5cXG4zLiBQb3RlbnRpYWwgY29uY3VycmVuY3ksIGxvY2tpbmcsIG9yIG1lbW9yeS1zYWZldHkgYnVncyAoZS5nLiBzbGVlcGFibGUga2Z1bmMgY29udGV4dCByZXF1aXJlbWVudHMsIGNncm91cCBwb2ludGVyIHZhbGlkaXR5LCBsb2NraW5nIGRlYWRsb2NrcykgYXJlIG1vbml0b3JlZCBieSBzdGFuZGFyZCBkZWJ1Z2dpbmcgZmFjaWxpdGllcyAoS0FTQU4sIExPQ0tERVAsIFBST1ZFX0xPQ0tJTkcpLlxcblxcblRodXMsIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpcyBub3Qgd2FycmFudGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIGFkZHMgYSBuZXcgc2xlZXBhYmxlIEJQRiBrZnVuYyBgYnBmX3Byb2FjdGl2ZV9yZWNsYWltKClgIGluIGBtbS9icGZfbWVtY29udHJvbC5jYCBhbG9uZyB3aXRoIGNvcnJlc3BvbmRpbmcgQlBGIHNlbGZ0ZXN0cy4gVGhlIGtmdW5jIGFjY2VwdHMgcHJpbWl0aXZlIHNjYWxhciBhcmd1bWVudHMgKGBtZW1jZ2AsIGBzaXplYCwgYHN3YXBwaW5lc3NgKSwgdmFsaWRhdGVzIHRoZSBwYXJhbWV0ZXJzLCBhbmQgZGVsZWdhdGVzIHRvIHRoZSBleGlzdGluZyBrZXJuZWwgcmVjbGFpbSBpbmZyYXN0cnVjdHVyZSB2aWEgYHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoKWAuIFxcblxcblRoZXJlIGFyZSBubyB1bmluaXRpYWxpemVkIG1lbW9yeSByaXNrczpcXG4xLiBObyB1bmluaXRpYWxpemVkIG1lbW9yeSBhbGxvY2F0aW9ucyBvbiBzdGFjayBvciBoZWFwIGFyZSBpbnRyb2R1Y2VkIG9yIHJlYWQuIEFsbCBsb2NhbCB2YXJpYWJsZXMgYW5kIHBhcmFtZXRlcnMgYXJlIHNjYWxhciB0eXBlcyBpbml0aWFsaXplZCBwcmlvciB0byB1c2UuXFxuMi4gTm8gZGF0YSBzdHJ1Y3R1cmVzIHdpdGggdW5pbml0aWFsaXplZCBwYWRkaW5nIG9yIGZpZWxkcyBhcmUgY29waWVkIHRvIHVzZXIgc3BhY2Ugb3IgZXhwb3NlZCB2aWEgaW9jdGxzL3N5c2ZzL25ldGxpbmsvQlBGIGJ1ZmZlcnMuXFxuMy4gUG90ZW50aWFsIGNvbmN1cnJlbmN5LCBsb2NraW5nLCBvciBtZW1vcnktc2FmZXR5IGJ1Z3MgKGUuZy4gc2xlZXBhYmxlIGtmdW5jIGNvbnRleHQgcmVxdWlyZW1lbnRzLCBjZ3JvdXAgcG9pbnRlciB2YWxpZGl0eSwgbG9ja2luZyBkZWFkbG9ja3MpIGFyZSBtb25pdG9yZWQgYnkgc3RhbmRhcmQgZGVidWdnaW5nIGZhY2lsaXRpZXMgKEtBU0FOLCBMT0NLREVQLCBQUk9WRV9MT0NLSU5HKS5cXG5cXG5UaHVzLCBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24gaXMgbm90IHdhcnJhbnRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH1dOwoJCQlpZiAoIXJhd0RhdGEgfHwgcmF3RGF0YS5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpOwoJCQlkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKTsKCQkJZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdTdW1tYXJ5VGFibGVzKHJhd0RhdGEpIHsKCQkJY29uc3Qgc3RhdHMgPSB7CgkJCQlsbG06IHsgY291bnQ6IDAsIHRva2VuczogMCwgZHVyYXRpb246IDAgfSwKCQkJCXRvb2w6IHsgY291bnQ6IDAsIGR1cmF0aW9uOiAwIH0KCQkJfTsKCgkJCXJhd0RhdGEuZm9yRWFjaChzID0+IHsKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOyAKCQkJCWlmIChzLlR5cGUgPT09ICJsbG0iKSB7CgkJCQkJc3RhdHMubGxtLmNvdW50Kys7CgkJCQkJc3RhdHMubGxtLnRva2VucyArPSAocy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2Vucyk7CgkJCQkJc3RhdHMubGxtLmR1cmF0aW9uICs9IGR1cjsKCQkJCX0gZWxzZSBpZiAocy5UeXBlID09PSAidG9vbCIpIHsKCQkJCQlzdGF0cy50b29sLmNvdW50Kys7CgkJCQkJc3RhdHMudG9vbC5kdXJhdGlvbiArPSBkdXI7CgkJCQl9CgkJCX0pOwoKCQkJY29uc3QgYXZnTGxtRHVyID0gc3RhdHMubGxtLmNvdW50ID4gMCA/IChzdGF0cy5sbG0uZHVyYXRpb24gLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdMbG1Ub2tlbiA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLnRva2VucyAvIHN0YXRzLmxsbS5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgkJCWNvbnN0IGF2Z1Rvb2xEdXIgPSBzdGF0cy50b29sLmNvdW50ID4gMCA/IChzdGF0cy50b29sLmR1cmF0aW9uIC8gc3RhdHMudG9vbC5jb3VudCkudG9GaXhlZCgyKSA6IDA7CgoJCQljb25zdCBsbG1TdW1hcnlDZWxscyA9IFtzdGF0cy5sbG0uY291bnQsIHN0YXRzLmxsbS50b2tlbnMsIGF2Z0xsbVRva2VuLCBzdGF0cy5sbG0uZHVyYXRpb24sIGF2Z0xsbUR1cl07CgkJCWNvbnN0IHRvb2xTdW1tYXJ5Q2VsbHMgPSBbc3RhdHMudG9vbC5jb3VudCwgc3RhdHMudG9vbC5kdXJhdGlvbiwgYXZnVG9vbER1cl07CgoJCQljb25zdCBsbG1TdW1tYXJ5Qm9keSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsbG1fc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCWxsbVN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCBsbG1UciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CgkJCWxsbVN1bWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQlsbG1Uci5hcHBlbmRDaGlsZCh0ZCk7CgkJCX0pOwoJCQlsbG1TdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZChsbG1Ucik7CgoJCQljb25zdCB0b29sU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9vbF9zdW1tYXJ5X3N0YXRzX2JvZHknKTsKCQkJdG9vbFN1bW1hcnlCb2R5LmlubmVySFRNTCA9ICIiOwoJCQljb25zdCB0b29sVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQl0b29sU3VtbWFyeUNlbGxzLmZvckVhY2goY2VsbCA9PiB7CgkJCQljb25zdCB0ZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CgkJCQl0ZC50ZXh0Q29udGVudCA9IGNlbGw7CgkJCQl0b29sVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJdG9vbFN1bW1hcnlCb2R5LmFwcGVuZENoaWxkKHRvb2xUcik7CgkJfQoKCQlmdW5jdGlvbiBkcmF3RHVyYXRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGZpbHRlcmVkU3RlcHMgPSByYXdEYXRhLmZpbHRlcihkID0+IFsibGxtIiwgInRvb2wiXS5pbmNsdWRlcyhkLlR5cGUpKTsKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnRHVyYXRpb24nKTsKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsgCgoJCQlmaWx0ZXJlZFN0ZXBzLmZvckVhY2gocyA9PiB7CgkJCQkKCQkJCWNvbnN0IGR1ciA9IHMuRHVyYXRpb24gLyAxMDAwMDAwMDAwOwoJCQkJbGV0IHRvb2x0aXAgPSBzLk5hbWU7CgkJCQlpZiAocy5UeXBlID09PSAibGxtIiAmJiBzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgkJCQlkYXRhLmFkZFJvdyhbYCR7cy5TZXF9YCwgZHVyLCB0b29sdGlwXSk7CgkJCX0pOwoKCQkJY29uc3Qgb3B0aW9ucyA9IHsKCQkJCXRpdGxlOiAnVGltZSBDb25zdW1wdGlvbiBvZiBMTE0vVG9vbCBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNL1Rvb2wgU3RlcHMnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnU2Vjb25kcycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHVyYXRpb25fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd1Rva2VuQ29uc3VtcHRpb25DaGFydChyYXdEYXRhKSB7CgkJCWNvbnN0IGxsbVN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBkLlR5cGUgPT09ICJsbG0iKTsKCQkJaWYgKGxsbVN0ZXBzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOwoKCQkJY29uc3QgZGF0YSA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5EYXRhVGFibGUoKTsKCQkJZGF0YS5hZGRDb2x1bW4oJ3N0cmluZycsICdTdGVwJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKCdudW1iZXInLCAnVG9rZW5zJyk7CQkJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3N0eWxlJ30pOwkKCQkJZGF0YS5hZGRDb2x1bW4oe3R5cGU6ICdzdHJpbmcnLCByb2xlOiAndG9vbHRpcCd9KTsJCgoJCQljb25zdCBhZ2VudENvbG9ycyA9IHt9OwoJCQljb25zdCBwYWxldHRlID0gWycjNDI4NUY0JywgJyNEQjQ0MzcnLCAnI0Y0QjQwMCcsICcjMEY5RDU4JywgJyNBQjQ3QkMnLCAnIzAwQUNDMSddOwoJCQlsZXQgY29sb3JJZHggPSAwOwoJCQljb25zdCBhZ2VudExMTUNvdW50cyA9IHt9OwoJCQlsbG1TdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJaWYgKCFhZ2VudENvbG9yc1tzLk5hbWVdKSB7CgkJCQkJYWdlbnRDb2xvcnNbcy5OYW1lXSA9IHBhbGV0dGVbY29sb3JJZHggJSBwYWxldHRlLmxlbmd0aF07CgkJCQkJY29sb3JJZHgrKzsKCQkJCX0KCgkJCQlhZ2VudExMTUNvdW50c1tzLk5hbWVdID0gKGFnZW50TExNQ291bnRzW3MuTmFtZV0gfHwgMCkgKyAxOwoJCQkJY29uc3QgbGFiZWwgPSBgJHtzLk5hbWV9LSR7YWdlbnRMTE1Db3VudHNbcy5OYW1lXX1gOwoJCQkJY29uc3QgdG90YWxUb2tlbnMgPSBzLklucHV0VG9rZW5zICsgcy5PdXRwdXRUb2tlbnMgKyBzLk91dHB1dFRob3VnaHRzVG9rZW5zOwoJCQkJY29uc3Qgc3R5bGUgPSBgY29sb3I6ICR7YWdlbnRDb2xvcnNbcy5OYW1lXX1gOwoJCQkJbGV0IHRvb2x0aXAgPSBgVG90YWwgVG9rZW5zOiAke3RvdGFsVG9rZW5zfVxuKEluOiAke3MuSW5wdXRUb2tlbnN9LCBPdXQ6ICR7cy5PdXRwdXRUb2tlbnN9LCBUaG91Z2h0czogJHtzLk91dHB1dFRob3VnaHRzVG9rZW5zfSlgOwoJCQkJaWYgKHMuVG9vbENhbGxzICYmIHMuVG9vbENhbGxzLmxlbmd0aCA+IDApIHsKCQkJCQl0b29sdGlwICs9IGBcblRvb2xzOiAke3MuVG9vbENhbGxzLmpvaW4oJywgJyl9YDsKCQkJCX0KCgkJCQlkYXRhLmFkZFJvdyhbbGFiZWwsIHRvdGFsVG9rZW5zLCBzdHlsZSwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1Rva2VuIENvbnN1bXB0aW9uIGJ5IExMTSBDYWxscycsCgkJCQloQXhpczogewoJCQkJCXRpdGxlOiAnTExNIENhbGwgU2VxdWVuY2UnLAoJCQkJfSwKCQkJCXZBeGlzOiB7IHRpdGxlOiAnQ29uc3VtZWQgVG9rZW5zJyB9LAoJCQkJbGVnZW5kOiB7IHBvc2l0aW9uOiAnbm9uZScgfSwKCQkJCWJhcjogeyBncm91cFdpZHRoOiAnNzUlJyB9LAoJCQkJY2hhcnRBcmVhOiB7IHdpZHRoOiAnODUlJywgaGVpZ2h0OiAnNzAlJyB9LAoJCQkJaGVpZ2h0OiA0MDAKCQkJfTsKCgkJCWNvbnN0IGNoYXJ0ID0gbmV3IGdvb2dsZS52aXN1YWxpemF0aW9uLkNvbHVtbkNoYXJ0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0b2tlbl9jaGFydF9kaXYnKSk7CgkJCWNoYXJ0LmRyYXcoZGF0YSwgb3B0aW9ucyk7CgkJfQoJCWxldCBhbGxFeHBhbmRlZCA9IGZhbHNlOwoJCWZ1bmN0aW9uIHRvZ2dsZUFsbERldGFpbHMoKSB7CgkJCWFsbEV4cGFuZGVkID0gIWFsbEV4cGFuZGVkOwoJCQlkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdkZXRhaWxzJykuZm9yRWFjaChkID0+IHsKCQkJCWlmIChhbGxFeHBhbmRlZCkgZC5zZXRBdHRyaWJ1dGUoJ29wZW4nLCAnJyk7CgkJCQllbHNlIGQucmVtb3ZlQXR0cmlidXRlKCdvcGVuJyk7CgkJCX0pOwoJCX0KCTwvc2NyaXB0PgoKCjwvYm9keT4KPC9odG1sPgo=" },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-workflowzxspf[1] Phase: Succeeded StartedAt: 2026-09-11 03:16:06 +0000 UTC FinishedAt: 2026-09-11 03:16:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-09-11 03:16:06 +0000 UTC FinishedAt: 2026-09-11 03:16:06 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2] Phase: Succeeded StartedAt: 2026-09-11 03:16:06 +0000 UTC FinishedAt: 2026-09-11 07:02:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:16:06 +0000 UTC FinishedAt: 2026-09-11 07:02:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:16:06 +0000 UTC FinishedAt: 2026-09-11 03:16:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:16:06 +0000 UTC FinishedAt: 2026-09-11 03:16:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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-workflowzxspf/series-workflowzxspf-convert-artifact-587244356/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:16:26 +0000 UTC FinishedAt: 2026-09-11 03:37:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:16:26 +0000 UTC FinishedAt: 2026-09-11 03:37:58 +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:*2c25879f-1479-4b09-a506-9f1882e28db0,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-workflowzxspf/series-workflowzxspf-convert-artifact-587244356/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": "7479fc5e-8c15-4410-8995-6138c24ce00b", "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-workflowzxspf/series-workflowzxspf-build-action-240576130/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:16:26 +0000 UTC FinishedAt: 2026-09-11 03:37:48 +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:*2c25879f-1479-4b09-a506-9f1882e28db0,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-workflowzxspf/series-workflowzxspf-convert-artifact-587244356/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": "7479fc5e-8c15-4410-8995-6138c24ce00b", "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-workflowzxspf/series-workflowzxspf-build-action-240576130/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:37:58 +0000 UTC FinishedAt: 2026-09-11 03:37:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:37:58 +0000 UTC FinishedAt: 2026-09-11 03:37:58 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:37:58 +0000 UTC FinishedAt: 2026-09-11 03:38:08 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:37:58 +0000 UTC FinishedAt: 2026-09-11 03:38:02 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-workflowzxspf/series-workflowzxspf-convert-artifact-1179727811/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:38:08 +0000 UTC FinishedAt: 2026-09-11 03:40:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:38:08 +0000 UTC FinishedAt: 2026-09-11 03:40:16 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7479fc5e-8c15-4410-8995-6138c24ce00b,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-workflowzxspf/series-workflowzxspf-build-action-240576130/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-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:40:26 +0000 UTC FinishedAt: 2026-09-11 03:40:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:40:26 +0000 UTC FinishedAt: 2026-09-11 03:40:26 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:40:26 +0000 UTC FinishedAt: 2026-09-11 03:58:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:40:26 +0000 UTC FinishedAt: 2026-09-11 03:58:56 +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:*2c25879f-1479-4b09-a506-9f1882e28db0,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-workflowzxspf/series-workflowzxspf-convert-artifact-1179727811/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": "e5cb24a6-d011-4492-b672-6cb5dd7ad3eb", "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-workflowzxspf/series-workflowzxspf-build-action-2534449783/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:40:26 +0000 UTC FinishedAt: 2026-09-11 03:58:46 +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:*2c25879f-1479-4b09-a506-9f1882e28db0,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-workflowzxspf/series-workflowzxspf-convert-artifact-1179727811/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": "e5cb24a6-d011-4492-b672-6cb5dd7ad3eb", "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-workflowzxspf/series-workflowzxspf-build-action-2534449783/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:58:56 +0000 UTC FinishedAt: 2026-09-11 03:58:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:58:56 +0000 UTC FinishedAt: 2026-09-11 03:58:56 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:58:56 +0000 UTC FinishedAt: 2026-09-11 04:00:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 03:58:56 +0000 UTC FinishedAt: 2026-09-11 04:00:42 +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:*e5cb24a6-d011-4492-b672-6cb5dd7ad3eb,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-workflowzxspf/series-workflowzxspf-build-action-2534449783/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-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 07:02:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 07:02:16 +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"],"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:*7479fc5e-8c15-4410-8995-6138c24ce00b,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e5cb24a6-d011-4492-b672-6cb5dd7ad3eb,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-workflowzxspf/series-workflowzxspf-build-action-240576130/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-workflowzxspf/series-workflowzxspf-build-action-2534449783/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 04:01:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 04:00:57 +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"],"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-workflowzxspf/series-workflowzxspf-convert-artifact-1366943452/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 04:00:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 04:00:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:00:52 +0000 UTC FinishedAt: 2026-09-11 04:00:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:01:02 +0000 UTC FinishedAt: 2026-09-11 07:02:16 +0000 UTC Input: nil Output: nil --------- Name: series-workflowzxspf[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"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"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"af0b84a9215d951d16f26b7ee34353b970cf5d4e","config_name":"upstream-apparmor-kasan.config","enable_configs":["BPF_SYSCALL","MEMCG","DEBUG_INFO_BTF"],"series_id":"1abb9a8a-0600-40ab-a2ba-9c7fae077cb0","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-09-11 04:01:02 +0000 UTC FinishedAt: 2026-09-11 07:02:06 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*7479fc5e-8c15-4410-8995-6138c24ce00b,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*e5cb24a6-d011-4492-b672-6cb5dd7ad3eb,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-workflowzxspf/series-workflowzxspf-build-action-240576130/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-workflowzxspf/series-workflowzxspf-build-action-2534449783/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-workflowzxspf/series-workflowzxspf-convert-artifact-1366943452/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,}