Name: series-workflowbr8cb Phase: Succeeded StartedAt: 2026-08-28 18:58:03 +0000 UTC FinishedAt: 2026-08-28 23:20:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[0] Phase: Succeeded StartedAt: 2026-08-28 18:58:03 +0000 UTC FinishedAt: 2026-08-28 19:40:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[0].run-triage Phase: Succeeded StartedAt: 2026-08-28 18:58:03 +0000 UTC FinishedAt: 2026-08-28 19:40:39 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9549574e05b39f39a13cd435facb8e4573a1ba85", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "DEVICE_PRIVATE", "USERFAULTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9549574e05b39f39a13cd435facb8e4573a1ba85", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "DEVICE_PRIVATE", "USERFAULTFD" ], "series_id": "6a7474e2-2659-47eb-874f-5e7d148f0d7c" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "split_huge_pmd_locked", "__split_huge_pmd", "split_huge_pmd_address" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0RFVklDRV9QUklWQVRFJiMzNDssCiAgICAmIzM0O1VTRVJGQVVMVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c3BsaXRfaHVnZV9wbWRfbG9ja2VkJiMzNDssCiAgICAmIzM0O19fc3BsaXRfaHVnZV9wbWQmIzM0OywKICAgICYjMzQ7c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBodWdlIFBNRCBzcGxpdHRpbmcgbG9naWMgKF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKSBpbiBtbS9odWdlX21lbW9yeS5jIGJ5IGJyZWFraW5nIGl0IGRvd24gaW50byBoZWxwZXIgZnVuY3Rpb25zIChodWdlX3plcm9fcG1kX2Nhbl9zcGxpdCwgdW5tYXBfaHVnZV9wbWRfZW50cnksIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMsIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQsIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKSBhbmQgZ3JvdXBpbmcgUE1EIHNwbGl0IHBhcmFtZXRlcnMgaW4gYSBsb2NhbCBzdGFjayBzdHJ1Y3R1cmUgKHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUpLlxuXG5BbGwgaW5zdGFuY2VzIG9mICYjMzk7c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSYjMzk7IGFyZSBzdGFjay1hbGxvY2F0ZWQgd2l0aCBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgZW5zdXJpbmcgYWxsIHVuc2V0IGZpZWxkcyBhcmUgemVyby1pbml0aWFsaXplZC4gVGhlcmUgYXJlIG5vIGtlcm5lbC10by11c2VyIGNvcHkgb3BlcmF0aW9ucyAoZS5nLiwgY29weV90b191c2VyKSwgbm8gdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHZhcmlhYmxlcyByZWFkIG9yIGJyYW5jaGVkIG9uLCBhbmQgbm8gaW5mby1sZWFrIHJpc2tzLiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgb3Igc3luY2hyb25pemF0aW9uIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBmb2xpbyByZWZjb3VudGluZywgcm1hcCBtYW5hZ2VtZW50LCBUTEIgaW52YWxpZGF0aW9uLCBvciBVQUYpIGFyZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4sIFZNX0JVR19PTiBhc3NlcnRpb25zLCBhbmQgc3RhbmRhcmQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBQTUQgc3BsaXQgbG9naWMgaW4gbW0vaHVnZV9tZW1vcnkuYywgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgcHJlc2VudCB2cyBub24tcHJlc2VudCAobWlncmF0aW9uLCBkZXZpY2UtcHJpdmF0ZSkgaHVnZSBQTURzIGFuZCByZW9yZ2FuaXppbmcgcm1hcCBjb252ZXJzaW9uIGFuZCB1bm1hcHBpbmcgbG9naWMuIFRoaXMgY29yZSBNTSBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSB2aWEgdXNlciBhY3Rpb25zIChtYWR2aXNlLCBtcHJvdGVjdCwgcGFnZSBtaWdyYXRpb24sIGV0Yy4pIGFuZCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMzdhZmRhMmQxMDk0YjBhOWRmMjAwYzUzNWJkNGIwMTI0N2E5ZjcxMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDI4IDE5OjM5OjIxIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTMxMzksMTkzICYjNDM7MzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcGd0YWJsZSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuLVx0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBib29sIGZyZWV6ZSlcbiYjNDM7LypcbiYjNDM7ICogT25seSBhIGh1Z2UgemVybyBQTUQgaW4gYW4gYW5vbnltb3VzIFZNQSBpcyBzcGxpdCwgaW50byBhIHBhZ2UgdGFibGUgb2ZcbiYjNDM7ICogc2hhcmVkIHplcm8gcGFnZSBtYXBwaW5ncy4gQW55IG90aGVyIGh1Z2UgemVybyBQTUQgaXMgc2ltcGx5IHVubWFwcGVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90IHBtZHZhbClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHBndGFibGVfdCBwZ3RhYmxlO1xuLVx0cG1kX3Qgb2xkX3BtZCwgX3BtZDtcbi1cdGJvb2wgc29mdF9kaXJ0eSwgdWZmZF93cCA9IGZhbHNlLCB5b3VuZyA9IGZhbHNlLCB3cml0ZSA9IGZhbHNlO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyO1xuLVx0cHRlX3QgKnB0ZTtcbi1cdGludCBpO1xuLVxuLVx0Vk1fQlVHX09OKGhhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fZW5kIFx1MDAzYyBoYWRkciAmIzQzOyBIUEFHRV9QTURfU0laRSwgdm1hKTtcbiYjNDM7XHRyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpIFx1MDAyNlx1MDAyNiB2bWFfaXNfYW5vbnltb3VzKHZtYSk7XG4mIzQzO31cbiBcbi1cdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpIFx1MDAyNlx1MDAyNiAhcG1kX3RyYW5zX2h1Z2UoKnBtZCkpO1xuJiM0MzsvKipcbiYjNDM7ICogdW5tYXBfaHVnZV9wbWRfZW50cnkoKSAtIFVubWFwIGEgaHVnZSBQTUQgZW50cnkgcmF0aGVyIHRoYW4gc3BsaXR0aW5nIGl0LlxuJiM0MzsgKiBAdm1hOiBUaGUgVk1BIEBwbWQgYmVsb25ncyB0by5cbiYjNDM7ICogQGhhZGRyOiBUaGUgUE1ELWFsaWduZWQgYWRkcmVzcyBAcG1kIG1hcHMuXG4mIzQzOyAqIEBwbWQ6IFBvaW50ZXIgdG8gdGhlIGh1Z2UgUE1EIGVudHJ5LlxuJiM0MzsgKiBAZm9saW86IFRoZSBmb2xpbyBAcG1kIGRlc2NyaWJlcywgb3IgTlVMTCBpZiBpdCBkZXNjcmliZXMgbm9uZS5cbiYjNDM7ICogQGlzX3ByZXNlbnQ6IElzIEBwbWQgYSBwcmVzZW50IGVudHJ5IHJhdGhlciB0aGFuIGEgc29mdGxlYWYgZW50cnk/XG4mIzQzOyAqXG4mIzQzOyAqIE9ubHkgYW5vbnltb3VzIGZvbGlvcyBhcmUgcmVidWlsdCBhdCBQVEUgbGV2ZWwgd2hlbiBhIGh1Z2UgUE1EIGVudHJ5IGlzXG4mIzQzOyAqIHNwbGl0LiBFdmVyeXRoaW5nIGVsc2UgaXMgdW5tYXBwZWQgaGVyZSBhbmQgZmF1bHRlZCBiYWNrIGluIG9uIHRoZSBuZXh0XG4mIzQzOyAqIGFjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHVubWFwX2h1Z2VfcG1kX2VudHJ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcbiYjNDM7XHRcdGJvb2wgaXNfcHJlc2VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuJiM0MztcdHBtZF90IG9sZF9wbWQ7XG4gXG4tXHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbiYjNDM7XHRvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXG4mIzQzO1x0ICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0XG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGhhc19kZXBvc2l0ZWRfcGd0YWJsZSh2bWEsIG9sZF9wbWQsIGZvbGlvKSlcbiYjNDM7XHRcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XG4gXG4tXHRpZiAoIXZtYV9pc19hbm9ueW1vdXModm1hKSkge1xuLVx0XHRvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7XG4tXHRcdC8qXG4tXHRcdCAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU29cbi1cdFx0ICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0XG4tXHRcdCAqL1xuLVx0XHRpZiAoYXJjaF9uZWVkc19wZ3RhYmxlX2RlcG9zaXQoKSlcbi1cdFx0XHR6YXBfZGVwb3NpdGVkX3RhYmxlKG1tLCBwbWQpO1xuLVx0XHRpZiAodm1hX2lzX3NwZWNpYWxfaHVnZSh2bWEpKVxuLVx0XHRcdHJldHVybjtcbi1cdFx0aWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7XG4tXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBvbGRfZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cbi1cdFx0XHRmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7XG4tXHRcdH0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkge1xuLVx0XHRcdHJldHVybjtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVx0XHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRcdGlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSBcdTAwMjZcdTAwMjYgcG1kX3lvdW5nKG9sZF9wbWQpKVxuLVx0XHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3BtZChmb2xpbywgcGFnZSwgdm1hKTtcbi1cdFx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4tXHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbi1cdFx0XHRyZXR1cm47XG4tXHRcdH1cbi1cdFx0YWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1IUEFHRV9QTURfTlIpO1xuJiM0MztcdGlmICghZm9saW8pXG4gXHRcdHJldHVybjtcbi1cdH1cbiBcbi1cdGlmIChpc19odWdlX3plcm9fcG1kKCpwbWQpKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBieSBjYWxsaW5nXG4tXHRcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbi1cdFx0ICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/XG4tXHRcdCAqXG4tXHRcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm9cbi1cdFx0ICogc21hbGwgcGFnZSBhbHNvIHdyaXRlIHByb3RlY3RlZCBzbyBpdCBkb2VzIG5vdCBzZWVtcyB1c2VmdWxcbi1cdFx0ICogdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGF0IHRoaXMgdGltZS5cbi1cdFx0ICovXG4tXHRcdHJldHVybiBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xuJiM0MztcdGlmIChpc19wcmVzZW50KSB7XG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpO1xuJiM0MztcbiYjNDM7XHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbiYjNDM7XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4mIzQzO1x0XHRpZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF95b3VuZyhvbGRfcG1kKSlcbiYjNDM7XHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xuIFx0fVxuIFxuLVx0aWYgKHBtZF9pc19taWdyYXRpb25fZW50cnkoKnBtZCkpIHtcbi1cdFx0c29mdGxlYWZfdCBlbnRyeTtcbiYjNDM7XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4gXG4tXHRcdG9sZF9wbWQgPSAqcG1kO1xuLVx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVx0XHRwYWdlID0gc29mdGxlYWZfdG9fcGFnZShlbnRyeSk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRpZiAoaXNfcHJlc2VudClcbiYjNDM7XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4mIzQzO31cbiBcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKTtcbi1cdFx0dWZmZF93cCA9IHBtZF9zd3BfdWZmZChvbGRfcG1kKTtcbiYjNDM7c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHRib29sIGlzX3ByZXNlbnQ7XG4mIzQzO1x0Ym9vbCBpc19kZXZpY2VfcHJpdmF0ZTtcbiYjNDM7XHRib29sIGZyZWV6ZTtcbiYjNDM7XHRib29sIHdyaXRlO1xuJiM0MztcdGJvb2wgeW91bmc7XG4mIzQzO1x0Ym9vbCBkaXJ0eTtcbiYjNDM7XHRib29sIHNvZnRfZGlydHk7XG4mIzQzO1x0Ym9vbCB1ZmZkO1xuJiM0MztcdGJvb2wgYW5vbl9leGNsdXNpdmU7XG4mIzQzO307XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbi1cdFx0aWYgKFBhZ2VBbm9uKHBhZ2UpKVxuLVx0XHRcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbi1cdFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xuLVx0XHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XG4tXHR9IGVsc2UgaWYgKHBtZF9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuJiM0MzsvKlxuJiM0MzsgKiBDb252ZXJ0IHRoZSBmb2xpbyYjMzk7cyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy5cbiYjNDM7ICpcbiYjNDM7ICogV2l0aG91dCBcJiMzNDtmcmVlemVcJiMzNDssIHdlJiMzOTtsbCBzaW1wbHkgc3BsaXQgdGhlIFBNRCwgcHJvcGFnYXRpbmcgdGhlXG4mIzQzOyAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3JcbiYjNDM7ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci5cbiYjNDM7ICpcbiYjNDM7ICogV2l0aCBcJiMzNDtmcmVlemVcJiMzNDsgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieVxuJiM0MzsgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcbiYjNDM7ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZVxuJiM0MzsgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1EXG4mIzQzOyAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIG1hcHBpbmcgbWF5IHN0aWxsIGJlIGZyb3plbi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcChjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbiYjNDM7XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxuJiM0Mzt7XG4mIzQzO1x0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4gXG4tXHRcdG9sZF9wbWQgPSAqcG1kO1xuLVx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVx0XHRwYWdlID0gc29mdGxlYWZfdG9fcGFnZShlbnRyeSk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRpZiAoc3RhdGUtXHUwMDNlZnJlZXplIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoIXN0YXRlLVx1MDAzZWFub25fZXhjbHVzaXZlIHx8XG4mIzQzO1x0ICAgICAhZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoc3RhdGUtXHUwMDNlZm9saW8sIHN0YXRlLVx1MDAzZXBhZ2UpKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuIFxuLVx0XHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xuJiM0MztcdGZvbGlvX3JlZl9hZGQoc3RhdGUtXHUwMDNlZm9saW8sIEhQQUdFX1BNRF9OUiAtIDEpO1xuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2Vhbm9uX2V4Y2x1c2l2ZSlcbiYjNDM7XHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4mIzQzO1x0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKHN0YXRlLVx1MDAzZWZvbGlvLCBzdGF0ZS1cdTAwM2VwYWdlLCBIUEFHRV9QTURfTlIsIHZtYSxcbiYjNDM7XHRcdFx0XHQgaGFkZHIsIHJtYXBfZmxhZ3MpO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuIFxuLVx0XHR3cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTtcbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiYjNDM7LypcbiYjNDM7ICogQnVpbGQgdGhlIGxlYWYgZW50cnkgZm9yIHRoZSBQVEUgZW50cnkgZGVzY3JpYmluZyBAcGZuLCBmb3IgYSBodWdlIFBNRCBlbnRyeVxuJiM0MzsgKiB3aGljaCBpcyBub3QgcmVzdG9yZWQgYXMgYSBwcmVzZW50IG1hcHBpbmcuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc29mdGxlYWZfdCBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbiYjNDM7XHRcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBwZm4pXG4mIzQzO3tcbiYjNDM7XHRzb2Z0bGVhZl90IGVudHJ5O1xuIFxuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2Vpc19kZXZpY2VfcHJpdmF0ZSBcdTAwMjZcdTAwMjYgIXN0YXRlLVx1MDAzZWZyZWV6ZSkge1xuIFx0XHQvKlxuLVx0XHQgKiBEZXZpY2UgcHJpdmF0ZSBUSFAgc2hvdWxkIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgcmVndWxhclxuLVx0XHQgKiBmb2xpb3Mgdy5yLnQgYW5vbiBleGNsdXNpdmUgaGFuZGxpbmcuIFNlZSB0aGUgY29tbWVudHMgZm9yXG4tXHRcdCAqIGZvbGlvIGhhbmRsaW5nIGFuZCBhbm9uX2V4Y2x1c2l2ZSBiZWxvdy5cbi1cdFx0ICovXG4tXHRcdGlmIChmcmVlemUgXHUwMDI2XHUwMDI2IGFub25fZXhjbHVzaXZlIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKVxuLVx0XHRcdGZyZWV6ZSA9IGZhbHNlO1xuLVx0XHRpZiAoIWZyZWV6ZSkge1xuLVx0XHRcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuLVxuLVx0XHRcdGZvbGlvX3JlZl9hZGQoZm9saW8sIEhQQUdFX1BNRF9OUiAtIDEpO1xuLVx0XHRcdGlmIChhbm9uX2V4Y2x1c2l2ZSlcbi1cdFx0XHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4tXG4tXHRcdFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsXG4tXHRcdFx0XHRcdFx0IHZtYSwgaGFkZHIsIHJtYXBfZmxhZ3MpO1xuLVx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHQvKlxuLVx0XHQgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzXG4tXHRcdCAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoXG4tXHRcdCAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZVxuLVx0XHQgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmXG4tXHRcdCAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZVxuLVx0XHQgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQlxuLVx0XHQgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJiMzOTt0XG4tXHRcdCAqIGxpa2UgdGhhdC4gU2VlXG4tXHRcdCAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW1cbi1cdFx0ICogMzgzIG9uIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0XG4tXHRcdCAqIGl0JiMzOTtzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGVcbi1cdFx0ICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkXG4tXHRcdCAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93XG4tXHRcdCAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmVcbi1cdFx0ICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nIFwmIzM0O3BtZF9wb3B1bGF0ZSgpO1xuLVx0XHQgKiBmbHVzaF9wbWRfdGxiX3JhbmdlKCk7XCYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlIGN1cnJlbnQgcG1kXG4tXHRcdCAqIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZSBtdXN0XG4tXHRcdCAqIHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzXG4tXHRcdCAqIGNvbXBsZXRlIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHlcbi1cdFx0ICogd2Ugd3JpdGUgdGhlIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoXG4tXHRcdCAqIHBtZF9wb3B1bGF0ZS5cbiYjNDM7XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcbiYjNDM7XHRcdCAqIHRoZSBQVEUgZW50cmllcyBieSBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKSwgYW5kIGFjY2Vzc2VkXG4mIzQzO1x0XHQgKiBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb3BhZ2F0ZWQgdmlhIGRldmljZSBwcml2YXRlXG4mIzQzO1x0XHQgKiBlbnRyaWVzLlxuIFx0XHQgKi9cbi1cdFx0b2xkX3BtZCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuLVx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0aWYgKHBtZF9kaXJ0eShvbGRfcG1kKSkge1xuLVx0XHRcdGRpcnR5ID0gdHJ1ZTtcbi1cdFx0XHRmb2xpb19zZXRfZGlydHkoZm9saW8pO1xuLVx0XHR9XG4tXHRcdHdyaXRlID0gcG1kX3dyaXRlKG9sZF9wbWQpO1xuLVx0XHR5b3VuZyA9IHBtZF95b3VuZyhvbGRfcG1kKTtcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3VmZmQob2xkX3BtZCk7XG4mIzQzO1x0XHRpZiAoc3RhdGUtXHUwMDNld3JpdGUpXG4mIzQzO1x0XHRcdHJldHVybiBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KHBmbik7XG4mIzQzO1x0XHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuJiM0MztcdH1cbiBcbi1cdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fcmVmX2NvdW50KGZvbGlvKSwgZm9saW8pO1xuLVx0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4mIzQzO1x0aWYgKHN0YXRlLVx1MDAzZXdyaXRlKVxuJiM0MztcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xuJiM0MztcdGVsc2UgaWYgKHN0YXRlLVx1MDAzZWFub25fZXhjbHVzaXZlKVxuJiM0MztcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkocGZuKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KHBmbik7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFdpdGhvdXQgXCYjMzQ7ZnJlZXplXCYjMzQ7LCB3ZSYjMzk7bGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxuLVx0XHQgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yXG4tXHRcdCAqIGVhY2ggc3VicGFnZSAtLSBubyBuZWVkIHRvICh0ZW1wb3JhcmlseSkgY2xlYXIuXG4tXHRcdCAqXG4tXHRcdCAqIFdpdGggXCYjMzQ7ZnJlZXplXCYjMzQ7IHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbi1cdFx0ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXG4tXHRcdCAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcbi1cdFx0ICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbi1cdFx0ICpcbi1cdFx0ICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxuLVx0XHQgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbi1cdFx0ICpcbi1cdFx0ICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxuLVx0XHQgKi9cbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH1cbiYjNDM7XHRpZiAoc3RhdGUtXHUwMDNleW91bmcpXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTtcbiYjNDM7XHRpZiAoc3RhdGUtXHUwMDNlZGlydHkpXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGVudHJ5O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXBsYWNlIGFuIGFub255bW91cyBodWdlIFBNRCBlbnRyeSB3aXRoIGEgcGFnZSB0YWJsZSBtYXBwaW5nIHRoZSBzYW1lXG4mIzQzOyAqIGZvbGlvIGF0IFBURSBncmFudWxhcml0eS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSlcbiYjNDM7e1xuJiM0MztcdC8qIFByZXNlbnQgbWFwcGluZ3MgYW5kIGRldmljZSBwcml2YXRlIGVudHJpZXMgaG9sZCBhIFBNRC1sZXZlbCBybWFwLiAqL1xuJiM0MztcdGNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLVx1MDAzZWlzX3ByZXNlbnQgfHwgc3RhdGUtXHUwMDNlaXNfZGV2aWNlX3ByaXZhdGU7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0c3RydWN0IHBhZ2UgKnBhZ2UgPSBzdGF0ZS1cdTAwM2VwYWdlO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiYjNDM7XHRwZ3RhYmxlX3QgcGd0YWJsZTtcbiYjNDM7XHRwbWRfdCBfcG1kO1xuJiM0MztcdHB0ZV90ICpwdGU7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmIChybWFwcGVkKVxuJiM0MztcdFx0c3RhdGUtXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcbiBcbiBcdC8qXG4tXHQgKiBXaXRoZHJhdyB0aGUgdGFibGUgb25seSBhZnRlciB3ZSBtYXJrIHRoZSBwbWQgZW50cnkgaW52YWxpZC5cbi1cdCAqIFRoaXMmIzM5O3MgY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxuJiM0MztcdCAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaW52YWxpZGF0ZWQgYSBwcmVzZW50IGVudHJ5LCBhbmQgYSBzb2Z0bGVhZlxuJiM0MztcdCAqIGVudHJ5IGlzIG5vdCBwcmVzZW50IHRvIGJlZ2luIHdpdGguIEVpdGhlciB3YXkgdGhlIGVudHJ5IGlzIG91dCBvZlxuJiM0MztcdCAqIHNlcnZpY2UgYmVmb3JlIHdlIHdpdGhkcmF3IHRoZSBkZXBvc2l0ZWQgcGFnZSB0YWJsZSwgd2hpY2ggaXNcbiYjNDM7XHQgKiBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuXG4gXHQgKi9cbiBcdHBndGFibGUgPSBwZ3RhYmxlX3RyYW5zX2h1Z2Vfd2l0aGRyYXcobW0sIHBtZCk7XG4gXHRwbWRfcG9wdWxhdGUobW0sIFx1MDAyNl9wbWQsIHBndGFibGUpO1xuQEAgLTMzMzcsNTUgJiM0MzszMzE3LDE3IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0ICogTm90ZSB0aGF0IE5VTUEgaGludGluZyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgdG9cbiBcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cbiBcdCAqL1xuLVx0aWYgKGZyZWV6ZSB8fCBwbWRfaXNfbWlncmF0aW9uX2VudHJ5KG9sZF9wbWQpKSB7XG4tXHRcdHB0ZV90IGVudHJ5O1xuLVx0XHRzd3BfZW50cnlfdCBzd3BfZW50cnk7XG4tXG4tXHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG4tXHRcdFx0aWYgKHdyaXRlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTtcbi1cdFx0XHRlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSlcbi1cdFx0XHRcdHN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgJiM0MzsgaSkpO1xuLVx0XHRcdGVsc2Vcbi1cdFx0XHRcdHN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7XG4tXHRcdFx0aWYgKHlvdW5nKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcbi1cdFx0XHRpZiAoZGlydHkpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUgfHwgIXN0YXRlLVx1MDAzZWlzX3ByZXNlbnQpIHtcbiYjNDM7XHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SO1xuJiM0MztcdFx0ICAgICBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG4mIzQzO1x0XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKTtcbiYjNDM7XHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cbiYjNDM7XHRcdFx0XHRzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihzdGF0ZSwgcGZuKTtcbiYjNDM7XHRcdFx0cHRlX3QgZW50cnkgPSBzb2Z0bGVhZl90b19wdGUobGVhZik7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoc3RhdGUtXHUwMDNlc29mdF9kaXJ0eSlcbiBcdFx0XHRcdGVudHJ5ID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoZW50cnkpO1xuLVx0XHRcdGlmICh1ZmZkX3dwKVxuLVx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rdWZmZChlbnRyeSk7XG4tXHRcdFx0Vk1fV0FSTl9PTighcHRlX25vbmUocHRlcF9nZXQocHRlICYjNDM7IGkpKSk7XG4tXHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTtcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcbi1cdFx0cHRlX3QgZW50cnk7XG4tXHRcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcbi1cbi1cdFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHJlbGV2YW50XG4tXHRcdFx0ICogcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHRlIGVudHJpZXMgd2hlbiBmcmVlemVcbi1cdFx0XHQgKiBpcyBmYWxzZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGUpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgJiM0MzsgaSkpO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogWW91bmcgYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9nYXRlZCB2aWEgc3dwX2VudHJ5XG4tXHRcdFx0ICovXG4tXHRcdFx0ZW50cnkgPSBzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSk7XG4tXHRcdFx0aWYgKHNvZnRfZGlydHkpXG4tXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcbi1cdFx0XHRpZiAodWZmZF93cClcbiYjNDM7XHRcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbiBcdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgJiM0MzsgaSkpKTtcbiBcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUgJiM0MzsgaSwgZW50cnkpO1xuQEAgLTMzOTQsMjAgJiM0MzszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRwdGVfdCBlbnRyeTtcbiBcbiBcdFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbi1cdFx0aWYgKHdyaXRlKVxuJiM0MztcdFx0aWYgKHN0YXRlLVx1MDAzZXdyaXRlKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rd3JpdGUoZW50cnksIHZtYSk7XG4tXHRcdGlmICgheW91bmcpXG4mIzQzO1x0XHRpZiAoIXN0YXRlLVx1MDAzZXlvdW5nKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTtcbiBcdFx0LyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi9cbi1cdFx0aWYgKGRpcnR5KVxuJiM0MztcdFx0aWYgKHN0YXRlLVx1MDAzZWRpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpO1xuLVx0XHRpZiAoc29mdF9kaXJ0eSlcbiYjNDM7XHRcdGlmIChzdGF0ZS1cdTAwM2Vzb2Z0X2RpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdGlmICh1ZmZkX3dwKVxuJiM0MztcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTtcbiBcbiBcdFx0LyogUmVzdG9yZSBQQUdFX05PTkUgc28gYW4gUldQIG1hcmtlciBrZWVwcyB0cmFwcGluZyAqL1xuLVx0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHVmZmRfd3ApXG4mIzQzO1x0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7KVxuQEAgLTM0MTcsMTUgJiM0MzszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbiBcdH1cbiBcdHB0ZV91bm1hcChwdGUpO1xuIFxuLVx0aWYgKCFwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKVxuLVx0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4tXHRpZiAoZnJlZXplKVxuJiM0MztcdGlmIChybWFwcGVkKVxuJiM0MztcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKHN0YXRlLVx1MDAzZWZvbGlvLCBwYWdlLCB2bWEpO1xuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUpXG4gXHRcdHB1dF9wYWdlKHBhZ2UpO1xuIFxuIFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyB2b2lkIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0Ym9vbCBmcmVlemUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xuJiM0MztcdFx0LmZvbGlvID0gZm9saW8sXG4mIzQzO1x0XHQuaXNfcHJlc2VudCA9IHRydWUsXG4mIzQzO1x0XHQuZnJlZXplID0gZnJlZXplLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcbiYjNDM7XHQgKiB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoIGhhcHBlbnMgaW5cbiYjNDM7XHQgKiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlIHZlcnNpb24gcG9pbnRpbmdcbiYjNDM7XHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xuJiM0MztcdCAqIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZSBzaXplIFRMQiBtaXNzIG9uIHRoZVxuJiM0MztcdCAqIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluXG4mIzQzO1x0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2VzbiYjMzk7dCBsaWtlIHRoYXQuIFNlZVxuJiM0MztcdCAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0gMzgzIG9uXG4mIzQzO1x0ICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQmIzM5O3Mgb25seSBzYWZlXG4mIzQzO1x0ICogaWYgdGhlIHBlcm1pc3Npb24gYW5kIGNhY2hlIGF0dHJpYnV0ZXMgb2YgdGhlIHR3byBlbnRyaWVzIGxvYWRlZCBpblxuJiM0MztcdCAqIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXNcbiYjNDM7XHQgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZVxuJiM0MztcdCAqIHNhbWUgdmlydHVhbCBhZGRyZXNzIHRvIGJlIGxvYWRlZCBzaW11bHRhbmVvdXNseS4gU28gaW5zdGVhZCBvZlxuJiM0MztcdCAqIGRvaW5nIFwmIzM0O3BtZF9wb3B1bGF0ZSgpOyBmbHVzaF9wbWRfdGxiX3JhbmdlKCk7XCYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlXG4mIzQzO1x0ICogY3VycmVudCBwbWQgbm90cHJlc2VudCAoYXRvbWljYWxseSBiZWNhdXNlIGhlcmUgdGhlIHBtZF90cmFuc19odWdlXG4mIzQzO1x0ICogbXVzdCByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcyBjb21wbGV0ZVxuJiM0MztcdCAqIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlXG4mIzQzO1x0ICogbm9uLWh1Z2UgdmVyc2lvbiBvZiB0aGUgcG1kIGVudHJ5IHdpdGggcG1kX3BvcHVsYXRlLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogVGhpcyBtdXN0IGFsc28gaGFwcGVuIGJlZm9yZSBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGlzIHJlYWQgYmVsb3csIHNlZVxuJiM0MztcdCAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uc3QgcG1kX3QgcG1kdmFsID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7XG4mIzQzO1xuJiM0MztcdHN0YXRlLnBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpO1xuJiM0MztcdHN0YXRlLndyaXRlID0gcG1kX3dyaXRlKHBtZHZhbCk7XG4mIzQzO1x0c3RhdGUueW91bmcgPSBwbWRfeW91bmcocG1kdmFsKTtcbiYjNDM7XHRzdGF0ZS5kaXJ0eSA9IHBtZF9kaXJ0eShwbWR2YWwpO1xuJiM0MztcdHN0YXRlLnNvZnRfZGlydHkgPSBwbWRfc29mdF9kaXJ0eShwbWR2YWwpO1xuJiM0MztcdHN0YXRlLnVmZmQgPSBwbWRfdWZmZChwbWR2YWwpO1xuJiM0MztcdHN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7XG4mIzQzO1xuJiM0MztcdGlmIChzdGF0ZS5kaXJ0eSlcbiYjNDM7XHRcdGZvbGlvX3NldF9kaXJ0eShmb2xpbyk7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0c3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsIFx1MDAyNnN0YXRlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBwbWRfdCBvbGRfcG1kLFxuJiM0MztcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBmcmVlemUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XG4mIzQzO1x0c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHtcbiYjNDM7XHRcdC5mb2xpbyA9IGZvbGlvLFxuJiM0MztcdFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcbiYjNDM7XHRcdC5pc19kZXZpY2VfcHJpdmF0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlKGVudHJ5KSxcbiYjNDM7XHRcdC5mcmVlemUgPSBmcmVlemUsXG4mIzQzO1x0XHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcbiYjNDM7XHRcdC51ZmZkID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdGlmIChzdGF0ZS5pc19kZXZpY2VfcHJpdmF0ZSkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIERldmljZSBwcml2YXRlIGZvbGlvcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIGZvbGlvc1xuJiM0MztcdFx0ICogdy5yLnQuIGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLCBzZWVcbiYjNDM7XHRcdCAqIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRzdGF0ZS53cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLnlvdW5nID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLmRpcnR5ID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLmFub25fZXhjbHVzaXZlID1cbiYjNDM7XHRcdFx0c29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBwbWRfdCBvbGRfcG1kID0gKnBtZDtcbiYjNDM7XHRjb25zdCBib29sIGlzX3ByZXNlbnQgPSBwbWRfcHJlc2VudChvbGRfcG1kKTtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcbiYjNDM7XHRWTV9CVUdfT04oaGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4mIzQzO1x0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuJiM0MztcdFZNX0JVR19PTl9WTUEodm1hLVx1MDAzZXZtX2VuZCBcdTAwM2MgaGFkZHIgJiM0MzsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKG9sZF9wbWQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xuJiM0MztcbiYjNDM7XHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xuJiM0MztcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbiYjNDM7XHQgKiBpbnNpZGUgX19zcGxpdF9odWdlX3BtZCgpID9cbiYjNDM7XHQgKlxuJiM0MztcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8gc21hbGxcbiYjNDM7XHQgKiBwYWdlIGFsc28gd3JpdGUgcHJvdGVjdGVkIHNvIGl0IGRvZXMgbm90IHNlZW1zIHVzZWZ1bCB0byBpbnZhbGlkYXRlXG4mIzQzO1x0ICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0KHZtYSwgb2xkX3BtZCkpIHtcbiYjNDM7XHRcdF9fc3BsaXRfaHVnZV96ZXJvX3BhZ2VfcG1kKHZtYSwgaGFkZHIsIHBtZCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBub24tcHJlc2VudCBlbnRyeSB3aGljaCBpcyBuZWl0aGVyIGEgbWlncmF0aW9uIG5vciBhIGRldmljZVxuJiM0MztcdCAqIHByaXZhdGUgZW50cnkgaXMgY29ycnVwdCwgYW5kIHBtZF90b19zb2Z0bGVhZl9mb2xpbygpIGhhcyBhbHJlYWR5XG4mIzQzO1x0ICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2hcbiYjNDM7XHQgKiBtZWFucyBub3RoaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh1bmxpa2VseSghaXNfcHJlc2VudCBcdTAwMjZcdTAwMjYgIWZvbGlvKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuJiM0MztcdFx0dW5tYXBfaHVnZV9wbWRfZW50cnkodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgaXNfcHJlc2VudCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoaXNfcHJlc2VudClcbiYjNDM7XHRcdHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgZnJlZXplKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIG9sZF9wbWQsIGZvbGlvLFxuJiM0MztcdFx0XHRcdFx0ICAgZnJlZXplKTtcbiYjNDM7fVxuJiM0MztcbiB2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0XHRcdCAgIHBtZF90ICpwbWQsIGJvb2wgZnJlZXplKVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtERVZJQ0VfUFJJVkFURSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCYjMzQ7LAogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcG1kJiMzNDssCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2FkZHJlc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBzcGxpdCBsb2dpYyBpbiBtbS9odWdlX21lbW9yeS5jLCBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBwcmVzZW50IHZzIG5vbi1wcmVzZW50IChtaWdyYXRpb24sIGRldmljZS1wcml2YXRlKSBodWdlIFBNRHMgYW5kIHJlb3JnYW5pemluZyBybWFwIGNvbnZlcnNpb24gYW5kIHVubWFwcGluZyBsb2dpYy4gVGhpcyBjb3JlIE1NIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIHZpYSB1c2VyIGFjdGlvbnMgKG1hZHZpc2UsIG1wcm90ZWN0LCBwYWdlIG1pZ3JhdGlvbiwgZXRjLikgYW5kIGlzIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzN2FmZGEyZDEwOTRiMGE5ZGYyMDBjNTM1YmQ0YjAxMjQ3YTlmNzExCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMjggMTk6Mzk6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTMxMzksMTkzICYjNDM7MzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCi1zdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKLQkJdW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpCiYjNDM7LyoKJiM0MzsgKiBPbmx5IGEgaHVnZSB6ZXJvIFBNRCBpbiBhbiBhbm9ueW1vdXMgVk1BIGlzIHNwbGl0LCBpbnRvIGEgcGFnZSB0YWJsZSBvZgomIzQzOyAqIHNoYXJlZCB6ZXJvIHBhZ2UgbWFwcGluZ3MuIEFueSBvdGhlciBodWdlIHplcm8gUE1EIGlzIHNpbXBseSB1bm1hcHBlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgcG1kdmFsKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKLQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXBndGFibGVfdCBwZ3RhYmxlOwotCXBtZF90IG9sZF9wbWQsIF9wbWQ7Ci0JYm9vbCBzb2Z0X2RpcnR5LCB1ZmZkX3dwID0gZmFsc2UsIHlvdW5nID0gZmFsc2UsIHdyaXRlID0gZmFsc2U7Ci0JYm9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlwdGVfdCAqcHRlOwotCWludCBpOwotCi0JVk1fQlVHX09OKGhhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX2VuZCAmbHQ7IGhhZGRyICYjNDM7IEhQQUdFX1BNRF9TSVpFLCB2bWEpOwomIzQzOwlyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpICZhbXA7JmFtcDsgdm1hX2lzX2Fub255bW91cyh2bWEpOwomIzQzO30KIAotCVZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpICZhbXA7JmFtcDsgIXBtZF90cmFuc19odWdlKCpwbWQpKTsKJiM0MzsvKioKJiM0MzsgKiB1bm1hcF9odWdlX3BtZF9lbnRyeSgpIC0gVW5tYXAgYSBodWdlIFBNRCBlbnRyeSByYXRoZXIgdGhhbiBzcGxpdHRpbmcgaXQuCiYjNDM7ICogQHZtYTogVGhlIFZNQSBAcG1kIGJlbG9uZ3MgdG8uCiYjNDM7ICogQGhhZGRyOiBUaGUgUE1ELWFsaWduZWQgYWRkcmVzcyBAcG1kIG1hcHMuCiYjNDM7ICogQHBtZDogUG9pbnRlciB0byB0aGUgaHVnZSBQTUQgZW50cnkuCiYjNDM7ICogQGZvbGlvOiBUaGUgZm9saW8gQHBtZCBkZXNjcmliZXMsIG9yIE5VTEwgaWYgaXQgZGVzY3JpYmVzIG5vbmUuCiYjNDM7ICogQGlzX3ByZXNlbnQ6IElzIEBwbWQgYSBwcmVzZW50IGVudHJ5IHJhdGhlciB0aGFuIGEgc29mdGxlYWYgZW50cnk/CiYjNDM7ICoKJiM0MzsgKiBPbmx5IGFub255bW91cyBmb2xpb3MgYXJlIHJlYnVpbHQgYXQgUFRFIGxldmVsIHdoZW4gYSBodWdlIFBNRCBlbnRyeSBpcwomIzQzOyAqIHNwbGl0LiBFdmVyeXRoaW5nIGVsc2UgaXMgdW5tYXBwZWQgaGVyZSBhbmQgZmF1bHRlZCBiYWNrIGluIG9uIHRoZSBuZXh0CiYjNDM7ICogYWNjZXNzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHVubWFwX2h1Z2VfcG1kX2VudHJ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCWJvb2wgaXNfcHJlc2VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJcG1kX3Qgb2xkX3BtZDsKIAotCWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwlvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU28KJiM0MzsJICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0CiYjNDM7CSAqLwomIzQzOwlpZiAoaGFzX2RlcG9zaXRlZF9wZ3RhYmxlKHZtYSwgb2xkX3BtZCwgZm9saW8pKQomIzQzOwkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKIAotCWlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7Ci0JCW9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTsKLQkJLyoKLQkJICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTbwotCQkgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXQKLQkJICovCi0JCWlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKQotCQkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKLQkJaWYgKHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSkKLQkJCXJldHVybjsKLQkJaWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7Ci0JCQljb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpOwotCi0JCQlmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7Ci0JCX0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkgewotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQkJaWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSAmYW1wOyZhbXA7IHBtZF9kaXJ0eShvbGRfcG1kKSkKLQkJCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKLQkJCWlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSAmYW1wOyZhbXA7IHBtZF95b3VuZyhvbGRfcG1kKSkKLQkJCQlmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7Ci0JCQlmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7Ci0JCQlhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7Ci0JCQlmb2xpb19wdXQoZm9saW8pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKJiM0MzsJaWYgKCFmb2xpbykKIAkJcmV0dXJuOwotCX0KIAotCWlmIChpc19odWdlX3plcm9fcG1kKCpwbWQpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBieSBjYWxsaW5nCi0JCSAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3cKLQkJICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/Ci0JCSAqCi0JCSAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8KLQkJICogc21hbGwgcGFnZSBhbHNvIHdyaXRlIHByb3RlY3RlZCBzbyBpdCBkb2VzIG5vdCBzZWVtcyB1c2VmdWwKLQkJICogdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGF0IHRoaXMgdGltZS4KLQkJICovCi0JCXJldHVybiBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpOwomIzQzOwlpZiAoaXNfcHJlc2VudCkgewomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTsKJiM0MzsKJiM0MzsJCWlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyBwbWRfZGlydHkob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQlpZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgJmFtcDsmYW1wOyBwbWRfeW91bmcob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pOwomIzQzOwkJZm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpOwogCX0KIAotCWlmIChwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7CWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJZm9saW9fcHV0KGZvbGlvKTsKJiM0Mzt9CiAKLQkJc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKTsKLQkJdWZmZF93cCA9IHBtZF9zd3BfdWZmZChvbGRfcG1kKTsKJiM0MztzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWJvb2wgaXNfcHJlc2VudDsKJiM0MzsJYm9vbCBpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJYm9vbCBmcmVlemU7CiYjNDM7CWJvb2wgd3JpdGU7CiYjNDM7CWJvb2wgeW91bmc7CiYjNDM7CWJvb2wgZGlydHk7CiYjNDM7CWJvb2wgc29mdF9kaXJ0eTsKJiM0MzsJYm9vbCB1ZmZkOwomIzQzOwlib29sIGFub25fZXhjbHVzaXZlOwomIzQzO307CiAKLQkJd3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwotCQlpZiAoUGFnZUFub24ocGFnZSkpCi0JCQlhbm9uX2V4Y2x1c2l2ZSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7Ci0JCXlvdW5nID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KTsKLQkJZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7LyoKJiM0MzsgKiBDb252ZXJ0IHRoZSBmb2xpbyYjMzk7cyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy4KJiM0MzsgKgomIzQzOyAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKJiM0MzsgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yCiYjNDM7ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci4KJiM0MzsgKgomIzQzOyAqIFdpdGggJiMzNDtmcmVlemUmIzM0OyB3ZSB3YW50IHRvIHJlcGxhY2UgbWFwcGVkIHBhZ2VzIGJ5CiYjNDM7ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlCiYjNDM7ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQomIzQzOyAqIHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCkuCiYjNDM7ICoKJiM0MzsgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECiYjNDM7ICogb25seSBhbmQgbGV0IHRyeV90b19taWdyYXRlX29uZSgpIGZhaWwgbGF0ZXIuCiYjNDM7ICoKJiM0MzsgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiB3aGV0aGVyIHRoZSBtYXBwaW5nIG1heSBzdGlsbCBiZSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgaGFkZHIpCiYjNDM7ewomIzQzOwlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplICZhbXA7JmFtcDsKJiM0MzsJICAgICghc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlIHx8CiYjNDM7CSAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLSZndDtmb2xpbywgc3RhdGUtJmd0O3BhZ2UpKSkKJiM0MzsJCXJldHVybiB0cnVlOwogCi0JCXNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7CiYjNDM7CWZvbGlvX3JlZl9hZGQoc3RhdGUtJmd0O2ZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTsKJiM0MzsJaWYgKHN0YXRlLSZndDthbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCXJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7CiYjNDM7CWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhzdGF0ZS0mZ3Q7Zm9saW8sIHN0YXRlLSZndDtwYWdlLCBIUEFHRV9QTURfTlIsIHZtYSwKJiM0MzsJCQkJIGhhZGRyLCBybWFwX2ZsYWdzKTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KIAotCQl3cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTsKLQkJYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTsKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIHRoZSBsZWFmIGVudHJ5IGZvciB0aGUgUFRFIGVudHJ5IGRlc2NyaWJpbmcgQHBmbiwgZm9yIGEgaHVnZSBQTUQgZW50cnkKJiM0MzsgKiB3aGljaCBpcyBub3QgcmVzdG9yZWQgYXMgYSBwcmVzZW50IG1hcHBpbmcuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNvZnRsZWFmX3Qgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWYoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsCiYjNDM7CQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQomIzQzO3sKJiM0MzsJc29mdGxlYWZfdCBlbnRyeTsKIAomIzQzOwlpZiAoc3RhdGUtJmd0O2lzX2RldmljZV9wcml2YXRlICZhbXA7JmFtcDsgIXN0YXRlLSZndDtmcmVlemUpIHsKIAkJLyoKLQkJICogRGV2aWNlIHByaXZhdGUgVEhQIHNob3VsZCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHJlZ3VsYXIKLQkJICogZm9saW9zIHcuci50IGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLiBTZWUgdGhlIGNvbW1lbnRzIGZvcgotCQkgKiBmb2xpbyBoYW5kbGluZyBhbmQgYW5vbl9leGNsdXNpdmUgYmVsb3cuCi0JCSAqLwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQotCQkJZm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsCi0JCQkJCQkgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzCi0JCSAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoCi0JCSAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZQotCQkgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmCi0JCSAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZQotCQkgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQgotCQkgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJiMzOTt0Ci0JCSAqIGxpa2UgdGhhdC4gU2VlCi0JCSAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0KLQkJICogMzgzIG9uIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0Ci0JCSAqIGl0JiMzOTtzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGUKLQkJICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkCi0JCSAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93Ci0JCSAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmUKLQkJICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nICYjMzQ7cG1kX3BvcHVsYXRlKCk7Ci0JCSAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTsmIzM0OyB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZAotCQkgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdAotCQkgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcwotCQkgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5Ci0JCSAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aAotCQkgKiBwbWRfcG9wdWxhdGUuCiYjNDM7CQkgKiBhbm9uX2V4Y2x1c2l2ZSB3YXMgYWxyZWFkeSBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlcyBiYWNraW5nCiYjNDM7CQkgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZAomIzQzOwkJICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZQomIzQzOwkJICogZW50cmllcy4KIAkJICovCi0JCW9sZF9wbWQgPSBwbWRwX2ludmFsaWRhdGUodm1hLCBoYWRkciwgcG1kKTsKLQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCWlmIChwbWRfZGlydHkob2xkX3BtZCkpIHsKLQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7Ci0JCX0KLQkJd3JpdGUgPSBwbWRfd3JpdGUob2xkX3BtZCk7Ci0JCXlvdW5nID0gcG1kX3lvdW5nKG9sZF9wbWQpOwotCQlzb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfdWZmZChvbGRfcG1kKTsKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7d3JpdGUpCiYjNDM7CQkJcmV0dXJuIG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkocGZuKTsKJiM0MzsJCXJldHVybiBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KHBmbik7CiYjNDM7CX0KIAotCQlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7Ci0JCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKJiM0MzsJaWYgKHN0YXRlLSZndDt3cml0ZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZSBpZiAoc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlKQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pOwogCi0JCS8qCi0JCSAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKLQkJICogUGFnZUFub25FeGNsdXNpdmUoKSBmbGFnIGZvciBlYWNoIFBURSBieSBzZXR0aW5nIGl0IGZvcgotCQkgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLgotCQkgKgotCQkgKiBXaXRoICYjMzQ7ZnJlZXplJiMzNDsgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieQotCQkgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2UKLQkJICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQotCQkgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLgotCQkgKgotCQkgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECi0JCSAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLgotCQkgKgotCQkgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCi0JCSAqLwotCQlhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQkJCWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgSFBBR0VfUE1EX05SLAotCQkJCQkJIHZtYSwgaGFkZHIsIHJtYXBfZmxhZ3MpOwotCQl9Ci0JfQomIzQzOwlpZiAoc3RhdGUtJmd0O3lvdW5nKQomIzQzOwkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZGlydHkpCiYjNDM7CQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVudHJ5OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWUKJiM0MzsgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlKQomIzQzO3sKJiM0MzsJLyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovCiYjNDM7CWNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLSZndDtpc19wcmVzZW50IHx8IHN0YXRlLSZndDtpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLSZndDtwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHI7CiYjNDM7CXBndGFibGVfdCBwZ3RhYmxlOwomIzQzOwlwbWRfdCBfcG1kOwomIzQzOwlwdGVfdCAqcHRlOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKHJtYXBwZWQpCiYjNDM7CQlzdGF0ZS0mZ3Q7ZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTsKIAogCS8qCi0JICogV2l0aGRyYXcgdGhlIHRhYmxlIG9ubHkgYWZ0ZXIgd2UgbWFyayB0aGUgcG1kIGVudHJ5IGludmFsaWQuCi0JICogVGhpcyYjMzk7cyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiYjNDM7CSAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaW52YWxpZGF0ZWQgYSBwcmVzZW50IGVudHJ5LCBhbmQgYSBzb2Z0bGVhZgomIzQzOwkgKiBlbnRyeSBpcyBub3QgcHJlc2VudCB0byBiZWdpbiB3aXRoLiBFaXRoZXIgd2F5IHRoZSBlbnRyeSBpcyBvdXQgb2YKJiM0MzsJICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpcwomIzQzOwkgKiBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiAJICovCiAJcGd0YWJsZSA9IHBndGFibGVfdHJhbnNfaHVnZV93aXRoZHJhdyhtbSwgcG1kKTsKIAlwbWRfcG9wdWxhdGUobW0sICZhbXA7X3BtZCwgcGd0YWJsZSk7CkBAIC0zMzM3LDU1ICYjNDM7MzMxNywxNyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAkgKiBOb3RlIHRoYXQgTlVNQSBoaW50aW5nIGFjY2VzcyByZXN0cmljdGlvbnMgYXJlIG5vdCB0cmFuc2ZlcnJlZCB0bwogCSAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy4KIAkgKi8KLQlpZiAoZnJlZXplIHx8IHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpIHsKLQkJcHRlX3QgZW50cnk7Ci0JCXN3cF9lbnRyeV90IHN3cF9lbnRyeTsKLQotCQlmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgJmx0OyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJCWlmICh3cml0ZSkKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UgaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWlmICh5b3VuZykKLQkJCQlzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhzd3BfZW50cnkpOwotCQkJaWYgKGRpcnR5KQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KHN3cF9lbnRyeSk7Ci0JCQllbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTsKLQkJCWlmIChzb2Z0X2RpcnR5KQomIzQzOwlpZiAoc3RhdGUtJmd0O2ZyZWV6ZSB8fCAhc3RhdGUtJmd0O2lzX3ByZXNlbnQpIHsKJiM0MzsJCWZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSAmbHQ7IEhQQUdFX1BNRF9OUjsKJiM0MzsJCSAgICAgaSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkgewomIzQzOwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKTsKJiM0MzsJCQljb25zdCBzb2Z0bGVhZl90IGxlYWYgPQomIzQzOwkJCQlzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihzdGF0ZSwgcGZuKTsKJiM0MzsJCQlwdGVfdCBlbnRyeSA9IHNvZnRsZWFmX3RvX3B0ZShsZWFmKTsKJiM0MzsKJiM0MzsJCQlpZiAoc3RhdGUtJmd0O3NvZnRfZGlydHkpCiAJCQkJZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCQlpZiAodWZmZF93cCkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKLQkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwotCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKLQkJfQotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KG9sZF9wbWQpKSB7Ci0JCXB0ZV90IGVudHJ5OwotCQlzd3BfZW50cnlfdCBzd3BfZW50cnk7Ci0KLQkJZm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7Ci0JCQkvKgotCQkJICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcmVsZXZhbnQKLQkJCSAqIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHB0ZSBlbnRyaWVzIHdoZW4gZnJlZXplCi0JCQkgKiBpcyBmYWxzZS4KLQkJCSAqLwotCQkJaWYgKHdyaXRlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkoCi0JCQkJCQkJcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7Ci0JCQllbHNlCi0JCQkJc3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCS8qCi0JCQkgKiBZb3VuZyBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb2dhdGVkIHZpYSBzd3BfZW50cnkKLQkJCSAqLwotCQkJZW50cnkgPSBzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSk7Ci0JCQlpZiAoc29mdF9kaXJ0eSkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTsKLQkJCWlmICh1ZmZkX3dwKQomIzQzOwkJCWlmIChzdGF0ZS0mZ3Q7dWZmZCkKIAkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKIAkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwogCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKQEAgLTMzOTQsMjAgJiM0MzszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQlwdGVfdCBlbnRyeTsKIAogCQllbnRyeSA9IG1rX3B0ZShwYWdlLCBSRUFEX09OQ0Uodm1hLSZndDt2bV9wYWdlX3Byb3QpKTsKLQkJaWYgKHdyaXRlKQomIzQzOwkJaWYgKHN0YXRlLSZndDt3cml0ZSkKIAkJCWVudHJ5ID0gcHRlX21rd3JpdGUoZW50cnksIHZtYSk7Ci0JCWlmICgheW91bmcpCiYjNDM7CQlpZiAoIXN0YXRlLSZndDt5b3VuZykKIAkJCWVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTsKIAkJLyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi8KLQkJaWYgKGRpcnR5KQomIzQzOwkJaWYgKHN0YXRlLSZndDtkaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpOwotCQlpZiAoc29mdF9kaXJ0eSkKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7c29mdF9kaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCWlmICh1ZmZkX3dwKQomIzQzOwkJaWYgKHN0YXRlLSZndDt1ZmZkKQogCQkJZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTsKIAogCQkvKiBSZXN0b3JlIFBBR0VfTk9ORSBzbyBhbiBSV1AgbWFya2VyIGtlZXBzIHRyYXBwaW5nICovCi0JCWlmICh1c2VyZmF1bHRmZF9yd3Aodm1hKSAmYW1wOyZhbXA7IHVmZmRfd3ApCiYjNDM7CQlpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgJmFtcDsmYW1wOyBzdGF0ZS0mZ3Q7dWZmZCkKIAkJCWVudHJ5ID0gcHRlX21vZGlmeShlbnRyeSwgUEFHRV9OT05FKTsKIAogCQlmb3IgKGkgPSAwOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOykKQEAgLTM0MTcsMTUgJiM0MzszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAl9CiAJcHRlX3VubWFwKHB0ZSk7CiAKLQlpZiAoIXBtZF9pc19taWdyYXRpb25fZW50cnkoKnBtZCkpCi0JCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChmb2xpbywgcGFnZSwgdm1hKTsKLQlpZiAoZnJlZXplKQomIzQzOwlpZiAocm1hcHBlZCkKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS0mZ3Q7Zm9saW8sIHBhZ2UsIHZtYSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplKQogCQlwdXRfcGFnZShwYWdlKTsKIAogCXNtcF93bWIoKTsgLyogbWFrZSBwdGUgdmlzaWJsZSBiZWZvcmUgcG1kICovCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgc3RhdGUgPSB7CiYjNDM7CQkuZm9saW8gPSBmb2xpbywKJiM0MzsJCS5pc19wcmVzZW50ID0gdHJ1ZSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXMgdGhlCiYjNDM7CSAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpbgomIzQzOwkgKiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlIHZlcnNpb24gcG9pbnRpbmcKJiM0MzsJICogdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWYgYWxsIENQVXMgd2VyZSBidWcKJiM0MzsJICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlCiYjNDM7CSAqIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluCiYjNDM7CSAqIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24mIzM5O3QgbGlrZSB0aGF0LiBTZWUKJiM0MzsJICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS9UZWNoRG9jcy80MTMyMl8xMGhfUmV2X0dkLnBkZiwgRXJyYXR1bSAzODMgb24KJiM0MzsJICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQmIzM5O3Mgb25seSBzYWZlCiYjNDM7CSAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW4KJiM0MzsJICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZSkuIEJ1dCBpdCBpcwomIzQzOwkgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZQomIzQzOwkgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2YKJiM0MzsJICogZG9pbmcgJiMzNDtwbWRfcG9wdWxhdGUoKTsgZmx1c2hfcG1kX3RsYl9yYW5nZSgpOyYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlCiYjNDM7CSAqIGN1cnJlbnQgcG1kIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZQomIzQzOwkgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlCiYjNDM7CSAqIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlCiYjNDM7CSAqIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoIHBtZF9wb3B1bGF0ZS4KJiM0MzsJICoKJiM0MzsJICogVGhpcyBtdXN0IGFsc28gaGFwcGVuIGJlZm9yZSBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGlzIHJlYWQgYmVsb3csIHNlZQomIzQzOwkgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpLgomIzQzOwkgKi8KJiM0MzsJY29uc3QgcG1kX3QgcG1kdmFsID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CiYjNDM7CXN0YXRlLnBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpOwomIzQzOwlzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpOwomIzQzOwlzdGF0ZS55b3VuZyA9IHBtZF95b3VuZyhwbWR2YWwpOwomIzQzOwlzdGF0ZS5kaXJ0eSA9IHBtZF9kaXJ0eShwbWR2YWwpOwomIzQzOwlzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTsKJiM0MzsJc3RhdGUudWZmZCA9IHBtZF91ZmZkKHBtZHZhbCk7CiYjNDM7CXN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7CiYjNDM7CiYjNDM7CWlmIChzdGF0ZS5kaXJ0eSkKJiM0MzsJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTsKJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHBtZF90IG9sZF9wbWQsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKJiM0MzsJc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHsKJiM0MzsJCS5mb2xpbyA9IGZvbGlvLAomIzQzOwkJLnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSwKJiM0MzsJCS5pc19kZXZpY2VfcHJpdmF0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlKGVudHJ5KSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CQkuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSwKJiM0MzsJCS51ZmZkID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpLAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoc3RhdGUuaXNfZGV2aWNlX3ByaXZhdGUpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBEZXZpY2UgcHJpdmF0ZSBmb2xpb3MgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgcmVndWxhciBmb2xpb3MKJiM0MzsJCSAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlCiYjNDM7CQkgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS4KJiM0MzsJCSAqLwomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19kZXZpY2VfcHJpdmF0ZV93cml0ZShlbnRyeSk7CiYjNDM7CQlzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwomIzQzOwkJc3RhdGUueW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpOwomIzQzOwkJc3RhdGUuZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwomIzQzOwkJc3RhdGUuYW5vbl9leGNsdXNpdmUgPQomIzQzOwkJCXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKQomIzQzO3sKJiM0MzsJY29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7CiYjNDM7CWNvbnN0IGJvb2wgaXNfcHJlc2VudCA9IHBtZF9wcmVzZW50KG9sZF9wbWQpOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwomIzQzOwlWTV9CVUdfT04oaGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKTsKJiM0MzsJVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7CiYjNDM7CVZNX0JVR19PTl9WTUEodm1hLSZndDt2bV9lbmQgJmx0OyBoYWRkciAmIzQzOyBIUEFHRV9QTURfU0laRSwgdm1hKTsKJiM0MzsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCFwbWRfaXNfdmFsaWRfc29mdGxlYWYob2xkX3BtZCkgJmFtcDsmYW1wOwomIzQzOwkJCSFwbWRfdHJhbnNfaHVnZShvbGRfcG1kKSk7CiYjNDM7CiYjNDM7CWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZwomIzQzOwkgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93CiYjNDM7CSAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgPwomIzQzOwkgKgomIzQzOwkgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvIHNtYWxsCiYjNDM7CSAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGUKJiM0MzsJICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuCiYjNDM7CSAqLwomIzQzOwlpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkgewomIzQzOwkJX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLXByZXNlbnQgZW50cnkgd2hpY2ggaXMgbmVpdGhlciBhIG1pZ3JhdGlvbiBub3IgYSBkZXZpY2UKJiM0MzsJICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHkKJiM0MzsJICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2gKJiM0MzsJICogbWVhbnMgbm90aGluZy4KJiM0MzsJICovCiYjNDM7CWlmICh1bmxpa2VseSghaXNfcHJlc2VudCAmYW1wOyZhbXA7ICFmb2xpbykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHsKJiM0MzsJCXVubWFwX2h1Z2VfcG1kX2VudHJ5KHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGlzX3ByZXNlbnQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJc3BsaXRfcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIGZvbGlvLCBmcmVlemUpOwomIzQzOwllbHNlCiYjNDM7CQlzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIG9sZF9wbWQsIGZvbGlvLAomIzQzOwkJCQkJICAgZnJlZXplKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NjgKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxODUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBIdWdlIFBhZ2VzIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB0aGUgZnV6emluZyBzdHJhdGVneS4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIHRoaXMgZXZlbiB3YXJyYW50cyBmdXp6aW5nIGF0dGVudGlvbiwgYW5kIGlmIHNvLCB3aGF0IGNvbmZpZ3VyYXRpb25zIGFuZCBmb2N1cyBzeW1ib2xzIGFyZSBjcml0aWNhbC4gTXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBkaXNzZWN0IHRoZSBkaWZmLgoKVGhlIGNoYW5nZXMgYXJlIGNvbmNlbnRyYXRlZCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHdoaWNoIGFsd2F5cyBwaXF1ZXMgbXkgaW50ZXJlc3QuIFNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHRvdWNoZXMgYSBoYW5kZnVsIG9mIGtleSBmdW5jdGlvbnM6IGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXBgLCBgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWZgLCBgc3BsaXRfaHVnZV9wbWRfdG9fcHRlc2AsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCwgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgYW5kIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAuIFRoaXMgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgcmVmYWN0b3Jpbmcgb3IgaW1wcm92ZW1lbnQgcmVsYXRlZCB0byBzcGxpdHRpbmcgaHVnZSBwYWdlcywgbGlrZWx5IGltcGFjdGluZyBtZW1vcnkgbWFuYWdlbWVudCBpbiBhIHNpZ25pZmljYW50IHdheS4KClRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSwgSSYjMzk7bGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCB0aGUgY29udGV4dCBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIHRoZSByZWxhdGVkIEtjb25maWcgb3B0aW9ucy4gSXQmIzM5O3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmdW5jdGlvbnMgaW50ZXJhY3Qgd2l0aCB0aGUgd2lkZXIgc3lzdGVtIGFuZCBhbnkgY29uZmlndXJhdGlvbiBrbm9icyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGVpciBiZWhhdmlvci4gS25vd2luZyB3aGljaCBjb25maWcgb3B0aW9ucyB0cmlnZ2VyIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIHRoZSBrZXkgdG8gZGVzaWduaW5nIHRoZSByaWdodCBmdXp6aW5nIHN0cmF0ZWd5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcG1kJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cC5jPTg5OD1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy05MzEtXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG5tbS9ndXAuYzo5MzI6XHRcdHNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTtcbm1tL2d1cC5jLTkzMy1cdFx0LyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqL1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTkwOD1pbnQgY29weV9odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE5OTAtXHRcdHNwaW5fdW5sb2NrKGRzdF9wdGwpO1xubW0vaHVnZV9tZW1vcnkuYzoxOTkxOlx0XHRfX3NwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIGFkZHIsIGZhbHNlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMTk5Mi1cdFx0cmV0dXJuIC1FQUdBSU47XG4tLVxubW0vaHVnZV9tZW1vcnkuYz0yMTI1PXZtX2ZhdWx0X3QgZG9faHVnZV9wbWRfd3BfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTIyMTQtZmFsbGJhY2s6XG5tbS9odWdlX21lbW9yeS5jOjIyMTU6XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgdm1mLVx1MDAzZXBtZCwgdm1mLVx1MDAzZWFkZHJlc3MsIGZhbHNlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMjIxNi1cdHJldHVybiBWTV9GQVVMVF9GQUxMQkFDSztcbi0tXG5tbS9odWdlX21lbW9yeS5jPTMxOTc9c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zMjI5LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozMjMwOnN0YXRpYyBib29sIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcChjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbm1tL2h1Z2VfbWVtb3J5LmMtMzIzMS1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgaGFkZHIpXG4tLVxubW0vaHVnZV9tZW1vcnkuYz0zMjUyPXN0YXRpYyBzb2Z0bGVhZl90IHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzI1OS1cdFx0ICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcGFnZXMgYmFja2luZ1xubW0vaHVnZV9tZW1vcnkuYzozMjYwOlx0XHQgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZFxubW0vaHVnZV9tZW1vcnkuYy0zMjYxLVx0XHQgKiBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb3BhZ2F0ZWQgdmlhIGRldmljZSBwcml2YXRlXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zMjg3LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozMjg4OnN0YXRpYyB2b2lkIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9odWdlX21lbW9yeS5jLTMyODktXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzMwMS1cdGlmIChybWFwcGVkKVxubW0vaHVnZV9tZW1vcnkuYzozMzAyOlx0XHRzdGF0ZS1cdTAwM2VmcmVlemUgPSBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoc3RhdGUsIHZtYSwgaGFkZHIpO1xubW0vaHVnZV9tZW1vcnkuYy0zMzAzLVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MzM3MT1zdGF0aWMgdm9pZCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzQxOC1cbm1tL2h1Z2VfbWVtb3J5LmM6MzQxOTpcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG5tbS9odWdlX21lbW9yeS5jLTM0MjAtfVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MzQyMj1zdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTM0MzktXHRcdCAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlXG5tbS9odWdlX21lbW9yeS5jOjM0NDA6XHRcdCAqIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLlxubW0vaHVnZV9tZW1vcnkuYy0zNDQxLVx0XHQgKi9cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM0NTEtXG5tbS9odWdlX21lbW9yeS5jOjM0NTI6XHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXHUwMDI2c3RhdGUpO1xubW0vaHVnZV9tZW1vcnkuYy0zNDUzLX1cbm1tL2h1Z2VfbWVtb3J5LmMtMzQ1NC1cbm1tL2h1Z2VfbWVtb3J5LmM6MzQ1NTpzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbm1tL2h1Z2VfbWVtb3J5LmMtMzQ1Ni1cdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zNDczLVx0ICogbW11X25vdGlmaWVyX2FyY2hfaW52YWxpZGF0ZV9zZWNvbmRhcnlfdGxicygpIHNlZSBjb21tZW50cyBiZWxvd1xubW0vaHVnZV9tZW1vcnkuYzozNDc0Olx0ICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/XG5tbS9odWdlX21lbW9yeS5jLTM0NzUtXHQgKlxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzUwNy1cbm1tL2h1Z2VfbWVtb3J5LmM6MzUwODp2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxubW0vaHVnZV9tZW1vcnkuYy0zNTA5LVx0XHRcdCAgIHBtZF90ICpwbWQsIGJvb2wgZnJlZXplKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzUxMi1cdGlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSB8fCBwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkpXG5tbS9odWdlX21lbW9yeS5jOjM1MTM6XHRcdF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xubW0vaHVnZV9tZW1vcnkuYy0zNTE0LX1cbm1tL2h1Z2VfbWVtb3J5LmMtMzUxNS1cbm1tL2h1Z2VfbWVtb3J5LmM6MzUxNjp2b2lkIF9fc3BsaXRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG5tbS9odWdlX21lbW9yeS5jLTM1MTctXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgYm9vbCBmcmVlemUpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zNTI2LVx0cHRsID0gcG1kX2xvY2sodm1hLVx1MDAzZXZtX21tLCBwbWQpO1xubW0vaHVnZV9tZW1vcnkuYzozNTI3Olx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcmFuZ2Uuc3RhcnQsIHBtZCwgZnJlZXplKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMzUyOC1cdHNwaW5fdW5sb2NrKHB0bCk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zNTMxLVxubW0vaHVnZV9tZW1vcnkuYzozNTMyOnZvaWQgc3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxubW0vaHVnZV9tZW1vcnkuYy0zNTMzLVx0XHRib29sIGZyZWV6ZSlcbi0tXG5tbS9odWdlX21lbW9yeS5jLTM1MzktXG5tbS9odWdlX21lbW9yeS5jOjM1NDA6XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xubW0vaHVnZV9tZW1vcnkuYy0zNTQxLX1cbm1tL2h1Z2VfbWVtb3J5LmMtMzU0Mi1cbm1tL2h1Z2VfbWVtb3J5LmM6MzU0MzpzdGF0aWMgaW5saW5lIHZvaWQgc3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXG5tbS9odWdlX21lbW9yeS5jLTM1NDQte1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzU1MS1cdFx0XHQgQUxJR04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKSlcbm1tL2h1Z2VfbWVtb3J5LmM6MzU1MjpcdFx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyh2bWEsIGFkZHJlc3MsIGZhbHNlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMzU1My19XG4tLVxubW0vaHVnZV9tZW1vcnkuYz0zNTU1PXZvaWQgdm1hX2FkanVzdF90cmFuc19odWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzU2MC1cdC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgc3RhcnQgZmlyc3QuICovXG5tbS9odWdlX21lbW9yeS5jOjM1NjE6XHRzcGxpdF9odWdlX3BtZF9pZl9uZWVkZWQodm1hLCBzdGFydCk7XG5tbS9odWdlX21lbW9yeS5jLTM1NjItXG5tbS9odWdlX21lbW9yeS5jLTM1NjMtXHQvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IGVuZCBuZXh0LiAqL1xubW0vaHVnZV9tZW1vcnkuYzozNTY0Olx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHZtYSwgZW5kKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMzU2NS1cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM1NjctXHRpZiAobmV4dClcbm1tL2h1Z2VfbWVtb3J5LmM6MzU2ODpcdFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKG5leHQsIGVuZCk7XG5tbS9odWdlX21lbW9yeS5jLTM1NjktfVxuLS1cbm1tL21lbW9yeS5jPTIxMjM9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHphcF9wbWRfcmFuZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYixcbi0tXG5tbS9tZW1vcnkuYy0yMTM1LVx0XHRcdGlmIChuZXh0IC0gYWRkciAhPSBIUEFHRV9QTURfU0laRSlcbm1tL21lbW9yeS5jOjIxMzY6XHRcdFx0XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyLCBmYWxzZSk7XG5tbS9tZW1vcnkuYy0yMTM3LVx0XHRcdGVsc2UgaWYgKHphcF9odWdlX3BtZCh0bGIsIHZtYSwgcG1kLCBhZGRyKSkge1xuLS1cbm1tL21lbW9yeS5jPTYzOTA9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHdwX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTY0MTUtXHQvKiBDT1cgb3Igd3JpdGUtbm90aWZ5IGhhbmRsZWQgb24gcHRlIGxldmVsOiBzcGxpdCBwbWQuICovXG5tbS9tZW1vcnkuYzo2NDE2Olx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHZtZi1cdTAwM2VwbWQsIHZtZi1cdTAwM2VhZGRyZXNzLCBmYWxzZSk7XG5tbS9tZW1vcnkuYy02NDE3LVxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmM9OTEyPXN0YXRpYyBpbnQgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IG1pZ3JhdGVfdm1hICptaWdyYXRlLFxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTIxLVx0Lypcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTIyOlx0ICogdGFrZSBhIHJlZmVyZW5jZSwgc2luY2Ugc3BsaXRfaHVnZV9wbWRfYWRkcmVzcygpIHdpdGggZnJlZXplID0gdHJ1ZVxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjMtXHQgKiBkcm9wcyBhIHJlZmVyZW5jZSBhdCB0aGUgZW5kLlxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI1LVx0Zm9saW9fZ2V0KGZvbGlvKTtcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI2Olx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhtaWdyYXRlLVx1MDAzZXZtYSwgYWRkciwgdHJ1ZSk7XG5tbS9taWdyYXRlX2RldmljZS5jLTkyNy1cdHJldCA9IGZvbGlvX3NwbGl0X3VubWFwcGVkKGZvbGlvLCAwKTtcbi0tXG5tbS9taWdyYXRlX2RldmljZS5jPTk3Nj1zdGF0aWMgdm9pZCBtaWdyYXRlX3ZtYV9pbnNlcnRfcGFnZShzdHJ1Y3QgbWlncmF0ZV92bWEgKm1pZ3JhdGUsXG4tLVxubW0vbWlncmF0ZV9kZXZpY2UuYy0xMDIxLVx0XHRcdFx0Z290byBhYm9ydDtcbm1tL21pZ3JhdGVfZGV2aWNlLmM6MTAyMjpcdFx0XHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZHAsIGFkZHIpO1xubW0vbWlncmF0ZV9kZXZpY2UuYy0xMDIzLVx0XHR9IGVsc2UgaWYgKHBtZF9sZWFmKCpwbWRwKSlcbi0tXG5tbS9tcHJvdGVjdC5jPTUwND1zdGF0aWMgaW5saW5lIGxvbmcgY2hhbmdlX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLFxuLS1cbm1tL21wcm90ZWN0LmMtNTMyLVx0XHRcdCAgICBwZ3RhYmxlX3NwbGl0X25lZWRlZCh2bWEsIGNwX2ZsYWdzKSkge1xubW0vbXByb3RlY3QuYzo1MzM6XHRcdFx0XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyLCBmYWxzZSk7XG5tbS9tcHJvdGVjdC5jLTUzNC1cdFx0XHRcdC8qXG4tLVxubW0vbXJlbWFwLmM9ODA0PXVuc2lnbmVkIGxvbmcgbW92ZV9wYWdlX3RhYmxlcyhzdHJ1Y3QgcGFnZXRhYmxlX21vdmVfY29udHJvbCAqcG1jKVxuLS1cbm1tL21yZW1hcC5jLTg2Ni1cdFx0XHRcdGNvbnRpbnVlO1xubW0vbXJlbWFwLmM6ODY3Olx0XHRcdHNwbGl0X2h1Z2VfcG1kKHBtYy1cdTAwM2VvbGQsIG9sZF9wbWQsIHBtYy1cdTAwM2VvbGRfYWRkcik7XG5tbS9tcmVtYXAuYy04NjgtXHRcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9NT1ZFX1BNRCkgXHUwMDI2XHUwMDI2XG4tLVxubW0vcGFnZXdhbGsuYz05Nj1zdGF0aWMgaW50IHdhbGtfcG1kX3JhbmdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXG4tLVxubW0vcGFnZXdhbGsuYy0xNjctXHRcdGlmICh3YWxrLVx1MDAzZXZtYSlcbm1tL3BhZ2V3YWxrLmM6MTY4Olx0XHRcdHNwbGl0X2h1Z2VfcG1kKHdhbGstXHUwMDNldm1hLCBwbWQsIGFkZHIpO1xubW0vcGFnZXdhbGsuYy0xNjktXHRcdGVsc2UgaWYgKHBtZF9sZWFmKCpwbWQpIHx8ICFwbWRfcHJlc2VudCgqcG1kKSlcbi0tXG5tbS9ybWFwLmM9MjIwMT1zdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL3JtYXAuYy0yMjg5LVx0XHRcdFx0ICovXG5tbS9ybWFwLmM6MjI5MDpcdFx0XHRcdHNwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHB2bXcuYWRkcmVzcyxcbm1tL3JtYXAuYy0yMjkxLVx0XHRcdFx0XHRcdCAgICAgIHB2bXcucG1kLCBmYWxzZSk7XG4tLVxubW0vcm1hcC5jPTI0NjU9c3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL3JtYXAuYy0yNTE4LVx0XHRcdFx0Lypcbm1tL3JtYXAuYzoyNTE5Olx0XHRcdFx0ICogc3BsaXRfaHVnZV9wbWRfbG9ja2VkKCkgbWlnaHQgbGVhdmUgdGhlXG5tbS9ybWFwLmMtMjUyMC1cdFx0XHRcdCAqIGZvbGlvIG1hcHBlZCB0aHJvdWdoIFBURXMuIFJldHJ5IHRoZSB3YWxrXG4tLVxubW0vcm1hcC5jLTI1MjMtXHRcdFx0XHQgKi9cbm1tL3JtYXAuYzoyNTI0Olx0XHRcdFx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcHZtdy5hZGRyZXNzLFxubW0vcm1hcC5jLTI1MjUtXHRcdFx0XHRcdFx0ICAgICAgcHZtdy5wbWQsIHRydWUpO1xuLS1cbm1tL3VzZXJmYXVsdGZkLmM9MjAyMD1zdGF0aWMgc3NpemVfdCBtb3ZlX3BhZ2VzKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBkc3Rfc3RhcnQsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0yMTI2LVx0XHRcdFx0c3Bpbl91bmxvY2socHRsKTtcbm1tL3VzZXJmYXVsdGZkLmM6MjEyNzpcdFx0XHRcdHNwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIHNyY19hZGRyKTtcbm1tL3VzZXJmYXVsdGZkLmMtMjEyOC1cdFx0XHRcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU3MQoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgSHVnZSBQYWdlcyBhbmQgU3BsaXQgUE1EcyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBLY29uZmlnIG9wdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgKFRIUCkgYW5kIHNwbGl0IGh1Z2UgcGFnZSBQTURzLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBkaXZlIGludG8gdGhlIGNvcmUgZGlyZWN0b3JpZXMuIEkga25vdyB0aGVzZSBjb25maWd1cmF0aW9ucyBhcmUgb2Z0ZW4gZGVmaW5lZCBpbiBNYWtlZmlsZXMgYW5kIEtjb25maWdzLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgbG9va2luZyBpbnRvIGBtbS9NYWtlZmlsZWAgYW5kIHRoZW4gYG1tL0tjb25maWdgLiBUaG9zZSBhcmUgdHlwaWNhbGx5IHdoZXJlIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgZGVwZW5kZW5jaWVzIGFyZSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtLCBzbyBpdCYjMzk7cyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcy4gSSYjMzk7bSBhc3N1bWluZyB0aGF0IHRoZSByZWxldmFudCBvcHRpb25zIHdpbGwgYmUgdXNlZCBpbiBidWlsZCBsb2dpYyBhbmQgbWF5YmUgZXZlbiB3aXRoaW4gYCNpZmRlZmAgc3RhdGVtZW50cyBpbnNpZGUgYGh1Z2VfbWVtb3J5LmNgIGl0c2VsZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodWdlX21lbW9yeVxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMTk6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5MTIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjoKCioqS2NvbmZpZyBEaXZlIGZvciBUSFAqKgoKT2theSwgc28gSSBuZWVkIHRvIHF1aWNrbHkgc2VlIHdoZXJlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZGVmaW5lZCBpbiB0aGUgS2NvbmZpZyBoaWVyYXJjaHkuIEkmIzM5O20gZ29pbmcgc3RyYWlnaHQgdG8gYG1tL0tjb25maWdgLCB0aGF0JiMzOTtzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIHN0YXJ0IGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJdCYjMzk7cyB0aGUgbW9zdCBsb2dpY2FsIGxvY2F0aW9uIGZvciBhIHNldHRpbmcgcmVsYXRlZCB0byBodWdlIHBhZ2VzLCBnaXZlbiB0aGF0IGBtbWAgaXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGRlZmluZWQgaW4gdGhlcmUgZm9yIHRoaXMgcGFydGljdWxhciBmZWF0dXJlLiBIb3BlZnVsbHkgaXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkIGFuZCBJIGNhbiBxdWlja2x5IGdyYXNwIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgzMj1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTgzNC1cbm1tL0tjb25maWc6ODM1Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODM2LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04NTM9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04NTgtXG5tbS9LY29uZmlnOjg1OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcbm1tL0tjb25maWctODYwLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctODY1LVxubW0vS2NvbmZpZzo4NjY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxubW0vS2NvbmZpZy04NjctXHRcdGJvb2wgXCYjMzQ7bWFkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODc0LVxubW0vS2NvbmZpZzo4NzU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcbm1tL0tjb25maWctODc2LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04ODI9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04OTEtXG5tbS9LY29uZmlnOjg5MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5My1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTAxLVxubW0vS2NvbmZpZzo5MDI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTAzLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTA5LVxubW0vS2NvbmZpZzo5MTA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05MTEtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkxNy1cbm1tL0tjb25maWc6OTE4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTkxOS1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTkyNz1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTkzNi1cbm1tL0tjb25maWc6OTM3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTM4LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NDUtXG5tbS9LY29uZmlnOjk0NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05NDctXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NTMtXG5tbS9LY29uZmlnOjk1NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTk1NS1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTYxLVxubW0vS2NvbmZpZzo5NjI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTYzLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODEzCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKkludmVzdGlnYXRpbmcgdGhlIFRSQU5TUEFSRU5UX0hVR0VQQUdFIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGZvciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBqdW1wIHJpZ2h0IGludG8gYG1tL0tjb25maWdgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgODM1LiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O2QgZXhwZWN0IHRvIGZpbmQgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgY29udHJvbHMgd2hldGhlciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGVuYWJsZWQuIEl0JiMzOTtzIGEgcHJldHR5IHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGF0IGtpbmQgb2YgZGV0YWlsIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFRpbWUgdG8gZGlnIGluIGFuZCBzZWUgd2hhdCBvdGhlciBvcHRpb25zIHRoaXMgcmVsaWVzIG9uLCBhbmQgd2hhdCB0aGUgaW1wbGljYXRpb25zIGFyZSBmb3IgbXkgYXJlYSBvZiBleHBlcnRpc2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODMwOlx0XHQgIG1lbW9yeSBjb25zdHJhaW5lZC5cbiA4MzE6XHRcbiA4MzI6XHRjb25maWcgTU1fSURcbiA4MzM6XHRcdGRlZl9ib29sIG5cbiA4MzQ6XHRcbiA4MzU6XHRtZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG4gODM2Olx0XHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbiA4Mzc6XHRcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVFxuIDgzODpcdFx0c2VsZWN0IENPTVBBQ1RJT05cbiA4Mzk6XHRcdHNlbGVjdCBYQVJSQVlfTVVMVElcbiA4NDA6XHRcdHNlbGVjdCBNTV9JRFxuIDg0MTpcdFx0aGVscFxuIDg0MjpcdFx0ICBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdXNlIGh1Z2UgcGFnZXMgYW5kXG4gODQzOlx0XHQgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS5cbiA4NDQ6XHRcdCAgVGhpcyBmZWF0dXJlIGNhbiBpbXByb3ZlIGNvbXB1dGluZyBwZXJmb3JtYW5jZSB0byBjZXJ0YWluXG4gODQ1Olx0XHQgIGFwcGxpY2F0aW9ucyBieSBzcGVlZGluZyB1cCBwYWdlIGZhdWx0cyBkdXJpbmcgbWVtb3J5XG4gODQ2Olx0XHQgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmdcbiA4NDc6XHRcdCAgdXAgdGhlIHBhZ2V0YWJsZSB3YWxraW5nLlxuIDg0ODpcdFxuIDg0OTpcdFx0ICBJZiBtZW1vcnkgY29uc3RyYWluZWQgb24gZW1iZWRkZWQsIHlvdSBtYXkgd2FudCB0byBzYXkgTi5cbiA4NTA6XHRcbiA4NTE6XHRpZiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxuIDg1MjpcdFxuIDg1MzpcdGNob2ljZVxuIDg1NDpcdFx0cHJvbXB0IFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQgc3lzZnMgZGVmYXVsdHNcJiMzNDtcbiA4NTU6XHRcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG4gODU2Olx0XHRoZWxwXG4gODU3Olx0XHQgIFNlbGVjdHMgdGhlIHN5c2ZzIGRlZmF1bHRzIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0LlxuIDg1ODpcdFxuIDg1OTpcdFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xuIDg2MDpcdFx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuIDg2MTpcdFx0aGVscFxuIDg2MjpcdFx0ICBFbmFibGluZyBUcmFuc3BhcmVudCBIdWdlcGFnZSBhbHdheXMsIGNhbiBpbmNyZWFzZSB0aGVcbiA4NjM6XHRcdCAgbWVtb3J5IGZvb3RwcmludCBvZiBhcHBsaWNhdGlvbnMgd2l0aG91dCBhIGd1YXJhbnRlZWRcbiA4NjQ6XHRcdCAgYmVuZWZpdCBidXQgaXQgd2lsbCB3b3JrIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBhcHBsaWNhdGlvbnMuXG4gODY1Olx0XG4gODY2Olx0XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxuIDg2NzpcdFx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbiA4Njg6XHRcdGhlbHBcbiA4Njk6XHRcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgbWFkdmlzZSwgd2lsbCBvbmx5IHByb3ZpZGUgYVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTU4MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE3NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgaHVnZSBwYWdlIHNwbGl0dGluZyBmdW5jdGlvbmFsaXR5LiBGaXJzdCwgSSYjMzk7bGwgdGFrZSBhIGxvb2sgYXQgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgbW9kaWZpZWQg4oCTIHRoZSBvbmVzIHRoYXQgYXJlIG1vc3QgbGlrZWx5IGF0IHRoZSBoZWFydCBvZiB0aGUgY2hhbmdlcy4gVGhlIG9uZXMgdGhhdCBpbW1lZGlhdGVseSBzdGFuZCBvdXQgYXJlOiBgX19zcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfaHVnZV9wbWRfdG9fcHRlc2AsIGB1bm1hcF9odWdlX3BtZF9lbnRyeWAsIGBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZmAsIGFuZCBgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXRgLiBUaGlzIGdpdmVzIG1lIGEgZ29vZCBzdGFydGluZyBwb2ludC4KCk5vdywgSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgKnVzZWQqLiBTbywgSSYjMzk7bGwgaWRlbnRpZnkgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBlbnRyeXBvaW50cyBvciBub24tc3RhdGljIGZ1bmN0aW9ucyB3aXRoaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIHRoYXQgY2FsbCB0aGVzZSBrZXkgZnVuY3Rpb25zLiBUaGlzIHdpbGwgaGVscCBtZSB0cmFjZSB0aGUgY29udHJvbCBmbG93IGFuZCBzZWUgaG93IHRoZSBzcGxpdHRpbmcgaXMgaW5pdGlhdGVkIGFuZCBvcmNoZXN0cmF0ZWQuCgpGaW5hbGx5LCBJJiMzOTtsbCBob21lIGluIG9uIGEgcmVsZXZhbnQgc2VjdGlvbiBvZiB0aGUgY29kZS4gTGV0JiMzOTtzIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgY29kZSBhcm91bmQgbGluZXMgMzUwMC0zNjAwIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBhcmVhIHRvIGNvbnRhaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBzcGxpdHRpbmctcmVsYXRlZCBmdW5jdGlvbnMsIG9yIHBlcmhhcHMgdGhlIGNvcmUgbG9naWMgdGhhdCBvcmNoZXN0cmF0ZXMgdGhlIHNwbGl0dGluZyBwcm9jZXNzLiBJJiMzOTtsbCByZWFkIHRocm91Z2ggdGhpcyBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSBjYW4gZ2xlYW4uIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBncmFzcCBvbiB3aGF0JiMzOTtzIGdvaW5nIG9uIGFuZCB3aGVyZSB0aGUgY2hhbmdlcyBtaWdodCBiZSBsb2NhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDc1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzM1MDA6XHRcbjM1MDE6XHRcdGlmIChpc19wcmVzZW50KVxuMzUwMjpcdFx0XHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XG4zNTAzOlx0XHRlbHNlXG4zNTA0Olx0XHRcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXG4zNTA1Olx0XHRcdFx0XHRcdCAgIGZyZWV6ZSk7XG4zNTA2Olx0fVxuMzUwNzpcdFxuMzUwODpcdHZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4zNTA5Olx0XHRcdFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXG4zNTEwOlx0e1xuMzUxMTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFJU19BTElHTkVEKGFkZHJlc3MsIEhQQUdFX1BNRF9TSVpFKSk7XG4zNTEyOlx0XHRpZiAocG1kX3RyYW5zX2h1Z2UoKnBtZCkgfHwgcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpKVxuMzUxMzpcdFx0XHRfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHBtZCwgYWRkcmVzcywgZnJlZXplKTtcbjM1MTQ6XHR9XG4zNTE1Olx0XG4zNTE2Olx0dm9pZCBfX3NwbGl0X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuMzUxNzpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGJvb2wgZnJlZXplKVxuMzUxODpcdHtcbjM1MTk6XHRcdHNwaW5sb2NrX3QgKnB0bDtcbjM1MjA6XHRcdHN0cnVjdCBtbXVfbm90aWZpZXJfcmFuZ2UgcmFuZ2U7XG4zNTIxOlx0XG4zNTIyOlx0XHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuMzUyMzpcdFx0XHRcdFx0YWRkcmVzcyBcdTAwMjYgSFBBR0VfUE1EX01BU0ssXG4zNTI0Olx0XHRcdFx0XHQoYWRkcmVzcyBcdTAwMjYgSFBBR0VfUE1EX01BU0spICYjNDM7IEhQQUdFX1BNRF9TSVpFKTtcbjM1MjU6XHRcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbjM1MjY6XHRcdHB0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbjM1Mjc6XHRcdHNwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHJhbmdlLnN0YXJ0LCBwbWQsIGZyZWV6ZSk7XG4zNTI4Olx0XHRzcGluX3VubG9jayhwdGwpO1xuMzUyOTpcdFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbjM1MzA6XHR9XG4zNTMxOlx0XG4zNTMyOlx0dm9pZCBzcGxpdF9odWdlX3BtZF9hZGRyZXNzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4zNTMzOlx0XHRcdGJvb2wgZnJlZXplKVxuMzUzNDpcdHtcbjM1MzU6XHRcdHBtZF90ICpwbWQgPSBtbV9maW5kX3BtZCh2bWEtXHUwMDNldm1fbW0sIGFkZHJlc3MpO1xuMzUzNjpcdFxuMzUzNzpcdFx0aWYgKCFwbWQpXG4zNTM4Olx0XHRcdHJldHVybjtcbjM1Mzk6XHRcbjM1NDA6XHRcdF9fc3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MsIGZyZWV6ZSk7XG4zNTQxOlx0fVxuMzU0MjpcdFxuMzU0MzpcdHN0YXRpYyBpbmxpbmUgdm9pZCBzcGxpdF9odWdlX3BtZF9pZl9uZWVkZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbjM1NDQ6XHR7XG4zNTQ1Olx0XHQvKlxuMzU0NjpcdFx0ICogSWYgdGhlIG5ldyBhZGRyZXNzIGlzbiYjMzk7dCBocGFnZSBhbGlnbmVkIGFuZCBpdCBjb3VsZCBwcmV2aW91c2x5XG4zNTQ3Olx0XHQgKiBjb250YWluIGFuIGh1Z2VwYWdlOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IGFuIGh1Z2UgcG1kLlxuMzU0ODpcdFx0ICovXG4zNTQ5Olx0XHRpZiAoIUlTX0FMSUdORUQoYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpIFx1MDAyNlx1MDAyNlxuMzU1MDpcdFx0ICAgIHJhbmdlX2luX3ZtYSh2bWEsIEFMSUdOX0RPV04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpLFxuMzU1MTpcdFx0XHRcdCBBTElHTihhZGRyZXNzLCBIUEFHRV9QTURfU0laRSkpKVxuMzU1MjpcdFx0XHRzcGxpdF9odWdlX3BtZF9hZGRyZXNzKHZtYSwgYWRkcmVzcywgZmFsc2UpO1xuMzU1MzpcdH1cbjM1NTQ6XHRcbjM1NTU6XHR2b2lkIHZtYV9hZGp1c3RfdHJhbnNfaHVnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbjM1NTY6XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuMzU1NzpcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuMzU1ODpcdFx0XHRcdCAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbmV4dClcbjM1NTk6XHR7XG4zNTYwOlx0XHQvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IHN0YXJ0IGZpcnN0LiAqL1xuMzU2MTpcdFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHZtYSwgc3RhcnQpO1xuMzU2MjpcdFxuMzU2MzpcdFx0LyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdCBlbmQgbmV4dC4gKi9cbjM1NjQ6XHRcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIGVuZCk7XG4zNTY1Olx0XG4zNTY2Olx0XHQvKiBJZiB3ZSYjMzk7cmUgaW5jcmVtZW50aW5nIG5leHQtXHUwMDNldm1fc3RhcnQsIHdlIG1pZ2h0IG5lZWQgdG8gc3BsaXQgaXQuICovXG4zNTY3Olx0XHRpZiAobmV4dClcbjM1Njg6XHRcdFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKG5leHQsIGVuZCk7XG4zNTY5Olx0fVxuMzU3MDpcdFxuMzU3MTpcdHN0YXRpYyB2b2lkIHVubWFwX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4zNTcyOlx0e1xuMzU3MzpcdFx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gVFRVX1JNQVBfTE9DS0VEIHwgVFRVX1NZTkMgfFxuMzU3NDpcdFx0XHRUVFVfQkFUQ0hfRkxVU0g7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NDM0CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgRnVuY3Rpb25zKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgbGFuZHNjYXBlIG9mIGh1Z2UgcGFnZSBzcGxpdHRpbmcgZnVuY3Rpb25zLiBNeSBpbml0aWFsIGZvY3VzIGlzIG9uIHRoZSBleGlzdGluZyBjYWxsZXJzIGFuZCBzeW1ib2xzIHJlbGF0ZWQgdG8gdGhpcy4gT2theSwgc28gSSYjMzk7dmUgZ290IGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AgaW4gbWluZCwgdGhvc2UgYXJlIHRoZSBmaXJzdCBjYW5kaWRhdGVzLiBUaGUgbmFtZSBgc3BsaXRfaHVnZV9wbWRgIGl0c2VsZiBmZWVscyBsaWtlIGl0IG1pZ2h0IGJlIGEgd3JhcHBlciwgYW4gaW5saW5lZCBmdW5jdGlvbiwgb3Igc29tZXRoaW5nIHNpbWlsYXIgdG8gb3RoZXIgY2FsbHMuIFRpbWUgdG8gYmUgdGhvcm91Z2ggYW5kIGNoZWNrIGJvdGggZm9yIHRoZSBleGFjdCBzaWduYXR1cmUgYHZvaWQgc3BsaXRfaHVnZV9wbWRgIGFuZCB0aGUgdXNlIG9mIHRoZSBtYWNybyBgI2RlZmluZSBzcGxpdF9odWdlX3BtZGAuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCB2aWV3IG9mIGl0cyByb2xlIGFuZCB1c2FnZS4gR290dGEgY292ZXIgYWxsIHRoZSBiYXNlcyB0byBhdm9pZCBtaXNzaW5nIGFueSBoaWRkZW4gZGV0YWlscyBpbiB0aGUgc3BsaXQgbG9naWMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2RlZmluZSBzcGxpdF9odWdlX3BtZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ0Nj1zdGF0aWMgaW5saW5lIGJvb2wgcG1kX2lzX2h1Z2UocG1kX3QgcG1kKVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQ2MC1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQ2MTojZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVx0XHRcdFx0XFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQ2Mi1cdGRvIHtcdFx0XHRcdFx0XHRcdFx0XFxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD02ODc9c3RhdGljIGlubGluZSB2b2lkIGRlZmVycmVkX3NwbGl0X2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGJvb2wgcGFydGlhbGx5X21hcHBlZClcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02OTAtXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2OTE6I2RlZmluZSBzcGxpdF9odWdlX3BtZChfX3ZtYSwgX19wbWQsIF9fYWRkcmVzcylcdFxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02OTItXHRkbyB7IH0gd2hpbGUgKDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3OTYzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgYHNwbGl0X2h1Z2VfcG1kYCBtYWNybywgZnJvbSBhIGhpZ2gtbGV2ZWwgcGVyc3BlY3RpdmUsIGFzIHRob3VnaCB0aGVzZSB3ZXJlIG15IG93biB0aG91Z2h0czoKCioqRGlzc2VjdGluZyB0aGUgYHNwbGl0X2h1Z2VfcG1kYCBNYWNybyoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgYHNwbGl0X2h1Z2VfcG1kYCBtYWNyby4gRnJvbSB0aGUgbmFtZSBpdHNlbGYsIEkmIzM5O20gZXhwZWN0aW5nIGl0IGRlYWxzIHdpdGggYnJlYWtpbmcgZG93biBhIGh1Z2UgcGFnZSDigJMgbGlrZWx5IGEgbGFyZ2UgcGh5c2ljYWwgbWVtb3J5IHBhZ2UsIGxpa2UgYSAyTUIgb3IgMUdCIHBhZ2Ug4oCTIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLCBwcm9iYWJseSA0S0IgcGFnZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBtZWNoYW5pY3MgYmVoaW5kIHRoaXM6IGhvdyBpdCBoYXBwZW5zLCB3aHkgaXQmIzM5O3MgbmVjZXNzYXJ5LCBhbmQgd2hhdCBjb25zaWRlcmF0aW9ucyBjb21lIGludG8gcGxheS4gSSYjMzk7bGwgbmVlZCB0byB0aGluayBhYm91dCB0aGluZ3MgbGlrZTogdGhlIHN0YXRlIG9mIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgKFBURXMpIGludm9sdmVkIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNwbGl0LCB0aGUgaW1wbGljYXRpb25zIGZvciB0aGUgcGFnZSB0YWJsZXMsIGFuZCBhbnkgcG90ZW50aWFsIGxvY2tpbmcgb3Igc3luY2hyb25pemF0aW9uIGludm9sdmVkIHRvIGVuc3VyZSBhdG9taWNpdHkgYW5kIGNvcnJlY3RuZXNzIGR1cmluZyB0aGUgb3BlcmF0aW9uLCBhbmQgZW5zdXJlIHRoaW5ncyBsaWtlIGNhY2hlIGNvaGVyZW5jeSBhcmUgbWFpbnRhaW5lZC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3Igd2hlcmUgdGhlIGN1cnJlbnQgaHVnZSBwYWdlIGlzIG1hcHBlZCBpbiB0aGUgcGFnZSB0YWJsZXMsIGFuZCBob3cgaXQgaXMgdXBkYXRlZCB0byBzaG93IHRoZXNlIG5ldyA0S0IgcGFnZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0NTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQ1NTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiA0NTY6XHRcdH1cbiA0NTc6XHRcbiA0NTg6XHRcdHJldHVybiBmYWxzZTtcbiA0NTk6XHR9XG4gNDYwOlx0XG4gNDYxOlx0I2RlZmluZSBzcGxpdF9odWdlX3BtZChfX3ZtYSwgX19wbWQsIF9fYWRkcmVzcylcdFx0XHRcdFxcXG4gNDYyOlx0XHRkbyB7XHRcdFx0XHRcdFx0XHRcdFxcXG4gNDYzOlx0XHRcdHBtZF90ICpfX19fcG1kID0gKF9fcG1kKTtcdFx0XHRcdFxcXG4gNDY0Olx0XHRcdGlmIChwbWRfaXNfaHVnZSgqX19fX3BtZCkpXHRcdFx0XHRcXFxuIDQ2NTpcdFx0XHRcdF9fc3BsaXRfaHVnZV9wbWQoX192bWEsIF9fcG1kLCBfX2FkZHJlc3MsXHRcXFxuIDQ2NjpcdFx0XHRcdFx0XHQgZmFsc2UpO1x0XHRcdFxcXG4gNDY3Olx0XHR9ICB3aGlsZSAoMClcbiA0Njg6XHRcbiA0Njk6XHR2b2lkIHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiA0NzA6XHRcdFx0Ym9vbCBmcmVlemUpO1xuIDQ3MTpcdFxuIDQ3MjpcdHZvaWQgX19zcGxpdF9odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZCxcbiA0NzM6XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzKTtcbiA0NzQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMTk6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg1NTcKCQkJCQkJCW91dHB1dDogMTY3CgkJCQkJCQl0aG91Z2h0czogMTAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldDogVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBTcGxpdHRpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgdGhlIHZpYWJpbGl0eSBvZiBmdXp6aW5nIHRoZSBUSFAgUE1EIHNwbGl0dGluZyBsb2dpYyB3aXRoaW4gdGhlIGtlcm5lbC4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgZnVuY3Rpb25zIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHkgaW52b2x2ZWQgaW4gUE1EIHNwbGl0dGluZy4gU3BlY2lmaWNhbGx5LCBJIHNlZSB0aHJlZSBub24tc3RhdGljIGZ1bmN0aW9uczogYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBfX3NwbGl0X2h1Z2VfcG1kYCwgYW5kIGBzcGxpdF9odWdlX3BtZF9hZGRyZXNzYC4gVGhlc2UgYXJlIG15IHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBpbnZlc3RpZ2F0aW9uLgoKTG9va2luZyBjbG9zZXIsIHRoZSBwYXRjaCB0b3VjaGVzIHNldmVyYWwgcmVsYXRlZCBmdW5jdGlvbnMuIGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAgYW5kIHZhcmlvdXMgc3RhdGljIGhlbHBlcnMgYXJlIG1vZGlmaWVkLiBUaGVzZSBpbmNsdWRlIGBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXBgLCBgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWZgLCBgc3BsaXRfaHVnZV9wbWRfdG9fcHRlc2AsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCwgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgYW5kIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAuIFRoZSBwYXR0ZXJuIGhlcmUgaXMgY2xlYXI6IGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGFuZCB0aGVuIHRoZSBvdGhlcnMgYXJlIHN0YXRpYyBoZWxwZXJzIGZvciB0aGlzLiBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBhbmQgdGhlIG90aGVycyBhcmUgY2FsbGVkIGJ5IHNldmVyYWwgb3RoZXIgZnVuY3Rpb25zLgoKSXMgdGhpcyB3b3J0aCB0aGUgZWZmb3J0PyBBYnNvbHV0ZWx5LiBUaGlzIGNvZGUgaXMgZnVuZGFtZW50YWwgdG8gaG93IFRIUHMgYXJlIGhhbmRsZWQuIFRoZSByZWZhY3RvcmluZyBhcHBlYXJzIHRvIHRvdWNoIGNvcmUgYXNwZWN0cyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgaW5jbHVkaW5nIHNwbGl0dGluZyBUSFBzIGludG8gc21hbGxlciBQVEVzLCBkZWFsaW5nIHdpdGggYW5vbnltb3VzIGZvbGlvcywgaGFuZGxpbmcgZmxhZ3MsIG1hbmFnaW5nIHRoZSByZXZlcnNlIG1hcCAocm1hcCksIGFuZCBhZGRyZXNzaW5nIHplcm8gUE1EIHNwbGl0dGluZy4gVGhpcyBjb2RlIGlzICpkaXJlY3RseSogZXhwb3NlZCB0byB1c2VyIHNwYWNlLiBJdCBpcyBpbnZvbHZlZCBpbiBjcml0aWNhbCBvcGVyYXRpb25zIGxpa2UgYG1hZHZpc2VgLCBWTUEgc3BsaXR0aW5nLCBgdW5tYXBgLCBgbXByb3RlY3RgLCBwYWdlIG1pZ3JhdGlvbiwgY29weS1vbi13cml0ZSAoQ09XKSwgYW5kIGB1c2VyZmF1bHRmZGAuIEFueSBmbGF3IGhlcmUgaGFzIHRoZSBwb3RlbnRpYWwgdG8gY2F1c2UgY3JpdGljYWwgaXNzdWVzOiBtZW1vcnkgY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUgY29uZGl0aW9ucywgVExCIHNob290ZG93biBwcm9ibGVtcywgZGF0YSBsb3NzLCBvciBldmVuIGtlcm5lbCBwYW5pY3MuIEhpZ2ggdmFsdWUuCgpOb3csIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbnMuIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGVzc2VudGlhbCwgb2J2aW91c2x5LiBEaWdnaW5nIGRlZXBlciwgaXQgZGVwZW5kcyBvbiBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgZXhjbHVkZXMgYFBSRUVNUFRfUlRgLiBJdCBhbHNvIHNlbGVjdHMgYENPTVBBQ1RJT05gLCBgWEFSUkFZX01VTFRJYCwgYW5kIGBNTV9JRGAuIEkgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBjb25maWdzIGZvciBkZXZpY2UtcHJpdmF0ZSBUSFBzLCBtaWdyYXRpb24sIG9yIGB1c2VyZmF1bHRmZGAuIEkgY29uZmlybSB0aGF0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQ09ORklHX0RFVklDRV9QUklWQVRFYCwgYW5kIGBDT05GSUdfVVNFUkZBVUxURkRgIGNvdWxkIGNvbWUgaW50byBwbGF5IGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgYmVpbmcgZXhlcmNpc2VkLiBgQ09ORklHX01JR1JBVElPTmAgaXMgdHlwaWNhbGx5IHNlbGVjdGVkIGluIGNvbmp1bmN0aW9uIHdpdGggVEhQL2NvbXBhY3Rpb24vTlVNQSwgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBhIGNvbXBsZXRlIGZ1enplciBjb25maWd1cmF0aW9uLiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHRoZSBwcmltYXJ5LCBidXQgdGhvc2Ugb3RoZXIgdHdvIGFyZSBwb3RlbnRpYWxseSBpbXBvcnRhbnQuCgpSZWdhcmRpbmcgdGhlICYjMzQ7Rm9jdXNTeW1ib2xzLCYjMzQ7IEkgbmVlZCB0byBjb25maXJtIHRoZXNlIGFyZW4mIzM5O3Qgc3RhdGljIG9yIGlubGluZWQuIFRoZSBrZXkgc3ltYm9scyBhcmUgYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBfX3NwbGl0X2h1Z2VfcG1kYCwgYW5kIGBzcGxpdF9odWdlX3BtZF9hZGRyZXNzYC4gSSBzZWUgdGhhdCBgX19zcGxpdF9odWdlX3BtZF9sb2NrZWRgICppcyogc3RhdGljIChhIGhlbHBlciksIHdoaWNoIGxlYXZlcyBtZSB3aXRoIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AgYXMgdGhlIHB1YmxpYyBBUElzIHRvIHRhcmdldC4KCkluIHN1bW1hcnksIHRoaXMgaXMgYSBjbGVhciAmIzM0O3llcyYjMzQ7IGZvciBmdXp6aW5nLiBXZSYjMzk7cmUgbG9va2luZyBhdCBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGV4cG9zZWQgdG8gdXNlciBzcGFjZSwgc28gdGhlIHBvdGVudGlhbCBmb3IgaW1wYWN0ZnVsIGZpbmRpbmdzIGlzIHZlcnkgaGlnaC4gVGhlIGZvY3VzIHNob3VsZCBiZSBvbiBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYF9fc3BsaXRfaHVnZV9wbWRgLCBhbmQgYHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NgLCB3aXRoIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQ09ORklHX0RFVklDRV9QUklWQVRFYCwgYW5kIGBDT05GSUdfVVNFUkZBVUxURkRgIGJlaW5nIHBvdGVudGlhbGx5IHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7REVWSUNFX1BSSVZBVEUmIzM0OywKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzcGxpdF9odWdlX3BtZF9sb2NrZWQmIzM0OywKICAgICYjMzQ7X19zcGxpdF9odWdlX3BtZCYjMzQ7LAogICAgJiMzNDtzcGxpdF9odWdlX3BtZF9hZGRyZXNzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBQTUQgc3BsaXQgbG9naWMgaW4gbW0vaHVnZV9tZW1vcnkuYywgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgcHJlc2VudCB2cyBub24tcHJlc2VudCAobWlncmF0aW9uLCBkZXZpY2UtcHJpdmF0ZSkgaHVnZSBQTURzIGFuZCByZW9yZ2FuaXppbmcgcm1hcCBjb252ZXJzaW9uIGFuZCB1bm1hcHBpbmcgbG9naWMuIFRoaXMgY29yZSBNTSBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSB2aWEgdXNlciBhY3Rpb25zIChtYWR2aXNlLCBtcHJvdGVjdCwgcGFnZSBtaWdyYXRpb24sIGV0Yy4pIGFuZCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtERVZJQ0VfUFJJVkFURSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCYjMzQ7LAogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcG1kJiMzNDssCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2FkZHJlc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBzcGxpdCBsb2dpYyBpbiBtbS9odWdlX21lbW9yeS5jLCBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBwcmVzZW50IHZzIG5vbi1wcmVzZW50IChtaWdyYXRpb24sIGRldmljZS1wcml2YXRlKSBodWdlIFBNRHMgYW5kIHJlb3JnYW5pemluZyBybWFwIGNvbnZlcnNpb24gYW5kIHVubWFwcGluZyBsb2dpYy4gVGhpcyBjb3JlIE1NIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIHZpYSB1c2VyIGFjdGlvbnMgKG1hZHZpc2UsIG1wcm90ZWN0LCBwYWdlIG1pZ3JhdGlvbiwgZXRjLikgYW5kIGlzIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjQwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMTk6NDA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cblxuQWxsIGluc3RhbmNlcyBvZiAmIzM5O3N0cnVjdCBzcGxpdF9wbWRfc3RhdGUmIzM5OyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzN2FmZGEyZDEwOTRiMGE5ZGYyMDBjNTM1YmQ0YjAxMjQ3YTlmNzExCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMjggMTk6Mzk6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTMxMzksMTkzICYjNDM7MzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCi1zdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKLQkJdW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpCiYjNDM7LyoKJiM0MzsgKiBPbmx5IGEgaHVnZSB6ZXJvIFBNRCBpbiBhbiBhbm9ueW1vdXMgVk1BIGlzIHNwbGl0LCBpbnRvIGEgcGFnZSB0YWJsZSBvZgomIzQzOyAqIHNoYXJlZCB6ZXJvIHBhZ2UgbWFwcGluZ3MuIEFueSBvdGhlciBodWdlIHplcm8gUE1EIGlzIHNpbXBseSB1bm1hcHBlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgcG1kdmFsKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKLQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXBndGFibGVfdCBwZ3RhYmxlOwotCXBtZF90IG9sZF9wbWQsIF9wbWQ7Ci0JYm9vbCBzb2Z0X2RpcnR5LCB1ZmZkX3dwID0gZmFsc2UsIHlvdW5nID0gZmFsc2UsIHdyaXRlID0gZmFsc2U7Ci0JYm9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlwdGVfdCAqcHRlOwotCWludCBpOwotCi0JVk1fQlVHX09OKGhhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX2VuZCAmbHQ7IGhhZGRyICYjNDM7IEhQQUdFX1BNRF9TSVpFLCB2bWEpOwomIzQzOwlyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpICZhbXA7JmFtcDsgdm1hX2lzX2Fub255bW91cyh2bWEpOwomIzQzO30KIAotCVZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpICZhbXA7JmFtcDsgIXBtZF90cmFuc19odWdlKCpwbWQpKTsKJiM0MzsvKioKJiM0MzsgKiB1bm1hcF9odWdlX3BtZF9lbnRyeSgpIC0gVW5tYXAgYSBodWdlIFBNRCBlbnRyeSByYXRoZXIgdGhhbiBzcGxpdHRpbmcgaXQuCiYjNDM7ICogQHZtYTogVGhlIFZNQSBAcG1kIGJlbG9uZ3MgdG8uCiYjNDM7ICogQGhhZGRyOiBUaGUgUE1ELWFsaWduZWQgYWRkcmVzcyBAcG1kIG1hcHMuCiYjNDM7ICogQHBtZDogUG9pbnRlciB0byB0aGUgaHVnZSBQTUQgZW50cnkuCiYjNDM7ICogQGZvbGlvOiBUaGUgZm9saW8gQHBtZCBkZXNjcmliZXMsIG9yIE5VTEwgaWYgaXQgZGVzY3JpYmVzIG5vbmUuCiYjNDM7ICogQGlzX3ByZXNlbnQ6IElzIEBwbWQgYSBwcmVzZW50IGVudHJ5IHJhdGhlciB0aGFuIGEgc29mdGxlYWYgZW50cnk/CiYjNDM7ICoKJiM0MzsgKiBPbmx5IGFub255bW91cyBmb2xpb3MgYXJlIHJlYnVpbHQgYXQgUFRFIGxldmVsIHdoZW4gYSBodWdlIFBNRCBlbnRyeSBpcwomIzQzOyAqIHNwbGl0LiBFdmVyeXRoaW5nIGVsc2UgaXMgdW5tYXBwZWQgaGVyZSBhbmQgZmF1bHRlZCBiYWNrIGluIG9uIHRoZSBuZXh0CiYjNDM7ICogYWNjZXNzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHVubWFwX2h1Z2VfcG1kX2VudHJ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCWJvb2wgaXNfcHJlc2VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJcG1kX3Qgb2xkX3BtZDsKIAotCWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwlvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU28KJiM0MzsJICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0CiYjNDM7CSAqLwomIzQzOwlpZiAoaGFzX2RlcG9zaXRlZF9wZ3RhYmxlKHZtYSwgb2xkX3BtZCwgZm9saW8pKQomIzQzOwkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKIAotCWlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7Ci0JCW9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTsKLQkJLyoKLQkJICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTbwotCQkgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXQKLQkJICovCi0JCWlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKQotCQkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKLQkJaWYgKHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSkKLQkJCXJldHVybjsKLQkJaWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7Ci0JCQljb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpOwotCi0JCQlmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7Ci0JCX0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkgewotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQkJaWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSAmYW1wOyZhbXA7IHBtZF9kaXJ0eShvbGRfcG1kKSkKLQkJCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKLQkJCWlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSAmYW1wOyZhbXA7IHBtZF95b3VuZyhvbGRfcG1kKSkKLQkJCQlmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7Ci0JCQlmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7Ci0JCQlhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7Ci0JCQlmb2xpb19wdXQoZm9saW8pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKJiM0MzsJaWYgKCFmb2xpbykKIAkJcmV0dXJuOwotCX0KIAotCWlmIChpc19odWdlX3plcm9fcG1kKCpwbWQpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBieSBjYWxsaW5nCi0JCSAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3cKLQkJICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/Ci0JCSAqCi0JCSAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8KLQkJICogc21hbGwgcGFnZSBhbHNvIHdyaXRlIHByb3RlY3RlZCBzbyBpdCBkb2VzIG5vdCBzZWVtcyB1c2VmdWwKLQkJICogdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGF0IHRoaXMgdGltZS4KLQkJICovCi0JCXJldHVybiBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpOwomIzQzOwlpZiAoaXNfcHJlc2VudCkgewomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTsKJiM0MzsKJiM0MzsJCWlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyBwbWRfZGlydHkob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQlpZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgJmFtcDsmYW1wOyBwbWRfeW91bmcob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pOwomIzQzOwkJZm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpOwogCX0KIAotCWlmIChwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7CWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJZm9saW9fcHV0KGZvbGlvKTsKJiM0Mzt9CiAKLQkJc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKTsKLQkJdWZmZF93cCA9IHBtZF9zd3BfdWZmZChvbGRfcG1kKTsKJiM0MztzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWJvb2wgaXNfcHJlc2VudDsKJiM0MzsJYm9vbCBpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJYm9vbCBmcmVlemU7CiYjNDM7CWJvb2wgd3JpdGU7CiYjNDM7CWJvb2wgeW91bmc7CiYjNDM7CWJvb2wgZGlydHk7CiYjNDM7CWJvb2wgc29mdF9kaXJ0eTsKJiM0MzsJYm9vbCB1ZmZkOwomIzQzOwlib29sIGFub25fZXhjbHVzaXZlOwomIzQzO307CiAKLQkJd3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwotCQlpZiAoUGFnZUFub24ocGFnZSkpCi0JCQlhbm9uX2V4Y2x1c2l2ZSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7Ci0JCXlvdW5nID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KTsKLQkJZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7LyoKJiM0MzsgKiBDb252ZXJ0IHRoZSBmb2xpbyYjMzk7cyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy4KJiM0MzsgKgomIzQzOyAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKJiM0MzsgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yCiYjNDM7ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci4KJiM0MzsgKgomIzQzOyAqIFdpdGggJiMzNDtmcmVlemUmIzM0OyB3ZSB3YW50IHRvIHJlcGxhY2UgbWFwcGVkIHBhZ2VzIGJ5CiYjNDM7ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlCiYjNDM7ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQomIzQzOyAqIHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCkuCiYjNDM7ICoKJiM0MzsgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECiYjNDM7ICogb25seSBhbmQgbGV0IHRyeV90b19taWdyYXRlX29uZSgpIGZhaWwgbGF0ZXIuCiYjNDM7ICoKJiM0MzsgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiB3aGV0aGVyIHRoZSBtYXBwaW5nIG1heSBzdGlsbCBiZSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgaGFkZHIpCiYjNDM7ewomIzQzOwlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplICZhbXA7JmFtcDsKJiM0MzsJICAgICghc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlIHx8CiYjNDM7CSAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLSZndDtmb2xpbywgc3RhdGUtJmd0O3BhZ2UpKSkKJiM0MzsJCXJldHVybiB0cnVlOwogCi0JCXNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7CiYjNDM7CWZvbGlvX3JlZl9hZGQoc3RhdGUtJmd0O2ZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTsKJiM0MzsJaWYgKHN0YXRlLSZndDthbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCXJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7CiYjNDM7CWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhzdGF0ZS0mZ3Q7Zm9saW8sIHN0YXRlLSZndDtwYWdlLCBIUEFHRV9QTURfTlIsIHZtYSwKJiM0MzsJCQkJIGhhZGRyLCBybWFwX2ZsYWdzKTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KIAotCQl3cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTsKLQkJYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTsKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIHRoZSBsZWFmIGVudHJ5IGZvciB0aGUgUFRFIGVudHJ5IGRlc2NyaWJpbmcgQHBmbiwgZm9yIGEgaHVnZSBQTUQgZW50cnkKJiM0MzsgKiB3aGljaCBpcyBub3QgcmVzdG9yZWQgYXMgYSBwcmVzZW50IG1hcHBpbmcuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNvZnRsZWFmX3Qgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWYoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsCiYjNDM7CQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQomIzQzO3sKJiM0MzsJc29mdGxlYWZfdCBlbnRyeTsKIAomIzQzOwlpZiAoc3RhdGUtJmd0O2lzX2RldmljZV9wcml2YXRlICZhbXA7JmFtcDsgIXN0YXRlLSZndDtmcmVlemUpIHsKIAkJLyoKLQkJICogRGV2aWNlIHByaXZhdGUgVEhQIHNob3VsZCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHJlZ3VsYXIKLQkJICogZm9saW9zIHcuci50IGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLiBTZWUgdGhlIGNvbW1lbnRzIGZvcgotCQkgKiBmb2xpbyBoYW5kbGluZyBhbmQgYW5vbl9leGNsdXNpdmUgYmVsb3cuCi0JCSAqLwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQotCQkJZm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsCi0JCQkJCQkgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzCi0JCSAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoCi0JCSAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZQotCQkgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmCi0JCSAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZQotCQkgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQgotCQkgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJiMzOTt0Ci0JCSAqIGxpa2UgdGhhdC4gU2VlCi0JCSAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0KLQkJICogMzgzIG9uIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0Ci0JCSAqIGl0JiMzOTtzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGUKLQkJICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkCi0JCSAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93Ci0JCSAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmUKLQkJICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nICYjMzQ7cG1kX3BvcHVsYXRlKCk7Ci0JCSAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTsmIzM0OyB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZAotCQkgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdAotCQkgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcwotCQkgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5Ci0JCSAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aAotCQkgKiBwbWRfcG9wdWxhdGUuCiYjNDM7CQkgKiBhbm9uX2V4Y2x1c2l2ZSB3YXMgYWxyZWFkeSBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlcyBiYWNraW5nCiYjNDM7CQkgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZAomIzQzOwkJICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZQomIzQzOwkJICogZW50cmllcy4KIAkJICovCi0JCW9sZF9wbWQgPSBwbWRwX2ludmFsaWRhdGUodm1hLCBoYWRkciwgcG1kKTsKLQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCWlmIChwbWRfZGlydHkob2xkX3BtZCkpIHsKLQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7Ci0JCX0KLQkJd3JpdGUgPSBwbWRfd3JpdGUob2xkX3BtZCk7Ci0JCXlvdW5nID0gcG1kX3lvdW5nKG9sZF9wbWQpOwotCQlzb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfdWZmZChvbGRfcG1kKTsKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7d3JpdGUpCiYjNDM7CQkJcmV0dXJuIG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkocGZuKTsKJiM0MzsJCXJldHVybiBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KHBmbik7CiYjNDM7CX0KIAotCQlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7Ci0JCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKJiM0MzsJaWYgKHN0YXRlLSZndDt3cml0ZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZSBpZiAoc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlKQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pOwogCi0JCS8qCi0JCSAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKLQkJICogUGFnZUFub25FeGNsdXNpdmUoKSBmbGFnIGZvciBlYWNoIFBURSBieSBzZXR0aW5nIGl0IGZvcgotCQkgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLgotCQkgKgotCQkgKiBXaXRoICYjMzQ7ZnJlZXplJiMzNDsgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieQotCQkgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2UKLQkJICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQotCQkgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLgotCQkgKgotCQkgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECi0JCSAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLgotCQkgKgotCQkgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCi0JCSAqLwotCQlhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQkJCWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgSFBBR0VfUE1EX05SLAotCQkJCQkJIHZtYSwgaGFkZHIsIHJtYXBfZmxhZ3MpOwotCQl9Ci0JfQomIzQzOwlpZiAoc3RhdGUtJmd0O3lvdW5nKQomIzQzOwkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZGlydHkpCiYjNDM7CQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVudHJ5OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWUKJiM0MzsgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlKQomIzQzO3sKJiM0MzsJLyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovCiYjNDM7CWNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLSZndDtpc19wcmVzZW50IHx8IHN0YXRlLSZndDtpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLSZndDtwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHI7CiYjNDM7CXBndGFibGVfdCBwZ3RhYmxlOwomIzQzOwlwbWRfdCBfcG1kOwomIzQzOwlwdGVfdCAqcHRlOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKHJtYXBwZWQpCiYjNDM7CQlzdGF0ZS0mZ3Q7ZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTsKIAogCS8qCi0JICogV2l0aGRyYXcgdGhlIHRhYmxlIG9ubHkgYWZ0ZXIgd2UgbWFyayB0aGUgcG1kIGVudHJ5IGludmFsaWQuCi0JICogVGhpcyYjMzk7cyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiYjNDM7CSAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaW52YWxpZGF0ZWQgYSBwcmVzZW50IGVudHJ5LCBhbmQgYSBzb2Z0bGVhZgomIzQzOwkgKiBlbnRyeSBpcyBub3QgcHJlc2VudCB0byBiZWdpbiB3aXRoLiBFaXRoZXIgd2F5IHRoZSBlbnRyeSBpcyBvdXQgb2YKJiM0MzsJICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpcwomIzQzOwkgKiBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiAJICovCiAJcGd0YWJsZSA9IHBndGFibGVfdHJhbnNfaHVnZV93aXRoZHJhdyhtbSwgcG1kKTsKIAlwbWRfcG9wdWxhdGUobW0sICZhbXA7X3BtZCwgcGd0YWJsZSk7CkBAIC0zMzM3LDU1ICYjNDM7MzMxNywxNyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAkgKiBOb3RlIHRoYXQgTlVNQSBoaW50aW5nIGFjY2VzcyByZXN0cmljdGlvbnMgYXJlIG5vdCB0cmFuc2ZlcnJlZCB0bwogCSAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy4KIAkgKi8KLQlpZiAoZnJlZXplIHx8IHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpIHsKLQkJcHRlX3QgZW50cnk7Ci0JCXN3cF9lbnRyeV90IHN3cF9lbnRyeTsKLQotCQlmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgJmx0OyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJCWlmICh3cml0ZSkKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UgaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWlmICh5b3VuZykKLQkJCQlzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhzd3BfZW50cnkpOwotCQkJaWYgKGRpcnR5KQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KHN3cF9lbnRyeSk7Ci0JCQllbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTsKLQkJCWlmIChzb2Z0X2RpcnR5KQomIzQzOwlpZiAoc3RhdGUtJmd0O2ZyZWV6ZSB8fCAhc3RhdGUtJmd0O2lzX3ByZXNlbnQpIHsKJiM0MzsJCWZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSAmbHQ7IEhQQUdFX1BNRF9OUjsKJiM0MzsJCSAgICAgaSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkgewomIzQzOwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKTsKJiM0MzsJCQljb25zdCBzb2Z0bGVhZl90IGxlYWYgPQomIzQzOwkJCQlzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihzdGF0ZSwgcGZuKTsKJiM0MzsJCQlwdGVfdCBlbnRyeSA9IHNvZnRsZWFmX3RvX3B0ZShsZWFmKTsKJiM0MzsKJiM0MzsJCQlpZiAoc3RhdGUtJmd0O3NvZnRfZGlydHkpCiAJCQkJZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCQlpZiAodWZmZF93cCkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKLQkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwotCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKLQkJfQotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KG9sZF9wbWQpKSB7Ci0JCXB0ZV90IGVudHJ5OwotCQlzd3BfZW50cnlfdCBzd3BfZW50cnk7Ci0KLQkJZm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7Ci0JCQkvKgotCQkJICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcmVsZXZhbnQKLQkJCSAqIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHB0ZSBlbnRyaWVzIHdoZW4gZnJlZXplCi0JCQkgKiBpcyBmYWxzZS4KLQkJCSAqLwotCQkJaWYgKHdyaXRlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkoCi0JCQkJCQkJcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7Ci0JCQllbHNlCi0JCQkJc3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCS8qCi0JCQkgKiBZb3VuZyBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb2dhdGVkIHZpYSBzd3BfZW50cnkKLQkJCSAqLwotCQkJZW50cnkgPSBzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSk7Ci0JCQlpZiAoc29mdF9kaXJ0eSkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTsKLQkJCWlmICh1ZmZkX3dwKQomIzQzOwkJCWlmIChzdGF0ZS0mZ3Q7dWZmZCkKIAkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKIAkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwogCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKQEAgLTMzOTQsMjAgJiM0MzszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQlwdGVfdCBlbnRyeTsKIAogCQllbnRyeSA9IG1rX3B0ZShwYWdlLCBSRUFEX09OQ0Uodm1hLSZndDt2bV9wYWdlX3Byb3QpKTsKLQkJaWYgKHdyaXRlKQomIzQzOwkJaWYgKHN0YXRlLSZndDt3cml0ZSkKIAkJCWVudHJ5ID0gcHRlX21rd3JpdGUoZW50cnksIHZtYSk7Ci0JCWlmICgheW91bmcpCiYjNDM7CQlpZiAoIXN0YXRlLSZndDt5b3VuZykKIAkJCWVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTsKIAkJLyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi8KLQkJaWYgKGRpcnR5KQomIzQzOwkJaWYgKHN0YXRlLSZndDtkaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpOwotCQlpZiAoc29mdF9kaXJ0eSkKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7c29mdF9kaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCWlmICh1ZmZkX3dwKQomIzQzOwkJaWYgKHN0YXRlLSZndDt1ZmZkKQogCQkJZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTsKIAogCQkvKiBSZXN0b3JlIFBBR0VfTk9ORSBzbyBhbiBSV1AgbWFya2VyIGtlZXBzIHRyYXBwaW5nICovCi0JCWlmICh1c2VyZmF1bHRmZF9yd3Aodm1hKSAmYW1wOyZhbXA7IHVmZmRfd3ApCiYjNDM7CQlpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgJmFtcDsmYW1wOyBzdGF0ZS0mZ3Q7dWZmZCkKIAkJCWVudHJ5ID0gcHRlX21vZGlmeShlbnRyeSwgUEFHRV9OT05FKTsKIAogCQlmb3IgKGkgPSAwOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOykKQEAgLTM0MTcsMTUgJiM0MzszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAl9CiAJcHRlX3VubWFwKHB0ZSk7CiAKLQlpZiAoIXBtZF9pc19taWdyYXRpb25fZW50cnkoKnBtZCkpCi0JCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChmb2xpbywgcGFnZSwgdm1hKTsKLQlpZiAoZnJlZXplKQomIzQzOwlpZiAocm1hcHBlZCkKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS0mZ3Q7Zm9saW8sIHBhZ2UsIHZtYSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplKQogCQlwdXRfcGFnZShwYWdlKTsKIAogCXNtcF93bWIoKTsgLyogbWFrZSBwdGUgdmlzaWJsZSBiZWZvcmUgcG1kICovCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgc3RhdGUgPSB7CiYjNDM7CQkuZm9saW8gPSBmb2xpbywKJiM0MzsJCS5pc19wcmVzZW50ID0gdHJ1ZSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXMgdGhlCiYjNDM7CSAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpbgomIzQzOwkgKiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlIHZlcnNpb24gcG9pbnRpbmcKJiM0MzsJICogdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWYgYWxsIENQVXMgd2VyZSBidWcKJiM0MzsJICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlCiYjNDM7CSAqIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluCiYjNDM7CSAqIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24mIzM5O3QgbGlrZSB0aGF0LiBTZWUKJiM0MzsJICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS9UZWNoRG9jcy80MTMyMl8xMGhfUmV2X0dkLnBkZiwgRXJyYXR1bSAzODMgb24KJiM0MzsJICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQmIzM5O3Mgb25seSBzYWZlCiYjNDM7CSAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW4KJiM0MzsJICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZSkuIEJ1dCBpdCBpcwomIzQzOwkgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZQomIzQzOwkgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2YKJiM0MzsJICogZG9pbmcgJiMzNDtwbWRfcG9wdWxhdGUoKTsgZmx1c2hfcG1kX3RsYl9yYW5nZSgpOyYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlCiYjNDM7CSAqIGN1cnJlbnQgcG1kIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZQomIzQzOwkgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlCiYjNDM7CSAqIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlCiYjNDM7CSAqIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoIHBtZF9wb3B1bGF0ZS4KJiM0MzsJICoKJiM0MzsJICogVGhpcyBtdXN0IGFsc28gaGFwcGVuIGJlZm9yZSBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGlzIHJlYWQgYmVsb3csIHNlZQomIzQzOwkgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpLgomIzQzOwkgKi8KJiM0MzsJY29uc3QgcG1kX3QgcG1kdmFsID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CiYjNDM7CXN0YXRlLnBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpOwomIzQzOwlzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpOwomIzQzOwlzdGF0ZS55b3VuZyA9IHBtZF95b3VuZyhwbWR2YWwpOwomIzQzOwlzdGF0ZS5kaXJ0eSA9IHBtZF9kaXJ0eShwbWR2YWwpOwomIzQzOwlzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTsKJiM0MzsJc3RhdGUudWZmZCA9IHBtZF91ZmZkKHBtZHZhbCk7CiYjNDM7CXN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7CiYjNDM7CiYjNDM7CWlmIChzdGF0ZS5kaXJ0eSkKJiM0MzsJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTsKJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHBtZF90IG9sZF9wbWQsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKJiM0MzsJc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHsKJiM0MzsJCS5mb2xpbyA9IGZvbGlvLAomIzQzOwkJLnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSwKJiM0MzsJCS5pc19kZXZpY2VfcHJpdmF0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlKGVudHJ5KSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CQkuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSwKJiM0MzsJCS51ZmZkID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpLAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoc3RhdGUuaXNfZGV2aWNlX3ByaXZhdGUpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBEZXZpY2UgcHJpdmF0ZSBmb2xpb3MgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgcmVndWxhciBmb2xpb3MKJiM0MzsJCSAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlCiYjNDM7CQkgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS4KJiM0MzsJCSAqLwomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19kZXZpY2VfcHJpdmF0ZV93cml0ZShlbnRyeSk7CiYjNDM7CQlzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwomIzQzOwkJc3RhdGUueW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpOwomIzQzOwkJc3RhdGUuZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwomIzQzOwkJc3RhdGUuYW5vbl9leGNsdXNpdmUgPQomIzQzOwkJCXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKQomIzQzO3sKJiM0MzsJY29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7CiYjNDM7CWNvbnN0IGJvb2wgaXNfcHJlc2VudCA9IHBtZF9wcmVzZW50KG9sZF9wbWQpOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwomIzQzOwlWTV9CVUdfT04oaGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKTsKJiM0MzsJVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7CiYjNDM7CVZNX0JVR19PTl9WTUEodm1hLSZndDt2bV9lbmQgJmx0OyBoYWRkciAmIzQzOyBIUEFHRV9QTURfU0laRSwgdm1hKTsKJiM0MzsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCFwbWRfaXNfdmFsaWRfc29mdGxlYWYob2xkX3BtZCkgJmFtcDsmYW1wOwomIzQzOwkJCSFwbWRfdHJhbnNfaHVnZShvbGRfcG1kKSk7CiYjNDM7CiYjNDM7CWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZwomIzQzOwkgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93CiYjNDM7CSAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgPwomIzQzOwkgKgomIzQzOwkgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvIHNtYWxsCiYjNDM7CSAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGUKJiM0MzsJICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuCiYjNDM7CSAqLwomIzQzOwlpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkgewomIzQzOwkJX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLXByZXNlbnQgZW50cnkgd2hpY2ggaXMgbmVpdGhlciBhIG1pZ3JhdGlvbiBub3IgYSBkZXZpY2UKJiM0MzsJICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHkKJiM0MzsJICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2gKJiM0MzsJICogbWVhbnMgbm90aGluZy4KJiM0MzsJICovCiYjNDM7CWlmICh1bmxpa2VseSghaXNfcHJlc2VudCAmYW1wOyZhbXA7ICFmb2xpbykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHsKJiM0MzsJCXVubWFwX2h1Z2VfcG1kX2VudHJ5KHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGlzX3ByZXNlbnQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJc3BsaXRfcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIGZvbGlvLCBmcmVlemUpOwomIzQzOwllbHNlCiYjNDM7CQlzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIG9sZF9wbWQsIGZvbGlvLAomIzQzOwkJCQkJICAgZnJlZXplKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjY1CgkJCQkJCQlvdXRwdXQ6IDI2NgoJCQkJCQkJdGhvdWdodHM6IDE1NzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQW5hbHlzaXM6IERldGVybWluaW5nIGlmIERlZGljYXRlZCBGdXp6aW5nIGlzIE5lY2Vzc2FyeSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXRjaCwgd2hpY2ggcmVmYWN0b3JzIGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLCByZXF1aXJlcyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24sIG9yIGlmIHdlIGNhbiByZWx5IG9uIEtBU0FOIGFuZCBzdGFuZGFyZCBkZXRlY3RvcnMuCgpGaXJzdCwgbGV0JiMzOTtzIHJlZnJlc2g6IEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgbGVha3MuIEtBU0FOIGhhbmRsZXMgdGhlIHVzdWFsIHN1c3BlY3RzOiBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZXRjLiwgYW5kIExPQ0tERVAgaXMgdGhlcmUgZm9yIGxvY2tpbmcgaXNzdWVzLgoKTm93LCBsb29raW5nIGF0IHRoZSBwYXRjaCwgaXQgc2VlbXMgbGlrZSBhIGRlZXAgZGl2ZSBpbnRvIGhvdyBodWdlIHBhZ2Ugc3BsaXR0aW5nIGlzIGhhbmRsZWQuIEl0IHJlZmFjdG9ycyB0aGUgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBmdW5jdGlvbiBhbmQgdGhlIHdheSBpdCB3b3JrcyB3aXRoIGZvbGlvcyBhbmQgcGFnZSB0YWJsZSBlbnRyaWVzIChQTURzIGFuZCBQVEVzKS4KCkkgc2VlIHRoZXNlIGtleSBjaGFuZ2VzOgoKMS4gIEEgY2hlY2ssIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAsIHRvIGVuc3VyZSB0aGUgUE1EIGlzIGEgemVybyBQTUQgYW5kIHRoZSBWTUEgaXMgYW5vbnltb3VzLgoyLiAgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgd2hpY2ggY2xlYW5zIHVwIGh1Z2UgUE1EIGVudHJpZXMsIHplcm9zIHRhYmxlIGVudHJpZXMsIGFuZCBkZWFscyB3aXRoIGZvbGlvIHN0YXRlIChkaXJ0eS9yZWZlcmVuY2VkL2V0Yy4pLgozLiAgVGhlIGludHJvZHVjdGlvbiBvZiBgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZWAgdG8gZW5jYXBzdWxhdGUgdGhlIHN0YXRlIGR1cmluZyB0aGUgc3BsaXR0aW5nIHByb2Nlc3MsIGluY2x1ZGluZyB0aGUgYGZvbGlvYCwgd2hldGhlciB0aGUgUE1EIGlzIGBpc19wcmVzZW50YCwgYXMgd2VsbCBhcyBmbGFncyBsaWtlIGB3cml0ZWAsIGB5b3VuZ2AsIGBkaXJ0eWAsIGV0Yy4KNC4gIEZ1bmN0aW9ucyBsaWtlIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCBhbmQgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCBpbml0aWFsaXplIHRoZSBgc3BsaXRfcG1kX3N0YXRlYCBzdHJ1Y3R1cmUuIENyaXRpY2FsbHksIHRoZXNlIGluaXRpYWxpemF0aW9ucyB1c2UgQyYjMzk7cyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIHN5bnRheCAoYD0geyAuLi4gfWApLCB3aGljaCBtZWFucyAqYW55KiBtZW1iZXJzICpub3QgZXhwbGljaXRseSogaW5pdGlhbGl6ZWQgd2lsbCBiZSB6ZXJvZWQuIFNvLCB0aGUgY29tcGlsZXIgaXMgaGFuZGxpbmcgdGhlIGRlZmF1bHQgdmFsdWVzLCBlbnN1cmluZyB0aGF0IG5vIG1lbWJlciBvZiBgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZWAgaGFzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuIFRoZSBgc3BsaXRfcHJlc2VudF9odWdlX3BtZGAgc3BlY2lmaWNhbGx5IHNldHMgdGhlIGZpZWxkcyBpdCBuZWVkcywgYW5kIHRoZSBvdGhlcnMgdXNlIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uLgoKICAgICogICBGb3IgdGhlIG5vbi1wcmVzZW50IGNhc2UsIGFsbCB0aGUgZmxhZ3Mgbm90IGV4cGxpY2l0bHkgc2V0IGFyZSB6ZXJvLWluaXRpYWxpemVkLiBBbHNvLCBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgZXhwbGljaXRseSBzZXQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGRldmljZS1wcml2YXRlIG9yIG5vdC4KNS4gIGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAgaXRzZWxmIGNoZWNrcyB0aGUgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YCwgZ2V0cyB0aGUgYGZvbGlvYCwgYW5kIHRoZW4gY2FsbHMgZWl0aGVyIGB1bm1hcF9odWdlX3BtZF9lbnRyeWAsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgb3IgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYC4KCk15IGZvY3VzIGlzIG9uIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbGVha3MgdG8gdXNlcnNwYWNlLCBvciBwYWRkaW5nIGlzc3VlcyB0aGF0IGNvdWxkIGxlYWQgdG8gdnVsbmVyYWJpbGl0aWVzLgoKKiAgIEkgc2VlIHRoYXQgdGhlIGBzcGxpdF9wbWRfc3RhdGVgIHN0cnVjdCBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXI7IHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIGZpZWxkcy4KKiAgIEkgZG9uJiMzOTt0IHNlZSBhbnkgZGlyZWN0IGNvcHlpbmcgb2YgZGF0YSB0byB1c2Vyc3BhY2UgKGBjb3B5X3RvX3VzZXJgLCBldGMuKSwgd2hpY2ggd291bGQgYmUgYSBsZWFrIHJpc2suCiogICBUaGUgY29kZSBtYW5pcHVsYXRlcyBQTUQgYW5kIFBURXMsIHdoaWNoIGFyZSBrZXkgZm9yIFRIUCBzcGxpdHRpbmcuIFBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBoZXJlIHdvdWxkIG1hbmlmZXN0IGFzIGluY29ycmVjdCBwYWdlIHRhYmxlIGVudHJpZXMsIHJlZmNvdW50aW5nIHByb2JsZW1zIChsaWtlIHVzZS1hZnRlci1mcmVlKSwgb3IgVExCIGZsdXNoIGVycm9ycyDigJMgYWxsIG9mIHdoaWNoIGFyZSB0aGUgZG9tYWluIG9mIHN0YW5kYXJkIG1tIGFzc2VydGlvbnMsIHJlZmNvdW50aW5nIG1lY2hhbmlzbXMsIGFuZCBLQVNBTi4KKiAgIENydWNpYWxseSwgS01TQU4gKmlzbiYjMzk7dCogZGVzaWduZWQgdG8gZGV0ZWN0IGlzc3VlcyB3aXRoIHBhZ2UgdGFibGUgZW50cmllcyB0aGVtc2VsdmVzLCBhcyB0aGV5IGFyZSBub3QgZ2VuZXJhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBidXQgaGFyZHdhcmUgZGVzY3JpcHRvcnMgb3IgcGh5c2ljYWwgYWRkcmVzc2VzLgoKU28sIGxldCYjMzk7cyBydW4gdGhyb3VnaCB0aGUgS01TQU4tc3BlY2lmaWMgY2hlY2tzOgoKMS4gIEtlcm5lbCBzdHJ1Y3RzIHNlbnQgdG8gdXNlcnNwYWNlIHdpdGggdW5pbml0aWFsaXplZCBvciBwYWRkaW5nIGlzc3Vlcz8gTm8uCjIuICBDb25kaXRpb25hbCBsb2dpYyB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOby4KMy4gIEFsbG9jYXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8gTm8g4oCTIGBzcGxpdF9wbWRfc3RhdGVgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhbmQgc3RhY2stbG9jYWwuCjQuICBCb3VuZHMgY2hlY2tzIHRoYXQgY291bGQgbGVhZCB0byBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBieXRlcz8gTm8uCgpHaXZlbiB0aGlzIGFuYWx5c2lzLCBhbmQgdGhhdDoKCiogICBUaGUgcmlza3MgYXJlIHByaW1hcmlseSBhYm91dCBwYWdlIHRhYmxlIGhhbmRsaW5nLCByZWZjb3VudGluZywgYW5kIGdlbmVyYWwgbWVtb3J5IG1hbmFnZW1lbnQgYnVncywgYWxsIGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCBhbmQgYFZNX0JVR19PTmAuCiogICBBbGwgc3RhY2sgc3RydWN0dXJlcyBhcmUgKmZ1bGx5KiBpbml0aWFsaXplZC4KKiAgIFRoZXJlJiMzOTtzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVhayByaXNrLgoKSSBhbSBjb25maWRlbnQgdGhhdCBgTmVlZHNLTVNBTj1mYWxzZWAgZm9yIHRoaXMgcGF0Y2guIEkmIzM5O2xsIHZlcmlmeSB0aGUgdG9vbHMgYW5kIHRoZW4gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cblxuQWxsIGluc3RhbmNlcyBvZiAmIzM5O3N0cnVjdCBzcGxpdF9wbWRfc3RhdGUmIzM5OyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGh1Z2UgUE1EIHNwbGl0dGluZyBsb2dpYyAoX19zcGxpdF9odWdlX3BtZF9sb2NrZWQpIGluIG1tL2h1Z2VfbWVtb3J5LmMgYnkgYnJlYWtpbmcgaXQgZG93biBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0LCB1bm1hcF9odWdlX3BtZF9lbnRyeSwgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcywgc3BsaXRfcHJlc2VudF9odWdlX3BtZCwgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQpIGFuZCBncm91cGluZyBQTUQgc3BsaXQgcGFyYW1ldGVycyBpbiBhIGxvY2FsIHN0YWNrIHN0cnVjdHVyZSAoc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSkuXG5cbkFsbCBpbnN0YW5jZXMgb2YgJiMzOTtzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlJiMzOTsgYXJlIHN0YWNrLWFsbG9jYXRlZCB3aXRoIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCBlbnN1cmluZyBhbGwgdW5zZXQgZmllbGRzIGFyZSB6ZXJvLWluaXRpYWxpemVkLiBUaGVyZSBhcmUgbm8ga2VybmVsLXRvLXVzZXIgY29weSBvcGVyYXRpb25zIChlLmcuLCBjb3B5X3RvX3VzZXIpLCBubyB1bmluaXRpYWxpemVkIGhlYXAgb3Igc3RhY2sgdmFyaWFibGVzIHJlYWQgb3IgYnJhbmNoZWQgb24sIGFuZCBubyBpbmZvLWxlYWsgcmlza3MuIEFueSBtZW1vcnkgbWFuYWdlbWVudCBvciBzeW5jaHJvbml6YXRpb24gaXNzdWVzIGluIHRoaXMgY29kZSBwYXRoIChzdWNoIGFzIGZvbGlvIHJlZmNvdW50aW5nLCBybWFwIG1hbmFnZW1lbnQsIFRMQiBpbnZhbGlkYXRpb24sIG9yIFVBRikgYXJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiwgVk1fQlVHX09OIGFzc2VydGlvbnMsIGFuZCBzdGFuZGFyZCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuNDM3MTIzMTc2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUzODQ3ODc4MTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkRFVklDRV9QUklWQVRFXCIsXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNwbGl0X2h1Z2VfcG1kX2xvY2tlZFwiLFxuICAgIFwiX19zcGxpdF9odWdlX3BtZFwiLFxuICAgIFwic3BsaXRfaHVnZV9wbWRfYWRkcmVzc1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGh1Z2UgUE1EIHNwbGl0dGluZyBsb2dpYyAoX19zcGxpdF9odWdlX3BtZF9sb2NrZWQpIGluIG1tL2h1Z2VfbWVtb3J5LmMgYnkgYnJlYWtpbmcgaXQgZG93biBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0LCB1bm1hcF9odWdlX3BtZF9lbnRyeSwgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcywgc3BsaXRfcHJlc2VudF9odWdlX3BtZCwgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQpIGFuZCBncm91cGluZyBQTUQgc3BsaXQgcGFyYW1ldGVycyBpbiBhIGxvY2FsIHN0YWNrIHN0cnVjdHVyZSAoc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSkuXFxuXFxuQWxsIGluc3RhbmNlcyBvZiAnc3RydWN0IHNwbGl0X3BtZF9zdGF0ZScgYXJlIHN0YWNrLWFsbG9jYXRlZCB3aXRoIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCBlbnN1cmluZyBhbGwgdW5zZXQgZmllbGRzIGFyZSB6ZXJvLWluaXRpYWxpemVkLiBUaGVyZSBhcmUgbm8ga2VybmVsLXRvLXVzZXIgY29weSBvcGVyYXRpb25zIChlLmcuLCBjb3B5X3RvX3VzZXIpLCBubyB1bmluaXRpYWxpemVkIGhlYXAgb3Igc3RhY2sgdmFyaWFibGVzIHJlYWQgb3IgYnJhbmNoZWQgb24sIGFuZCBubyBpbmZvLWxlYWsgcmlza3MuIEFueSBtZW1vcnkgbWFuYWdlbWVudCBvciBzeW5jaHJvbml6YXRpb24gaXNzdWVzIGluIHRoaXMgY29kZSBwYXRoIChzdWNoIGFzIGZvbGlvIHJlZmNvdW50aW5nLCBybWFwIG1hbmFnZW1lbnQsIFRMQiBpbnZhbGlkYXRpb24sIG9yIFVBRikgYXJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiwgVk1fQlVHX09OIGFzc2VydGlvbnMsIGFuZCBzdGFuZGFyZCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgUE1EIHNwbGl0IGxvZ2ljIGluIG1tL2h1Z2VfbWVtb3J5LmMsIHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIHByZXNlbnQgdnMgbm9uLXByZXNlbnQgKG1pZ3JhdGlvbiwgZGV2aWNlLXByaXZhdGUpIGh1Z2UgUE1EcyBhbmQgcmVvcmdhbml6aW5nIHJtYXAgY29udmVyc2lvbiBhbmQgdW5tYXBwaW5nIGxvZ2ljLiBUaGlzIGNvcmUgTU0gZnVuY3Rpb25hbGl0eSBpcyByZWFjaGFibGUgdmlhIHVzZXIgYWN0aW9ucyAobWFkdmlzZSwgbXByb3RlY3QsIHBhZ2UgbWlncmF0aW9uLCBldGMuKSBhbmQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuNDM3MTMxMDI2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NTM0MDU2OTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzN2FmZGEyZDEwOTRiMGE5ZGYyMDBjNTM1YmQ0YjAxMjQ3YTlmNzExXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDI4IDE5OjM5OjIxIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXFxuaW5kZXggYWZiYjU5NzRiZDIyNS4uOGUwZmQxMWRhM2Q3YSAxMDA2NDRcXG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXFxuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xcbkBAIC0zMTM5LDE5MyArMzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuLVxcdFxcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxcbisvKlxcbisgKiBPbmx5IGEgaHVnZSB6ZXJvIFBNRCBpbiBhbiBhbm9ueW1vdXMgVk1BIGlzIHNwbGl0LCBpbnRvIGEgcGFnZSB0YWJsZSBvZlxcbisgKiBzaGFyZWQgemVybyBwYWdlIG1hcHBpbmdzLiBBbnkgb3RoZXIgaHVnZSB6ZXJvIFBNRCBpcyBzaW1wbHkgdW5tYXBwZWQuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgcG1kdmFsKVxcbiB7XFxuLVxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4tXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4tXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuLVxcdHBndGFibGVfdCBwZ3RhYmxlO1xcbi1cXHRwbWRfdCBvbGRfcG1kLCBfcG1kO1xcbi1cXHRib29sIHNvZnRfZGlydHksIHVmZmRfd3AgPSBmYWxzZSwgeW91bmcgPSBmYWxzZSwgd3JpdGUgPSBmYWxzZTtcXG4tXFx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xcbi1cXHR1bnNpZ25lZCBsb25nIGFkZHI7XFxuLVxcdHB0ZV90ICpwdGU7XFxuLVxcdGludCBpO1xcbi1cXG4tXFx0Vk1fQlVHX09OKGhhZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcXG4tXFx0Vk1fQlVHX09OX1ZNQSh2bWEtXFx1MDAzZXZtX3N0YXJ0IFxcdTAwM2UgaGFkZHIsIHZtYSk7XFxuLVxcdFZNX0JVR19PTl9WTUEodm1hLVxcdTAwM2V2bV9lbmQgXFx1MDAzYyBoYWRkciArIEhQQUdFX1BNRF9TSVpFLCB2bWEpO1xcbitcXHRyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IHZtYV9pc19hbm9ueW1vdXModm1hKTtcXG4rfVxcbiBcXG4tXFx0Vk1fV0FSTl9PTl9PTkNFKCFwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkgXFx1MDAyNlxcdTAwMjYgIXBtZF90cmFuc19odWdlKCpwbWQpKTtcXG4rLyoqXFxuKyAqIHVubWFwX2h1Z2VfcG1kX2VudHJ5KCkgLSBVbm1hcCBhIGh1Z2UgUE1EIGVudHJ5IHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdC5cXG4rICogQHZtYTogVGhlIFZNQSBAcG1kIGJlbG9uZ3MgdG8uXFxuKyAqIEBoYWRkcjogVGhlIFBNRC1hbGlnbmVkIGFkZHJlc3MgQHBtZCBtYXBzLlxcbisgKiBAcG1kOiBQb2ludGVyIHRvIHRoZSBodWdlIFBNRCBlbnRyeS5cXG4rICogQGZvbGlvOiBUaGUgZm9saW8gQHBtZCBkZXNjcmliZXMsIG9yIE5VTEwgaWYgaXQgZGVzY3JpYmVzIG5vbmUuXFxuKyAqIEBpc19wcmVzZW50OiBJcyBAcG1kIGEgcHJlc2VudCBlbnRyeSByYXRoZXIgdGhhbiBhIHNvZnRsZWFmIGVudHJ5P1xcbisgKlxcbisgKiBPbmx5IGFub255bW91cyBmb2xpb3MgYXJlIHJlYnVpbHQgYXQgUFRFIGxldmVsIHdoZW4gYSBodWdlIFBNRCBlbnRyeSBpc1xcbisgKiBzcGxpdC4gRXZlcnl0aGluZyBlbHNlIGlzIHVubWFwcGVkIGhlcmUgYW5kIGZhdWx0ZWQgYmFjayBpbiBvbiB0aGUgbmV4dFxcbisgKiBhY2Nlc3MuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB1bm1hcF9odWdlX3BtZF9lbnRyeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0Ym9vbCBpc19wcmVzZW50KVxcbit7XFxuK1xcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4rXFx0cG1kX3Qgb2xkX3BtZDtcXG4gXFxuLVxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpO1xcbitcXHRvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7XFxuK1xcdC8qXFxuK1xcdCAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU29cXG4rXFx0ICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0XFxuK1xcdCAqL1xcbitcXHRpZiAoaGFzX2RlcG9zaXRlZF9wZ3RhYmxlKHZtYSwgb2xkX3BtZCwgZm9saW8pKVxcbitcXHRcXHR6YXBfZGVwb3NpdGVkX3RhYmxlKG1tLCBwbWQpO1xcbiBcXG4tXFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcXG4tXFx0XFx0b2xkX3BtZCA9IHBtZHBfaHVnZV9jbGVhcl9mbHVzaCh2bWEsIGhhZGRyLCBwbWQpO1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXFxuLVxcdFxcdCAqIGp1c3QgZ28gYWhlYWQgYW5kIHphcCBpdFxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGFyY2hfbmVlZHNfcGd0YWJsZV9kZXBvc2l0KCkpXFxuLVxcdFxcdFxcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XFxuLVxcdFxcdGlmICh2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXFxuLVxcdFxcdFxcdHJldHVybjtcXG4tXFx0XFx0aWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7XFxuLVxcdFxcdFxcdGNvbnN0IHNvZnRsZWFmX3Qgb2xkX2VudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XFxuLVxcbi1cXHRcXHRcXHRmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7XFxuLVxcdFxcdH0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkge1xcbi1cXHRcXHRcXHRyZXR1cm47XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcXG4tXFx0XFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbi1cXHRcXHRcXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdFxcdFxcdGlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXFxuLVxcdFxcdFxcdFxcdGZvbGlvX3NldF9yZWZlcmVuY2VkKGZvbGlvKTtcXG4tXFx0XFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xcbi1cXHRcXHRcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XFxuLVxcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuLVxcdFxcdFxcdHJldHVybjtcXG4tXFx0XFx0fVxcbi1cXHRcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XFxuK1xcdGlmICghZm9saW8pXFxuIFxcdFxcdHJldHVybjtcXG4tXFx0fVxcbiBcXG4tXFx0aWYgKGlzX2h1Z2VfemVyb19wbWQoKnBtZCkpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogRklYTUU6IERvIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGJ5IGNhbGxpbmdcXG4tXFx0XFx0ICogbW11X25vdGlmaWVyX2FyY2hfaW52YWxpZGF0ZV9zZWNvbmRhcnlfdGxicygpIHNlZSBjb21tZW50cyBiZWxvd1xcbi1cXHRcXHQgKiBpbnNpZGUgX19zcGxpdF9odWdlX3BtZCgpID9cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogV2UgYXJlIGdvaW5nIGZyb20gYSB6ZXJvIGh1Z2UgcGFnZSB3cml0ZSBwcm90ZWN0ZWQgdG8gemVyb1xcbi1cXHRcXHQgKiBzbWFsbCBwYWdlIGFsc28gd3JpdGUgcHJvdGVjdGVkIHNvIGl0IGRvZXMgbm90IHNlZW1zIHVzZWZ1bFxcbi1cXHRcXHQgKiB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYXQgdGhpcyB0aW1lLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0cmV0dXJuIF9fc3BsaXRfaHVnZV96ZXJvX3BhZ2VfcG1kKHZtYSwgaGFkZHIsIHBtZCk7XFxuK1xcdGlmIChpc19wcmVzZW50KSB7XFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XFxuK1xcbitcXHRcXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcXG4rXFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcdFxcdGlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXFxuK1xcdFxcdFxcdGZvbGlvX3NldF9yZWZlcmVuY2VkKGZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAocG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkge1xcbi1cXHRcXHRzb2Z0bGVhZl90IGVudHJ5O1xcbitcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XFxuIFxcbi1cXHRcXHRvbGRfcG1kID0gKnBtZDtcXG4tXFx0XFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcXG4tXFx0XFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuK1xcdGlmIChpc19wcmVzZW50KVxcbitcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbit9XFxuIFxcbi1cXHRcXHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xcbi1cXHRcXHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xcbitzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHtcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdGJvb2wgaXNfcHJlc2VudDtcXG4rXFx0Ym9vbCBpc19kZXZpY2VfcHJpdmF0ZTtcXG4rXFx0Ym9vbCBmcmVlemU7XFxuK1xcdGJvb2wgd3JpdGU7XFxuK1xcdGJvb2wgeW91bmc7XFxuK1xcdGJvb2wgZGlydHk7XFxuK1xcdGJvb2wgc29mdF9kaXJ0eTtcXG4rXFx0Ym9vbCB1ZmZkO1xcbitcXHRib29sIGFub25fZXhjbHVzaXZlO1xcbit9O1xcbiBcXG4tXFx0XFx0d3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpO1xcbi1cXHRcXHRpZiAoUGFnZUFub24ocGFnZSkpXFxuLVxcdFxcdFxcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcXG4tXFx0XFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xcbi1cXHRcXHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XFxuLVxcdH0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KCpwbWQpKSB7XFxuLVxcdFxcdHNvZnRsZWFmX3QgZW50cnk7XFxuKy8qXFxuKyAqIENvbnZlcnQgdGhlIGZvbGlvJ3MgUE1ELWxldmVsIGFub255bW91cyBybWFwIGludG8gUFRFLWxldmVsIG9uZXMuXFxuKyAqXFxuKyAqIFdpdGhvdXQgXFxcImZyZWV6ZVxcXCIsIHdlJ2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGVcXG4rICogUGFnZUFub25FeGNsdXNpdmUoKSBmbGFnIGZvciBlYWNoIFBURSBieSBzZXR0aW5nIGl0IGZvclxcbisgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLlxcbisgKlxcbisgKiBXaXRoIFxcXCJmcmVlemVcXFwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcXG4rICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXFxuKyAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcXG4rICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cXG4rICpcXG4rICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxcbisgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cXG4rICpcXG4rICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxcbisgKlxcbisgKiBSZXR1cm5zOiB3aGV0aGVyIHRoZSBtYXBwaW5nIG1heSBzdGlsbCBiZSBmcm96ZW4uXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxcbit7XFxuK1xcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xcbiBcXG4tXFx0XFx0b2xkX3BtZCA9ICpwbWQ7XFxuLVxcdFxcdGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XFxuLVxcdFxcdHBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KTtcXG4tXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbitcXHRpZiAoc3RhdGUtXFx1MDAzZWZyZWV6ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKCFzdGF0ZS1cXHUwMDNlYW5vbl9leGNsdXNpdmUgfHxcXG4rXFx0ICAgICAhZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoc3RhdGUtXFx1MDAzZWZvbGlvLCBzdGF0ZS1cXHUwMDNlcGFnZSkpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuLVxcdFxcdHNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7XFxuLVxcdFxcdHVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7XFxuK1xcdGZvbGlvX3JlZl9hZGQoc3RhdGUtXFx1MDAzZWZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2Vhbm9uX2V4Y2x1c2l2ZSlcXG4rXFx0XFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcXG4rXFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKHN0YXRlLVxcdTAwM2Vmb2xpbywgc3RhdGUtXFx1MDAzZXBhZ2UsIEhQQUdFX1BNRF9OUiwgdm1hLFxcbitcXHRcXHRcXHRcXHQgaGFkZHIsIHJtYXBfZmxhZ3MpO1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4gXFxuLVxcdFxcdHdyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xcbi1cXHRcXHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xcbisvKlxcbisgKiBCdWlsZCB0aGUgbGVhZiBlbnRyeSBmb3IgdGhlIFBURSBlbnRyeSBkZXNjcmliaW5nIEBwZm4sIGZvciBhIGh1Z2UgUE1EIGVudHJ5XFxuKyAqIHdoaWNoIGlzIG5vdCByZXN0b3JlZCBhcyBhIHByZXNlbnQgbWFwcGluZy5cXG4rICovXFxuK3N0YXRpYyBzb2Z0bGVhZl90IHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLFxcbitcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgcGZuKVxcbit7XFxuK1xcdHNvZnRsZWFmX3QgZW50cnk7XFxuIFxcbitcXHRpZiAoc3RhdGUtXFx1MDAzZWlzX2RldmljZV9wcml2YXRlIFxcdTAwMjZcXHUwMDI2ICFzdGF0ZS1cXHUwMDNlZnJlZXplKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIERldmljZSBwcml2YXRlIFRIUCBzaG91bGQgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyXFxuLVxcdFxcdCAqIGZvbGlvcyB3LnIudCBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZy4gU2VlIHRoZSBjb21tZW50cyBmb3JcXG4tXFx0XFx0ICogZm9saW8gaGFuZGxpbmcgYW5kIGFub25fZXhjbHVzaXZlIGJlbG93Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGZyZWV6ZSBcXHUwMDI2XFx1MDAyNiBhbm9uX2V4Y2x1c2l2ZSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKVxcbi1cXHRcXHRcXHRmcmVlemUgPSBmYWxzZTtcXG4tXFx0XFx0aWYgKCFmcmVlemUpIHtcXG4tXFx0XFx0XFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XFxuLVxcbi1cXHRcXHRcXHRmb2xpb19yZWZfYWRkKGZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTtcXG4tXFx0XFx0XFx0aWYgKGFub25fZXhjbHVzaXZlKVxcbi1cXHRcXHRcXHRcXHRybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xcbi1cXG4tXFx0XFx0XFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCB2bWEsIGhhZGRyLCBybWFwX2ZsYWdzKTtcXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzXFxuLVxcdFxcdCAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoXFxuLVxcdFxcdCAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZVxcbi1cXHRcXHQgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmXFxuLVxcdFxcdCAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZVxcbi1cXHRcXHQgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQlxcbi1cXHRcXHQgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJ3RcXG4tXFx0XFx0ICogbGlrZSB0aGF0LiBTZWVcXG4tXFx0XFx0ICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS9UZWNoRG9jcy80MTMyMl8xMGhfUmV2X0dkLnBkZiwgRXJyYXR1bVxcbi1cXHRcXHQgKiAzODMgb24gcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXRcXG4tXFx0XFx0ICogaXQncyBvbmx5IHNhZmUgaWYgdGhlIHBlcm1pc3Npb24gYW5kIGNhY2hlIGF0dHJpYnV0ZXMgb2YgdGhlXFxuLVxcdFxcdCAqIHR3byBlbnRyaWVzIGxvYWRlZCBpbiB0aGUgdHdvIFRMQiBpcyBpZGVudGljYWwgKHdoaWNoIHNob3VsZFxcbi1cXHRcXHQgKiBiZSB0aGUgY2FzZSBoZXJlKS4gQnV0IGl0IGlzIGdlbmVyYWxseSBzYWZlciB0byBuZXZlciBhbGxvd1xcbi1cXHRcXHQgKiBzbWFsbCBhbmQgaHVnZSBUTEIgZW50cmllcyBmb3IgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIHRvIGJlXFxuLVxcdFxcdCAqIGxvYWRlZCBzaW11bHRhbmVvdXNseS4gU28gaW5zdGVhZCBvZiBkb2luZyBcXFwicG1kX3BvcHVsYXRlKCk7XFxuLVxcdFxcdCAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcXFwiIHdlIGZpcnN0IG1hcmsgdGhlIGN1cnJlbnQgcG1kXFxuLVxcdFxcdCAqIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZSBtdXN0XFxuLVxcdFxcdCAqIHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzXFxuLVxcdFxcdCAqIGNvbXBsZXRlIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHlcXG4tXFx0XFx0ICogd2Ugd3JpdGUgdGhlIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoXFxuLVxcdFxcdCAqIHBtZF9wb3B1bGF0ZS5cXG4rXFx0XFx0ICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcGFnZXMgYmFja2luZ1xcbitcXHRcXHQgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZFxcbitcXHRcXHQgKiBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb3BhZ2F0ZWQgdmlhIGRldmljZSBwcml2YXRlXFxuK1xcdFxcdCAqIGVudHJpZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRvbGRfcG1kID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7XFxuLVxcdFxcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcXG4tXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbi1cXHRcXHRpZiAocG1kX2RpcnR5KG9sZF9wbWQpKSB7XFxuLVxcdFxcdFxcdGRpcnR5ID0gdHJ1ZTtcXG4tXFx0XFx0XFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcXG4tXFx0XFx0fVxcbi1cXHRcXHR3cml0ZSA9IHBtZF93cml0ZShvbGRfcG1kKTtcXG4tXFx0XFx0eW91bmcgPSBwbWRfeW91bmcob2xkX3BtZCk7XFxuLVxcdFxcdHNvZnRfZGlydHkgPSBwbWRfc29mdF9kaXJ0eShvbGRfcG1kKTtcXG4tXFx0XFx0dWZmZF93cCA9IHBtZF91ZmZkKG9sZF9wbWQpO1xcbitcXHRcXHRpZiAoc3RhdGUtXFx1MDAzZXdyaXRlKVxcbitcXHRcXHRcXHRyZXR1cm4gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xcbitcXHRcXHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7XFxuLVxcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2V3cml0ZSlcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xcbitcXHRlbHNlIGlmIChzdGF0ZS1cXHUwMDNlYW5vbl9leGNsdXNpdmUpXFxuK1xcdFxcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KHBmbik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2l0aG91dCBcXFwiZnJlZXplXFxcIiwgd2UnbGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxcbi1cXHRcXHQgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yXFxuLVxcdFxcdCAqIGVhY2ggc3VicGFnZSAtLSBubyBuZWVkIHRvICh0ZW1wb3JhcmlseSkgY2xlYXIuXFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFdpdGggXFxcImZyZWV6ZVxcXCIgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieVxcbi1cXHRcXHQgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcXG4tXFx0XFx0ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZVxcbi1cXHRcXHQgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1EXFxuLVxcdFxcdCAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xcbi1cXHRcXHRpZiAoZnJlZXplIFxcdTAwMjZcXHUwMDI2IGFub25fZXhjbHVzaXZlIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXFxuLVxcdFxcdFxcdGZyZWV6ZSA9IGZhbHNlO1xcbi1cXHRcXHRpZiAoIWZyZWV6ZSkge1xcbi1cXHRcXHRcXHRybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTtcXG4tXFxuLVxcdFxcdFxcdGZvbGlvX3JlZl9hZGQoZm9saW8sIEhQQUdFX1BNRF9OUiAtIDEpO1xcbi1cXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUpXFxuLVxcdFxcdFxcdFxcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XFxuLVxcdFxcdFxcdGZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgSFBBR0VfUE1EX05SLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XFxuLVxcdFxcdH1cXG4tXFx0fVxcbitcXHRpZiAoc3RhdGUtXFx1MDAzZXlvdW5nKVxcbitcXHRcXHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2VkaXJ0eSlcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7XFxuK1xcbitcXHRyZXR1cm4gZW50cnk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWVcXG4rICogZm9saW8gYXQgUFRFIGdyYW51bGFyaXR5LlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUpXFxuK3tcXG4rXFx0LyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovXFxuK1xcdGNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLVxcdTAwM2Vpc19wcmVzZW50IHx8IHN0YXRlLVxcdTAwM2Vpc19kZXZpY2VfcHJpdmF0ZTtcXG4rXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbitcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLVxcdTAwM2VwYWdlO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHI7XFxuK1xcdHBndGFibGVfdCBwZ3RhYmxlO1xcbitcXHRwbWRfdCBfcG1kO1xcbitcXHRwdGVfdCAqcHRlO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChybWFwcGVkKVxcbitcXHRcXHRzdGF0ZS1cXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIFdpdGhkcmF3IHRoZSB0YWJsZSBvbmx5IGFmdGVyIHdlIG1hcmsgdGhlIHBtZCBlbnRyeSBpbnZhbGlkLlxcbi1cXHQgKiBUaGlzJ3MgY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxcbitcXHQgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGludmFsaWRhdGVkIGEgcHJlc2VudCBlbnRyeSwgYW5kIGEgc29mdGxlYWZcXG4rXFx0ICogZW50cnkgaXMgbm90IHByZXNlbnQgdG8gYmVnaW4gd2l0aC4gRWl0aGVyIHdheSB0aGUgZW50cnkgaXMgb3V0IG9mXFxuK1xcdCAqIHNlcnZpY2UgYmVmb3JlIHdlIHdpdGhkcmF3IHRoZSBkZXBvc2l0ZWQgcGFnZSB0YWJsZSwgd2hpY2ggaXNcXG4rXFx0ICogY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxcbiBcXHQgKi9cXG4gXFx0cGd0YWJsZSA9IHBndGFibGVfdHJhbnNfaHVnZV93aXRoZHJhdyhtbSwgcG1kKTtcXG4gXFx0cG1kX3BvcHVsYXRlKG1tLCBcXHUwMDI2X3BtZCwgcGd0YWJsZSk7XFxuQEAgLTMzMzcsNTUgKzMzMTcsMTcgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuIFxcdCAqIE5vdGUgdGhhdCBOVU1BIGhpbnRpbmcgYWNjZXNzIHJlc3RyaWN0aW9ucyBhcmUgbm90IHRyYW5zZmVycmVkIHRvXFxuIFxcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cXG4gXFx0ICovXFxuLVxcdGlmIChmcmVlemUgfHwgcG1kX2lzX21pZ3JhdGlvbl9lbnRyeShvbGRfcG1kKSkge1xcbi1cXHRcXHRwdGVfdCBlbnRyeTtcXG4tXFx0XFx0c3dwX2VudHJ5X3Qgc3dwX2VudHJ5O1xcbi1cXG4tXFx0XFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFxcdTAwM2MgSFBBR0VfUE1EX05SOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XFxuLVxcdFxcdFxcdGlmICh3cml0ZSlcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxcbi1cXHRcXHRcXHRcXHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XFxuLVxcdFxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XFxuLVxcdFxcdFxcdGlmICh5b3VuZylcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKGRpcnR5KVxcbi1cXHRcXHRcXHRcXHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xcbi1cXHRcXHRcXHRlbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKHNvZnRfZGlydHkpXFxuK1xcdGlmIChzdGF0ZS1cXHUwMDNlZnJlZXplIHx8ICFzdGF0ZS1cXHUwMDNlaXNfcHJlc2VudCkge1xcbitcXHRcXHRmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgXFx1MDAzYyBIUEFHRV9QTURfTlI7XFxuK1xcdFxcdCAgICAgaSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbitcXHRcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKTtcXG4rXFx0XFx0XFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cXG4rXFx0XFx0XFx0XFx0c3BsaXRfcG1kX21ha2Vfc29mdGxlYWYoc3RhdGUsIHBmbik7XFxuK1xcdFxcdFxcdHB0ZV90IGVudHJ5ID0gc29mdGxlYWZfdG9fcHRlKGxlYWYpO1xcbitcXG4rXFx0XFx0XFx0aWYgKHN0YXRlLVxcdTAwM2Vzb2Z0X2RpcnR5KVxcbiBcXHRcXHRcXHRcXHRlbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKHVmZmRfd3ApXFxuLVxcdFxcdFxcdFxcdGVudHJ5ID0gcHRlX3N3cF9ta3VmZmQoZW50cnkpO1xcbi1cXHRcXHRcXHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xcbi1cXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUgKyBpLCBlbnRyeSk7XFxuLVxcdFxcdH1cXG4tXFx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcXG4tXFx0XFx0cHRlX3QgZW50cnk7XFxuLVxcdFxcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcXG4tXFxuLVxcdFxcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcXHUwMDNjIEhQQUdFX1BNRF9OUjsgaSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBhbm9uX2V4Y2x1c2l2ZSB3YXMgYWxyZWFkeSBwcm9wYWdhdGVkIHRvIHRoZSByZWxldmFudFxcbi1cXHRcXHRcXHQgKiBwYWdlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwdGUgZW50cmllcyB3aGVuIGZyZWV6ZVxcbi1cXHRcXHRcXHQgKiBpcyBmYWxzZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICh3cml0ZSlcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcXG4tXFx0XFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRcXHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHRwYWdlX3RvX3BmbihwYWdlICsgaSkpO1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBZb3VuZyBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb2dhdGVkIHZpYSBzd3BfZW50cnlcXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xcbi1cXHRcXHRcXHRpZiAoc29mdF9kaXJ0eSlcXG4tXFx0XFx0XFx0XFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XFxuLVxcdFxcdFxcdGlmICh1ZmZkX3dwKVxcbitcXHRcXHRcXHRpZiAoc3RhdGUtXFx1MDAzZXVmZmQpXFxuIFxcdFxcdFxcdFxcdGVudHJ5ID0gcHRlX3N3cF9ta3VmZmQoZW50cnkpO1xcbiBcXHRcXHRcXHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xcbiBcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUgKyBpLCBlbnRyeSk7XFxuQEAgLTMzOTQsMjAgKzMzMzYsMjAgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuIFxcdFxcdHB0ZV90IGVudHJ5O1xcbiBcXG4gXFx0XFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cXHUwMDNldm1fcGFnZV9wcm90KSk7XFxuLVxcdFxcdGlmICh3cml0ZSlcXG4rXFx0XFx0aWYgKHN0YXRlLVxcdTAwM2V3cml0ZSlcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbWt3cml0ZShlbnRyeSwgdm1hKTtcXG4tXFx0XFx0aWYgKCF5b3VuZylcXG4rXFx0XFx0aWYgKCFzdGF0ZS1cXHUwMDNleW91bmcpXFxuIFxcdFxcdFxcdGVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTtcXG4gXFx0XFx0LyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi9cXG4tXFx0XFx0aWYgKGRpcnR5KVxcbitcXHRcXHRpZiAoc3RhdGUtXFx1MDAzZWRpcnR5KVxcbiBcXHRcXHRcXHRlbnRyeSA9IHB0ZV9ta2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0aWYgKHNvZnRfZGlydHkpXFxuK1xcdFxcdGlmIChzdGF0ZS1cXHUwMDNlc29mdF9kaXJ0eSlcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0aWYgKHVmZmRfd3ApXFxuK1xcdFxcdGlmIChzdGF0ZS1cXHUwMDNldWZmZClcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTtcXG4gXFxuIFxcdFxcdC8qIFJlc3RvcmUgUEFHRV9OT05FIHNvIGFuIFJXUCBtYXJrZXIga2VlcHMgdHJhcHBpbmcgKi9cXG4tXFx0XFx0aWYgKHVzZXJmYXVsdGZkX3J3cCh2bWEpIFxcdTAwMjZcXHUwMDI2IHVmZmRfd3ApXFxuK1xcdFxcdGlmICh1c2VyZmF1bHRmZF9yd3Aodm1hKSBcXHUwMDI2XFx1MDAyNiBzdGF0ZS1cXHUwMDNldWZmZClcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xcbiBcXG4gXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEhQQUdFX1BNRF9OUjsgaSsrKVxcbkBAIC0zNDE3LDE1ICszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcXG4gXFx0fVxcbiBcXHRwdGVfdW5tYXAocHRlKTtcXG4gXFxuLVxcdGlmICghcG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSlcXG4tXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xcbi1cXHRpZiAoZnJlZXplKVxcbitcXHRpZiAocm1hcHBlZClcXG4rXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKHN0YXRlLVxcdTAwM2Vmb2xpbywgcGFnZSwgdm1hKTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2VmcmVlemUpXFxuIFxcdFxcdHB1dF9wYWdlKHBhZ2UpO1xcbiBcXG4gXFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cXG4gXFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpO1xcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbitcXHRcXHRib29sIGZyZWV6ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xcbitcXHRcXHQuZm9saW8gPSBmb2xpbyxcXG4rXFx0XFx0LmlzX3ByZXNlbnQgPSB0cnVlLFxcbitcXHRcXHQuZnJlZXplID0gZnJlZXplLFxcbitcXHR9O1xcbitcXG4rXFx0LypcXG4rXFx0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcXG4rXFx0ICogd2hvbGUgYWNjZXNzIHRvIHRoZSBodWdlcGFnZSBkdXJpbmcgdGhlIHNwbGl0ICh3aGljaCBoYXBwZW5zIGluXFxuK1xcdCAqIHBsYWNlKS4gSWYgd2Ugb3ZlcndyaXRlIHRoZSBwbWQgd2l0aCB0aGUgbm90LWh1Z2UgdmVyc2lvbiBwb2ludGluZ1xcbitcXHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xcbitcXHQgKiBmcmVlKSwgdXNlcmxhbmQgY291bGQgdHJpZ2dlciBhIHNtYWxsIHBhZ2Ugc2l6ZSBUTEIgbWlzcyBvbiB0aGVcXG4rXFx0ICogc21hbGwgc2l6ZWQgVExCIHdoaWxlIHRoZSBodWdlcGFnZSBUTEIgZW50cnkgaXMgc3RpbGwgZXN0YWJsaXNoZWQgaW5cXG4rXFx0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2Vzbid0IGxpa2UgdGhhdC4gU2VlXFxuK1xcdCAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0gMzgzIG9uXFxuK1xcdCAqIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0IGl0J3Mgb25seSBzYWZlXFxuK1xcdCAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW5cXG4rXFx0ICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZSkuIEJ1dCBpdCBpc1xcbitcXHQgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZVxcbitcXHQgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2ZcXG4rXFx0ICogZG9pbmcgXFxcInBtZF9wb3B1bGF0ZSgpOyBmbHVzaF9wbWRfdGxiX3JhbmdlKCk7XFxcIiB3ZSBmaXJzdCBtYXJrIHRoZVxcbitcXHQgKiBjdXJyZW50IHBtZCBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2VcXG4rXFx0ICogbXVzdCByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcyBjb21wbGV0ZVxcbitcXHQgKiBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5IHdlIHdyaXRlIHRoZVxcbitcXHQgKiBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aCBwbWRfcG9wdWxhdGUuXFxuK1xcdCAqXFxuK1xcdCAqIFRoaXMgbXVzdCBhbHNvIGhhcHBlbiBiZWZvcmUgUGFnZUFub25FeGNsdXNpdmUoKSBpcyByZWFkIGJlbG93LCBzZWVcXG4rXFx0ICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKS5cXG4rXFx0ICovXFxuK1xcdGNvbnN0IHBtZF90IHBtZHZhbCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xcbitcXG4rXFx0c3RhdGUucGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XFxuK1xcdHN0YXRlLndyaXRlID0gcG1kX3dyaXRlKHBtZHZhbCk7XFxuK1xcdHN0YXRlLnlvdW5nID0gcG1kX3lvdW5nKHBtZHZhbCk7XFxuK1xcdHN0YXRlLmRpcnR5ID0gcG1kX2RpcnR5KHBtZHZhbCk7XFxuK1xcdHN0YXRlLnNvZnRfZGlydHkgPSBwbWRfc29mdF9kaXJ0eShwbWR2YWwpO1xcbitcXHRzdGF0ZS51ZmZkID0gcG1kX3VmZmQocG1kdmFsKTtcXG4rXFx0c3RhdGUuYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShzdGF0ZS5wYWdlKTtcXG4rXFxuK1xcdGlmIChzdGF0ZS5kaXJ0eSlcXG4rXFx0XFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcXG4rXFxuK1xcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcXG4rXFxuK1xcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcXHUwMDI2c3RhdGUpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgcG1kX3Qgb2xkX3BtZCxcXG4rXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBmcmVlemUpXFxuK3tcXG4rXFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xcbitcXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xcbitcXHRcXHQuZm9saW8gPSBmb2xpbyxcXG4rXFx0XFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcXG4rXFx0XFx0LmlzX2RldmljZV9wcml2YXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGUoZW50cnkpLFxcbitcXHRcXHQuZnJlZXplID0gZnJlZXplLFxcbitcXHRcXHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcXG4rXFx0XFx0LnVmZmQgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCksXFxuK1xcdH07XFxuK1xcbitcXHRpZiAoc3RhdGUuaXNfZGV2aWNlX3ByaXZhdGUpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogRGV2aWNlIHByaXZhdGUgZm9saW9zIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHJlZ3VsYXIgZm9saW9zXFxuK1xcdFxcdCAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlXFxuK1xcdFxcdCAqIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0c3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19kZXZpY2VfcHJpdmF0ZV93cml0ZShlbnRyeSk7XFxuK1xcdFxcdHN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcXG4rXFx0XFx0c3RhdGUueW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xcbitcXHRcXHRzdGF0ZS5kaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XFxuK1xcdFxcdHN0YXRlLmFub25fZXhjbHVzaXZlID1cXG4rXFx0XFx0XFx0c29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcXG4rXFx0fVxcbitcXG4rXFx0c3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsIFxcdTAwMjZzdGF0ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGhhZGRyLCBib29sIGZyZWV6ZSlcXG4re1xcbitcXHRjb25zdCBwbWRfdCBvbGRfcG1kID0gKnBtZDtcXG4rXFx0Y29uc3QgYm9vbCBpc19wcmVzZW50ID0gcG1kX3ByZXNlbnQob2xkX3BtZCk7XFxuK1xcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuK1xcbitcXHRWTV9CVUdfT04oaGFkZHIgXFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xcbitcXHRWTV9CVUdfT05fVk1BKHZtYS1cXHUwMDNldm1fc3RhcnQgXFx1MDAzZSBoYWRkciwgdm1hKTtcXG4rXFx0Vk1fQlVHX09OX1ZNQSh2bWEtXFx1MDAzZXZtX2VuZCBcXHUwMDNjIGhhZGRyICsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XFxuK1xcbitcXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9pc192YWxpZF9zb2Z0bGVhZihvbGRfcG1kKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xcbitcXG4rXFx0Y291bnRfdm1fZXZlbnQoVEhQX1NQTElUX1BNRCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xcbitcXHQgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93XFxuK1xcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xcbitcXHQgKlxcbitcXHQgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvIHNtYWxsXFxuK1xcdCAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGVcXG4rXFx0ICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXFxuK1xcdCAqL1xcbitcXHRpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkge1xcbitcXHRcXHRfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGZvbGlvID0gbm9ybWFsX29yX3NvZnRsZWFmX2ZvbGlvX3BtZCh2bWEsIGhhZGRyLCBvbGRfcG1kLCBpc19wcmVzZW50KTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgbm9uLXByZXNlbnQgZW50cnkgd2hpY2ggaXMgbmVpdGhlciBhIG1pZ3JhdGlvbiBub3IgYSBkZXZpY2VcXG4rXFx0ICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHlcXG4rXFx0ICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2hcXG4rXFx0ICogbWVhbnMgbm90aGluZy5cXG4rXFx0ICovXFxuK1xcdGlmICh1bmxpa2VseSghaXNfcHJlc2VudCBcXHUwMDI2XFx1MDAyNiAhZm9saW8pKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAoIWZvbGlvIHx8ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XFxuK1xcdFxcdHVubWFwX2h1Z2VfcG1kX2VudHJ5KHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGlzX3ByZXNlbnQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChpc19wcmVzZW50KVxcbitcXHRcXHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQodm1hLCBoYWRkciwgcG1kLCBvbGRfcG1kLCBmb2xpbyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgZnJlZXplKTtcXG4rfVxcbitcXG4gdm9pZCBzcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4gXFx0XFx0XFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXFxuIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuOTkxMjc4MjYyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1MzcxNjE3MTQ2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiREVWSUNFX1BSSVZBVEVcIixcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic3BsaXRfaHVnZV9wbWRfbG9ja2VkXCIsXG4gICAgXCJfX3NwbGl0X2h1Z2VfcG1kXCIsXG4gICAgXCJzcGxpdF9odWdlX3BtZF9hZGRyZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBzcGxpdCBsb2dpYyBpbiBtbS9odWdlX21lbW9yeS5jLCBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBwcmVzZW50IHZzIG5vbi1wcmVzZW50IChtaWdyYXRpb24sIGRldmljZS1wcml2YXRlKSBodWdlIFBNRHMgYW5kIHJlb3JnYW5pemluZyBybWFwIGNvbnZlcnNpb24gYW5kIHVubWFwcGluZyBsb2dpYy4gVGhpcyBjb3JlIE1NIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIHZpYSB1c2VyIGFjdGlvbnMgKG1hZHZpc2UsIG1wcm90ZWN0LCBwYWdlIG1pZ3JhdGlvbiwgZXRjLikgYW5kIGlzIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDM3YWZkYTJkMTA5NGIwYTlkZjIwMGM1MzViZDRiMDEyNDdhOWY3MTFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyOCAxOTozOToyMSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTMxMzksMTkzICszMTM5LDE3MyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG4tXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxuKy8qXG4rICogT25seSBhIGh1Z2UgemVybyBQTUQgaW4gYW4gYW5vbnltb3VzIFZNQSBpcyBzcGxpdCwgaW50byBhIHBhZ2UgdGFibGUgb2ZcbisgKiBzaGFyZWQgemVybyBwYWdlIG1hcHBpbmdzLiBBbnkgb3RoZXIgaHVnZSB6ZXJvIFBNRCBpcyBzaW1wbHkgdW5tYXBwZWQuXG4rICovXG4rc3RhdGljIGJvb2wgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90IHBtZHZhbClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHBndGFibGVfdCBwZ3RhYmxlO1xuLVx0cG1kX3Qgb2xkX3BtZCwgX3BtZDtcbi1cdGJvb2wgc29mdF9kaXJ0eSwgdWZmZF93cCA9IGZhbHNlLCB5b3VuZyA9IGZhbHNlLCB3cml0ZSA9IGZhbHNlO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyO1xuLVx0cHRlX3QgKnB0ZTtcbi1cdGludCBpO1xuLVxuLVx0Vk1fQlVHX09OKGhhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fZW5kIFx1MDAzYyBoYWRkciArIEhQQUdFX1BNRF9TSVpFLCB2bWEpO1xuK1x0cmV0dXJuIGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSBcdTAwMjZcdTAwMjYgdm1hX2lzX2Fub255bW91cyh2bWEpO1xuK31cbiBcbi1cdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpIFx1MDAyNlx1MDAyNiAhcG1kX3RyYW5zX2h1Z2UoKnBtZCkpO1xuKy8qKlxuKyAqIHVubWFwX2h1Z2VfcG1kX2VudHJ5KCkgLSBVbm1hcCBhIGh1Z2UgUE1EIGVudHJ5IHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdC5cbisgKiBAdm1hOiBUaGUgVk1BIEBwbWQgYmVsb25ncyB0by5cbisgKiBAaGFkZHI6IFRoZSBQTUQtYWxpZ25lZCBhZGRyZXNzIEBwbWQgbWFwcy5cbisgKiBAcG1kOiBQb2ludGVyIHRvIHRoZSBodWdlIFBNRCBlbnRyeS5cbisgKiBAZm9saW86IFRoZSBmb2xpbyBAcG1kIGRlc2NyaWJlcywgb3IgTlVMTCBpZiBpdCBkZXNjcmliZXMgbm9uZS5cbisgKiBAaXNfcHJlc2VudDogSXMgQHBtZCBhIHByZXNlbnQgZW50cnkgcmF0aGVyIHRoYW4gYSBzb2Z0bGVhZiBlbnRyeT9cbisgKlxuKyAqIE9ubHkgYW5vbnltb3VzIGZvbGlvcyBhcmUgcmVidWlsdCBhdCBQVEUgbGV2ZWwgd2hlbiBhIGh1Z2UgUE1EIGVudHJ5IGlzXG4rICogc3BsaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB1bm1hcHBlZCBoZXJlIGFuZCBmYXVsdGVkIGJhY2sgaW4gb24gdGhlIG5leHRcbisgKiBhY2Nlc3MuXG4rICovXG4rc3RhdGljIHZvaWQgdW5tYXBfaHVnZV9wbWRfZW50cnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdGJvb2wgaXNfcHJlc2VudClcbit7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcdHBtZF90IG9sZF9wbWQ7XG4gXG4tXHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbitcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbitcdC8qXG4rXHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXG4rXHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbitcdCAqL1xuK1x0aWYgKGhhc19kZXBvc2l0ZWRfcGd0YWJsZSh2bWEsIG9sZF9wbWQsIGZvbGlvKSlcbitcdFx0emFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTtcbiBcbi1cdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG4tXHRcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTb1xuLVx0XHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbi1cdFx0ICovXG4tXHRcdGlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKVxuLVx0XHRcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XG4tXHRcdGlmICh2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRpZiAodW5saWtlbHkocG1kX2lzX21pZ3JhdGlvbl9lbnRyeShvbGRfcG1kKSkpIHtcbi1cdFx0XHRjb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVxuLVx0XHRcdGZvbGlvID0gc29mdGxlYWZfdG9fZm9saW8ob2xkX2VudHJ5KTtcbi1cdFx0fSBlbHNlIGlmIChpc19odWdlX3plcm9fcG1kKG9sZF9wbWQpKSB7XG4tXHRcdFx0cmV0dXJuO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgcG1kX2RpcnR5KG9sZF9wbWQpKVxuLVx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4tXHRcdFx0XHRmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7XG4tXHRcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xuLVx0XHRcdGFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTtcbi1cdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuLVx0XHRcdHJldHVybjtcbi1cdFx0fVxuLVx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4rXHRpZiAoIWZvbGlvKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHRpZiAoaXNfaHVnZV96ZXJvX3BtZCgqcG1kKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xuLVx0XHQgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93XG4tXHRcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuLVx0XHQgKlxuLVx0XHQgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvXG4tXHRcdCAqIHNtYWxsIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsXG4tXHRcdCAqIHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXG4tXHRcdCAqL1xuLVx0XHRyZXR1cm4gX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTtcbitcdGlmIChpc19wcmVzZW50KSB7XG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4rXG4rXHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4rXHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuK1x0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4gXHR9XG4gXG4tXHRpZiAocG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuK1x0YWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1IUEFHRV9QTURfTlIpO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoaXNfcHJlc2VudClcbitcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbit9XG4gXG4tXHRcdHNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7XG4tXHRcdHVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7XG4rc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRib29sIGlzX3ByZXNlbnQ7XG4rXHRib29sIGlzX2RldmljZV9wcml2YXRlO1xuK1x0Ym9vbCBmcmVlemU7XG4rXHRib29sIHdyaXRlO1xuK1x0Ym9vbCB5b3VuZztcbitcdGJvb2wgZGlydHk7XG4rXHRib29sIHNvZnRfZGlydHk7XG4rXHRib29sIHVmZmQ7XG4rXHRib29sIGFub25fZXhjbHVzaXZlO1xuK307XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbi1cdFx0aWYgKFBhZ2VBbm9uKHBhZ2UpKVxuLVx0XHRcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbi1cdFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xuLVx0XHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XG4tXHR9IGVsc2UgaWYgKHBtZF9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuKy8qXG4rICogQ29udmVydCB0aGUgZm9saW8ncyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy5cbisgKlxuKyAqIFdpdGhvdXQgXCJmcmVlemVcIiwgd2UnbGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxuKyAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3JcbisgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLlxuKyAqXG4rICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbisgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcbisgKiBtYW5hZ2VkIHRvIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCkgLS0gc2VlXG4rICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbisgKlxuKyAqIEluIGNhc2Ugd2UgY2Fubm90IGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCksIHNwbGl0IHRoZSBQTURcbisgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbisgKlxuKyAqIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpOiBpbnZhbGlkYXRlIFBNRCBmaXJzdC5cbisgKlxuKyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIG1hcHBpbmcgbWF5IHN0aWxsIGJlIGZyb3plbi5cbisgKi9cbitzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXG4rXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxuK3tcbitcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZnJlZXplIFx1MDAyNlx1MDAyNlxuK1x0ICAgICghc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUgfHxcbitcdCAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLVx1MDAzZWZvbGlvLCBzdGF0ZS1cdTAwM2VwYWdlKSkpXG4rXHRcdHJldHVybiB0cnVlO1xuIFxuLVx0XHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xuK1x0Zm9saW9fcmVmX2FkZChzdGF0ZS1cdTAwM2Vmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4rXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoc3RhdGUtXHUwMDNlZm9saW8sIHN0YXRlLVx1MDAzZXBhZ2UsIEhQQUdFX1BNRF9OUiwgdm1hLFxuK1x0XHRcdFx0IGhhZGRyLCBybWFwX2ZsYWdzKTtcbitcdHJldHVybiBmYWxzZTtcbit9XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuLVx0XHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuKy8qXG4rICogQnVpbGQgdGhlIGxlYWYgZW50cnkgZm9yIHRoZSBQVEUgZW50cnkgZGVzY3JpYmluZyBAcGZuLCBmb3IgYSBodWdlIFBNRCBlbnRyeVxuKyAqIHdoaWNoIGlzIG5vdCByZXN0b3JlZCBhcyBhIHByZXNlbnQgbWFwcGluZy5cbisgKi9cbitzdGF0aWMgc29mdGxlYWZfdCBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBmbilcbit7XG4rXHRzb2Z0bGVhZl90IGVudHJ5O1xuIFxuK1x0aWYgKHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlIFx1MDAyNlx1MDAyNiAhc3RhdGUtXHUwMDNlZnJlZXplKSB7XG4gXHRcdC8qXG4tXHRcdCAqIERldmljZSBwcml2YXRlIFRIUCBzaG91bGQgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyXG4tXHRcdCAqIGZvbGlvcyB3LnIudCBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZy4gU2VlIHRoZSBjb21tZW50cyBmb3Jcbi1cdFx0ICogZm9saW8gaGFuZGxpbmcgYW5kIGFub25fZXhjbHVzaXZlIGJlbG93LlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qXG4tXHRcdCAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXNcbi1cdFx0ICogdGhlIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2hcbi1cdFx0ICogaGFwcGVucyBpbiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlXG4tXHRcdCAqIHZlcnNpb24gcG9pbnRpbmcgdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWZcbi1cdFx0ICogYWxsIENQVXMgd2VyZSBidWcgZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlXG4tXHRcdCAqIHNpemUgVExCIG1pc3Mgb24gdGhlIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCXG4tXHRcdCAqIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24ndFxuLVx0XHQgKiBsaWtlIHRoYXQuIFNlZVxuLVx0XHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtXG4tXHRcdCAqIDM4MyBvbiBwYWdlIDEwNS4gSW50ZWwgc2hvdWxkIGJlIHNhZmUgYnV0IGlzIGFsc28gd2FybnMgdGhhdFxuLVx0XHQgKiBpdCdzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGVcbi1cdFx0ICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkXG4tXHRcdCAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93XG4tXHRcdCAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmVcbi1cdFx0ICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7XG4tXHRcdCAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZFxuLVx0XHQgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdFxuLVx0XHQgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpc1xuLVx0XHQgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5XG4tXHRcdCAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aFxuLVx0XHQgKiBwbWRfcG9wdWxhdGUuXG4rXHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcbitcdFx0ICogdGhlIFBURSBlbnRyaWVzIGJ5IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLCBhbmQgYWNjZXNzZWRcbitcdFx0ICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZVxuK1x0XHQgKiBlbnRyaWVzLlxuIFx0XHQgKi9cbi1cdFx0b2xkX3BtZCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuLVx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0aWYgKHBtZF9kaXJ0eShvbGRfcG1kKSkge1xuLVx0XHRcdGRpcnR5ID0gdHJ1ZTtcbi1cdFx0XHRmb2xpb19zZXRfZGlydHkoZm9saW8pO1xuLVx0XHR9XG4tXHRcdHdyaXRlID0gcG1kX3dyaXRlKG9sZF9wbWQpO1xuLVx0XHR5b3VuZyA9IHBtZF95b3VuZyhvbGRfcG1kKTtcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3VmZmQob2xkX3BtZCk7XG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0XHRyZXR1cm4gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0XHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0fVxuIFxuLVx0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7XG4tXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbitcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xuK1x0ZWxzZSBpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KHBmbik7XG4rXHRlbHNlXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkocGZuKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2l0aG91dCBcImZyZWV6ZVwiLCB3ZSdsbCBzaW1wbHkgc3BsaXQgdGhlIFBNRCwgcHJvcGFnYXRpbmcgdGhlXG4tXHRcdCAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3Jcbi1cdFx0ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci5cbi1cdFx0ICpcbi1cdFx0ICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbi1cdFx0ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXG4tXHRcdCAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcbi1cdFx0ICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbi1cdFx0ICpcbi1cdFx0ICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxuLVx0XHQgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbi1cdFx0ICpcbi1cdFx0ICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxuLVx0XHQgKi9cbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH1cbitcdGlmIChzdGF0ZS1cdTAwM2V5b3VuZylcbitcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZGlydHkpXG4rXHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfZGlydHkoZW50cnkpO1xuK1xuK1x0cmV0dXJuIGVudHJ5O1xuK31cbitcbisvKlxuKyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWVcbisgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuXG4rICovXG4rc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUpXG4re1xuK1x0LyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovXG4rXHRjb25zdCBib29sIHJtYXBwZWQgPSBzdGF0ZS1cdTAwM2Vpc19wcmVzZW50IHx8IHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlO1xuK1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4rXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLVx1MDAzZXBhZ2U7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4rXHRwZ3RhYmxlX3QgcGd0YWJsZTtcbitcdHBtZF90IF9wbWQ7XG4rXHRwdGVfdCAqcHRlO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAocm1hcHBlZClcbitcdFx0c3RhdGUtXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcbiBcbiBcdC8qXG4tXHQgKiBXaXRoZHJhdyB0aGUgdGFibGUgb25seSBhZnRlciB3ZSBtYXJrIHRoZSBwbWQgZW50cnkgaW52YWxpZC5cbi1cdCAqIFRoaXMncyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuXG4rXHQgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGludmFsaWRhdGVkIGEgcHJlc2VudCBlbnRyeSwgYW5kIGEgc29mdGxlYWZcbitcdCAqIGVudHJ5IGlzIG5vdCBwcmVzZW50IHRvIGJlZ2luIHdpdGguIEVpdGhlciB3YXkgdGhlIGVudHJ5IGlzIG91dCBvZlxuK1x0ICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpc1xuK1x0ICogY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxuIFx0ICovXG4gXHRwZ3RhYmxlID0gcGd0YWJsZV90cmFuc19odWdlX3dpdGhkcmF3KG1tLCBwbWQpO1xuIFx0cG1kX3BvcHVsYXRlKG1tLCBcdTAwMjZfcG1kLCBwZ3RhYmxlKTtcbkBAIC0zMzM3LDU1ICszMzE3LDE3IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0ICogTm90ZSB0aGF0IE5VTUEgaGludGluZyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgdG9cbiBcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cbiBcdCAqL1xuLVx0aWYgKGZyZWV6ZSB8fCBwbWRfaXNfbWlncmF0aW9uX2VudHJ5KG9sZF9wbWQpKSB7XG4tXHRcdHB0ZV90IGVudHJ5O1xuLVx0XHRzd3BfZW50cnlfdCBzd3BfZW50cnk7XG4tXG4tXHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4tXHRcdFx0aWYgKHdyaXRlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihwYWdlICsgaSkpO1xuLVx0XHRcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XG4tXHRcdFx0aWYgKHlvdW5nKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcbi1cdFx0XHRpZiAoZGlydHkpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuK1x0aWYgKHN0YXRlLVx1MDAzZWZyZWV6ZSB8fCAhc3RhdGUtXHUwMDNlaXNfcHJlc2VudCkge1xuK1x0XHRmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgXHUwMDNjIEhQQUdFX1BNRF9OUjtcbitcdFx0ICAgICBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4rXHRcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlICsgaSk7XG4rXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cbitcdFx0XHRcdHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKHN0YXRlLCBwZm4pO1xuK1x0XHRcdHB0ZV90IGVudHJ5ID0gc29mdGxlYWZfdG9fcHRlKGxlYWYpO1xuK1xuK1x0XHRcdGlmIChzdGF0ZS1cdTAwM2Vzb2Z0X2RpcnR5KVxuIFx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4tXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuLVx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcbi1cdFx0cHRlX3QgZW50cnk7XG4tXHRcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcbi1cbi1cdFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHJlbGV2YW50XG4tXHRcdFx0ICogcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHRlIGVudHJpZXMgd2hlbiBmcmVlemVcbi1cdFx0XHQgKiBpcyBmYWxzZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGUpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFlvdW5nIGFuZCBkaXJ0eSBiaXRzIGFyZSBub3QgcHJvZ2F0ZWQgdmlhIHN3cF9lbnRyeVxuLVx0XHRcdCAqL1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuLVx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4rXHRcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbiBcdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuIFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbkBAIC0zMzk0LDIwICszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRwdGVfdCBlbnRyeTtcbiBcbiBcdFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbi1cdFx0aWYgKHdyaXRlKVxuK1x0XHRpZiAoc3RhdGUtXHUwMDNld3JpdGUpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWt3cml0ZShlbnRyeSwgdm1hKTtcbi1cdFx0aWYgKCF5b3VuZylcbitcdFx0aWYgKCFzdGF0ZS1cdTAwM2V5b3VuZylcbiBcdFx0XHRlbnRyeSA9IHB0ZV9ta29sZChlbnRyeSk7XG4gXHRcdC8qIE5PVEU6IHRoaXMgbWF5IHNldCBzb2Z0LWRpcnR5IHRvbyBvbiBzb21lIGFyY2hzICovXG4tXHRcdGlmIChkaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZWRpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpO1xuLVx0XHRpZiAoc29mdF9kaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZXNvZnRfZGlydHkpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcbi1cdFx0aWYgKHVmZmRfd3ApXG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V1ZmZkKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rdWZmZChlbnRyeSk7XG4gXG4gXHRcdC8qIFJlc3RvcmUgUEFHRV9OT05FIHNvIGFuIFJXUCBtYXJrZXIga2VlcHMgdHJhcHBpbmcgKi9cbi1cdFx0aWYgKHVzZXJmYXVsdGZkX3J3cCh2bWEpIFx1MDAyNlx1MDAyNiB1ZmZkX3dwKVxuK1x0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKylcbkBAIC0zNDE3LDE1ICszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbiBcdH1cbiBcdHB0ZV91bm1hcChwdGUpO1xuIFxuLVx0aWYgKCFwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKVxuLVx0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4tXHRpZiAoZnJlZXplKVxuK1x0aWYgKHJtYXBwZWQpXG4rXHRcdGZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS1cdTAwM2Vmb2xpbywgcGFnZSwgdm1hKTtcbitcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUpXG4gXHRcdHB1dF9wYWdlKHBhZ2UpO1xuIFxuIFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0Ym9vbCBmcmVlemUpXG4re1xuK1x0c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHtcbitcdFx0LmZvbGlvID0gZm9saW8sXG4rXHRcdC5pc19wcmVzZW50ID0gdHJ1ZSxcbitcdFx0LmZyZWV6ZSA9IGZyZWV6ZSxcbitcdH07XG4rXG4rXHQvKlxuK1x0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcbitcdCAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpblxuK1x0ICogcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZSB2ZXJzaW9uIHBvaW50aW5nXG4rXHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xuK1x0ICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlXG4rXHQgKiBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpblxuK1x0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2Vzbid0IGxpa2UgdGhhdC4gU2VlXG4rXHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtIDM4MyBvblxuK1x0ICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQncyBvbmx5IHNhZmVcbitcdCAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW5cbitcdCAqIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXNcbitcdCAqIGdlbmVyYWxseSBzYWZlciB0byBuZXZlciBhbGxvdyBzbWFsbCBhbmQgaHVnZSBUTEIgZW50cmllcyBmb3IgdGhlXG4rXHQgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2ZcbitcdCAqIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7IGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZVxuK1x0ICogY3VycmVudCBwbWQgbm90cHJlc2VudCAoYXRvbWljYWxseSBiZWNhdXNlIGhlcmUgdGhlIHBtZF90cmFuc19odWdlXG4rXHQgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlXG4rXHQgKiBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5IHdlIHdyaXRlIHRoZVxuK1x0ICogbm9uLWh1Z2UgdmVyc2lvbiBvZiB0aGUgcG1kIGVudHJ5IHdpdGggcG1kX3BvcHVsYXRlLlxuK1x0ICpcbitcdCAqIFRoaXMgbXVzdCBhbHNvIGhhcHBlbiBiZWZvcmUgUGFnZUFub25FeGNsdXNpdmUoKSBpcyByZWFkIGJlbG93LCBzZWVcbitcdCAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCkuXG4rXHQgKi9cbitcdGNvbnN0IHBtZF90IHBtZHZhbCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuK1xuK1x0c3RhdGUucGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XG4rXHRzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpO1xuK1x0c3RhdGUueW91bmcgPSBwbWRfeW91bmcocG1kdmFsKTtcbitcdHN0YXRlLmRpcnR5ID0gcG1kX2RpcnR5KHBtZHZhbCk7XG4rXHRzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTtcbitcdHN0YXRlLnVmZmQgPSBwbWRfdWZmZChwbWR2YWwpO1xuK1x0c3RhdGUuYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShzdGF0ZS5wYWdlKTtcbitcbitcdGlmIChzdGF0ZS5kaXJ0eSlcbitcdFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcbitcbitcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcbitcbitcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBwbWRfdCBvbGRfcG1kLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSlcbit7XG4rXHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XG4rXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xuK1x0XHQuZm9saW8gPSBmb2xpbyxcbitcdFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcbitcdFx0LmlzX2RldmljZV9wcml2YXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGUoZW50cnkpLFxuK1x0XHQuZnJlZXplID0gZnJlZXplLFxuK1x0XHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcbitcdFx0LnVmZmQgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCksXG4rXHR9O1xuK1xuK1x0aWYgKHN0YXRlLmlzX2RldmljZV9wcml2YXRlKSB7XG4rXHRcdC8qXG4rXHRcdCAqIERldmljZSBwcml2YXRlIGZvbGlvcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIGZvbGlvc1xuK1x0XHQgKiB3LnIudC4gYW5vbiBleGNsdXNpdmUgaGFuZGxpbmcsIHNlZVxuK1x0XHQgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS5cbitcdFx0ICovXG4rXHRcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS55b3VuZyA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSk7XG4rXHRcdHN0YXRlLmRpcnR5ID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KTtcbitcdFx0c3RhdGUuYW5vbl9leGNsdXNpdmUgPVxuK1x0XHRcdHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7XG4rXHR9XG4rXG4rXHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXHUwMDI2c3RhdGUpO1xuK31cbitcbitzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4re1xuK1x0Y29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7XG4rXHRjb25zdCBib29sIGlzX3ByZXNlbnQgPSBwbWRfcHJlc2VudChvbGRfcG1kKTtcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXG4rXHRWTV9CVUdfT04oaGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9zdGFydCBcdTAwM2UgaGFkZHIsIHZtYSk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9lbmQgXHUwMDNjIGhhZGRyICsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XG4rXG4rXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9pc192YWxpZF9zb2Z0bGVhZihvbGRfcG1kKSBcdTAwMjZcdTAwMjZcbitcdFx0XHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xuK1xuK1x0Y291bnRfdm1fZXZlbnQoVEhQX1NQTElUX1BNRCk7XG4rXG4rXHQvKlxuK1x0ICogRklYTUU6IERvIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGJ5IGNhbGxpbmdcbitcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbitcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuK1x0ICpcbitcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8gc21hbGxcbitcdCAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGVcbitcdCAqIHNlY29uZGFyeSBtbXUgYXQgdGhpcyB0aW1lLlxuK1x0ICovXG4rXHRpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkge1xuK1x0XHRfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7XG4rXG4rXHQvKlxuK1x0ICogQSBub24tcHJlc2VudCBlbnRyeSB3aGljaCBpcyBuZWl0aGVyIGEgbWlncmF0aW9uIG5vciBhIGRldmljZVxuK1x0ICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHlcbitcdCAqIHdhcm5lZCBhYm91dCBpdC4gTGVhdmUgaXQgYWxvbmUgcmF0aGVyIHRoYW4gYWN0IG9uIGEgUEZOIHdoaWNoXG4rXHQgKiBtZWFucyBub3RoaW5nLlxuK1x0ICovXG4rXHRpZiAodW5saWtlbHkoIWlzX3ByZXNlbnQgXHUwMDI2XHUwMDI2ICFmb2xpbykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbitcdFx0dW5tYXBfaHVnZV9wbWRfZW50cnkodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgaXNfcHJlc2VudCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmIChpc19wcmVzZW50KVxuK1x0XHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XG4rXHRlbHNlXG4rXHRcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXG4rXHRcdFx0XHRcdCAgIGZyZWV6ZSk7XG4rfVxuK1xuIHZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuOTkxMjc5OTgyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzY1MjkzNDM0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEh1Z2UgUGFnZXMgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB0aGUgZnV6emluZyBzdHJhdGVneS4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIHRoaXMgZXZlbiB3YXJyYW50cyBmdXp6aW5nIGF0dGVudGlvbiwgYW5kIGlmIHNvLCB3aGF0IGNvbmZpZ3VyYXRpb25zIGFuZCBmb2N1cyBzeW1ib2xzIGFyZSBjcml0aWNhbC4gTXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBkaXNzZWN0IHRoZSBkaWZmLlxuXG5UaGUgY2hhbmdlcyBhcmUgY29uY2VudHJhdGVkIGluIGBtbS9odWdlX21lbW9yeS5jYCwgd2hpY2ggYWx3YXlzIHBpcXVlcyBteSBpbnRlcmVzdC4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggdG91Y2hlcyBhIGhhbmRmdWwgb2Yga2V5IGZ1bmN0aW9uczogYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcGAsIGBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZmAsIGBzcGxpdF9odWdlX3BtZF90b19wdGVzYCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLCBgdW5tYXBfaHVnZV9wbWRfZW50cnlgLCBhbmQgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YC4gVGhpcyBzdWdnZXN0cyBhIHBvdGVudGlhbCByZWZhY3RvcmluZyBvciBpbXByb3ZlbWVudCByZWxhdGVkIHRvIHNwbGl0dGluZyBodWdlIHBhZ2VzLCBsaWtlbHkgaW1wYWN0aW5nIG1lbW9yeSBtYW5hZ2VtZW50IGluIGEgc2lnbmlmaWNhbnQgd2F5LlxuXG5UbyBnZXQgYSBjbGVhcmVyIHBpY3R1cmUsIEknbGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCB0aGUgY29udGV4dCBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIHRoZSByZWxhdGVkIEtjb25maWcgb3B0aW9ucy4gSXQncyBjcnVjaWFsIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZSB3aWRlciBzeXN0ZW0gYW5kIGFueSBjb25maWd1cmF0aW9uIGtub2JzIHRoYXQgbWlnaHQgaW5mbHVlbmNlIHRoZWlyIGJlaGF2aW9yLiBLbm93aW5nIHdoaWNoIGNvbmZpZyBvcHRpb25zIHRyaWdnZXIgdGhvc2UgZnVuY3Rpb25zIHdpbGwgYmUgdGhlIGtleSB0byBkZXNpZ25pbmcgdGhlIHJpZ2h0IGZ1enppbmcgc3RyYXRlZ3kuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NjgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTozOToyNi42NDQyMTYxODhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk3Mzg0MTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3BsaXRfaHVnZV9wbWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTg5OD1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTkzMS1cXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbm1tL2d1cC5jOjkzMjpcXHRcXHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcyk7XFxubW0vZ3VwLmMtOTMzLVxcdFxcdC8qIElmIHBtZCB3YXMgbGVmdCBlbXB0eSwgc3R1ZmYgYSBwYWdlIHRhYmxlIGluIHRoZXJlIHF1aWNrbHkgKi9cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9MTkwOD1pbnQgY29weV9odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTk5MC1cXHRcXHRzcGluX3VubG9jayhkc3RfcHRsKTtcXG5tbS9odWdlX21lbW9yeS5jOjE5OTE6XFx0XFx0X19zcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBhZGRyLCBmYWxzZSk7XFxubW0vaHVnZV9tZW1vcnkuYy0xOTkyLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0yMTI1PXZtX2ZhdWx0X3QgZG9faHVnZV9wbWRfd3BfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMjIxNC1mYWxsYmFjazpcXG5tbS9odWdlX21lbW9yeS5jOjIyMTU6XFx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHZtZi1cXHUwMDNlcG1kLCB2bWYtXFx1MDAzZWFkZHJlc3MsIGZhbHNlKTtcXG5tbS9odWdlX21lbW9yeS5jLTIyMTYtXFx0cmV0dXJuIFZNX0ZBVUxUX0ZBTExCQUNLO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zMTk3PXN0cnVjdCBzcGxpdF9wbWRfc3RhdGUge1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zMjI5LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6MzIzMDpzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXFxubW0vaHVnZV9tZW1vcnkuYy0zMjMxLVxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zMjUyPXN0YXRpYyBzb2Z0bGVhZl90IHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zMjU5LVxcdFxcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcXG5tbS9odWdlX21lbW9yeS5jOjMyNjA6XFx0XFx0ICogdGhlIFBURSBlbnRyaWVzIGJ5IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLCBhbmQgYWNjZXNzZWRcXG5tbS9odWdlX21lbW9yeS5jLTMyNjEtXFx0XFx0ICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zMjg3LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6MzI4ODpzdGF0aWMgdm9pZCBzcGxpdF9odWdlX3BtZF90b19wdGVzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMzI4OS1cXHRcXHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSlcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzMwMS1cXHRpZiAocm1hcHBlZClcXG5tbS9odWdlX21lbW9yeS5jOjMzMDI6XFx0XFx0c3RhdGUtXFx1MDAzZWZyZWV6ZSA9IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcChzdGF0ZSwgdm1hLCBoYWRkcik7XFxubW0vaHVnZV9tZW1vcnkuYy0zMzAzLVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zMzcxPXN0YXRpYyB2b2lkIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM0MTgtXFxubW0vaHVnZV9tZW1vcnkuYzozNDE5OlxcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcXHUwMDI2c3RhdGUpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzQyMC19XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTM0MjI9c3RhdGljIHZvaWQgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM0MzktXFx0XFx0ICogdy5yLnQuIGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLCBzZWVcXG5tbS9odWdlX21lbW9yeS5jOjM0NDA6XFx0XFx0ICogc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCkuXFxubW0vaHVnZV9tZW1vcnkuYy0zNDQxLVxcdFxcdCAqL1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNDUxLVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzQ1MjpcXHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXFx1MDAyNnN0YXRlKTtcXG5tbS9odWdlX21lbW9yeS5jLTM0NTMtfVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzQ1NC1cXG5tbS9odWdlX21lbW9yeS5jOjM0NTU6c3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxubW0vaHVnZV9tZW1vcnkuYy0zNDU2LVxcdFxcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNDczLVxcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcXG5tbS9odWdlX21lbW9yeS5jOjM0NzQ6XFx0ICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/XFxubW0vaHVnZV9tZW1vcnkuYy0zNDc1LVxcdCAqXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM1MDctXFxubW0vaHVnZV9tZW1vcnkuYzozNTA4OnZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxubW0vaHVnZV9tZW1vcnkuYy0zNTA5LVxcdFxcdFxcdCAgIHBtZF90ICpwbWQsIGJvb2wgZnJlZXplKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTEyLVxcdGlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSB8fCBwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkpXFxubW0vaHVnZV9tZW1vcnkuYzozNTEzOlxcdFxcdF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzUxNC19XFxubW0vaHVnZV9tZW1vcnkuYy0zNTE1LVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzUxNjp2b2lkIF9fc3BsaXRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxubW0vaHVnZV9tZW1vcnkuYy0zNTE3LVxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgYm9vbCBmcmVlemUpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM1MjYtXFx0cHRsID0gcG1kX2xvY2sodm1hLVxcdTAwM2V2bV9tbSwgcG1kKTtcXG5tbS9odWdlX21lbW9yeS5jOjM1Mjc6XFx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcmFuZ2Uuc3RhcnQsIHBtZCwgZnJlZXplKTtcXG5tbS9odWdlX21lbW9yeS5jLTM1MjgtXFx0c3Bpbl91bmxvY2socHRsKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzUzMS1cXG5tbS9odWdlX21lbW9yeS5jOjM1MzI6dm9pZCBzcGxpdF9odWdlX3BtZF9hZGRyZXNzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxubW0vaHVnZV9tZW1vcnkuYy0zNTMzLVxcdFxcdGJvb2wgZnJlZXplKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTM5LVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzU0MDpcXHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzU0MS19XFxubW0vaHVnZV9tZW1vcnkuYy0zNTQyLVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzU0MzpzdGF0aWMgaW5saW5lIHZvaWQgc3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXFxubW0vaHVnZV9tZW1vcnkuYy0zNTQ0LXtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzU1MS1cXHRcXHRcXHQgQUxJR04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKSlcXG5tbS9odWdlX21lbW9yeS5jOjM1NTI6XFx0XFx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyh2bWEsIGFkZHJlc3MsIGZhbHNlKTtcXG5tbS9odWdlX21lbW9yeS5jLTM1NTMtfVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zNTU1PXZvaWQgdm1hX2FkanVzdF90cmFuc19odWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTYwLVxcdC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgc3RhcnQgZmlyc3QuICovXFxubW0vaHVnZV9tZW1vcnkuYzozNTYxOlxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIHN0YXJ0KTtcXG5tbS9odWdlX21lbW9yeS5jLTM1NjItXFxubW0vaHVnZV9tZW1vcnkuYy0zNTYzLVxcdC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgZW5kIG5leHQuICovXFxubW0vaHVnZV9tZW1vcnkuYzozNTY0OlxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIGVuZCk7XFxubW0vaHVnZV9tZW1vcnkuYy0zNTY1LVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTY3LVxcdGlmIChuZXh0KVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzU2ODpcXHRcXHRzcGxpdF9odWdlX3BtZF9pZl9uZWVkZWQobmV4dCwgZW5kKTtcXG5tbS9odWdlX21lbW9yeS5jLTM1NjktfVxcbi0tXFxubW0vbWVtb3J5LmM9MjEyMz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgemFwX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLFxcbi0tXFxubW0vbWVtb3J5LmMtMjEzNS1cXHRcXHRcXHRpZiAobmV4dCAtIGFkZHIgIT0gSFBBR0VfUE1EX1NJWkUpXFxubW0vbWVtb3J5LmM6MjEzNjpcXHRcXHRcXHRcXHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyLCBmYWxzZSk7XFxubW0vbWVtb3J5LmMtMjEzNy1cXHRcXHRcXHRlbHNlIGlmICh6YXBfaHVnZV9wbWQodGxiLCB2bWEsIHBtZCwgYWRkcikpIHtcXG4tLVxcbm1tL21lbW9yeS5jPTYzOTA9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHdwX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjQxNS1cXHQvKiBDT1cgb3Igd3JpdGUtbm90aWZ5IGhhbmRsZWQgb24gcHRlIGxldmVsOiBzcGxpdCBwbWQuICovXFxubW0vbWVtb3J5LmM6NjQxNjpcXHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgdm1mLVxcdTAwM2VwbWQsIHZtZi1cXHUwMDNlYWRkcmVzcywgZmFsc2UpO1xcbm1tL21lbW9yeS5jLTY0MTctXFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jPTkxMj1zdGF0aWMgaW50IG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBtaWdyYXRlX3ZtYSAqbWlncmF0ZSxcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTIxLVxcdC8qXFxubW0vbWlncmF0ZV9kZXZpY2UuYzo5MjI6XFx0ICogdGFrZSBhIHJlZmVyZW5jZSwgc2luY2Ugc3BsaXRfaHVnZV9wbWRfYWRkcmVzcygpIHdpdGggZnJlZXplID0gdHJ1ZVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTIzLVxcdCAqIGRyb3BzIGEgcmVmZXJlbmNlIGF0IHRoZSBlbmQuXFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jLTkyNS1cXHRmb2xpb19nZXQoZm9saW8pO1xcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI2OlxcdHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3MobWlncmF0ZS1cXHUwMDNldm1hLCBhZGRyLCB0cnVlKTtcXG5tbS9taWdyYXRlX2RldmljZS5jLTkyNy1cXHRyZXQgPSBmb2xpb19zcGxpdF91bm1hcHBlZChmb2xpbywgMCk7XFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jPTk3Nj1zdGF0aWMgdm9pZCBtaWdyYXRlX3ZtYV9pbnNlcnRfcGFnZShzdHJ1Y3QgbWlncmF0ZV92bWEgKm1pZ3JhdGUsXFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jLTEwMjEtXFx0XFx0XFx0XFx0Z290byBhYm9ydDtcXG5tbS9taWdyYXRlX2RldmljZS5jOjEwMjI6XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWRwLCBhZGRyKTtcXG5tbS9taWdyYXRlX2RldmljZS5jLTEwMjMtXFx0XFx0fSBlbHNlIGlmIChwbWRfbGVhZigqcG1kcCkpXFxuLS1cXG5tbS9tcHJvdGVjdC5jPTUwND1zdGF0aWMgaW5saW5lIGxvbmcgY2hhbmdlX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLFxcbi0tXFxubW0vbXByb3RlY3QuYy01MzItXFx0XFx0XFx0ICAgIHBndGFibGVfc3BsaXRfbmVlZGVkKHZtYSwgY3BfZmxhZ3MpKSB7XFxubW0vbXByb3RlY3QuYzo1MzM6XFx0XFx0XFx0XFx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkciwgZmFsc2UpO1xcbm1tL21wcm90ZWN0LmMtNTM0LVxcdFxcdFxcdFxcdC8qXFxuLS1cXG5tbS9tcmVtYXAuYz04MDQ9dW5zaWduZWQgbG9uZyBtb3ZlX3BhZ2VfdGFibGVzKHN0cnVjdCBwYWdldGFibGVfbW92ZV9jb250cm9sICpwbWMpXFxuLS1cXG5tbS9tcmVtYXAuYy04NjYtXFx0XFx0XFx0XFx0Y29udGludWU7XFxubW0vbXJlbWFwLmM6ODY3OlxcdFxcdFxcdHNwbGl0X2h1Z2VfcG1kKHBtYy1cXHUwMDNlb2xkLCBvbGRfcG1kLCBwbWMtXFx1MDAzZW9sZF9hZGRyKTtcXG5tbS9tcmVtYXAuYy04NjgtXFx0XFx0fSBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19IQVZFX01PVkVfUE1EKSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxubW0vcGFnZXdhbGsuYz05Nj1zdGF0aWMgaW50IHdhbGtfcG1kX3JhbmdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXFxuLS1cXG5tbS9wYWdld2Fsay5jLTE2Ny1cXHRcXHRpZiAod2Fsay1cXHUwMDNldm1hKVxcbm1tL3BhZ2V3YWxrLmM6MTY4OlxcdFxcdFxcdHNwbGl0X2h1Z2VfcG1kKHdhbGstXFx1MDAzZXZtYSwgcG1kLCBhZGRyKTtcXG5tbS9wYWdld2Fsay5jLTE2OS1cXHRcXHRlbHNlIGlmIChwbWRfbGVhZigqcG1kKSB8fCAhcG1kX3ByZXNlbnQoKnBtZCkpXFxuLS1cXG5tbS9ybWFwLmM9MjIwMT1zdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vcm1hcC5jLTIyODktXFx0XFx0XFx0XFx0ICovXFxubW0vcm1hcC5jOjIyOTA6XFx0XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcHZtdy5hZGRyZXNzLFxcbm1tL3JtYXAuYy0yMjkxLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHB2bXcucG1kLCBmYWxzZSk7XFxuLS1cXG5tbS9ybWFwLmM9MjQ2NT1zdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ybWFwLmMtMjUxOC1cXHRcXHRcXHRcXHQvKlxcbm1tL3JtYXAuYzoyNTE5OlxcdFxcdFxcdFxcdCAqIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZCgpIG1pZ2h0IGxlYXZlIHRoZVxcbm1tL3JtYXAuYy0yNTIwLVxcdFxcdFxcdFxcdCAqIGZvbGlvIG1hcHBlZCB0aHJvdWdoIFBURXMuIFJldHJ5IHRoZSB3YWxrXFxuLS1cXG5tbS9ybWFwLmMtMjUyMy1cXHRcXHRcXHRcXHQgKi9cXG5tbS9ybWFwLmM6MjUyNDpcXHRcXHRcXHRcXHRzcGxpdF9odWdlX3BtZF9sb2NrZWQodm1hLCBwdm13LmFkZHJlc3MsXFxubW0vcm1hcC5jLTI1MjUtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgcHZtdy5wbWQsIHRydWUpO1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz0yMDIwPXN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMjEyNi1cXHRcXHRcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbm1tL3VzZXJmYXVsdGZkLmM6MjEyNzpcXHRcXHRcXHRcXHRzcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBzcmNfYWRkcik7XFxubW0vdXNlcmZhdWx0ZmQuYy0yMTI4LVxcdFxcdFxcdFxcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjYuNjkzOTYwNDQ2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzE5NzAyNTg4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIEh1Z2UgUGFnZXMgYW5kIFNwbGl0IFBNRHMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBLY29uZmlnIG9wdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgKFRIUCkgYW5kIHNwbGl0IGh1Z2UgcGFnZSBQTURzLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBkaXZlIGludG8gdGhlIGNvcmUgZGlyZWN0b3JpZXMuIEkga25vdyB0aGVzZSBjb25maWd1cmF0aW9ucyBhcmUgb2Z0ZW4gZGVmaW5lZCBpbiBNYWtlZmlsZXMgYW5kIEtjb25maWdzLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgbG9va2luZyBpbnRvIGBtbS9NYWtlZmlsZWAgYW5kIHRoZW4gYG1tL0tjb25maWdgLiBUaG9zZSBhcmUgdHlwaWNhbGx5IHdoZXJlIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgZGVwZW5kZW5jaWVzIGFyZSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtLCBzbyBpdCdzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzLiBJJ20gYXNzdW1pbmcgdGhhdCB0aGUgcmVsZXZhbnQgb3B0aW9ucyB3aWxsIGJlIHVzZWQgaW4gYnVpbGQgbG9naWMgYW5kIG1heWJlIGV2ZW4gd2l0aGluIGAjaWZkZWZgIHN0YXRlbWVudHMgaW5zaWRlIGBodWdlX21lbW9yeS5jYCBpdHNlbGYuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNTcxLCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjkuODkwOTg4MjYxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNjM5NDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImh1Z2VfbWVtb3J5XFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTozOToyOS45NDM2MzUwMjlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDQxNjk4MTQ1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOlxuXG4qKktjb25maWcgRGl2ZSBmb3IgVEhQKipcblxuT2theSwgc28gSSBuZWVkIHRvIHF1aWNrbHkgc2VlIHdoZXJlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZGVmaW5lZCBpbiB0aGUgS2NvbmZpZyBoaWVyYXJjaHkuIEknbSBnb2luZyBzdHJhaWdodCB0byBgbW0vS2NvbmZpZ2AsIHRoYXQncyB0aGUgb2J2aW91cyBwbGFjZSB0byBzdGFydCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4gSXQncyB0aGUgbW9zdCBsb2dpY2FsIGxvY2F0aW9uIGZvciBhIHNldHRpbmcgcmVsYXRlZCB0byBodWdlIHBhZ2VzLCBnaXZlbiB0aGF0IGBtbWAgaXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTGV0J3Mgc2VlIHdoYXQncyBkZWZpbmVkIGluIHRoZXJlIGZvciB0aGlzIHBhcnRpY3VsYXIgZmVhdHVyZS4gSG9wZWZ1bGx5IGl0J3Mgc3RyYWlnaHRmb3J3YXJkIGFuZCBJIGNhbiBxdWlja2x5IGdyYXNwIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzkxMiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjM5OjUwLjM2MDYyMTYyN1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjQ2NzE2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODMyPWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04MzQtXFxubW0vS2NvbmZpZzo4MzU6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODM2LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg1Mz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODU4LVxcbm1tL0tjb25maWc6ODU5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2MC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg2NS1cXG5tbS9LY29uZmlnOjg2NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbm1tL0tjb25maWctODY3LVxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg3NC1cXG5tbS9LY29uZmlnOjg3NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg3Ni1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODgyPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04OTEtXFxubW0vS2NvbmZpZzo4OTI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg5My1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTAxLVxcbm1tL0tjb25maWc6OTAyOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTAzLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTA5LVxcbm1tL0tjb25maWc6OTEwOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MTEtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkxNy1cXG5tbS9LY29uZmlnOjkxODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkxOS1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkyNz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTM2LVxcbm1tL0tjb25maWc6OTM3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05MzgtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0NS1cXG5tbS9LY29uZmlnOjk0NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTk0Ny1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk1My1cXG5tbS9LY29uZmlnOjk1NDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTU1LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjEtXFxubW0vS2NvbmZpZzo5NjI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05NjMtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTozOTo1MC40MTMwOTU0MzVaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MTMwNDU1Mzg2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgVFJBTlNQQVJFTlRfSFVHRVBBR0UgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBmb3IgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8ganVtcCByaWdodCBpbnRvIGBtbS9LY29uZmlnYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDgzNS4gVGhhdCdzIHdoZXJlIEknZCBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBjb250cm9scyB3aGV0aGVyIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZW5hYmxlZC4gSXQncyBhIHByZXR0eSBzdGFuZGFyZCBsb2NhdGlvbiBmb3IgdGhhdCBraW5kIG9mIGRldGFpbCBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBUaW1lIHRvIGRpZyBpbiBhbmQgc2VlIHdoYXQgb3RoZXIgb3B0aW9ucyB0aGlzIHJlbGllcyBvbiwgYW5kIHdoYXQgdGhlIGltcGxpY2F0aW9ucyBhcmUgZm9yIG15IGFyZWEgb2YgZXhwZXJ0aXNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDgxMywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjM5OjU0LjU0MzU1MzI1MVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MjYwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDgzMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDgzMDpcXHRcXHQgIG1lbW9yeSBjb25zdHJhaW5lZC5cXG4gODMxOlxcdFxcbiA4MzI6XFx0Y29uZmlnIE1NX0lEXFxuIDgzMzpcXHRcXHRkZWZfYm9vbCBuXFxuIDgzNDpcXHRcXG4gODM1OlxcdG1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG4gODM2OlxcdFxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuIDgzNzpcXHRcXHRkZXBlbmRzIG9uIEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRSBcXHUwMDI2XFx1MDAyNiAhUFJFRU1QVF9SVFxcbiA4Mzg6XFx0XFx0c2VsZWN0IENPTVBBQ1RJT05cXG4gODM5OlxcdFxcdHNlbGVjdCBYQVJSQVlfTVVMVElcXG4gODQwOlxcdFxcdHNlbGVjdCBNTV9JRFxcbiA4NDE6XFx0XFx0aGVscFxcbiA4NDI6XFx0XFx0ICBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdXNlIGh1Z2UgcGFnZXMgYW5kXFxuIDg0MzpcXHRcXHQgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS5cXG4gODQ0OlxcdFxcdCAgVGhpcyBmZWF0dXJlIGNhbiBpbXByb3ZlIGNvbXB1dGluZyBwZXJmb3JtYW5jZSB0byBjZXJ0YWluXFxuIDg0NTpcXHRcXHQgIGFwcGxpY2F0aW9ucyBieSBzcGVlZGluZyB1cCBwYWdlIGZhdWx0cyBkdXJpbmcgbWVtb3J5XFxuIDg0NjpcXHRcXHQgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmdcXG4gODQ3OlxcdFxcdCAgdXAgdGhlIHBhZ2V0YWJsZSB3YWxraW5nLlxcbiA4NDg6XFx0XFxuIDg0OTpcXHRcXHQgIElmIG1lbW9yeSBjb25zdHJhaW5lZCBvbiBlbWJlZGRlZCwgeW91IG1heSB3YW50IHRvIHNheSBOLlxcbiA4NTA6XFx0XFxuIDg1MTpcXHRpZiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbiA4NTI6XFx0XFxuIDg1MzpcXHRjaG9pY2VcXG4gODU0OlxcdFxcdHByb21wdCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCBzeXNmcyBkZWZhdWx0c1xcXCJcXG4gODU1OlxcdFxcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxuIDg1NjpcXHRcXHRoZWxwXFxuIDg1NzpcXHRcXHQgIFNlbGVjdHMgdGhlIHN5c2ZzIGRlZmF1bHRzIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0LlxcbiA4NTg6XFx0XFxuIDg1OTpcXHRcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxuIDg2MDpcXHRcXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuIDg2MTpcXHRcXHRoZWxwXFxuIDg2MjpcXHRcXHQgIEVuYWJsaW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlIGFsd2F5cywgY2FuIGluY3JlYXNlIHRoZVxcbiA4NjM6XFx0XFx0ICBtZW1vcnkgZm9vdHByaW50IG9mIGFwcGxpY2F0aW9ucyB3aXRob3V0IGEgZ3VhcmFudGVlZFxcbiA4NjQ6XFx0XFx0ICBiZW5lZml0IGJ1dCBpdCB3aWxsIHdvcmsgYXV0b21hdGljYWxseSBmb3IgYWxsIGFwcGxpY2F0aW9ucy5cXG4gODY1OlxcdFxcbiA4NjY6XFx0XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG4gODY3OlxcdFxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuIDg2ODpcXHRcXHRoZWxwXFxuIDg2OTpcXHRcXHQgIEVuYWJsaW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlIG1hZHZpc2UsIHdpbGwgb25seSBwcm92aWRlIGFcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6NTQuNTQzNjQ4MjQxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMxMzkxMTE4MzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nIGZ1bmN0aW9uYWxpdHkuIEZpcnN0LCBJJ2xsIHRha2UgYSBsb29rIGF0IHRoZSBrZXkgZnVuY3Rpb25zIHRoYXQgYXJlIG1vZGlmaWVkIOKAkyB0aGUgb25lcyB0aGF0IGFyZSBtb3N0IGxpa2VseSBhdCB0aGUgaGVhcnQgb2YgdGhlIGNoYW5nZXMuIFRoZSBvbmVzIHRoYXQgaW1tZWRpYXRlbHkgc3RhbmQgb3V0IGFyZTogYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXNgLCBgdW5tYXBfaHVnZV9wbWRfZW50cnlgLCBgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWZgLCBhbmQgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YC4gVGhpcyBnaXZlcyBtZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG5cbk5vdywgSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgKnVzZWQqLiBTbywgSSdsbCBpZGVudGlmeSB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIGVudHJ5cG9pbnRzIG9yIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdGhhdCBjYWxsIHRoZXNlIGtleSBmdW5jdGlvbnMuIFRoaXMgd2lsbCBoZWxwIG1lIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgYW5kIHNlZSBob3cgdGhlIHNwbGl0dGluZyBpcyBpbml0aWF0ZWQgYW5kIG9yY2hlc3RyYXRlZC5cblxuRmluYWxseSwgSSdsbCBob21lIGluIG9uIGEgcmVsZXZhbnQgc2VjdGlvbiBvZiB0aGUgY29kZS4gTGV0J3Mgc3RhcnQgYnkgZXhhbWluaW5nIHRoZSBjb2RlIGFyb3VuZCBsaW5lcyAzNTAwLTM2MDAgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJJ20gZXhwZWN0aW5nIHRoaXMgYXJlYSB0byBjb250YWluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgc3BsaXR0aW5nLXJlbGF0ZWQgZnVuY3Rpb25zLCBvciBwZXJoYXBzIHRoZSBjb3JlIGxvZ2ljIHRoYXQgb3JjaGVzdHJhdGVzIHRoZSBzcGxpdHRpbmcgcHJvY2Vzcy4gSSdsbCByZWFkIHRocm91Z2ggdGhpcyBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSBjYW4gZ2xlYW4uIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBncmFzcCBvbiB3aGF0J3MgZ29pbmcgb24gYW5kIHdoZXJlIHRoZSBjaGFuZ2VzIG1pZ2h0IGJlIGxvY2F0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NTgwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6NTcuNjgyNzYyMDc5WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4ODgzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9odWdlX21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1MDAsXG4gIFwiTGluZUNvdW50XCI6IDc1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjM1MDA6XFx0XFxuMzUwMTpcXHRcXHRpZiAoaXNfcHJlc2VudClcXG4zNTAyOlxcdFxcdFxcdHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgZnJlZXplKTtcXG4zNTAzOlxcdFxcdGVsc2VcXG4zNTA0OlxcdFxcdFxcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXFxuMzUwNTpcXHRcXHRcXHRcXHRcXHRcXHQgICBmcmVlemUpO1xcbjM1MDY6XFx0fVxcbjM1MDc6XFx0XFxuMzUwODpcXHR2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbjM1MDk6XFx0XFx0XFx0XFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXFxuMzUxMDpcXHR7XFxuMzUxMTpcXHRcXHRWTV9XQVJOX09OX09OQ0UoIUlTX0FMSUdORUQoYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKTtcXG4zNTEyOlxcdFxcdGlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSB8fCBwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkpXFxuMzUxMzpcXHRcXHRcXHRfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHBtZCwgYWRkcmVzcywgZnJlZXplKTtcXG4zNTE0OlxcdH1cXG4zNTE1OlxcdFxcbjM1MTY6XFx0dm9pZCBfX3NwbGl0X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxcbjM1MTc6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBib29sIGZyZWV6ZSlcXG4zNTE4OlxcdHtcXG4zNTE5OlxcdFxcdHNwaW5sb2NrX3QgKnB0bDtcXG4zNTIwOlxcdFxcdHN0cnVjdCBtbXVfbm90aWZpZXJfcmFuZ2UgcmFuZ2U7XFxuMzUyMTpcXHRcXG4zNTIyOlxcdFxcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFxcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVxcdTAwM2V2bV9tbSxcXG4zNTIzOlxcdFxcdFxcdFxcdFxcdGFkZHJlc3MgXFx1MDAyNiBIUEFHRV9QTURfTUFTSyxcXG4zNTI0OlxcdFxcdFxcdFxcdFxcdChhZGRyZXNzIFxcdTAwMjYgSFBBR0VfUE1EX01BU0spICsgSFBBR0VfUE1EX1NJWkUpO1xcbjM1MjU6XFx0XFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXFx1MDAyNnJhbmdlKTtcXG4zNTI2OlxcdFxcdHB0bCA9IHBtZF9sb2NrKHZtYS1cXHUwMDNldm1fbW0sIHBtZCk7XFxuMzUyNzpcXHRcXHRzcGxpdF9odWdlX3BtZF9sb2NrZWQodm1hLCByYW5nZS5zdGFydCwgcG1kLCBmcmVlemUpO1xcbjM1Mjg6XFx0XFx0c3Bpbl91bmxvY2socHRsKTtcXG4zNTI5OlxcdFxcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcXHUwMDI2cmFuZ2UpO1xcbjM1MzA6XFx0fVxcbjM1MzE6XFx0XFxuMzUzMjpcXHR2b2lkIHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4zNTMzOlxcdFxcdFxcdGJvb2wgZnJlZXplKVxcbjM1MzQ6XFx0e1xcbjM1MzU6XFx0XFx0cG1kX3QgKnBtZCA9IG1tX2ZpbmRfcG1kKHZtYS1cXHUwMDNldm1fbW0sIGFkZHJlc3MpO1xcbjM1MzY6XFx0XFxuMzUzNzpcXHRcXHRpZiAoIXBtZClcXG4zNTM4OlxcdFxcdFxcdHJldHVybjtcXG4zNTM5OlxcdFxcbjM1NDA6XFx0XFx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcywgZnJlZXplKTtcXG4zNTQxOlxcdH1cXG4zNTQyOlxcdFxcbjM1NDM6XFx0c3RhdGljIGlubGluZSB2b2lkIHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxcbjM1NDQ6XFx0e1xcbjM1NDU6XFx0XFx0LypcXG4zNTQ2OlxcdFxcdCAqIElmIHRoZSBuZXcgYWRkcmVzcyBpc24ndCBocGFnZSBhbGlnbmVkIGFuZCBpdCBjb3VsZCBwcmV2aW91c2x5XFxuMzU0NzpcXHRcXHQgKiBjb250YWluIGFuIGh1Z2VwYWdlOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IGFuIGh1Z2UgcG1kLlxcbjM1NDg6XFx0XFx0ICovXFxuMzU0OTpcXHRcXHRpZiAoIUlTX0FMSUdORUQoYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpIFxcdTAwMjZcXHUwMDI2XFxuMzU1MDpcXHRcXHQgICAgcmFuZ2VfaW5fdm1hKHZtYSwgQUxJR05fRE9XTihhZGRyZXNzLCBIUEFHRV9QTURfU0laRSksXFxuMzU1MTpcXHRcXHRcXHRcXHQgQUxJR04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKSlcXG4zNTUyOlxcdFxcdFxcdHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3Modm1hLCBhZGRyZXNzLCBmYWxzZSk7XFxuMzU1MzpcXHR9XFxuMzU1NDpcXHRcXG4zNTU1OlxcdHZvaWQgdm1hX2FkanVzdF90cmFuc19odWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbjM1NTY6XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4zNTU3OlxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxcbjM1NTg6XFx0XFx0XFx0XFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpuZXh0KVxcbjM1NTk6XFx0e1xcbjM1NjA6XFx0XFx0LyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdCBzdGFydCBmaXJzdC4gKi9cXG4zNTYxOlxcdFxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIHN0YXJ0KTtcXG4zNTYyOlxcdFxcbjM1NjM6XFx0XFx0LyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdCBlbmQgbmV4dC4gKi9cXG4zNTY0OlxcdFxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIGVuZCk7XFxuMzU2NTpcXHRcXG4zNTY2OlxcdFxcdC8qIElmIHdlJ3JlIGluY3JlbWVudGluZyBuZXh0LVxcdTAwM2V2bV9zdGFydCwgd2UgbWlnaHQgbmVlZCB0byBzcGxpdCBpdC4gKi9cXG4zNTY3OlxcdFxcdGlmIChuZXh0KVxcbjM1Njg6XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKG5leHQsIGVuZCk7XFxuMzU2OTpcXHR9XFxuMzU3MDpcXHRcXG4zNTcxOlxcdHN0YXRpYyB2b2lkIHVubWFwX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuMzU3MjpcXHR7XFxuMzU3MzpcXHRcXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSBUVFVfUk1BUF9MT0NLRUQgfCBUVFVfU1lOQyB8XFxuMzU3NDpcXHRcXHRcXHRUVFVfQkFUQ0hfRkxVU0g7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjM5OjU3LjY4Mjk1MjI3OVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjkyNjYyMDYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBIdWdlIFBhZ2UgU3BsaXR0aW5nIEZ1bmN0aW9ucyoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBsYW5kc2NhcGUgb2YgaHVnZSBwYWdlIHNwbGl0dGluZyBmdW5jdGlvbnMuIE15IGluaXRpYWwgZm9jdXMgaXMgb24gdGhlIGV4aXN0aW5nIGNhbGxlcnMgYW5kIHN5bWJvbHMgcmVsYXRlZCB0byB0aGlzLiBPa2F5LCBzbyBJJ3ZlIGdvdCBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYF9fc3BsaXRfaHVnZV9wbWRgLCBhbmQgYHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NgIGluIG1pbmQsIHRob3NlIGFyZSB0aGUgZmlyc3QgY2FuZGlkYXRlcy4gVGhlIG5hbWUgYHNwbGl0X2h1Z2VfcG1kYCBpdHNlbGYgZmVlbHMgbGlrZSBpdCBtaWdodCBiZSBhIHdyYXBwZXIsIGFuIGlubGluZWQgZnVuY3Rpb24sIG9yIHNvbWV0aGluZyBzaW1pbGFyIHRvIG90aGVyIGNhbGxzLiBUaW1lIHRvIGJlIHRob3JvdWdoIGFuZCBjaGVjayBib3RoIGZvciB0aGUgZXhhY3Qgc2lnbmF0dXJlIGB2b2lkIHNwbGl0X2h1Z2VfcG1kYCBhbmQgdGhlIHVzZSBvZiB0aGUgbWFjcm8gYCNkZWZpbmUgc3BsaXRfaHVnZV9wbWRgLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgdmlldyBvZiBpdHMgcm9sZSBhbmQgdXNhZ2UuIEdvdHRhIGNvdmVyIGFsbCB0aGUgYmFzZXMgdG8gYXZvaWQgbWlzc2luZyBhbnkgaGlkZGVuIGRldGFpbHMgaW4gdGhlIHNwbGl0IGxvZ2ljIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzQzNCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6NTkuOTc1NjE3OTgyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjcyNzI3MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGVmaW5lIHNwbGl0X2h1Z2VfcG1kXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ0Nj1zdGF0aWMgaW5saW5lIGJvb2wgcG1kX2lzX2h1Z2UocG1kX3QgcG1kKVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDYwLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQ2MTojZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVxcdFxcdFxcdFxcdFxcXFxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00NjItXFx0ZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY4Nz1zdGF0aWMgaW5saW5lIHZvaWQgZGVmZXJyZWRfc3BsaXRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBwYXJ0aWFsbHlfbWFwcGVkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjkwLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY5MTojZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVxcdFxcXFxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02OTItXFx0ZG8geyB9IHdoaWxlICgwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTo0MDowMC4xMDI4OTcxMjdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Njk1MDU5Nzk0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGBzcGxpdF9odWdlX3BtZGAgbWFjcm8sIGZyb20gYSBoaWdoLWxldmVsIHBlcnNwZWN0aXZlLCBhcyB0aG91Z2ggdGhlc2Ugd2VyZSBteSBvd24gdGhvdWdodHM6XG5cbioqRGlzc2VjdGluZyB0aGUgYHNwbGl0X2h1Z2VfcG1kYCBNYWNybyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGBzcGxpdF9odWdlX3BtZGAgbWFjcm8uIEZyb20gdGhlIG5hbWUgaXRzZWxmLCBJJ20gZXhwZWN0aW5nIGl0IGRlYWxzIHdpdGggYnJlYWtpbmcgZG93biBhIGh1Z2UgcGFnZSDigJMgbGlrZWx5IGEgbGFyZ2UgcGh5c2ljYWwgbWVtb3J5IHBhZ2UsIGxpa2UgYSAyTUIgb3IgMUdCIHBhZ2Ug4oCTIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLCBwcm9iYWJseSA0S0IgcGFnZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBtZWNoYW5pY3MgYmVoaW5kIHRoaXM6IGhvdyBpdCBoYXBwZW5zLCB3aHkgaXQncyBuZWNlc3NhcnksIGFuZCB3aGF0IGNvbnNpZGVyYXRpb25zIGNvbWUgaW50byBwbGF5LiBJJ2xsIG5lZWQgdG8gdGhpbmsgYWJvdXQgdGhpbmdzIGxpa2U6IHRoZSBzdGF0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIChQVEVzKSBpbnZvbHZlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzcGxpdCwgdGhlIGltcGxpY2F0aW9ucyBmb3IgdGhlIHBhZ2UgdGFibGVzLCBhbmQgYW55IHBvdGVudGlhbCBsb2NraW5nIG9yIHN5bmNocm9uaXphdGlvbiBpbnZvbHZlZCB0byBlbnN1cmUgYXRvbWljaXR5IGFuZCBjb3JyZWN0bmVzcyBkdXJpbmcgdGhlIG9wZXJhdGlvbiwgYW5kIGVuc3VyZSB0aGluZ3MgbGlrZSBjYWNoZSBjb2hlcmVuY3kgYXJlIG1haW50YWluZWQuIEknbGwgYmUgbG9va2luZyBmb3Igd2hlcmUgdGhlIGN1cnJlbnQgaHVnZSBwYWdlIGlzIG1hcHBlZCBpbiB0aGUgcGFnZSB0YWJsZXMsIGFuZCBob3cgaXQgaXMgdXBkYXRlZCB0byBzaG93IHRoZXNlIG5ldyA0S0IgcGFnZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3OTYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MDcuMDUzNDk3OTc0WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc5MTkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ1NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQ1NTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNDU2OlxcdFxcdH1cXG4gNDU3OlxcdFxcbiA0NTg6XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA0NTk6XFx0fVxcbiA0NjA6XFx0XFxuIDQ2MTpcXHQjZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVxcdFxcdFxcdFxcdFxcXFxcXG4gNDYyOlxcdFxcdGRvIHtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIDQ2MzpcXHRcXHRcXHRwbWRfdCAqX19fX3BtZCA9IChfX3BtZCk7XFx0XFx0XFx0XFx0XFxcXFxcbiA0NjQ6XFx0XFx0XFx0aWYgKHBtZF9pc19odWdlKCpfX19fcG1kKSlcXHRcXHRcXHRcXHRcXFxcXFxuIDQ2NTpcXHRcXHRcXHRcXHRfX3NwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzLFxcdFxcXFxcXG4gNDY2OlxcdFxcdFxcdFxcdFxcdFxcdCBmYWxzZSk7XFx0XFx0XFx0XFxcXFxcbiA0Njc6XFx0XFx0fSAgd2hpbGUgKDApXFxuIDQ2ODpcXHRcXG4gNDY5OlxcdHZvaWQgc3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiA0NzA6XFx0XFx0XFx0Ym9vbCBmcmVlemUpO1xcbiA0NzE6XFx0XFxuIDQ3MjpcXHR2b2lkIF9fc3BsaXRfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHB1ZF90ICpwdWQsXFxuIDQ3MzpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MpO1xcbiA0NzQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjQwOjA3LjA1MzU3ODgwM1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo5NTc2ODE4ODg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0OiBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgUE1EIFNwbGl0dGluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgdGhlIHZpYWJpbGl0eSBvZiBmdXp6aW5nIHRoZSBUSFAgUE1EIHNwbGl0dGluZyBsb2dpYyB3aXRoaW4gdGhlIGtlcm5lbC4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgZnVuY3Rpb25zIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHkgaW52b2x2ZWQgaW4gUE1EIHNwbGl0dGluZy4gU3BlY2lmaWNhbGx5LCBJIHNlZSB0aHJlZSBub24tc3RhdGljIGZ1bmN0aW9uczogYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBfX3NwbGl0X2h1Z2VfcG1kYCwgYW5kIGBzcGxpdF9odWdlX3BtZF9hZGRyZXNzYC4gVGhlc2UgYXJlIG15IHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBpbnZlc3RpZ2F0aW9uLlxuXG5Mb29raW5nIGNsb3NlciwgdGhlIHBhdGNoIHRvdWNoZXMgc2V2ZXJhbCByZWxhdGVkIGZ1bmN0aW9ucy4gYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBhbmQgdmFyaW91cyBzdGF0aWMgaGVscGVycyBhcmUgbW9kaWZpZWQuIFRoZXNlIGluY2x1ZGUgYHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcGAsIGBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZmAsIGBzcGxpdF9odWdlX3BtZF90b19wdGVzYCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLCBgdW5tYXBfaHVnZV9wbWRfZW50cnlgLCBhbmQgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YC4gVGhlIHBhdHRlcm4gaGVyZSBpcyBjbGVhcjogYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYW5kIHRoZW4gdGhlIG90aGVycyBhcmUgc3RhdGljIGhlbHBlcnMgZm9yIHRoaXMuIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgIGFuZCB0aGUgb3RoZXJzIGFyZSBjYWxsZWQgYnkgc2V2ZXJhbCBvdGhlciBmdW5jdGlvbnMuXG5cbklzIHRoaXMgd29ydGggdGhlIGVmZm9ydD8gQWJzb2x1dGVseS4gVGhpcyBjb2RlIGlzIGZ1bmRhbWVudGFsIHRvIGhvdyBUSFBzIGFyZSBoYW5kbGVkLiBUaGUgcmVmYWN0b3JpbmcgYXBwZWFycyB0byB0b3VjaCBjb3JlIGFzcGVjdHMgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGluY2x1ZGluZyBzcGxpdHRpbmcgVEhQcyBpbnRvIHNtYWxsZXIgUFRFcywgZGVhbGluZyB3aXRoIGFub255bW91cyBmb2xpb3MsIGhhbmRsaW5nIGZsYWdzLCBtYW5hZ2luZyB0aGUgcmV2ZXJzZSBtYXAgKHJtYXApLCBhbmQgYWRkcmVzc2luZyB6ZXJvIFBNRCBzcGxpdHRpbmcuIFRoaXMgY29kZSBpcyAqZGlyZWN0bHkqIGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSXQgaXMgaW52b2x2ZWQgaW4gY3JpdGljYWwgb3BlcmF0aW9ucyBsaWtlIGBtYWR2aXNlYCwgVk1BIHNwbGl0dGluZywgYHVubWFwYCwgYG1wcm90ZWN0YCwgcGFnZSBtaWdyYXRpb24sIGNvcHktb24td3JpdGUgKENPVyksIGFuZCBgdXNlcmZhdWx0ZmRgLiBBbnkgZmxhdyBoZXJlIGhhcyB0aGUgcG90ZW50aWFsIHRvIGNhdXNlIGNyaXRpY2FsIGlzc3VlczogbWVtb3J5IGNvcnJ1cHRpb24sIHVzZS1hZnRlci1mcmVlIGNvbmRpdGlvbnMsIFRMQiBzaG9vdGRvd24gcHJvYmxlbXMsIGRhdGEgbG9zcywgb3IgZXZlbiBrZXJuZWwgcGFuaWNzLiBIaWdoIHZhbHVlLlxuXG5Ob3csIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbnMuIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGVzc2VudGlhbCwgb2J2aW91c2x5LiBEaWdnaW5nIGRlZXBlciwgaXQgZGVwZW5kcyBvbiBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgZXhjbHVkZXMgYFBSRUVNUFRfUlRgLiBJdCBhbHNvIHNlbGVjdHMgYENPTVBBQ1RJT05gLCBgWEFSUkFZX01VTFRJYCwgYW5kIGBNTV9JRGAuIEkgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBjb25maWdzIGZvciBkZXZpY2UtcHJpdmF0ZSBUSFBzLCBtaWdyYXRpb24sIG9yIGB1c2VyZmF1bHRmZGAuIEkgY29uZmlybSB0aGF0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQ09ORklHX0RFVklDRV9QUklWQVRFYCwgYW5kIGBDT05GSUdfVVNFUkZBVUxURkRgIGNvdWxkIGNvbWUgaW50byBwbGF5IGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgYmVpbmcgZXhlcmNpc2VkLiBgQ09ORklHX01JR1JBVElPTmAgaXMgdHlwaWNhbGx5IHNlbGVjdGVkIGluIGNvbmp1bmN0aW9uIHdpdGggVEhQL2NvbXBhY3Rpb24vTlVNQSwgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBhIGNvbXBsZXRlIGZ1enplciBjb25maWd1cmF0aW9uLiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHRoZSBwcmltYXJ5LCBidXQgdGhvc2Ugb3RoZXIgdHdvIGFyZSBwb3RlbnRpYWxseSBpbXBvcnRhbnQuXG5cblJlZ2FyZGluZyB0aGUgXCJGb2N1c1N5bWJvbHMsXCIgSSBuZWVkIHRvIGNvbmZpcm0gdGhlc2UgYXJlbid0IHN0YXRpYyBvciBpbmxpbmVkLiBUaGUga2V5IHN5bWJvbHMgYXJlIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AuIEkgc2VlIHRoYXQgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCAqaXMqIHN0YXRpYyAoYSBoZWxwZXIpLCB3aGljaCBsZWF2ZXMgbWUgd2l0aCBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYF9fc3BsaXRfaHVnZV9wbWRgLCBhbmQgYHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NgIGFzIHRoZSBwdWJsaWMgQVBJcyB0byB0YXJnZXQuXG5cbkluIHN1bW1hcnksIHRoaXMgaXMgYSBjbGVhciBcInllc1wiIGZvciBmdXp6aW5nLiBXZSdyZSBsb29raW5nIGF0IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZXhwb3NlZCB0byB1c2VyIHNwYWNlLCBzbyB0aGUgcG90ZW50aWFsIGZvciBpbXBhY3RmdWwgZmluZGluZ3MgaXMgdmVyeSBoaWdoLiBUaGUgZm9jdXMgc2hvdWxkIGJlIG9uIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AsIHdpdGggYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBDT05GSUdfREVWSUNFX1BSSVZBVEVgLCBhbmQgYENPTkZJR19VU0VSRkFVTFRGRGAgYmVpbmcgcG90ZW50aWFsbHkgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NTU3LCJPdXRwdXRUb2tlbnMiOjE2NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTo0MDoxNi42MzA0MDExOTlaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NzA0NDU0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkRFVklDRV9QUklWQVRFXCIsXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNwbGl0X2h1Z2VfcG1kX2xvY2tlZFwiLFxuICAgIFwiX19zcGxpdF9odWdlX3BtZFwiLFxuICAgIFwic3BsaXRfaHVnZV9wbWRfYWRkcmVzc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBQTUQgc3BsaXQgbG9naWMgaW4gbW0vaHVnZV9tZW1vcnkuYywgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgcHJlc2VudCB2cyBub24tcHJlc2VudCAobWlncmF0aW9uLCBkZXZpY2UtcHJpdmF0ZSkgaHVnZSBQTURzIGFuZCByZW9yZ2FuaXppbmcgcm1hcCBjb252ZXJzaW9uIGFuZCB1bm1hcHBpbmcgbG9naWMuIFRoaXMgY29yZSBNTSBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSB2aWEgdXNlciBhY3Rpb25zIChtYWR2aXNlLCBtcHJvdGVjdCwgcGFnZSBtaWdyYXRpb24sIGV0Yy4pIGFuZCBpcyB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJERVZJQ0VfUFJJVkFURVwiLFxuICAgIFwiVVNFUkZBVUxURkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzcGxpdF9odWdlX3BtZF9sb2NrZWRcIixcbiAgICBcIl9fc3BsaXRfaHVnZV9wbWRcIixcbiAgICBcInNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgUE1EIHNwbGl0IGxvZ2ljIGluIG1tL2h1Z2VfbWVtb3J5LmMsIHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIHByZXNlbnQgdnMgbm9uLXByZXNlbnQgKG1pZ3JhdGlvbiwgZGV2aWNlLXByaXZhdGUpIGh1Z2UgUE1EcyBhbmQgcmVvcmdhbml6aW5nIHJtYXAgY29udmVyc2lvbiBhbmQgdW5tYXBwaW5nIGxvZ2ljLiBUaGlzIGNvcmUgTU0gZnVuY3Rpb25hbGl0eSBpcyByZWFjaGFibGUgdmlhIHVzZXIgYWN0aW9ucyAobWFkdmlzZSwgbXByb3RlY3QsIHBhZ2UgbWlncmF0aW9uLCBldGMuKSBhbmQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MTYuNzA3NDUzNTE2WiIsIlNlcSI6MTksIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTExNDQ0Nzc1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjQwOjE2LjcwNzk1MDA4NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjExMTEzOTQ3NzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cXG5cXG5BbGwgaW5zdGFuY2VzIG9mICdzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlJyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDM3YWZkYTJkMTA5NGIwYTlkZjIwMGM1MzViZDRiMDEyNDdhOWY3MTFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyOCAxOTozOToyMSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTMxMzksMTkzICszMTM5LDE3MyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG4tXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxuKy8qXG4rICogT25seSBhIGh1Z2UgemVybyBQTUQgaW4gYW4gYW5vbnltb3VzIFZNQSBpcyBzcGxpdCwgaW50byBhIHBhZ2UgdGFibGUgb2ZcbisgKiBzaGFyZWQgemVybyBwYWdlIG1hcHBpbmdzLiBBbnkgb3RoZXIgaHVnZSB6ZXJvIFBNRCBpcyBzaW1wbHkgdW5tYXBwZWQuXG4rICovXG4rc3RhdGljIGJvb2wgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90IHBtZHZhbClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHBndGFibGVfdCBwZ3RhYmxlO1xuLVx0cG1kX3Qgb2xkX3BtZCwgX3BtZDtcbi1cdGJvb2wgc29mdF9kaXJ0eSwgdWZmZF93cCA9IGZhbHNlLCB5b3VuZyA9IGZhbHNlLCB3cml0ZSA9IGZhbHNlO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyO1xuLVx0cHRlX3QgKnB0ZTtcbi1cdGludCBpO1xuLVxuLVx0Vk1fQlVHX09OKGhhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fZW5kIFx1MDAzYyBoYWRkciArIEhQQUdFX1BNRF9TSVpFLCB2bWEpO1xuK1x0cmV0dXJuIGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSBcdTAwMjZcdTAwMjYgdm1hX2lzX2Fub255bW91cyh2bWEpO1xuK31cbiBcbi1cdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpIFx1MDAyNlx1MDAyNiAhcG1kX3RyYW5zX2h1Z2UoKnBtZCkpO1xuKy8qKlxuKyAqIHVubWFwX2h1Z2VfcG1kX2VudHJ5KCkgLSBVbm1hcCBhIGh1Z2UgUE1EIGVudHJ5IHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdC5cbisgKiBAdm1hOiBUaGUgVk1BIEBwbWQgYmVsb25ncyB0by5cbisgKiBAaGFkZHI6IFRoZSBQTUQtYWxpZ25lZCBhZGRyZXNzIEBwbWQgbWFwcy5cbisgKiBAcG1kOiBQb2ludGVyIHRvIHRoZSBodWdlIFBNRCBlbnRyeS5cbisgKiBAZm9saW86IFRoZSBmb2xpbyBAcG1kIGRlc2NyaWJlcywgb3IgTlVMTCBpZiBpdCBkZXNjcmliZXMgbm9uZS5cbisgKiBAaXNfcHJlc2VudDogSXMgQHBtZCBhIHByZXNlbnQgZW50cnkgcmF0aGVyIHRoYW4gYSBzb2Z0bGVhZiBlbnRyeT9cbisgKlxuKyAqIE9ubHkgYW5vbnltb3VzIGZvbGlvcyBhcmUgcmVidWlsdCBhdCBQVEUgbGV2ZWwgd2hlbiBhIGh1Z2UgUE1EIGVudHJ5IGlzXG4rICogc3BsaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB1bm1hcHBlZCBoZXJlIGFuZCBmYXVsdGVkIGJhY2sgaW4gb24gdGhlIG5leHRcbisgKiBhY2Nlc3MuXG4rICovXG4rc3RhdGljIHZvaWQgdW5tYXBfaHVnZV9wbWRfZW50cnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdGJvb2wgaXNfcHJlc2VudClcbit7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcdHBtZF90IG9sZF9wbWQ7XG4gXG4tXHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbitcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbitcdC8qXG4rXHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXG4rXHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbitcdCAqL1xuK1x0aWYgKGhhc19kZXBvc2l0ZWRfcGd0YWJsZSh2bWEsIG9sZF9wbWQsIGZvbGlvKSlcbitcdFx0emFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTtcbiBcbi1cdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG4tXHRcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTb1xuLVx0XHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbi1cdFx0ICovXG4tXHRcdGlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKVxuLVx0XHRcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XG4tXHRcdGlmICh2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRpZiAodW5saWtlbHkocG1kX2lzX21pZ3JhdGlvbl9lbnRyeShvbGRfcG1kKSkpIHtcbi1cdFx0XHRjb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVxuLVx0XHRcdGZvbGlvID0gc29mdGxlYWZfdG9fZm9saW8ob2xkX2VudHJ5KTtcbi1cdFx0fSBlbHNlIGlmIChpc19odWdlX3plcm9fcG1kKG9sZF9wbWQpKSB7XG4tXHRcdFx0cmV0dXJuO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgcG1kX2RpcnR5KG9sZF9wbWQpKVxuLVx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4tXHRcdFx0XHRmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7XG4tXHRcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xuLVx0XHRcdGFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTtcbi1cdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuLVx0XHRcdHJldHVybjtcbi1cdFx0fVxuLVx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4rXHRpZiAoIWZvbGlvKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHRpZiAoaXNfaHVnZV96ZXJvX3BtZCgqcG1kKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xuLVx0XHQgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93XG4tXHRcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuLVx0XHQgKlxuLVx0XHQgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvXG4tXHRcdCAqIHNtYWxsIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsXG4tXHRcdCAqIHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXG4tXHRcdCAqL1xuLVx0XHRyZXR1cm4gX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTtcbitcdGlmIChpc19wcmVzZW50KSB7XG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4rXG4rXHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4rXHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuK1x0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4gXHR9XG4gXG4tXHRpZiAocG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuK1x0YWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1IUEFHRV9QTURfTlIpO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoaXNfcHJlc2VudClcbitcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbit9XG4gXG4tXHRcdHNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7XG4tXHRcdHVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7XG4rc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRib29sIGlzX3ByZXNlbnQ7XG4rXHRib29sIGlzX2RldmljZV9wcml2YXRlO1xuK1x0Ym9vbCBmcmVlemU7XG4rXHRib29sIHdyaXRlO1xuK1x0Ym9vbCB5b3VuZztcbitcdGJvb2wgZGlydHk7XG4rXHRib29sIHNvZnRfZGlydHk7XG4rXHRib29sIHVmZmQ7XG4rXHRib29sIGFub25fZXhjbHVzaXZlO1xuK307XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbi1cdFx0aWYgKFBhZ2VBbm9uKHBhZ2UpKVxuLVx0XHRcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbi1cdFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xuLVx0XHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XG4tXHR9IGVsc2UgaWYgKHBtZF9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuKy8qXG4rICogQ29udmVydCB0aGUgZm9saW8ncyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy5cbisgKlxuKyAqIFdpdGhvdXQgXCJmcmVlemVcIiwgd2UnbGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxuKyAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3JcbisgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLlxuKyAqXG4rICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbisgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcbisgKiBtYW5hZ2VkIHRvIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCkgLS0gc2VlXG4rICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbisgKlxuKyAqIEluIGNhc2Ugd2UgY2Fubm90IGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCksIHNwbGl0IHRoZSBQTURcbisgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbisgKlxuKyAqIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpOiBpbnZhbGlkYXRlIFBNRCBmaXJzdC5cbisgKlxuKyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIG1hcHBpbmcgbWF5IHN0aWxsIGJlIGZyb3plbi5cbisgKi9cbitzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXG4rXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxuK3tcbitcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZnJlZXplIFx1MDAyNlx1MDAyNlxuK1x0ICAgICghc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUgfHxcbitcdCAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLVx1MDAzZWZvbGlvLCBzdGF0ZS1cdTAwM2VwYWdlKSkpXG4rXHRcdHJldHVybiB0cnVlO1xuIFxuLVx0XHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xuK1x0Zm9saW9fcmVmX2FkZChzdGF0ZS1cdTAwM2Vmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4rXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoc3RhdGUtXHUwMDNlZm9saW8sIHN0YXRlLVx1MDAzZXBhZ2UsIEhQQUdFX1BNRF9OUiwgdm1hLFxuK1x0XHRcdFx0IGhhZGRyLCBybWFwX2ZsYWdzKTtcbitcdHJldHVybiBmYWxzZTtcbit9XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuLVx0XHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuKy8qXG4rICogQnVpbGQgdGhlIGxlYWYgZW50cnkgZm9yIHRoZSBQVEUgZW50cnkgZGVzY3JpYmluZyBAcGZuLCBmb3IgYSBodWdlIFBNRCBlbnRyeVxuKyAqIHdoaWNoIGlzIG5vdCByZXN0b3JlZCBhcyBhIHByZXNlbnQgbWFwcGluZy5cbisgKi9cbitzdGF0aWMgc29mdGxlYWZfdCBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBmbilcbit7XG4rXHRzb2Z0bGVhZl90IGVudHJ5O1xuIFxuK1x0aWYgKHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlIFx1MDAyNlx1MDAyNiAhc3RhdGUtXHUwMDNlZnJlZXplKSB7XG4gXHRcdC8qXG4tXHRcdCAqIERldmljZSBwcml2YXRlIFRIUCBzaG91bGQgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyXG4tXHRcdCAqIGZvbGlvcyB3LnIudCBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZy4gU2VlIHRoZSBjb21tZW50cyBmb3Jcbi1cdFx0ICogZm9saW8gaGFuZGxpbmcgYW5kIGFub25fZXhjbHVzaXZlIGJlbG93LlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qXG4tXHRcdCAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXNcbi1cdFx0ICogdGhlIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2hcbi1cdFx0ICogaGFwcGVucyBpbiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlXG4tXHRcdCAqIHZlcnNpb24gcG9pbnRpbmcgdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWZcbi1cdFx0ICogYWxsIENQVXMgd2VyZSBidWcgZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlXG4tXHRcdCAqIHNpemUgVExCIG1pc3Mgb24gdGhlIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCXG4tXHRcdCAqIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24ndFxuLVx0XHQgKiBsaWtlIHRoYXQuIFNlZVxuLVx0XHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtXG4tXHRcdCAqIDM4MyBvbiBwYWdlIDEwNS4gSW50ZWwgc2hvdWxkIGJlIHNhZmUgYnV0IGlzIGFsc28gd2FybnMgdGhhdFxuLVx0XHQgKiBpdCdzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGVcbi1cdFx0ICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkXG4tXHRcdCAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93XG4tXHRcdCAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmVcbi1cdFx0ICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7XG4tXHRcdCAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZFxuLVx0XHQgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdFxuLVx0XHQgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpc1xuLVx0XHQgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5XG4tXHRcdCAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aFxuLVx0XHQgKiBwbWRfcG9wdWxhdGUuXG4rXHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcbitcdFx0ICogdGhlIFBURSBlbnRyaWVzIGJ5IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLCBhbmQgYWNjZXNzZWRcbitcdFx0ICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZVxuK1x0XHQgKiBlbnRyaWVzLlxuIFx0XHQgKi9cbi1cdFx0b2xkX3BtZCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuLVx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0aWYgKHBtZF9kaXJ0eShvbGRfcG1kKSkge1xuLVx0XHRcdGRpcnR5ID0gdHJ1ZTtcbi1cdFx0XHRmb2xpb19zZXRfZGlydHkoZm9saW8pO1xuLVx0XHR9XG4tXHRcdHdyaXRlID0gcG1kX3dyaXRlKG9sZF9wbWQpO1xuLVx0XHR5b3VuZyA9IHBtZF95b3VuZyhvbGRfcG1kKTtcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3VmZmQob2xkX3BtZCk7XG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0XHRyZXR1cm4gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0XHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0fVxuIFxuLVx0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7XG4tXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbitcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xuK1x0ZWxzZSBpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KHBmbik7XG4rXHRlbHNlXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkocGZuKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2l0aG91dCBcImZyZWV6ZVwiLCB3ZSdsbCBzaW1wbHkgc3BsaXQgdGhlIFBNRCwgcHJvcGFnYXRpbmcgdGhlXG4tXHRcdCAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3Jcbi1cdFx0ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci5cbi1cdFx0ICpcbi1cdFx0ICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbi1cdFx0ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXG4tXHRcdCAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcbi1cdFx0ICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbi1cdFx0ICpcbi1cdFx0ICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxuLVx0XHQgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbi1cdFx0ICpcbi1cdFx0ICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxuLVx0XHQgKi9cbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH1cbitcdGlmIChzdGF0ZS1cdTAwM2V5b3VuZylcbitcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZGlydHkpXG4rXHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfZGlydHkoZW50cnkpO1xuK1xuK1x0cmV0dXJuIGVudHJ5O1xuK31cbitcbisvKlxuKyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWVcbisgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuXG4rICovXG4rc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUpXG4re1xuK1x0LyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovXG4rXHRjb25zdCBib29sIHJtYXBwZWQgPSBzdGF0ZS1cdTAwM2Vpc19wcmVzZW50IHx8IHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlO1xuK1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4rXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLVx1MDAzZXBhZ2U7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4rXHRwZ3RhYmxlX3QgcGd0YWJsZTtcbitcdHBtZF90IF9wbWQ7XG4rXHRwdGVfdCAqcHRlO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAocm1hcHBlZClcbitcdFx0c3RhdGUtXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcbiBcbiBcdC8qXG4tXHQgKiBXaXRoZHJhdyB0aGUgdGFibGUgb25seSBhZnRlciB3ZSBtYXJrIHRoZSBwbWQgZW50cnkgaW52YWxpZC5cbi1cdCAqIFRoaXMncyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuXG4rXHQgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGludmFsaWRhdGVkIGEgcHJlc2VudCBlbnRyeSwgYW5kIGEgc29mdGxlYWZcbitcdCAqIGVudHJ5IGlzIG5vdCBwcmVzZW50IHRvIGJlZ2luIHdpdGguIEVpdGhlciB3YXkgdGhlIGVudHJ5IGlzIG91dCBvZlxuK1x0ICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpc1xuK1x0ICogY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxuIFx0ICovXG4gXHRwZ3RhYmxlID0gcGd0YWJsZV90cmFuc19odWdlX3dpdGhkcmF3KG1tLCBwbWQpO1xuIFx0cG1kX3BvcHVsYXRlKG1tLCBcdTAwMjZfcG1kLCBwZ3RhYmxlKTtcbkBAIC0zMzM3LDU1ICszMzE3LDE3IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0ICogTm90ZSB0aGF0IE5VTUEgaGludGluZyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgdG9cbiBcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cbiBcdCAqL1xuLVx0aWYgKGZyZWV6ZSB8fCBwbWRfaXNfbWlncmF0aW9uX2VudHJ5KG9sZF9wbWQpKSB7XG4tXHRcdHB0ZV90IGVudHJ5O1xuLVx0XHRzd3BfZW50cnlfdCBzd3BfZW50cnk7XG4tXG4tXHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4tXHRcdFx0aWYgKHdyaXRlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihwYWdlICsgaSkpO1xuLVx0XHRcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XG4tXHRcdFx0aWYgKHlvdW5nKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcbi1cdFx0XHRpZiAoZGlydHkpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuK1x0aWYgKHN0YXRlLVx1MDAzZWZyZWV6ZSB8fCAhc3RhdGUtXHUwMDNlaXNfcHJlc2VudCkge1xuK1x0XHRmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgXHUwMDNjIEhQQUdFX1BNRF9OUjtcbitcdFx0ICAgICBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4rXHRcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlICsgaSk7XG4rXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cbitcdFx0XHRcdHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKHN0YXRlLCBwZm4pO1xuK1x0XHRcdHB0ZV90IGVudHJ5ID0gc29mdGxlYWZfdG9fcHRlKGxlYWYpO1xuK1xuK1x0XHRcdGlmIChzdGF0ZS1cdTAwM2Vzb2Z0X2RpcnR5KVxuIFx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4tXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuLVx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcbi1cdFx0cHRlX3QgZW50cnk7XG4tXHRcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcbi1cbi1cdFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHJlbGV2YW50XG4tXHRcdFx0ICogcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHRlIGVudHJpZXMgd2hlbiBmcmVlemVcbi1cdFx0XHQgKiBpcyBmYWxzZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGUpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFlvdW5nIGFuZCBkaXJ0eSBiaXRzIGFyZSBub3QgcHJvZ2F0ZWQgdmlhIHN3cF9lbnRyeVxuLVx0XHRcdCAqL1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuLVx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4rXHRcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbiBcdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuIFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbkBAIC0zMzk0LDIwICszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRwdGVfdCBlbnRyeTtcbiBcbiBcdFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbi1cdFx0aWYgKHdyaXRlKVxuK1x0XHRpZiAoc3RhdGUtXHUwMDNld3JpdGUpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWt3cml0ZShlbnRyeSwgdm1hKTtcbi1cdFx0aWYgKCF5b3VuZylcbitcdFx0aWYgKCFzdGF0ZS1cdTAwM2V5b3VuZylcbiBcdFx0XHRlbnRyeSA9IHB0ZV9ta29sZChlbnRyeSk7XG4gXHRcdC8qIE5PVEU6IHRoaXMgbWF5IHNldCBzb2Z0LWRpcnR5IHRvbyBvbiBzb21lIGFyY2hzICovXG4tXHRcdGlmIChkaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZWRpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpO1xuLVx0XHRpZiAoc29mdF9kaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZXNvZnRfZGlydHkpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcbi1cdFx0aWYgKHVmZmRfd3ApXG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V1ZmZkKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rdWZmZChlbnRyeSk7XG4gXG4gXHRcdC8qIFJlc3RvcmUgUEFHRV9OT05FIHNvIGFuIFJXUCBtYXJrZXIga2VlcHMgdHJhcHBpbmcgKi9cbi1cdFx0aWYgKHVzZXJmYXVsdGZkX3J3cCh2bWEpIFx1MDAyNlx1MDAyNiB1ZmZkX3dwKVxuK1x0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKylcbkBAIC0zNDE3LDE1ICszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbiBcdH1cbiBcdHB0ZV91bm1hcChwdGUpO1xuIFxuLVx0aWYgKCFwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKVxuLVx0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4tXHRpZiAoZnJlZXplKVxuK1x0aWYgKHJtYXBwZWQpXG4rXHRcdGZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS1cdTAwM2Vmb2xpbywgcGFnZSwgdm1hKTtcbitcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUpXG4gXHRcdHB1dF9wYWdlKHBhZ2UpO1xuIFxuIFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0Ym9vbCBmcmVlemUpXG4re1xuK1x0c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHtcbitcdFx0LmZvbGlvID0gZm9saW8sXG4rXHRcdC5pc19wcmVzZW50ID0gdHJ1ZSxcbitcdFx0LmZyZWV6ZSA9IGZyZWV6ZSxcbitcdH07XG4rXG4rXHQvKlxuK1x0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcbitcdCAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpblxuK1x0ICogcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZSB2ZXJzaW9uIHBvaW50aW5nXG4rXHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xuK1x0ICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlXG4rXHQgKiBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpblxuK1x0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2Vzbid0IGxpa2UgdGhhdC4gU2VlXG4rXHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtIDM4MyBvblxuK1x0ICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQncyBvbmx5IHNhZmVcbitcdCAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW5cbitcdCAqIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXNcbitcdCAqIGdlbmVyYWxseSBzYWZlciB0byBuZXZlciBhbGxvdyBzbWFsbCBhbmQgaHVnZSBUTEIgZW50cmllcyBmb3IgdGhlXG4rXHQgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2ZcbitcdCAqIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7IGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZVxuK1x0ICogY3VycmVudCBwbWQgbm90cHJlc2VudCAoYXRvbWljYWxseSBiZWNhdXNlIGhlcmUgdGhlIHBtZF90cmFuc19odWdlXG4rXHQgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlXG4rXHQgKiBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5IHdlIHdyaXRlIHRoZVxuK1x0ICogbm9uLWh1Z2UgdmVyc2lvbiBvZiB0aGUgcG1kIGVudHJ5IHdpdGggcG1kX3BvcHVsYXRlLlxuK1x0ICpcbitcdCAqIFRoaXMgbXVzdCBhbHNvIGhhcHBlbiBiZWZvcmUgUGFnZUFub25FeGNsdXNpdmUoKSBpcyByZWFkIGJlbG93LCBzZWVcbitcdCAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCkuXG4rXHQgKi9cbitcdGNvbnN0IHBtZF90IHBtZHZhbCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuK1xuK1x0c3RhdGUucGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XG4rXHRzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpO1xuK1x0c3RhdGUueW91bmcgPSBwbWRfeW91bmcocG1kdmFsKTtcbitcdHN0YXRlLmRpcnR5ID0gcG1kX2RpcnR5KHBtZHZhbCk7XG4rXHRzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTtcbitcdHN0YXRlLnVmZmQgPSBwbWRfdWZmZChwbWR2YWwpO1xuK1x0c3RhdGUuYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShzdGF0ZS5wYWdlKTtcbitcbitcdGlmIChzdGF0ZS5kaXJ0eSlcbitcdFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcbitcbitcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcbitcbitcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBwbWRfdCBvbGRfcG1kLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSlcbit7XG4rXHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XG4rXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xuK1x0XHQuZm9saW8gPSBmb2xpbyxcbitcdFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcbitcdFx0LmlzX2RldmljZV9wcml2YXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGUoZW50cnkpLFxuK1x0XHQuZnJlZXplID0gZnJlZXplLFxuK1x0XHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcbitcdFx0LnVmZmQgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCksXG4rXHR9O1xuK1xuK1x0aWYgKHN0YXRlLmlzX2RldmljZV9wcml2YXRlKSB7XG4rXHRcdC8qXG4rXHRcdCAqIERldmljZSBwcml2YXRlIGZvbGlvcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIGZvbGlvc1xuK1x0XHQgKiB3LnIudC4gYW5vbiBleGNsdXNpdmUgaGFuZGxpbmcsIHNlZVxuK1x0XHQgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS5cbitcdFx0ICovXG4rXHRcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS55b3VuZyA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSk7XG4rXHRcdHN0YXRlLmRpcnR5ID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KTtcbitcdFx0c3RhdGUuYW5vbl9leGNsdXNpdmUgPVxuK1x0XHRcdHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7XG4rXHR9XG4rXG4rXHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXHUwMDI2c3RhdGUpO1xuK31cbitcbitzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4re1xuK1x0Y29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7XG4rXHRjb25zdCBib29sIGlzX3ByZXNlbnQgPSBwbWRfcHJlc2VudChvbGRfcG1kKTtcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXG4rXHRWTV9CVUdfT04oaGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9zdGFydCBcdTAwM2UgaGFkZHIsIHZtYSk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9lbmQgXHUwMDNjIGhhZGRyICsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XG4rXG4rXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9pc192YWxpZF9zb2Z0bGVhZihvbGRfcG1kKSBcdTAwMjZcdTAwMjZcbitcdFx0XHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xuK1xuK1x0Y291bnRfdm1fZXZlbnQoVEhQX1NQTElUX1BNRCk7XG4rXG4rXHQvKlxuK1x0ICogRklYTUU6IERvIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGJ5IGNhbGxpbmdcbitcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbitcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuK1x0ICpcbitcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8gc21hbGxcbitcdCAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGVcbitcdCAqIHNlY29uZGFyeSBtbXUgYXQgdGhpcyB0aW1lLlxuK1x0ICovXG4rXHRpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkge1xuK1x0XHRfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7XG4rXG4rXHQvKlxuK1x0ICogQSBub24tcHJlc2VudCBlbnRyeSB3aGljaCBpcyBuZWl0aGVyIGEgbWlncmF0aW9uIG5vciBhIGRldmljZVxuK1x0ICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHlcbitcdCAqIHdhcm5lZCBhYm91dCBpdC4gTGVhdmUgaXQgYWxvbmUgcmF0aGVyIHRoYW4gYWN0IG9uIGEgUEZOIHdoaWNoXG4rXHQgKiBtZWFucyBub3RoaW5nLlxuK1x0ICovXG4rXHRpZiAodW5saWtlbHkoIWlzX3ByZXNlbnQgXHUwMDI2XHUwMDI2ICFmb2xpbykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbitcdFx0dW5tYXBfaHVnZV9wbWRfZW50cnkodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgaXNfcHJlc2VudCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmIChpc19wcmVzZW50KVxuK1x0XHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XG4rXHRlbHNlXG4rXHRcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXG4rXHRcdFx0XHRcdCAgIGZyZWV6ZSk7XG4rfVxuK1xuIHZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MTYuNzA3OTUwOTE2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjExMTEzOTI1NDgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFuYWx5c2lzOiBEZXRlcm1pbmluZyBpZiBEZWRpY2F0ZWQgRnV6emluZyBpcyBOZWNlc3NhcnkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdGNoLCB3aGljaCByZWZhY3RvcnMgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHJlcXVpcmVzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiwgb3IgaWYgd2UgY2FuIHJlbHkgb24gS0FTQU4gYW5kIHN0YW5kYXJkIGRldGVjdG9ycy5cblxuRmlyc3QsIGxldCdzIHJlZnJlc2g6IEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgbGVha3MuIEtBU0FOIGhhbmRsZXMgdGhlIHVzdWFsIHN1c3BlY3RzOiBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZXRjLiwgYW5kIExPQ0tERVAgaXMgdGhlcmUgZm9yIGxvY2tpbmcgaXNzdWVzLlxuXG5Ob3csIGxvb2tpbmcgYXQgdGhlIHBhdGNoLCBpdCBzZWVtcyBsaWtlIGEgZGVlcCBkaXZlIGludG8gaG93IGh1Z2UgcGFnZSBzcGxpdHRpbmcgaXMgaGFuZGxlZC4gSXQgcmVmYWN0b3JzIHRoZSBgX19zcGxpdF9odWdlX3BtZF9sb2NrZWRgIGZ1bmN0aW9uIGFuZCB0aGUgd2F5IGl0IHdvcmtzIHdpdGggZm9saW9zIGFuZCBwYWdlIHRhYmxlIGVudHJpZXMgKFBNRHMgYW5kIFBURXMpLlxuXG5JIHNlZSB0aGVzZSBrZXkgY2hhbmdlczpcblxuMS4gIEEgY2hlY2ssIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAsIHRvIGVuc3VyZSB0aGUgUE1EIGlzIGEgemVybyBQTUQgYW5kIHRoZSBWTUEgaXMgYW5vbnltb3VzLlxuMi4gIGB1bm1hcF9odWdlX3BtZF9lbnRyeWAsIHdoaWNoIGNsZWFucyB1cCBodWdlIFBNRCBlbnRyaWVzLCB6ZXJvcyB0YWJsZSBlbnRyaWVzLCBhbmQgZGVhbHMgd2l0aCBmb2xpbyBzdGF0ZSAoZGlydHkvcmVmZXJlbmNlZC9ldGMuKS5cbjMuICBUaGUgaW50cm9kdWN0aW9uIG9mIGBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlYCB0byBlbmNhcHN1bGF0ZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSBzcGxpdHRpbmcgcHJvY2VzcywgaW5jbHVkaW5nIHRoZSBgZm9saW9gLCB3aGV0aGVyIHRoZSBQTUQgaXMgYGlzX3ByZXNlbnRgLCBhcyB3ZWxsIGFzIGZsYWdzIGxpa2UgYHdyaXRlYCwgYHlvdW5nYCwgYGRpcnR5YCwgZXRjLlxuNC4gIEZ1bmN0aW9ucyBsaWtlIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCBhbmQgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCBpbml0aWFsaXplIHRoZSBgc3BsaXRfcG1kX3N0YXRlYCBzdHJ1Y3R1cmUuIENyaXRpY2FsbHksIHRoZXNlIGluaXRpYWxpemF0aW9ucyB1c2UgQydzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgc3ludGF4IChgPSB7IC4uLiB9YCksIHdoaWNoIG1lYW5zICphbnkqIG1lbWJlcnMgKm5vdCBleHBsaWNpdGx5KiBpbml0aWFsaXplZCB3aWxsIGJlIHplcm9lZC4gU28sIHRoZSBjb21waWxlciBpcyBoYW5kbGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMsIGVuc3VyaW5nIHRoYXQgbm8gbWVtYmVyIG9mIGBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlYCBoYXMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4gVGhlIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCBzcGVjaWZpY2FsbHkgc2V0cyB0aGUgZmllbGRzIGl0IG5lZWRzLCBhbmQgdGhlIG90aGVycyB1c2UgdGhlIHplcm8taW5pdGlhbGl6YXRpb24uXG5cbiAgICAqICAgRm9yIHRoZSBub24tcHJlc2VudCBjYXNlLCBhbGwgdGhlIGZsYWdzIG5vdCBleHBsaWNpdGx5IHNldCBhcmUgemVyby1pbml0aWFsaXplZC4gQWxzbywgYWRkaXRpb25hbCBmaWVsZHMgYXJlIGV4cGxpY2l0bHkgc2V0IGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlbnRyeSBpcyBkZXZpY2UtcHJpdmF0ZSBvciBub3QuXG41LiAgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBpdHNlbGYgY2hlY2tzIHRoZSBgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXRgLCBnZXRzIHRoZSBgZm9saW9gLCBhbmQgdGhlbiBjYWxscyBlaXRoZXIgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBvciBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLlxuXG5NeSBmb2N1cyBpcyBvbiBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGxlYWtzIHRvIHVzZXJzcGFjZSwgb3IgcGFkZGluZyBpc3N1ZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHZ1bG5lcmFiaWxpdGllcy5cblxuKiAgIEkgc2VlIHRoYXQgdGhlIGBzcGxpdF9wbWRfc3RhdGVgIHN0cnVjdCBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXI7IHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIGZpZWxkcy5cbiogICBJIGRvbid0IHNlZSBhbnkgZGlyZWN0IGNvcHlpbmcgb2YgZGF0YSB0byB1c2Vyc3BhY2UgKGBjb3B5X3RvX3VzZXJgLCBldGMuKSwgd2hpY2ggd291bGQgYmUgYSBsZWFrIHJpc2suXG4qICAgVGhlIGNvZGUgbWFuaXB1bGF0ZXMgUE1EIGFuZCBQVEVzLCB3aGljaCBhcmUga2V5IGZvciBUSFAgc3BsaXR0aW5nLiBQb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaGVyZSB3b3VsZCBtYW5pZmVzdCBhcyBpbmNvcnJlY3QgcGFnZSB0YWJsZSBlbnRyaWVzLCByZWZjb3VudGluZyBwcm9ibGVtcyAobGlrZSB1c2UtYWZ0ZXItZnJlZSksIG9yIFRMQiBmbHVzaCBlcnJvcnMg4oCTIGFsbCBvZiB3aGljaCBhcmUgdGhlIGRvbWFpbiBvZiBzdGFuZGFyZCBtbSBhc3NlcnRpb25zLCByZWZjb3VudGluZyBtZWNoYW5pc21zLCBhbmQgS0FTQU4uXG4qICAgQ3J1Y2lhbGx5LCBLTVNBTiAqaXNuJ3QqIGRlc2lnbmVkIHRvIGRldGVjdCBpc3N1ZXMgd2l0aCBwYWdlIHRhYmxlIGVudHJpZXMgdGhlbXNlbHZlcywgYXMgdGhleSBhcmUgbm90IGdlbmVyYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgYnV0IGhhcmR3YXJlIGRlc2NyaXB0b3JzIG9yIHBoeXNpY2FsIGFkZHJlc3Nlcy5cblxuU28sIGxldCdzIHJ1biB0aHJvdWdoIHRoZSBLTVNBTi1zcGVjaWZpYyBjaGVja3M6XG5cbjEuICBLZXJuZWwgc3RydWN0cyBzZW50IHRvIHVzZXJzcGFjZSB3aXRoIHVuaW5pdGlhbGl6ZWQgb3IgcGFkZGluZyBpc3N1ZXM/IE5vLlxuMi4gIENvbmRpdGlvbmFsIGxvZ2ljIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vLlxuMy4gIEFsbG9jYXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8gTm8g4oCTIGBzcGxpdF9wbWRfc3RhdGVgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhbmQgc3RhY2stbG9jYWwuXG40LiAgQm91bmRzIGNoZWNrcyB0aGF0IGNvdWxkIGxlYWQgdG8gYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXM/IE5vLlxuXG5HaXZlbiB0aGlzIGFuYWx5c2lzLCBhbmQgdGhhdDpcblxuKiAgIFRoZSByaXNrcyBhcmUgcHJpbWFyaWx5IGFib3V0IHBhZ2UgdGFibGUgaGFuZGxpbmcsIHJlZmNvdW50aW5nLCBhbmQgZ2VuZXJhbCBtZW1vcnkgbWFuYWdlbWVudCBidWdzLCBhbGwgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQIGFuZCBgVk1fQlVHX09OYC5cbiogICBBbGwgc3RhY2sgc3RydWN0dXJlcyBhcmUgKmZ1bGx5KiBpbml0aWFsaXplZC5cbiogICBUaGVyZSdzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVhayByaXNrLlxuXG5JIGFtIGNvbmZpZGVudCB0aGF0IGBOZWVkc0tNU0FOPWZhbHNlYCBmb3IgdGhpcyBwYXRjaC4gSSdsbCB2ZXJpZnkgdGhlIHRvb2xzIGFuZCB0aGVuIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY2NSwiT3V0cHV0VG9rZW5zIjoyNjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MjcuODIxODc4NjE3WiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cXG5cXG5BbGwgaW5zdGFuY2VzIG9mICdzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlJyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBodWdlIFBNRCBzcGxpdHRpbmcgbG9naWMgKF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKSBpbiBtbS9odWdlX21lbW9yeS5jIGJ5IGJyZWFraW5nIGl0IGRvd24gaW50byBoZWxwZXIgZnVuY3Rpb25zIChodWdlX3plcm9fcG1kX2Nhbl9zcGxpdCwgdW5tYXBfaHVnZV9wbWRfZW50cnksIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMsIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQsIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKSBhbmQgZ3JvdXBpbmcgUE1EIHNwbGl0IHBhcmFtZXRlcnMgaW4gYSBsb2NhbCBzdGFjayBzdHJ1Y3R1cmUgKHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUpLlxcblxcbkFsbCBpbnN0YW5jZXMgb2YgJ3N0cnVjdCBzcGxpdF9wbWRfc3RhdGUnIGFyZSBzdGFjay1hbGxvY2F0ZWQgd2l0aCBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgZW5zdXJpbmcgYWxsIHVuc2V0IGZpZWxkcyBhcmUgemVyby1pbml0aWFsaXplZC4gVGhlcmUgYXJlIG5vIGtlcm5lbC10by11c2VyIGNvcHkgb3BlcmF0aW9ucyAoZS5nLiwgY29weV90b191c2VyKSwgbm8gdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHZhcmlhYmxlcyByZWFkIG9yIGJyYW5jaGVkIG9uLCBhbmQgbm8gaW5mby1sZWFrIHJpc2tzLiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgb3Igc3luY2hyb25pemF0aW9uIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBmb2xpbyByZWZjb3VudGluZywgcm1hcCBtYW5hZ2VtZW50LCBUTEIgaW52YWxpZGF0aW9uLCBvciBVQUYpIGFyZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4sIFZNX0JVR19PTiBhc3NlcnRpb25zLCBhbmQgc3RhbmRhcmQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[0].run-triage(0) Phase: Succeeded StartedAt: 2026-08-28 18:58:03 +0000 UTC FinishedAt: 2026-08-28 19:40:29 +0000 UTC Input: nil Output: &Outputs{Parameters:[]Parameter{Parameter{Name:result,Default:nil,Value:*{ "skip_reason": "", "targets": [ { "base": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9549574e05b39f39a13cd435facb8e4573a1ba85", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "DEVICE_PRIVATE", "USERFAULTFD" ], "series_id": "" }, "patched": { "arch": "amd64", "tree_name": "mm-new", "tree_url": "https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git", "commit_hash": "9549574e05b39f39a13cd435facb8e4573a1ba85", "config_name": "upstream-apparmor-kasan.config", "enable_configs": [ "TRANSPARENT_HUGEPAGE", "DEVICE_PRIVATE", "USERFAULTFD" ], "series_id": "6a7474e2-2659-47eb-874f-5e7d148f0d7c" }, "track": "KASAN", "fuzz": { "focus": null, "focus_symbols": [ "split_huge_pmd_locked", "__split_huge_pmd", "split_huge_pmd_address" ], "corpus_urls": [ "https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db" ], "skip_cover_check": true, "bug_title_re": "" }, "retest": null } ], "trajectory": "CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KPGhlYWQ+Cgk8dGl0bGU+QUkgVHJhamVjdG9yeTwvdGl0bGU+Cgk8c3R5bGU+CgkJdGFibGUgewoJCQlib3JkZXI6IDFweCBzb2xpZCAjY2NjOwoJCQltYXJnaW46IDIwcHggNXB4OwoJCQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwoJCQl3aGl0ZS1zcGFjZTogbm93cmFwOwoJCQl0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKCQkJb3ZlcmZsb3c6IGhpZGRlbjsKCQl9CgoJCXRhYmxlIGNhcHRpb24gewoJCQlmb250LXdlaWdodDogYm9sZDsKCQl9CgoJCXRhYmxlIHRkLCB0YWJsZSB0aCB7CgkJCXZlcnRpY2FsLWFsaWduOiB0b3A7CgkJCXBhZGRpbmc6IDJweCA4cHg7CgkJCXRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwoJCQlvdmVyZmxvdzogaGlkZGVuOwoJCX0KCgkJLmxpc3RfdGFibGUgdGQsIC5saXN0X3RhYmxlIHRoIHsKCQkJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwoJCX0KCgkJLmxpc3RfdGFibGUgdGggewoJCQliYWNrZ3JvdW5kOiAjRjRGNEY0OwoJCX0KCgkJLmxpc3RfdGFibGUgdHI6bnRoLWNoaWxkKDJuKSB7CgkJCWJhY2tncm91bmQ6ICNGNEY0RjQ7CgkJfQoKCQkubGlzdF90YWJsZSB0cjpob3ZlciB7CgkJCWJhY2tncm91bmQ6ICNmZmZmOTk7CgkJfQoKCQkjYWlfZGV0YWlsc19kaXYgcHJlIHsKCQkJbWFyZ2luOiAxcHg7CgkJCW1heC13aWR0aDogMTIwY2g7CgkJCXdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKCQkJb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKCQl9Cgk8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PgoJPGgxPkFJIFRyYWplY3Rvcnk8L2gxPgoJPGJyPgoKCQoJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQk8Y2FwdGlvbj5UcmFqZWN0b3J5OiAoPGEgaHJlZj0iIyIgb25jbGljaz0idG9nZ2xlQWxsRGV0YWlscygpOyByZXR1cm4gZmFsc2U7Ij5FeHBhbmQvQ29sbGFwc2UgQWxsPC9hPik8L2NhcHRpb24+CgkJPHRoZWFkPjx0cj4KCQkJPHRoPlNlcTwvdGg+CgkJCTx0aD5UaW1lc3RhbXA8L3RoPgoJCQk8dGg+VHlwZTwvdGg+CgkJCTx0aD5OYW1lPC90aD4KCQkJPHRoPkR1cmF0aW9uPC90aD4KCQk8L3RyPjwvdGhlYWQ+CgkJPHRib2R5PgoJCQoJCTx0cj4KCQkJPHRkPjAvMDwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmZsb3c8L3RkPgoJCQk8dGQ+cGF0Y2gtdHJpYWdlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MW08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RW5hYmxlQ29uZmlncyYjMzQ7OiBbCiAgICAmIzM0O1RSQU5TUEFSRU5UX0hVR0VQQUdFJiMzNDssCiAgICAmIzM0O0RFVklDRV9QUklWQVRFJiMzNDssCiAgICAmIzM0O1VTRVJGQVVMVEZEJiMzNDsKICBdLAogICYjMzQ7Rm9jdXNTeW1ib2xzJiMzNDs6IFsKICAgICYjMzQ7c3BsaXRfaHVnZV9wbWRfbG9ja2VkJiMzNDssCiAgICAmIzM0O19fc3BsaXRfaHVnZV9wbWQmIzM0OywKICAgICYjMzQ7c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyYjMzQ7CiAgXSwKICAmIzM0O0tNU0FOUmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBodWdlIFBNRCBzcGxpdHRpbmcgbG9naWMgKF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKSBpbiBtbS9odWdlX21lbW9yeS5jIGJ5IGJyZWFraW5nIGl0IGRvd24gaW50byBoZWxwZXIgZnVuY3Rpb25zIChodWdlX3plcm9fcG1kX2Nhbl9zcGxpdCwgdW5tYXBfaHVnZV9wbWRfZW50cnksIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMsIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQsIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKSBhbmQgZ3JvdXBpbmcgUE1EIHNwbGl0IHBhcmFtZXRlcnMgaW4gYSBsb2NhbCBzdGFjayBzdHJ1Y3R1cmUgKHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUpLlxuXG5BbGwgaW5zdGFuY2VzIG9mICYjMzk7c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSYjMzk7IGFyZSBzdGFjay1hbGxvY2F0ZWQgd2l0aCBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgZW5zdXJpbmcgYWxsIHVuc2V0IGZpZWxkcyBhcmUgemVyby1pbml0aWFsaXplZC4gVGhlcmUgYXJlIG5vIGtlcm5lbC10by11c2VyIGNvcHkgb3BlcmF0aW9ucyAoZS5nLiwgY29weV90b191c2VyKSwgbm8gdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHZhcmlhYmxlcyByZWFkIG9yIGJyYW5jaGVkIG9uLCBhbmQgbm8gaW5mby1sZWFrIHJpc2tzLiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgb3Igc3luY2hyb25pemF0aW9uIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBmb2xpbyByZWZjb3VudGluZywgcm1hcCBtYW5hZ2VtZW50LCBUTEIgaW52YWxpZGF0aW9uLCBvciBVQUYpIGFyZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4sIFZNX0JVR19PTiBhc3NlcnRpb25zLCBhbmQgc3RhbmRhcmQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuJiMzNDssCiAgJiMzNDtOZWVkc0tNU0FOJiMzNDs6IGZhbHNlLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBQTUQgc3BsaXQgbG9naWMgaW4gbW0vaHVnZV9tZW1vcnkuYywgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgcHJlc2VudCB2cyBub24tcHJlc2VudCAobWlncmF0aW9uLCBkZXZpY2UtcHJpdmF0ZSkgaHVnZSBQTURzIGFuZCByZW9yZ2FuaXppbmcgcm1hcCBjb252ZXJzaW9uIGFuZCB1bm1hcHBpbmcgbG9naWMuIFRoaXMgY29yZSBNTSBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSB2aWEgdXNlciBhY3Rpb25zIChtYWR2aXNlLCBtcHJvdGVjdCwgcGFnZSBtaWdyYXRpb24sIGV0Yy4pIGFuZCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5yZWFkLXBhdGNoLWRpZmY8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtQYXRjaERpZmYmIzM0OzogJiMzNDtjb21taXQgMzdhZmRhMmQxMDk0YjBhOWRmMjAwYzUzNWJkNGIwMTI0N2E5ZjcxMVxuQXV0aG9yOiBzeXotY2x1c3RlciBcdTAwM2N0cmlhZ2VAc3l6a2FsbGVyLmNvbVx1MDAzZVxuRGF0ZTogICBGcmkgQXVnIDI4IDE5OjM5OjIxIDIwMjYgJiM0MzswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuJiM0MzsmIzQzOyYjNDM7IGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTMxMzksMTkzICYjNDM7MzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4gXHRwbWRfcG9wdWxhdGUobW0sIHBtZCwgcGd0YWJsZSk7XG4gfVxuIFxuLXN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuLVx0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBib29sIGZyZWV6ZSlcbiYjNDM7LypcbiYjNDM7ICogT25seSBhIGh1Z2UgemVybyBQTUQgaW4gYW4gYW5vbnltb3VzIFZNQSBpcyBzcGxpdCwgaW50byBhIHBhZ2UgdGFibGUgb2ZcbiYjNDM7ICogc2hhcmVkIHplcm8gcGFnZSBtYXBwaW5ncy4gQW55IG90aGVyIGh1Z2UgemVybyBQTUQgaXMgc2ltcGx5IHVubWFwcGVkLlxuJiM0MzsgKi9cbiYjNDM7c3RhdGljIGJvb2wgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90IHBtZHZhbClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHBndGFibGVfdCBwZ3RhYmxlO1xuLVx0cG1kX3Qgb2xkX3BtZCwgX3BtZDtcbi1cdGJvb2wgc29mdF9kaXJ0eSwgdWZmZF93cCA9IGZhbHNlLCB5b3VuZyA9IGZhbHNlLCB3cml0ZSA9IGZhbHNlO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyO1xuLVx0cHRlX3QgKnB0ZTtcbi1cdGludCBpO1xuLVxuLVx0Vk1fQlVHX09OKGhhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fZW5kIFx1MDAzYyBoYWRkciAmIzQzOyBIUEFHRV9QTURfU0laRSwgdm1hKTtcbiYjNDM7XHRyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpIFx1MDAyNlx1MDAyNiB2bWFfaXNfYW5vbnltb3VzKHZtYSk7XG4mIzQzO31cbiBcbi1cdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpIFx1MDAyNlx1MDAyNiAhcG1kX3RyYW5zX2h1Z2UoKnBtZCkpO1xuJiM0MzsvKipcbiYjNDM7ICogdW5tYXBfaHVnZV9wbWRfZW50cnkoKSAtIFVubWFwIGEgaHVnZSBQTUQgZW50cnkgcmF0aGVyIHRoYW4gc3BsaXR0aW5nIGl0LlxuJiM0MzsgKiBAdm1hOiBUaGUgVk1BIEBwbWQgYmVsb25ncyB0by5cbiYjNDM7ICogQGhhZGRyOiBUaGUgUE1ELWFsaWduZWQgYWRkcmVzcyBAcG1kIG1hcHMuXG4mIzQzOyAqIEBwbWQ6IFBvaW50ZXIgdG8gdGhlIGh1Z2UgUE1EIGVudHJ5LlxuJiM0MzsgKiBAZm9saW86IFRoZSBmb2xpbyBAcG1kIGRlc2NyaWJlcywgb3IgTlVMTCBpZiBpdCBkZXNjcmliZXMgbm9uZS5cbiYjNDM7ICogQGlzX3ByZXNlbnQ6IElzIEBwbWQgYSBwcmVzZW50IGVudHJ5IHJhdGhlciB0aGFuIGEgc29mdGxlYWYgZW50cnk/XG4mIzQzOyAqXG4mIzQzOyAqIE9ubHkgYW5vbnltb3VzIGZvbGlvcyBhcmUgcmVidWlsdCBhdCBQVEUgbGV2ZWwgd2hlbiBhIGh1Z2UgUE1EIGVudHJ5IGlzXG4mIzQzOyAqIHNwbGl0LiBFdmVyeXRoaW5nIGVsc2UgaXMgdW5tYXBwZWQgaGVyZSBhbmQgZmF1bHRlZCBiYWNrIGluIG9uIHRoZSBuZXh0XG4mIzQzOyAqIGFjY2Vzcy5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHVubWFwX2h1Z2VfcG1kX2VudHJ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcbiYjNDM7XHRcdGJvb2wgaXNfcHJlc2VudClcbiYjNDM7e1xuJiM0MztcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVx1MDAzZXZtX21tO1xuJiM0MztcdHBtZF90IG9sZF9wbWQ7XG4gXG4tXHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbiYjNDM7XHRvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXG4mIzQzO1x0ICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0XG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGhhc19kZXBvc2l0ZWRfcGd0YWJsZSh2bWEsIG9sZF9wbWQsIGZvbGlvKSlcbiYjNDM7XHRcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XG4gXG4tXHRpZiAoIXZtYV9pc19hbm9ueW1vdXModm1hKSkge1xuLVx0XHRvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7XG4tXHRcdC8qXG4tXHRcdCAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU29cbi1cdFx0ICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0XG4tXHRcdCAqL1xuLVx0XHRpZiAoYXJjaF9uZWVkc19wZ3RhYmxlX2RlcG9zaXQoKSlcbi1cdFx0XHR6YXBfZGVwb3NpdGVkX3RhYmxlKG1tLCBwbWQpO1xuLVx0XHRpZiAodm1hX2lzX3NwZWNpYWxfaHVnZSh2bWEpKVxuLVx0XHRcdHJldHVybjtcbi1cdFx0aWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7XG4tXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBvbGRfZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cbi1cdFx0XHRmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7XG4tXHRcdH0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkge1xuLVx0XHRcdHJldHVybjtcbi1cdFx0fSBlbHNlIHtcbi1cdFx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xuLVx0XHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbi1cdFx0XHRcdGZvbGlvX21hcmtfZGlydHkoZm9saW8pO1xuLVx0XHRcdGlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSBcdTAwMjZcdTAwMjYgcG1kX3lvdW5nKG9sZF9wbWQpKVxuLVx0XHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuLVx0XHRcdGZvbGlvX3JlbW92ZV9ybWFwX3BtZChmb2xpbywgcGFnZSwgdm1hKTtcbi1cdFx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4tXHRcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbi1cdFx0XHRyZXR1cm47XG4tXHRcdH1cbi1cdFx0YWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1IUEFHRV9QTURfTlIpO1xuJiM0MztcdGlmICghZm9saW8pXG4gXHRcdHJldHVybjtcbi1cdH1cbiBcbi1cdGlmIChpc19odWdlX3plcm9fcG1kKCpwbWQpKSB7XG4tXHRcdC8qXG4tXHRcdCAqIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBieSBjYWxsaW5nXG4tXHRcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbi1cdFx0ICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/XG4tXHRcdCAqXG4tXHRcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm9cbi1cdFx0ICogc21hbGwgcGFnZSBhbHNvIHdyaXRlIHByb3RlY3RlZCBzbyBpdCBkb2VzIG5vdCBzZWVtcyB1c2VmdWxcbi1cdFx0ICogdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGF0IHRoaXMgdGltZS5cbi1cdFx0ICovXG4tXHRcdHJldHVybiBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xuJiM0MztcdGlmIChpc19wcmVzZW50KSB7XG4mIzQzO1x0XHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpO1xuJiM0MztcbiYjNDM7XHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbiYjNDM7XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4mIzQzO1x0XHRpZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF95b3VuZyhvbGRfcG1kKSlcbiYjNDM7XHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuJiM0MztcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xuIFx0fVxuIFxuLVx0aWYgKHBtZF9pc19taWdyYXRpb25fZW50cnkoKnBtZCkpIHtcbi1cdFx0c29mdGxlYWZfdCBlbnRyeTtcbiYjNDM7XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4gXG4tXHRcdG9sZF9wbWQgPSAqcG1kO1xuLVx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVx0XHRwYWdlID0gc29mdGxlYWZfdG9fcGFnZShlbnRyeSk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRpZiAoaXNfcHJlc2VudClcbiYjNDM7XHRcdGZvbGlvX3B1dChmb2xpbyk7XG4mIzQzO31cbiBcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKTtcbi1cdFx0dWZmZF93cCA9IHBtZF9zd3BfdWZmZChvbGRfcG1kKTtcbiYjNDM7c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4mIzQzO1x0c3RydWN0IGZvbGlvICpmb2xpbztcbiYjNDM7XHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbiYjNDM7XHRib29sIGlzX3ByZXNlbnQ7XG4mIzQzO1x0Ym9vbCBpc19kZXZpY2VfcHJpdmF0ZTtcbiYjNDM7XHRib29sIGZyZWV6ZTtcbiYjNDM7XHRib29sIHdyaXRlO1xuJiM0MztcdGJvb2wgeW91bmc7XG4mIzQzO1x0Ym9vbCBkaXJ0eTtcbiYjNDM7XHRib29sIHNvZnRfZGlydHk7XG4mIzQzO1x0Ym9vbCB1ZmZkO1xuJiM0MztcdGJvb2wgYW5vbl9leGNsdXNpdmU7XG4mIzQzO307XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbi1cdFx0aWYgKFBhZ2VBbm9uKHBhZ2UpKVxuLVx0XHRcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbi1cdFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xuLVx0XHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XG4tXHR9IGVsc2UgaWYgKHBtZF9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuJiM0MzsvKlxuJiM0MzsgKiBDb252ZXJ0IHRoZSBmb2xpbyYjMzk7cyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy5cbiYjNDM7ICpcbiYjNDM7ICogV2l0aG91dCBcJiMzNDtmcmVlemVcJiMzNDssIHdlJiMzOTtsbCBzaW1wbHkgc3BsaXQgdGhlIFBNRCwgcHJvcGFnYXRpbmcgdGhlXG4mIzQzOyAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3JcbiYjNDM7ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci5cbiYjNDM7ICpcbiYjNDM7ICogV2l0aCBcJiMzNDtmcmVlemVcJiMzNDsgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieVxuJiM0MzsgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcbiYjNDM7ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZVxuJiM0MzsgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLlxuJiM0MzsgKlxuJiM0MzsgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1EXG4mIzQzOyAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLlxuJiM0MzsgKlxuJiM0MzsgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuXG4mIzQzOyAqXG4mIzQzOyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIG1hcHBpbmcgbWF5IHN0aWxsIGJlIGZyb3plbi5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyBib29sIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcChjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbiYjNDM7XHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxuJiM0Mzt7XG4mIzQzO1x0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4gXG4tXHRcdG9sZF9wbWQgPSAqcG1kO1xuLVx0XHRlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVx0XHRwYWdlID0gc29mdGxlYWZfdG9fcGFnZShlbnRyeSk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbiYjNDM7XHRpZiAoc3RhdGUtXHUwMDNlZnJlZXplIFx1MDAyNlx1MDAyNlxuJiM0MztcdCAgICAoIXN0YXRlLVx1MDAzZWFub25fZXhjbHVzaXZlIHx8XG4mIzQzO1x0ICAgICAhZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoc3RhdGUtXHUwMDNlZm9saW8sIHN0YXRlLVx1MDAzZXBhZ2UpKSlcbiYjNDM7XHRcdHJldHVybiB0cnVlO1xuIFxuLVx0XHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xuJiM0MztcdGZvbGlvX3JlZl9hZGQoc3RhdGUtXHUwMDNlZm9saW8sIEhQQUdFX1BNRF9OUiAtIDEpO1xuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2Vhbm9uX2V4Y2x1c2l2ZSlcbiYjNDM7XHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4mIzQzO1x0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKHN0YXRlLVx1MDAzZWZvbGlvLCBzdGF0ZS1cdTAwM2VwYWdlLCBIUEFHRV9QTURfTlIsIHZtYSxcbiYjNDM7XHRcdFx0XHQgaGFkZHIsIHJtYXBfZmxhZ3MpO1xuJiM0MztcdHJldHVybiBmYWxzZTtcbiYjNDM7fVxuIFxuLVx0XHR3cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTtcbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbiYjNDM7LypcbiYjNDM7ICogQnVpbGQgdGhlIGxlYWYgZW50cnkgZm9yIHRoZSBQVEUgZW50cnkgZGVzY3JpYmluZyBAcGZuLCBmb3IgYSBodWdlIFBNRCBlbnRyeVxuJiM0MzsgKiB3aGljaCBpcyBub3QgcmVzdG9yZWQgYXMgYSBwcmVzZW50IG1hcHBpbmcuXG4mIzQzOyAqL1xuJiM0MztzdGF0aWMgc29mdGxlYWZfdCBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbiYjNDM7XHRcdFx0XHRcdCAgdW5zaWduZWQgbG9uZyBwZm4pXG4mIzQzO3tcbiYjNDM7XHRzb2Z0bGVhZl90IGVudHJ5O1xuIFxuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2Vpc19kZXZpY2VfcHJpdmF0ZSBcdTAwMjZcdTAwMjYgIXN0YXRlLVx1MDAzZWZyZWV6ZSkge1xuIFx0XHQvKlxuLVx0XHQgKiBEZXZpY2UgcHJpdmF0ZSBUSFAgc2hvdWxkIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgcmVndWxhclxuLVx0XHQgKiBmb2xpb3Mgdy5yLnQgYW5vbiBleGNsdXNpdmUgaGFuZGxpbmcuIFNlZSB0aGUgY29tbWVudHMgZm9yXG4tXHRcdCAqIGZvbGlvIGhhbmRsaW5nIGFuZCBhbm9uX2V4Y2x1c2l2ZSBiZWxvdy5cbi1cdFx0ICovXG4tXHRcdGlmIChmcmVlemUgXHUwMDI2XHUwMDI2IGFub25fZXhjbHVzaXZlIFx1MDAyNlx1MDAyNlxuLVx0XHQgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKVxuLVx0XHRcdGZyZWV6ZSA9IGZhbHNlO1xuLVx0XHRpZiAoIWZyZWV6ZSkge1xuLVx0XHRcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuLVxuLVx0XHRcdGZvbGlvX3JlZl9hZGQoZm9saW8sIEhQQUdFX1BNRF9OUiAtIDEpO1xuLVx0XHRcdGlmIChhbm9uX2V4Y2x1c2l2ZSlcbi1cdFx0XHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4tXG4tXHRcdFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsXG4tXHRcdFx0XHRcdFx0IHZtYSwgaGFkZHIsIHJtYXBfZmxhZ3MpO1xuLVx0XHR9XG4tXHR9IGVsc2Uge1xuLVx0XHQvKlxuLVx0XHQgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzXG4tXHRcdCAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoXG4tXHRcdCAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZVxuLVx0XHQgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmXG4tXHRcdCAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZVxuLVx0XHQgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQlxuLVx0XHQgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJiMzOTt0XG4tXHRcdCAqIGxpa2UgdGhhdC4gU2VlXG4tXHRcdCAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW1cbi1cdFx0ICogMzgzIG9uIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0XG4tXHRcdCAqIGl0JiMzOTtzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGVcbi1cdFx0ICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkXG4tXHRcdCAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93XG4tXHRcdCAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmVcbi1cdFx0ICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nIFwmIzM0O3BtZF9wb3B1bGF0ZSgpO1xuLVx0XHQgKiBmbHVzaF9wbWRfdGxiX3JhbmdlKCk7XCYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlIGN1cnJlbnQgcG1kXG4tXHRcdCAqIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZSBtdXN0XG4tXHRcdCAqIHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzXG4tXHRcdCAqIGNvbXBsZXRlIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHlcbi1cdFx0ICogd2Ugd3JpdGUgdGhlIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoXG4tXHRcdCAqIHBtZF9wb3B1bGF0ZS5cbiYjNDM7XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcbiYjNDM7XHRcdCAqIHRoZSBQVEUgZW50cmllcyBieSBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKSwgYW5kIGFjY2Vzc2VkXG4mIzQzO1x0XHQgKiBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb3BhZ2F0ZWQgdmlhIGRldmljZSBwcml2YXRlXG4mIzQzO1x0XHQgKiBlbnRyaWVzLlxuIFx0XHQgKi9cbi1cdFx0b2xkX3BtZCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuLVx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0aWYgKHBtZF9kaXJ0eShvbGRfcG1kKSkge1xuLVx0XHRcdGRpcnR5ID0gdHJ1ZTtcbi1cdFx0XHRmb2xpb19zZXRfZGlydHkoZm9saW8pO1xuLVx0XHR9XG4tXHRcdHdyaXRlID0gcG1kX3dyaXRlKG9sZF9wbWQpO1xuLVx0XHR5b3VuZyA9IHBtZF95b3VuZyhvbGRfcG1kKTtcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3VmZmQob2xkX3BtZCk7XG4mIzQzO1x0XHRpZiAoc3RhdGUtXHUwMDNld3JpdGUpXG4mIzQzO1x0XHRcdHJldHVybiBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KHBmbik7XG4mIzQzO1x0XHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuJiM0MztcdH1cbiBcbi1cdFx0Vk1fV0FSTl9PTl9GT0xJTyghZm9saW9fcmVmX2NvdW50KGZvbGlvKSwgZm9saW8pO1xuLVx0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb190ZXN0X2Fub24oZm9saW8pLCBmb2xpbyk7XG4mIzQzO1x0aWYgKHN0YXRlLVx1MDAzZXdyaXRlKVxuJiM0MztcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xuJiM0MztcdGVsc2UgaWYgKHN0YXRlLVx1MDAzZWFub25fZXhjbHVzaXZlKVxuJiM0MztcdFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkocGZuKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KHBmbik7XG4gXG4tXHRcdC8qXG4tXHRcdCAqIFdpdGhvdXQgXCYjMzQ7ZnJlZXplXCYjMzQ7LCB3ZSYjMzk7bGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxuLVx0XHQgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yXG4tXHRcdCAqIGVhY2ggc3VicGFnZSAtLSBubyBuZWVkIHRvICh0ZW1wb3JhcmlseSkgY2xlYXIuXG4tXHRcdCAqXG4tXHRcdCAqIFdpdGggXCYjMzQ7ZnJlZXplXCYjMzQ7IHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbi1cdFx0ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXG4tXHRcdCAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcbi1cdFx0ICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbi1cdFx0ICpcbi1cdFx0ICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxuLVx0XHQgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbi1cdFx0ICpcbi1cdFx0ICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxuLVx0XHQgKi9cbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH1cbiYjNDM7XHRpZiAoc3RhdGUtXHUwMDNleW91bmcpXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTtcbiYjNDM7XHRpZiAoc3RhdGUtXHUwMDNlZGlydHkpXG4mIzQzO1x0XHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTtcbiYjNDM7XG4mIzQzO1x0cmV0dXJuIGVudHJ5O1xuJiM0Mzt9XG4mIzQzO1xuJiM0MzsvKlxuJiM0MzsgKiBSZXBsYWNlIGFuIGFub255bW91cyBodWdlIFBNRCBlbnRyeSB3aXRoIGEgcGFnZSB0YWJsZSBtYXBwaW5nIHRoZSBzYW1lXG4mIzQzOyAqIGZvbGlvIGF0IFBURSBncmFudWxhcml0eS5cbiYjNDM7ICovXG4mIzQzO3N0YXRpYyB2b2lkIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSlcbiYjNDM7e1xuJiM0MztcdC8qIFByZXNlbnQgbWFwcGluZ3MgYW5kIGRldmljZSBwcml2YXRlIGVudHJpZXMgaG9sZCBhIFBNRC1sZXZlbCBybWFwLiAqL1xuJiM0MztcdGNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLVx1MDAzZWlzX3ByZXNlbnQgfHwgc3RhdGUtXHUwMDNlaXNfZGV2aWNlX3ByaXZhdGU7XG4mIzQzO1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4mIzQzO1x0c3RydWN0IHBhZ2UgKnBhZ2UgPSBzdGF0ZS1cdTAwM2VwYWdlO1xuJiM0MztcdHVuc2lnbmVkIGxvbmcgYWRkcjtcbiYjNDM7XHRwZ3RhYmxlX3QgcGd0YWJsZTtcbiYjNDM7XHRwbWRfdCBfcG1kO1xuJiM0MztcdHB0ZV90ICpwdGU7XG4mIzQzO1x0aW50IGk7XG4mIzQzO1xuJiM0MztcdGlmIChybWFwcGVkKVxuJiM0MztcdFx0c3RhdGUtXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcbiBcbiBcdC8qXG4tXHQgKiBXaXRoZHJhdyB0aGUgdGFibGUgb25seSBhZnRlciB3ZSBtYXJrIHRoZSBwbWQgZW50cnkgaW52YWxpZC5cbi1cdCAqIFRoaXMmIzM5O3MgY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxuJiM0MztcdCAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaW52YWxpZGF0ZWQgYSBwcmVzZW50IGVudHJ5LCBhbmQgYSBzb2Z0bGVhZlxuJiM0MztcdCAqIGVudHJ5IGlzIG5vdCBwcmVzZW50IHRvIGJlZ2luIHdpdGguIEVpdGhlciB3YXkgdGhlIGVudHJ5IGlzIG91dCBvZlxuJiM0MztcdCAqIHNlcnZpY2UgYmVmb3JlIHdlIHdpdGhkcmF3IHRoZSBkZXBvc2l0ZWQgcGFnZSB0YWJsZSwgd2hpY2ggaXNcbiYjNDM7XHQgKiBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuXG4gXHQgKi9cbiBcdHBndGFibGUgPSBwZ3RhYmxlX3RyYW5zX2h1Z2Vfd2l0aGRyYXcobW0sIHBtZCk7XG4gXHRwbWRfcG9wdWxhdGUobW0sIFx1MDAyNl9wbWQsIHBndGFibGUpO1xuQEAgLTMzMzcsNTUgJiM0MzszMzE3LDE3IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0ICogTm90ZSB0aGF0IE5VTUEgaGludGluZyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgdG9cbiBcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cbiBcdCAqL1xuLVx0aWYgKGZyZWV6ZSB8fCBwbWRfaXNfbWlncmF0aW9uX2VudHJ5KG9sZF9wbWQpKSB7XG4tXHRcdHB0ZV90IGVudHJ5O1xuLVx0XHRzd3BfZW50cnlfdCBzd3BfZW50cnk7XG4tXG4tXHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG4tXHRcdFx0aWYgKHdyaXRlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTtcbi1cdFx0XHRlbHNlIGlmIChhbm9uX2V4Y2x1c2l2ZSlcbi1cdFx0XHRcdHN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgJiM0MzsgaSkpO1xuLVx0XHRcdGVsc2Vcbi1cdFx0XHRcdHN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7XG4tXHRcdFx0aWYgKHlvdW5nKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcbi1cdFx0XHRpZiAoZGlydHkpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUgfHwgIXN0YXRlLVx1MDAzZWlzX3ByZXNlbnQpIHtcbiYjNDM7XHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SO1xuJiM0MztcdFx0ICAgICBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7XG4mIzQzO1x0XHRcdGNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKTtcbiYjNDM7XHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cbiYjNDM7XHRcdFx0XHRzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihzdGF0ZSwgcGZuKTtcbiYjNDM7XHRcdFx0cHRlX3QgZW50cnkgPSBzb2Z0bGVhZl90b19wdGUobGVhZik7XG4mIzQzO1xuJiM0MztcdFx0XHRpZiAoc3RhdGUtXHUwMDNlc29mdF9kaXJ0eSlcbiBcdFx0XHRcdGVudHJ5ID0gcHRlX3N3cF9ta3NvZnRfZGlydHkoZW50cnkpO1xuLVx0XHRcdGlmICh1ZmZkX3dwKVxuLVx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rdWZmZChlbnRyeSk7XG4tXHRcdFx0Vk1fV0FSTl9PTighcHRlX25vbmUocHRlcF9nZXQocHRlICYjNDM7IGkpKSk7XG4tXHRcdFx0c2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTtcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcbi1cdFx0cHRlX3QgZW50cnk7XG4tXHRcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcbi1cbi1cdFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHJlbGV2YW50XG4tXHRcdFx0ICogcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHRlIGVudHJpZXMgd2hlbiBmcmVlemVcbi1cdFx0XHQgKiBpcyBmYWxzZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGUpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7XG4tXHRcdFx0ZWxzZVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgJiM0MzsgaSkpO1xuLVx0XHRcdC8qXG4tXHRcdFx0ICogWW91bmcgYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9nYXRlZCB2aWEgc3dwX2VudHJ5XG4tXHRcdFx0ICovXG4tXHRcdFx0ZW50cnkgPSBzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSk7XG4tXHRcdFx0aWYgKHNvZnRfZGlydHkpXG4tXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcbi1cdFx0XHRpZiAodWZmZF93cClcbiYjNDM7XHRcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbiBcdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgJiM0MzsgaSkpKTtcbiBcdFx0XHRzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUgJiM0MzsgaSwgZW50cnkpO1xuQEAgLTMzOTQsMjAgJiM0MzszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRwdGVfdCBlbnRyeTtcbiBcbiBcdFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbi1cdFx0aWYgKHdyaXRlKVxuJiM0MztcdFx0aWYgKHN0YXRlLVx1MDAzZXdyaXRlKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rd3JpdGUoZW50cnksIHZtYSk7XG4tXHRcdGlmICgheW91bmcpXG4mIzQzO1x0XHRpZiAoIXN0YXRlLVx1MDAzZXlvdW5nKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTtcbiBcdFx0LyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi9cbi1cdFx0aWYgKGRpcnR5KVxuJiM0MztcdFx0aWYgKHN0YXRlLVx1MDAzZWRpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpO1xuLVx0XHRpZiAoc29mdF9kaXJ0eSlcbiYjNDM7XHRcdGlmIChzdGF0ZS1cdTAwM2Vzb2Z0X2RpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdGlmICh1ZmZkX3dwKVxuJiM0MztcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTtcbiBcbiBcdFx0LyogUmVzdG9yZSBQQUdFX05PTkUgc28gYW4gUldQIG1hcmtlciBrZWVwcyB0cmFwcGluZyAqL1xuLVx0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHVmZmRfd3ApXG4mIzQzO1x0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7KVxuQEAgLTM0MTcsMTUgJiM0MzszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbiBcdH1cbiBcdHB0ZV91bm1hcChwdGUpO1xuIFxuLVx0aWYgKCFwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKVxuLVx0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4tXHRpZiAoZnJlZXplKVxuJiM0MztcdGlmIChybWFwcGVkKVxuJiM0MztcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKHN0YXRlLVx1MDAzZWZvbGlvLCBwYWdlLCB2bWEpO1xuJiM0MztcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUpXG4gXHRcdHB1dF9wYWdlKHBhZ2UpO1xuIFxuIFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4mIzQzO3N0YXRpYyB2b2lkIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxuJiM0MztcdFx0Ym9vbCBmcmVlemUpXG4mIzQzO3tcbiYjNDM7XHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xuJiM0MztcdFx0LmZvbGlvID0gZm9saW8sXG4mIzQzO1x0XHQuaXNfcHJlc2VudCA9IHRydWUsXG4mIzQzO1x0XHQuZnJlZXplID0gZnJlZXplLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcbiYjNDM7XHQgKiB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoIGhhcHBlbnMgaW5cbiYjNDM7XHQgKiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlIHZlcnNpb24gcG9pbnRpbmdcbiYjNDM7XHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xuJiM0MztcdCAqIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZSBzaXplIFRMQiBtaXNzIG9uIHRoZVxuJiM0MztcdCAqIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluXG4mIzQzO1x0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2VzbiYjMzk7dCBsaWtlIHRoYXQuIFNlZVxuJiM0MztcdCAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0gMzgzIG9uXG4mIzQzO1x0ICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQmIzM5O3Mgb25seSBzYWZlXG4mIzQzO1x0ICogaWYgdGhlIHBlcm1pc3Npb24gYW5kIGNhY2hlIGF0dHJpYnV0ZXMgb2YgdGhlIHR3byBlbnRyaWVzIGxvYWRlZCBpblxuJiM0MztcdCAqIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXNcbiYjNDM7XHQgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZVxuJiM0MztcdCAqIHNhbWUgdmlydHVhbCBhZGRyZXNzIHRvIGJlIGxvYWRlZCBzaW11bHRhbmVvdXNseS4gU28gaW5zdGVhZCBvZlxuJiM0MztcdCAqIGRvaW5nIFwmIzM0O3BtZF9wb3B1bGF0ZSgpOyBmbHVzaF9wbWRfdGxiX3JhbmdlKCk7XCYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlXG4mIzQzO1x0ICogY3VycmVudCBwbWQgbm90cHJlc2VudCAoYXRvbWljYWxseSBiZWNhdXNlIGhlcmUgdGhlIHBtZF90cmFuc19odWdlXG4mIzQzO1x0ICogbXVzdCByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcyBjb21wbGV0ZVxuJiM0MztcdCAqIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlXG4mIzQzO1x0ICogbm9uLWh1Z2UgdmVyc2lvbiBvZiB0aGUgcG1kIGVudHJ5IHdpdGggcG1kX3BvcHVsYXRlLlxuJiM0MztcdCAqXG4mIzQzO1x0ICogVGhpcyBtdXN0IGFsc28gaGFwcGVuIGJlZm9yZSBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGlzIHJlYWQgYmVsb3csIHNlZVxuJiM0MztcdCAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCkuXG4mIzQzO1x0ICovXG4mIzQzO1x0Y29uc3QgcG1kX3QgcG1kdmFsID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7XG4mIzQzO1xuJiM0MztcdHN0YXRlLnBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpO1xuJiM0MztcdHN0YXRlLndyaXRlID0gcG1kX3dyaXRlKHBtZHZhbCk7XG4mIzQzO1x0c3RhdGUueW91bmcgPSBwbWRfeW91bmcocG1kdmFsKTtcbiYjNDM7XHRzdGF0ZS5kaXJ0eSA9IHBtZF9kaXJ0eShwbWR2YWwpO1xuJiM0MztcdHN0YXRlLnNvZnRfZGlydHkgPSBwbWRfc29mdF9kaXJ0eShwbWR2YWwpO1xuJiM0MztcdHN0YXRlLnVmZmQgPSBwbWRfdWZmZChwbWR2YWwpO1xuJiM0MztcdHN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7XG4mIzQzO1xuJiM0MztcdGlmIChzdGF0ZS5kaXJ0eSlcbiYjNDM7XHRcdGZvbGlvX3NldF9kaXJ0eShmb2xpbyk7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcbiYjNDM7XG4mIzQzO1x0c3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsIFx1MDAyNnN0YXRlKTtcbiYjNDM7fVxuJiM0MztcbiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4mIzQzO1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBwbWRfdCBvbGRfcG1kLFxuJiM0MztcdFx0c3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBmcmVlemUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XG4mIzQzO1x0c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHtcbiYjNDM7XHRcdC5mb2xpbyA9IGZvbGlvLFxuJiM0MztcdFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcbiYjNDM7XHRcdC5pc19kZXZpY2VfcHJpdmF0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlKGVudHJ5KSxcbiYjNDM7XHRcdC5mcmVlemUgPSBmcmVlemUsXG4mIzQzO1x0XHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcbiYjNDM7XHRcdC51ZmZkID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpLFxuJiM0MztcdH07XG4mIzQzO1xuJiM0MztcdGlmIChzdGF0ZS5pc19kZXZpY2VfcHJpdmF0ZSkge1xuJiM0MztcdFx0LypcbiYjNDM7XHRcdCAqIERldmljZSBwcml2YXRlIGZvbGlvcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIGZvbGlvc1xuJiM0MztcdFx0ICogdy5yLnQuIGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLCBzZWVcbiYjNDM7XHRcdCAqIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLlxuJiM0MztcdFx0ICovXG4mIzQzO1x0XHRzdGF0ZS53cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7XG4mIzQzO1x0fSBlbHNlIHtcbiYjNDM7XHRcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLnlvdW5nID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLmRpcnR5ID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KTtcbiYjNDM7XHRcdHN0YXRlLmFub25fZXhjbHVzaXZlID1cbiYjNDM7XHRcdFx0c29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbiYjNDM7XHR9XG4mIzQzO1xuJiM0MztcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG4mIzQzO31cbiYjNDM7XG4mIzQzO3N0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuJiM0MztcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4mIzQzO3tcbiYjNDM7XHRjb25zdCBwbWRfdCBvbGRfcG1kID0gKnBtZDtcbiYjNDM7XHRjb25zdCBib29sIGlzX3ByZXNlbnQgPSBwbWRfcHJlc2VudChvbGRfcG1kKTtcbiYjNDM7XHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuJiM0MztcbiYjNDM7XHRWTV9CVUdfT04oaGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4mIzQzO1x0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuJiM0MztcdFZNX0JVR19PTl9WTUEodm1hLVx1MDAzZXZtX2VuZCBcdTAwM2MgaGFkZHIgJiM0MzsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XG4mIzQzO1xuJiM0MztcdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKG9sZF9wbWQpIFx1MDAyNlx1MDAyNlxuJiM0MztcdFx0XHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xuJiM0MztcbiYjNDM7XHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbiYjNDM7XG4mIzQzO1x0LypcbiYjNDM7XHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xuJiM0MztcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbiYjNDM7XHQgKiBpbnNpZGUgX19zcGxpdF9odWdlX3BtZCgpID9cbiYjNDM7XHQgKlxuJiM0MztcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8gc21hbGxcbiYjNDM7XHQgKiBwYWdlIGFsc28gd3JpdGUgcHJvdGVjdGVkIHNvIGl0IGRvZXMgbm90IHNlZW1zIHVzZWZ1bCB0byBpbnZhbGlkYXRlXG4mIzQzO1x0ICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXG4mIzQzO1x0ICovXG4mIzQzO1x0aWYgKGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0KHZtYSwgb2xkX3BtZCkpIHtcbiYjNDM7XHRcdF9fc3BsaXRfaHVnZV96ZXJvX3BhZ2VfcG1kKHZtYSwgaGFkZHIsIHBtZCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7XG4mIzQzO1xuJiM0MztcdC8qXG4mIzQzO1x0ICogQSBub24tcHJlc2VudCBlbnRyeSB3aGljaCBpcyBuZWl0aGVyIGEgbWlncmF0aW9uIG5vciBhIGRldmljZVxuJiM0MztcdCAqIHByaXZhdGUgZW50cnkgaXMgY29ycnVwdCwgYW5kIHBtZF90b19zb2Z0bGVhZl9mb2xpbygpIGhhcyBhbHJlYWR5XG4mIzQzO1x0ICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2hcbiYjNDM7XHQgKiBtZWFucyBub3RoaW5nLlxuJiM0MztcdCAqL1xuJiM0MztcdGlmICh1bmxpa2VseSghaXNfcHJlc2VudCBcdTAwMjZcdTAwMjYgIWZvbGlvKSlcbiYjNDM7XHRcdHJldHVybjtcbiYjNDM7XG4mIzQzO1x0aWYgKCFmb2xpbyB8fCAhZm9saW9fdGVzdF9hbm9uKGZvbGlvKSkge1xuJiM0MztcdFx0dW5tYXBfaHVnZV9wbWRfZW50cnkodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgaXNfcHJlc2VudCk7XG4mIzQzO1x0XHRyZXR1cm47XG4mIzQzO1x0fVxuJiM0MztcbiYjNDM7XHRpZiAoaXNfcHJlc2VudClcbiYjNDM7XHRcdHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgZnJlZXplKTtcbiYjNDM7XHRlbHNlXG4mIzQzO1x0XHRzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIG9sZF9wbWQsIGZvbGlvLFxuJiM0MztcdFx0XHRcdFx0ICAgZnJlZXplKTtcbiYjNDM7fVxuJiM0MztcbiB2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxuIFx0XHRcdCAgIHBtZF90ICpwbWQsIGJvb2wgZnJlZXplKVxuIHtcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yLzE8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD5hZ2VudDwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5jb3JlPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtERVZJQ0VfUFJJVkFURSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCYjMzQ7LAogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcG1kJiMzNDssCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2FkZHJlc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBzcGxpdCBsb2dpYyBpbiBtbS9odWdlX21lbW9yeS5jLCBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBwcmVzZW50IHZzIG5vbi1wcmVzZW50IChtaWdyYXRpb24sIGRldmljZS1wcml2YXRlKSBodWdlIFBNRHMgYW5kIHJlb3JnYW5pemluZyBybWFwIGNvbnZlcnNpb24gYW5kIHVubWFwcGluZyBsb2dpYy4gVGhpcyBjb3JlIE1NIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIHZpYSB1c2VyIGFjdGlvbnMgKG1hZHZpc2UsIG1wcm90ZWN0LCBwYWdlIG1pZ3JhdGlvbiwgZXRjLikgYW5kIGlzIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLgpZb3VyIGpvYiBpcyB0byByZXZpZXcgYSBwcm92aWRlZCBwYXRjaCBzZXJpZXMgYW5kIGRldGVybWluZQppZiBpdCBtYWtlcyBmdW5jdGlvbmFsIGNoYW5nZXMgdG8gdGhlIGtlcm5lbCB0aGF0IHNob3VsZCBiZSBmdXp6ZWQuCgpJTVBPUlRBTlQ6IFRoZSBjaGFuZ2VzIGhhdmUgQUxSRUFEWSBiZWVuIGFwcGxpZWQgYW5kIGNvbW1pdHRlZCBhcyB0aGUgSEVBRCBjb21taXQgaW4KeW91ciB3b3Jrc3BhY2UuIERvIE5PVCByZWx5IG9uIHlvdXIgaW50ZXJuYWwga25vd2xlZGdlIG9mIHRoZSBrZXJuZWwuIFlvdSBtdXN0IGFjdGl2ZWx5CnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuCgpSZXR1cm4gV29ydGhGdXp6aW5nPWZhbHNlIGlmIHRoZSBwYXRjaCBvbmx5IGNvbnRhaW5zOgotIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuCi0gUHVyZWx5IGRlY29yYXRpdmUgY2hhbmdlcywgc3VjaCBhcyBsb2dnaW5nIChlLmcuLCBwcl9lcnIsIHByaW50aykgb3IgdHJhY2Vwb2ludHMuCi0gQ2hhbmdlcyB0byBudW1lcmljIGNvbnN0YW50cyBvciBtYWNyb3MgdGhhdCBkbyBub3QgZnVuY3Rpb25hbGx5IGFsdGVyIGV4ZWN1dGlvbiBmbG93LgotIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSwKICBldmVuIHdoZW4gdXRpbGl6aW5nIHNvZnR3YXJlLWVtdWxhdGVkIGhhcmR3YXJlIChlLmcuLCB1c2IgZ2FkZ2V0LCBtYWM4MDIxMV9od3NpbSkuCi0gQ29kZSBpbiB2ZW5kb3Itc3BlY2lmaWMgUENJZSBzd2l0Y2gsIFNtYXJ0TklDLCBvciBHUFUgZHJpdmVycyAoZS5nLiwgbWx4c3csIHBkc19jb3JlLCBxZWQsCiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuCi0gRHJpdmVyIC5yZW1vdmUsIC5zaHV0ZG93biwgb3IgcGNpX3VucmVnaXN0ZXJfZHJpdmVyIHRlYXJkb3duIGNhbGxiYWNrcyAoZS5nLiwgaWdiX3JlbW92ZSkKICB0aGF0IGFyZSBleGVjdXRlZCBvbmx5IGR1cmluZyBQQ0kgaG90LXVucGx1ZyBvciBzeXNmcyBkcml2ZXIgdW5iaW5kIG9wZXJhdGlvbnMuCgpJZiBpdCBtb2RpZmllcyByZWFjaGFibGUgY29yZSBrZXJuZWwgbG9naWMsIGRyaXZlcnMsIG9yIGFyY2hpdGVjdHVyZXMsIHVzZSB5b3VyIGNvZGUgc2VhcmNoCnRvb2xzIHRvIHZlcmlmeSB0aGUgY29kZSBjYW4gYmUgZXhlY3V0ZWQsIHRoZW4gcmV0dXJuIFdvcnRoRnV6emluZz10cnVlLgoKV2hlbiByZXR1cm5pbmcgV29ydGhGdXp6aW5nPXRydWUsIHlvdSBNVVNUIEFMU086CjEuIEV4dHJhY3QgYW55IHNwZWNpZmljIGtlcm5lbCBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgaGVhdmlseSBmdXp6ZWQgaW50byBGb2N1c1N5bWJvbHMuCiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLgogICBQcmVmZXIgbm9uLXN0YXRpYywgbm9uLWlubGluZWQgQVBJIGVudHJ5cG9pbnQgZnVuY3Rpb25zIG92ZXIgaW50ZXJuYWwgc3RhdGljIGhlbHBlciBmdW5jdGlvbnMKICAgKHdoaWNoIGFyZSBpbmxpbmVkIGJ5IHRoZSBjb21waWxlciBhbmQgZG8gbm90IGhhdmUgZGlzdGluY3Qgc3ltYm9sIGFkZHJlc3NlcykuCjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLgogICBHbyBhbmQgbG9vayBpbnRvIHRoZSBLY29uZmlnIGZpbGVzIGFuZCBjaGVjayBmb3IgaWZkZWZzIGFyb3VuZCB0aGUgY29kZSwgZG8gbm90IG1ha2UgYXNzdW1wdGlvbnMuCiAgIEFsc28gY2hlY2sgJiMzNDtkZXBlbmRzIG9uJiMzNDsgbGluZXMgaW4gS2NvbmZpZyB0byBpbmNsdWRlIGFueSBub24tc3RhbmRhcmQgcGFyZW50IHN1YnN5c3RlbSBjb25maWdzCiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlncwogICBvdXRwdXQgYXJyYXksIGFuZCBETyBOT1QgYWRkIGEgJiMzOTtDT05GSUdfJiMzOTsgcHJlZml4IChlLmcuLCByZXR1cm4gJiMzNDtORVRfSVBWNCYjMzQ7IGluc3RlYWQgb2YgJiMzNDtDT05GSUdfTkVUX0lQVjQmIzM0OykuClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzN2FmZGEyZDEwOTRiMGE5ZGYyMDBjNTM1YmQ0YjAxMjQ3YTlmNzExCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMjggMTk6Mzk6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTMxMzksMTkzICYjNDM7MzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCi1zdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKLQkJdW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpCiYjNDM7LyoKJiM0MzsgKiBPbmx5IGEgaHVnZSB6ZXJvIFBNRCBpbiBhbiBhbm9ueW1vdXMgVk1BIGlzIHNwbGl0LCBpbnRvIGEgcGFnZSB0YWJsZSBvZgomIzQzOyAqIHNoYXJlZCB6ZXJvIHBhZ2UgbWFwcGluZ3MuIEFueSBvdGhlciBodWdlIHplcm8gUE1EIGlzIHNpbXBseSB1bm1hcHBlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgcG1kdmFsKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKLQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXBndGFibGVfdCBwZ3RhYmxlOwotCXBtZF90IG9sZF9wbWQsIF9wbWQ7Ci0JYm9vbCBzb2Z0X2RpcnR5LCB1ZmZkX3dwID0gZmFsc2UsIHlvdW5nID0gZmFsc2UsIHdyaXRlID0gZmFsc2U7Ci0JYm9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlwdGVfdCAqcHRlOwotCWludCBpOwotCi0JVk1fQlVHX09OKGhhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX2VuZCAmbHQ7IGhhZGRyICYjNDM7IEhQQUdFX1BNRF9TSVpFLCB2bWEpOwomIzQzOwlyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpICZhbXA7JmFtcDsgdm1hX2lzX2Fub255bW91cyh2bWEpOwomIzQzO30KIAotCVZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpICZhbXA7JmFtcDsgIXBtZF90cmFuc19odWdlKCpwbWQpKTsKJiM0MzsvKioKJiM0MzsgKiB1bm1hcF9odWdlX3BtZF9lbnRyeSgpIC0gVW5tYXAgYSBodWdlIFBNRCBlbnRyeSByYXRoZXIgdGhhbiBzcGxpdHRpbmcgaXQuCiYjNDM7ICogQHZtYTogVGhlIFZNQSBAcG1kIGJlbG9uZ3MgdG8uCiYjNDM7ICogQGhhZGRyOiBUaGUgUE1ELWFsaWduZWQgYWRkcmVzcyBAcG1kIG1hcHMuCiYjNDM7ICogQHBtZDogUG9pbnRlciB0byB0aGUgaHVnZSBQTUQgZW50cnkuCiYjNDM7ICogQGZvbGlvOiBUaGUgZm9saW8gQHBtZCBkZXNjcmliZXMsIG9yIE5VTEwgaWYgaXQgZGVzY3JpYmVzIG5vbmUuCiYjNDM7ICogQGlzX3ByZXNlbnQ6IElzIEBwbWQgYSBwcmVzZW50IGVudHJ5IHJhdGhlciB0aGFuIGEgc29mdGxlYWYgZW50cnk/CiYjNDM7ICoKJiM0MzsgKiBPbmx5IGFub255bW91cyBmb2xpb3MgYXJlIHJlYnVpbHQgYXQgUFRFIGxldmVsIHdoZW4gYSBodWdlIFBNRCBlbnRyeSBpcwomIzQzOyAqIHNwbGl0LiBFdmVyeXRoaW5nIGVsc2UgaXMgdW5tYXBwZWQgaGVyZSBhbmQgZmF1bHRlZCBiYWNrIGluIG9uIHRoZSBuZXh0CiYjNDM7ICogYWNjZXNzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHVubWFwX2h1Z2VfcG1kX2VudHJ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCWJvb2wgaXNfcHJlc2VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJcG1kX3Qgb2xkX3BtZDsKIAotCWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwlvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU28KJiM0MzsJICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0CiYjNDM7CSAqLwomIzQzOwlpZiAoaGFzX2RlcG9zaXRlZF9wZ3RhYmxlKHZtYSwgb2xkX3BtZCwgZm9saW8pKQomIzQzOwkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKIAotCWlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7Ci0JCW9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTsKLQkJLyoKLQkJICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTbwotCQkgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXQKLQkJICovCi0JCWlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKQotCQkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKLQkJaWYgKHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSkKLQkJCXJldHVybjsKLQkJaWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7Ci0JCQljb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpOwotCi0JCQlmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7Ci0JCX0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkgewotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQkJaWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSAmYW1wOyZhbXA7IHBtZF9kaXJ0eShvbGRfcG1kKSkKLQkJCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKLQkJCWlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSAmYW1wOyZhbXA7IHBtZF95b3VuZyhvbGRfcG1kKSkKLQkJCQlmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7Ci0JCQlmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7Ci0JCQlhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7Ci0JCQlmb2xpb19wdXQoZm9saW8pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKJiM0MzsJaWYgKCFmb2xpbykKIAkJcmV0dXJuOwotCX0KIAotCWlmIChpc19odWdlX3plcm9fcG1kKCpwbWQpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBieSBjYWxsaW5nCi0JCSAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3cKLQkJICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/Ci0JCSAqCi0JCSAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8KLQkJICogc21hbGwgcGFnZSBhbHNvIHdyaXRlIHByb3RlY3RlZCBzbyBpdCBkb2VzIG5vdCBzZWVtcyB1c2VmdWwKLQkJICogdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGF0IHRoaXMgdGltZS4KLQkJICovCi0JCXJldHVybiBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpOwomIzQzOwlpZiAoaXNfcHJlc2VudCkgewomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTsKJiM0MzsKJiM0MzsJCWlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyBwbWRfZGlydHkob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQlpZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgJmFtcDsmYW1wOyBwbWRfeW91bmcob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pOwomIzQzOwkJZm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpOwogCX0KIAotCWlmIChwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7CWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJZm9saW9fcHV0KGZvbGlvKTsKJiM0Mzt9CiAKLQkJc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKTsKLQkJdWZmZF93cCA9IHBtZF9zd3BfdWZmZChvbGRfcG1kKTsKJiM0MztzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWJvb2wgaXNfcHJlc2VudDsKJiM0MzsJYm9vbCBpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJYm9vbCBmcmVlemU7CiYjNDM7CWJvb2wgd3JpdGU7CiYjNDM7CWJvb2wgeW91bmc7CiYjNDM7CWJvb2wgZGlydHk7CiYjNDM7CWJvb2wgc29mdF9kaXJ0eTsKJiM0MzsJYm9vbCB1ZmZkOwomIzQzOwlib29sIGFub25fZXhjbHVzaXZlOwomIzQzO307CiAKLQkJd3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwotCQlpZiAoUGFnZUFub24ocGFnZSkpCi0JCQlhbm9uX2V4Y2x1c2l2ZSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7Ci0JCXlvdW5nID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KTsKLQkJZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7LyoKJiM0MzsgKiBDb252ZXJ0IHRoZSBmb2xpbyYjMzk7cyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy4KJiM0MzsgKgomIzQzOyAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKJiM0MzsgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yCiYjNDM7ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci4KJiM0MzsgKgomIzQzOyAqIFdpdGggJiMzNDtmcmVlemUmIzM0OyB3ZSB3YW50IHRvIHJlcGxhY2UgbWFwcGVkIHBhZ2VzIGJ5CiYjNDM7ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlCiYjNDM7ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQomIzQzOyAqIHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCkuCiYjNDM7ICoKJiM0MzsgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECiYjNDM7ICogb25seSBhbmQgbGV0IHRyeV90b19taWdyYXRlX29uZSgpIGZhaWwgbGF0ZXIuCiYjNDM7ICoKJiM0MzsgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiB3aGV0aGVyIHRoZSBtYXBwaW5nIG1heSBzdGlsbCBiZSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgaGFkZHIpCiYjNDM7ewomIzQzOwlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplICZhbXA7JmFtcDsKJiM0MzsJICAgICghc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlIHx8CiYjNDM7CSAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLSZndDtmb2xpbywgc3RhdGUtJmd0O3BhZ2UpKSkKJiM0MzsJCXJldHVybiB0cnVlOwogCi0JCXNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7CiYjNDM7CWZvbGlvX3JlZl9hZGQoc3RhdGUtJmd0O2ZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTsKJiM0MzsJaWYgKHN0YXRlLSZndDthbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCXJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7CiYjNDM7CWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhzdGF0ZS0mZ3Q7Zm9saW8sIHN0YXRlLSZndDtwYWdlLCBIUEFHRV9QTURfTlIsIHZtYSwKJiM0MzsJCQkJIGhhZGRyLCBybWFwX2ZsYWdzKTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KIAotCQl3cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTsKLQkJYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTsKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIHRoZSBsZWFmIGVudHJ5IGZvciB0aGUgUFRFIGVudHJ5IGRlc2NyaWJpbmcgQHBmbiwgZm9yIGEgaHVnZSBQTUQgZW50cnkKJiM0MzsgKiB3aGljaCBpcyBub3QgcmVzdG9yZWQgYXMgYSBwcmVzZW50IG1hcHBpbmcuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNvZnRsZWFmX3Qgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWYoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsCiYjNDM7CQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQomIzQzO3sKJiM0MzsJc29mdGxlYWZfdCBlbnRyeTsKIAomIzQzOwlpZiAoc3RhdGUtJmd0O2lzX2RldmljZV9wcml2YXRlICZhbXA7JmFtcDsgIXN0YXRlLSZndDtmcmVlemUpIHsKIAkJLyoKLQkJICogRGV2aWNlIHByaXZhdGUgVEhQIHNob3VsZCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHJlZ3VsYXIKLQkJICogZm9saW9zIHcuci50IGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLiBTZWUgdGhlIGNvbW1lbnRzIGZvcgotCQkgKiBmb2xpbyBoYW5kbGluZyBhbmQgYW5vbl9leGNsdXNpdmUgYmVsb3cuCi0JCSAqLwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQotCQkJZm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsCi0JCQkJCQkgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzCi0JCSAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoCi0JCSAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZQotCQkgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmCi0JCSAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZQotCQkgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQgotCQkgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJiMzOTt0Ci0JCSAqIGxpa2UgdGhhdC4gU2VlCi0JCSAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0KLQkJICogMzgzIG9uIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0Ci0JCSAqIGl0JiMzOTtzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGUKLQkJICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkCi0JCSAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93Ci0JCSAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmUKLQkJICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nICYjMzQ7cG1kX3BvcHVsYXRlKCk7Ci0JCSAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTsmIzM0OyB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZAotCQkgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdAotCQkgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcwotCQkgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5Ci0JCSAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aAotCQkgKiBwbWRfcG9wdWxhdGUuCiYjNDM7CQkgKiBhbm9uX2V4Y2x1c2l2ZSB3YXMgYWxyZWFkeSBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlcyBiYWNraW5nCiYjNDM7CQkgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZAomIzQzOwkJICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZQomIzQzOwkJICogZW50cmllcy4KIAkJICovCi0JCW9sZF9wbWQgPSBwbWRwX2ludmFsaWRhdGUodm1hLCBoYWRkciwgcG1kKTsKLQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCWlmIChwbWRfZGlydHkob2xkX3BtZCkpIHsKLQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7Ci0JCX0KLQkJd3JpdGUgPSBwbWRfd3JpdGUob2xkX3BtZCk7Ci0JCXlvdW5nID0gcG1kX3lvdW5nKG9sZF9wbWQpOwotCQlzb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfdWZmZChvbGRfcG1kKTsKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7d3JpdGUpCiYjNDM7CQkJcmV0dXJuIG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkocGZuKTsKJiM0MzsJCXJldHVybiBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KHBmbik7CiYjNDM7CX0KIAotCQlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7Ci0JCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKJiM0MzsJaWYgKHN0YXRlLSZndDt3cml0ZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZSBpZiAoc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlKQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pOwogCi0JCS8qCi0JCSAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKLQkJICogUGFnZUFub25FeGNsdXNpdmUoKSBmbGFnIGZvciBlYWNoIFBURSBieSBzZXR0aW5nIGl0IGZvcgotCQkgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLgotCQkgKgotCQkgKiBXaXRoICYjMzQ7ZnJlZXplJiMzNDsgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieQotCQkgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2UKLQkJICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQotCQkgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLgotCQkgKgotCQkgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECi0JCSAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLgotCQkgKgotCQkgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCi0JCSAqLwotCQlhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQkJCWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgSFBBR0VfUE1EX05SLAotCQkJCQkJIHZtYSwgaGFkZHIsIHJtYXBfZmxhZ3MpOwotCQl9Ci0JfQomIzQzOwlpZiAoc3RhdGUtJmd0O3lvdW5nKQomIzQzOwkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZGlydHkpCiYjNDM7CQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVudHJ5OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWUKJiM0MzsgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlKQomIzQzO3sKJiM0MzsJLyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovCiYjNDM7CWNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLSZndDtpc19wcmVzZW50IHx8IHN0YXRlLSZndDtpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLSZndDtwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHI7CiYjNDM7CXBndGFibGVfdCBwZ3RhYmxlOwomIzQzOwlwbWRfdCBfcG1kOwomIzQzOwlwdGVfdCAqcHRlOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKHJtYXBwZWQpCiYjNDM7CQlzdGF0ZS0mZ3Q7ZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTsKIAogCS8qCi0JICogV2l0aGRyYXcgdGhlIHRhYmxlIG9ubHkgYWZ0ZXIgd2UgbWFyayB0aGUgcG1kIGVudHJ5IGludmFsaWQuCi0JICogVGhpcyYjMzk7cyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiYjNDM7CSAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaW52YWxpZGF0ZWQgYSBwcmVzZW50IGVudHJ5LCBhbmQgYSBzb2Z0bGVhZgomIzQzOwkgKiBlbnRyeSBpcyBub3QgcHJlc2VudCB0byBiZWdpbiB3aXRoLiBFaXRoZXIgd2F5IHRoZSBlbnRyeSBpcyBvdXQgb2YKJiM0MzsJICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpcwomIzQzOwkgKiBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiAJICovCiAJcGd0YWJsZSA9IHBndGFibGVfdHJhbnNfaHVnZV93aXRoZHJhdyhtbSwgcG1kKTsKIAlwbWRfcG9wdWxhdGUobW0sICZhbXA7X3BtZCwgcGd0YWJsZSk7CkBAIC0zMzM3LDU1ICYjNDM7MzMxNywxNyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAkgKiBOb3RlIHRoYXQgTlVNQSBoaW50aW5nIGFjY2VzcyByZXN0cmljdGlvbnMgYXJlIG5vdCB0cmFuc2ZlcnJlZCB0bwogCSAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy4KIAkgKi8KLQlpZiAoZnJlZXplIHx8IHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpIHsKLQkJcHRlX3QgZW50cnk7Ci0JCXN3cF9lbnRyeV90IHN3cF9lbnRyeTsKLQotCQlmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgJmx0OyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJCWlmICh3cml0ZSkKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UgaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWlmICh5b3VuZykKLQkJCQlzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhzd3BfZW50cnkpOwotCQkJaWYgKGRpcnR5KQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KHN3cF9lbnRyeSk7Ci0JCQllbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTsKLQkJCWlmIChzb2Z0X2RpcnR5KQomIzQzOwlpZiAoc3RhdGUtJmd0O2ZyZWV6ZSB8fCAhc3RhdGUtJmd0O2lzX3ByZXNlbnQpIHsKJiM0MzsJCWZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSAmbHQ7IEhQQUdFX1BNRF9OUjsKJiM0MzsJCSAgICAgaSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkgewomIzQzOwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKTsKJiM0MzsJCQljb25zdCBzb2Z0bGVhZl90IGxlYWYgPQomIzQzOwkJCQlzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihzdGF0ZSwgcGZuKTsKJiM0MzsJCQlwdGVfdCBlbnRyeSA9IHNvZnRsZWFmX3RvX3B0ZShsZWFmKTsKJiM0MzsKJiM0MzsJCQlpZiAoc3RhdGUtJmd0O3NvZnRfZGlydHkpCiAJCQkJZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCQlpZiAodWZmZF93cCkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKLQkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwotCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKLQkJfQotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KG9sZF9wbWQpKSB7Ci0JCXB0ZV90IGVudHJ5OwotCQlzd3BfZW50cnlfdCBzd3BfZW50cnk7Ci0KLQkJZm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7Ci0JCQkvKgotCQkJICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcmVsZXZhbnQKLQkJCSAqIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHB0ZSBlbnRyaWVzIHdoZW4gZnJlZXplCi0JCQkgKiBpcyBmYWxzZS4KLQkJCSAqLwotCQkJaWYgKHdyaXRlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkoCi0JCQkJCQkJcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7Ci0JCQllbHNlCi0JCQkJc3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCS8qCi0JCQkgKiBZb3VuZyBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb2dhdGVkIHZpYSBzd3BfZW50cnkKLQkJCSAqLwotCQkJZW50cnkgPSBzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSk7Ci0JCQlpZiAoc29mdF9kaXJ0eSkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTsKLQkJCWlmICh1ZmZkX3dwKQomIzQzOwkJCWlmIChzdGF0ZS0mZ3Q7dWZmZCkKIAkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKIAkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwogCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKQEAgLTMzOTQsMjAgJiM0MzszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQlwdGVfdCBlbnRyeTsKIAogCQllbnRyeSA9IG1rX3B0ZShwYWdlLCBSRUFEX09OQ0Uodm1hLSZndDt2bV9wYWdlX3Byb3QpKTsKLQkJaWYgKHdyaXRlKQomIzQzOwkJaWYgKHN0YXRlLSZndDt3cml0ZSkKIAkJCWVudHJ5ID0gcHRlX21rd3JpdGUoZW50cnksIHZtYSk7Ci0JCWlmICgheW91bmcpCiYjNDM7CQlpZiAoIXN0YXRlLSZndDt5b3VuZykKIAkJCWVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTsKIAkJLyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi8KLQkJaWYgKGRpcnR5KQomIzQzOwkJaWYgKHN0YXRlLSZndDtkaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpOwotCQlpZiAoc29mdF9kaXJ0eSkKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7c29mdF9kaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCWlmICh1ZmZkX3dwKQomIzQzOwkJaWYgKHN0YXRlLSZndDt1ZmZkKQogCQkJZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTsKIAogCQkvKiBSZXN0b3JlIFBBR0VfTk9ORSBzbyBhbiBSV1AgbWFya2VyIGtlZXBzIHRyYXBwaW5nICovCi0JCWlmICh1c2VyZmF1bHRmZF9yd3Aodm1hKSAmYW1wOyZhbXA7IHVmZmRfd3ApCiYjNDM7CQlpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgJmFtcDsmYW1wOyBzdGF0ZS0mZ3Q7dWZmZCkKIAkJCWVudHJ5ID0gcHRlX21vZGlmeShlbnRyeSwgUEFHRV9OT05FKTsKIAogCQlmb3IgKGkgPSAwOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOykKQEAgLTM0MTcsMTUgJiM0MzszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAl9CiAJcHRlX3VubWFwKHB0ZSk7CiAKLQlpZiAoIXBtZF9pc19taWdyYXRpb25fZW50cnkoKnBtZCkpCi0JCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChmb2xpbywgcGFnZSwgdm1hKTsKLQlpZiAoZnJlZXplKQomIzQzOwlpZiAocm1hcHBlZCkKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS0mZ3Q7Zm9saW8sIHBhZ2UsIHZtYSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplKQogCQlwdXRfcGFnZShwYWdlKTsKIAogCXNtcF93bWIoKTsgLyogbWFrZSBwdGUgdmlzaWJsZSBiZWZvcmUgcG1kICovCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgc3RhdGUgPSB7CiYjNDM7CQkuZm9saW8gPSBmb2xpbywKJiM0MzsJCS5pc19wcmVzZW50ID0gdHJ1ZSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXMgdGhlCiYjNDM7CSAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpbgomIzQzOwkgKiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlIHZlcnNpb24gcG9pbnRpbmcKJiM0MzsJICogdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWYgYWxsIENQVXMgd2VyZSBidWcKJiM0MzsJICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlCiYjNDM7CSAqIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluCiYjNDM7CSAqIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24mIzM5O3QgbGlrZSB0aGF0LiBTZWUKJiM0MzsJICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS9UZWNoRG9jcy80MTMyMl8xMGhfUmV2X0dkLnBkZiwgRXJyYXR1bSAzODMgb24KJiM0MzsJICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQmIzM5O3Mgb25seSBzYWZlCiYjNDM7CSAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW4KJiM0MzsJICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZSkuIEJ1dCBpdCBpcwomIzQzOwkgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZQomIzQzOwkgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2YKJiM0MzsJICogZG9pbmcgJiMzNDtwbWRfcG9wdWxhdGUoKTsgZmx1c2hfcG1kX3RsYl9yYW5nZSgpOyYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlCiYjNDM7CSAqIGN1cnJlbnQgcG1kIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZQomIzQzOwkgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlCiYjNDM7CSAqIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlCiYjNDM7CSAqIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoIHBtZF9wb3B1bGF0ZS4KJiM0MzsJICoKJiM0MzsJICogVGhpcyBtdXN0IGFsc28gaGFwcGVuIGJlZm9yZSBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGlzIHJlYWQgYmVsb3csIHNlZQomIzQzOwkgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpLgomIzQzOwkgKi8KJiM0MzsJY29uc3QgcG1kX3QgcG1kdmFsID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CiYjNDM7CXN0YXRlLnBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpOwomIzQzOwlzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpOwomIzQzOwlzdGF0ZS55b3VuZyA9IHBtZF95b3VuZyhwbWR2YWwpOwomIzQzOwlzdGF0ZS5kaXJ0eSA9IHBtZF9kaXJ0eShwbWR2YWwpOwomIzQzOwlzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTsKJiM0MzsJc3RhdGUudWZmZCA9IHBtZF91ZmZkKHBtZHZhbCk7CiYjNDM7CXN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7CiYjNDM7CiYjNDM7CWlmIChzdGF0ZS5kaXJ0eSkKJiM0MzsJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTsKJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHBtZF90IG9sZF9wbWQsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKJiM0MzsJc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHsKJiM0MzsJCS5mb2xpbyA9IGZvbGlvLAomIzQzOwkJLnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSwKJiM0MzsJCS5pc19kZXZpY2VfcHJpdmF0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlKGVudHJ5KSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CQkuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSwKJiM0MzsJCS51ZmZkID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpLAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoc3RhdGUuaXNfZGV2aWNlX3ByaXZhdGUpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBEZXZpY2UgcHJpdmF0ZSBmb2xpb3MgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgcmVndWxhciBmb2xpb3MKJiM0MzsJCSAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlCiYjNDM7CQkgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS4KJiM0MzsJCSAqLwomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19kZXZpY2VfcHJpdmF0ZV93cml0ZShlbnRyeSk7CiYjNDM7CQlzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwomIzQzOwkJc3RhdGUueW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpOwomIzQzOwkJc3RhdGUuZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwomIzQzOwkJc3RhdGUuYW5vbl9leGNsdXNpdmUgPQomIzQzOwkJCXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKQomIzQzO3sKJiM0MzsJY29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7CiYjNDM7CWNvbnN0IGJvb2wgaXNfcHJlc2VudCA9IHBtZF9wcmVzZW50KG9sZF9wbWQpOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwomIzQzOwlWTV9CVUdfT04oaGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKTsKJiM0MzsJVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7CiYjNDM7CVZNX0JVR19PTl9WTUEodm1hLSZndDt2bV9lbmQgJmx0OyBoYWRkciAmIzQzOyBIUEFHRV9QTURfU0laRSwgdm1hKTsKJiM0MzsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCFwbWRfaXNfdmFsaWRfc29mdGxlYWYob2xkX3BtZCkgJmFtcDsmYW1wOwomIzQzOwkJCSFwbWRfdHJhbnNfaHVnZShvbGRfcG1kKSk7CiYjNDM7CiYjNDM7CWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZwomIzQzOwkgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93CiYjNDM7CSAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgPwomIzQzOwkgKgomIzQzOwkgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvIHNtYWxsCiYjNDM7CSAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGUKJiM0MzsJICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuCiYjNDM7CSAqLwomIzQzOwlpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkgewomIzQzOwkJX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLXByZXNlbnQgZW50cnkgd2hpY2ggaXMgbmVpdGhlciBhIG1pZ3JhdGlvbiBub3IgYSBkZXZpY2UKJiM0MzsJICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHkKJiM0MzsJICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2gKJiM0MzsJICogbWVhbnMgbm90aGluZy4KJiM0MzsJICovCiYjNDM7CWlmICh1bmxpa2VseSghaXNfcHJlc2VudCAmYW1wOyZhbXA7ICFmb2xpbykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHsKJiM0MzsJCXVubWFwX2h1Z2VfcG1kX2VudHJ5KHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGlzX3ByZXNlbnQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJc3BsaXRfcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIGZvbGlvLCBmcmVlemUpOwomIzQzOwllbHNlCiYjNDM7CQlzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIG9sZF9wbWQsIGZvbGlvLAomIzQzOwkJCQkJICAgZnJlZXplKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDk2NjgKCQkJCQkJCW91dHB1dDogMjgKCQkJCQkJCXRob3VnaHRzOiAxODUKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIHRoZSBIdWdlIFBhZ2VzIFBhdGNoKioKCk9rYXksIGxldCYjMzk7cyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB0aGUgZnV6emluZyBzdHJhdGVneS4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIHRoaXMgZXZlbiB3YXJyYW50cyBmdXp6aW5nIGF0dGVudGlvbiwgYW5kIGlmIHNvLCB3aGF0IGNvbmZpZ3VyYXRpb25zIGFuZCBmb2N1cyBzeW1ib2xzIGFyZSBjcml0aWNhbC4gTXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBkaXNzZWN0IHRoZSBkaWZmLgoKVGhlIGNoYW5nZXMgYXJlIGNvbmNlbnRyYXRlZCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHdoaWNoIGFsd2F5cyBwaXF1ZXMgbXkgaW50ZXJlc3QuIFNwZWNpZmljYWxseSwgdGhlIHBhdGNoIHRvdWNoZXMgYSBoYW5kZnVsIG9mIGtleSBmdW5jdGlvbnM6IGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXBgLCBgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWZgLCBgc3BsaXRfaHVnZV9wbWRfdG9fcHRlc2AsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCwgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgYW5kIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAuIFRoaXMgc3VnZ2VzdHMgYSBwb3RlbnRpYWwgcmVmYWN0b3Jpbmcgb3IgaW1wcm92ZW1lbnQgcmVsYXRlZCB0byBzcGxpdHRpbmcgaHVnZSBwYWdlcywgbGlrZWx5IGltcGFjdGluZyBtZW1vcnkgbWFuYWdlbWVudCBpbiBhIHNpZ25pZmljYW50IHdheS4KClRvIGdldCBhIGNsZWFyZXIgcGljdHVyZSwgSSYjMzk7bGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCB0aGUgY29udGV4dCBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIHRoZSByZWxhdGVkIEtjb25maWcgb3B0aW9ucy4gSXQmIzM5O3MgY3J1Y2lhbCB0byB1bmRlcnN0YW5kIGhvdyB0aGVzZSBmdW5jdGlvbnMgaW50ZXJhY3Qgd2l0aCB0aGUgd2lkZXIgc3lzdGVtIGFuZCBhbnkgY29uZmlndXJhdGlvbiBrbm9icyB0aGF0IG1pZ2h0IGluZmx1ZW5jZSB0aGVpciBiZWhhdmlvci4gS25vd2luZyB3aGljaCBjb25maWcgb3B0aW9ucyB0cmlnZ2VyIHRob3NlIGZ1bmN0aW9ucyB3aWxsIGJlIHRoZSBrZXkgdG8gZGVzaWduaW5nIHRoZSByaWdodCBmdXp6aW5nIHN0cmF0ZWd5LgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O3NwbGl0X2h1Z2VfcG1kJiMzNDssCiAgJiMzNDtQYXRoUHJlZml4JiMzNDs6ICYjMzQ7bW0vJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O21tL2d1cC5jPTg5OD1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9ndXAuYy05MzEtXHRcdHNwaW5fdW5sb2NrKHB0bCk7XG5tbS9ndXAuYzo5MzI6XHRcdHNwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzKTtcbm1tL2d1cC5jLTkzMy1cdFx0LyogSWYgcG1kIHdhcyBsZWZ0IGVtcHR5LCBzdHVmZiBhIHBhZ2UgdGFibGUgaW4gdGhlcmUgcXVpY2tseSAqL1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MTkwOD1pbnQgY29weV9odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTE5OTAtXHRcdHNwaW5fdW5sb2NrKGRzdF9wdGwpO1xubW0vaHVnZV9tZW1vcnkuYzoxOTkxOlx0XHRfX3NwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIGFkZHIsIGZhbHNlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMTk5Mi1cdFx0cmV0dXJuIC1FQUdBSU47XG4tLVxubW0vaHVnZV9tZW1vcnkuYz0yMTI1PXZtX2ZhdWx0X3QgZG9faHVnZV9wbWRfd3BfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcbi0tXG5tbS9odWdlX21lbW9yeS5jLTIyMTQtZmFsbGJhY2s6XG5tbS9odWdlX21lbW9yeS5jOjIyMTU6XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgdm1mLVx1MDAzZXBtZCwgdm1mLVx1MDAzZWFkZHJlc3MsIGZhbHNlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMjIxNi1cdHJldHVybiBWTV9GQVVMVF9GQUxMQkFDSztcbi0tXG5tbS9odWdlX21lbW9yeS5jPTMxOTc9c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zMjI5LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozMjMwOnN0YXRpYyBib29sIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcChjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbm1tL2h1Z2VfbWVtb3J5LmMtMzIzMS1cdFx0c3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgaGFkZHIpXG4tLVxubW0vaHVnZV9tZW1vcnkuYz0zMjUyPXN0YXRpYyBzb2Z0bGVhZl90IHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzI1OS1cdFx0ICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcGFnZXMgYmFja2luZ1xubW0vaHVnZV9tZW1vcnkuYzozMjYwOlx0XHQgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZFxubW0vaHVnZV9tZW1vcnkuYy0zMjYxLVx0XHQgKiBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb3BhZ2F0ZWQgdmlhIGRldmljZSBwcml2YXRlXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zMjg3LSAqL1xubW0vaHVnZV9tZW1vcnkuYzozMjg4OnN0YXRpYyB2b2lkIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG5tbS9odWdlX21lbW9yeS5jLTMyODktXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzMwMS1cdGlmIChybWFwcGVkKVxubW0vaHVnZV9tZW1vcnkuYzozMzAyOlx0XHRzdGF0ZS1cdTAwM2VmcmVlemUgPSBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoc3RhdGUsIHZtYSwgaGFkZHIpO1xubW0vaHVnZV9tZW1vcnkuYy0zMzAzLVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MzM3MT1zdGF0aWMgdm9pZCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzQxOC1cbm1tL2h1Z2VfbWVtb3J5LmM6MzQxOTpcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG5tbS9odWdlX21lbW9yeS5jLTM0MjAtfVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmM9MzQyMj1zdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbi0tXG5tbS9odWdlX21lbW9yeS5jLTM0MzktXHRcdCAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlXG5tbS9odWdlX21lbW9yeS5jOjM0NDA6XHRcdCAqIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLlxubW0vaHVnZV9tZW1vcnkuYy0zNDQxLVx0XHQgKi9cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM0NTEtXG5tbS9odWdlX21lbW9yeS5jOjM0NTI6XHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXHUwMDI2c3RhdGUpO1xubW0vaHVnZV9tZW1vcnkuYy0zNDUzLX1cbm1tL2h1Z2VfbWVtb3J5LmMtMzQ1NC1cbm1tL2h1Z2VfbWVtb3J5LmM6MzQ1NTpzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbm1tL2h1Z2VfbWVtb3J5LmMtMzQ1Ni1cdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zNDczLVx0ICogbW11X25vdGlmaWVyX2FyY2hfaW52YWxpZGF0ZV9zZWNvbmRhcnlfdGxicygpIHNlZSBjb21tZW50cyBiZWxvd1xubW0vaHVnZV9tZW1vcnkuYzozNDc0Olx0ICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/XG5tbS9odWdlX21lbW9yeS5jLTM0NzUtXHQgKlxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzUwNy1cbm1tL2h1Z2VfbWVtb3J5LmM6MzUwODp2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxubW0vaHVnZV9tZW1vcnkuYy0zNTA5LVx0XHRcdCAgIHBtZF90ICpwbWQsIGJvb2wgZnJlZXplKVxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzUxMi1cdGlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSB8fCBwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkpXG5tbS9odWdlX21lbW9yeS5jOjM1MTM6XHRcdF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xubW0vaHVnZV9tZW1vcnkuYy0zNTE0LX1cbm1tL2h1Z2VfbWVtb3J5LmMtMzUxNS1cbm1tL2h1Z2VfbWVtb3J5LmM6MzUxNjp2b2lkIF9fc3BsaXRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG5tbS9odWdlX21lbW9yeS5jLTM1MTctXHRcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgYm9vbCBmcmVlemUpXG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zNTI2LVx0cHRsID0gcG1kX2xvY2sodm1hLVx1MDAzZXZtX21tLCBwbWQpO1xubW0vaHVnZV9tZW1vcnkuYzozNTI3Olx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcmFuZ2Uuc3RhcnQsIHBtZCwgZnJlZXplKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMzUyOC1cdHNwaW5fdW5sb2NrKHB0bCk7XG4tLVxubW0vaHVnZV9tZW1vcnkuYy0zNTMxLVxubW0vaHVnZV9tZW1vcnkuYzozNTMyOnZvaWQgc3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxubW0vaHVnZV9tZW1vcnkuYy0zNTMzLVx0XHRib29sIGZyZWV6ZSlcbi0tXG5tbS9odWdlX21lbW9yeS5jLTM1MzktXG5tbS9odWdlX21lbW9yeS5jOjM1NDA6XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xubW0vaHVnZV9tZW1vcnkuYy0zNTQxLX1cbm1tL2h1Z2VfbWVtb3J5LmMtMzU0Mi1cbm1tL2h1Z2VfbWVtb3J5LmM6MzU0MzpzdGF0aWMgaW5saW5lIHZvaWQgc3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXG5tbS9odWdlX21lbW9yeS5jLTM1NDQte1xuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzU1MS1cdFx0XHQgQUxJR04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKSlcbm1tL2h1Z2VfbWVtb3J5LmM6MzU1MjpcdFx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyh2bWEsIGFkZHJlc3MsIGZhbHNlKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMzU1My19XG4tLVxubW0vaHVnZV9tZW1vcnkuYz0zNTU1PXZvaWQgdm1hX2FkanVzdF90cmFuc19odWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL2h1Z2VfbWVtb3J5LmMtMzU2MC1cdC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgc3RhcnQgZmlyc3QuICovXG5tbS9odWdlX21lbW9yeS5jOjM1NjE6XHRzcGxpdF9odWdlX3BtZF9pZl9uZWVkZWQodm1hLCBzdGFydCk7XG5tbS9odWdlX21lbW9yeS5jLTM1NjItXG5tbS9odWdlX21lbW9yeS5jLTM1NjMtXHQvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IGVuZCBuZXh0LiAqL1xubW0vaHVnZV9tZW1vcnkuYzozNTY0Olx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHZtYSwgZW5kKTtcbm1tL2h1Z2VfbWVtb3J5LmMtMzU2NS1cbi0tXG5tbS9odWdlX21lbW9yeS5jLTM1NjctXHRpZiAobmV4dClcbm1tL2h1Z2VfbWVtb3J5LmM6MzU2ODpcdFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKG5leHQsIGVuZCk7XG5tbS9odWdlX21lbW9yeS5jLTM1NjktfVxuLS1cbm1tL21lbW9yeS5jPTIxMjM9c3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHphcF9wbWRfcmFuZ2Uoc3RydWN0IG1tdV9nYXRoZXIgKnRsYixcbi0tXG5tbS9tZW1vcnkuYy0yMTM1LVx0XHRcdGlmIChuZXh0IC0gYWRkciAhPSBIUEFHRV9QTURfU0laRSlcbm1tL21lbW9yeS5jOjIxMzY6XHRcdFx0XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyLCBmYWxzZSk7XG5tbS9tZW1vcnkuYy0yMTM3LVx0XHRcdGVsc2UgaWYgKHphcF9odWdlX3BtZCh0bGIsIHZtYSwgcG1kLCBhZGRyKSkge1xuLS1cbm1tL21lbW9yeS5jPTYzOTA9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHdwX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxuLS1cbm1tL21lbW9yeS5jLTY0MTUtXHQvKiBDT1cgb3Igd3JpdGUtbm90aWZ5IGhhbmRsZWQgb24gcHRlIGxldmVsOiBzcGxpdCBwbWQuICovXG5tbS9tZW1vcnkuYzo2NDE2Olx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHZtZi1cdTAwM2VwbWQsIHZtZi1cdTAwM2VhZGRyZXNzLCBmYWxzZSk7XG5tbS9tZW1vcnkuYy02NDE3LVxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmM9OTEyPXN0YXRpYyBpbnQgbWlncmF0ZV92bWFfc3BsaXRfdW5tYXBwZWRfZm9saW8oc3RydWN0IG1pZ3JhdGVfdm1hICptaWdyYXRlLFxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTIxLVx0Lypcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTIyOlx0ICogdGFrZSBhIHJlZmVyZW5jZSwgc2luY2Ugc3BsaXRfaHVnZV9wbWRfYWRkcmVzcygpIHdpdGggZnJlZXplID0gdHJ1ZVxubW0vbWlncmF0ZV9kZXZpY2UuYy05MjMtXHQgKiBkcm9wcyBhIHJlZmVyZW5jZSBhdCB0aGUgZW5kLlxuLS1cbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTI1LVx0Zm9saW9fZ2V0KGZvbGlvKTtcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI2Olx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhtaWdyYXRlLVx1MDAzZXZtYSwgYWRkciwgdHJ1ZSk7XG5tbS9taWdyYXRlX2RldmljZS5jLTkyNy1cdHJldCA9IGZvbGlvX3NwbGl0X3VubWFwcGVkKGZvbGlvLCAwKTtcbi0tXG5tbS9taWdyYXRlX2RldmljZS5jPTk3Nj1zdGF0aWMgdm9pZCBtaWdyYXRlX3ZtYV9pbnNlcnRfcGFnZShzdHJ1Y3QgbWlncmF0ZV92bWEgKm1pZ3JhdGUsXG4tLVxubW0vbWlncmF0ZV9kZXZpY2UuYy0xMDIxLVx0XHRcdFx0Z290byBhYm9ydDtcbm1tL21pZ3JhdGVfZGV2aWNlLmM6MTAyMjpcdFx0XHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZHAsIGFkZHIpO1xubW0vbWlncmF0ZV9kZXZpY2UuYy0xMDIzLVx0XHR9IGVsc2UgaWYgKHBtZF9sZWFmKCpwbWRwKSlcbi0tXG5tbS9tcHJvdGVjdC5jPTUwND1zdGF0aWMgaW5saW5lIGxvbmcgY2hhbmdlX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLFxuLS1cbm1tL21wcm90ZWN0LmMtNTMyLVx0XHRcdCAgICBwZ3RhYmxlX3NwbGl0X25lZWRlZCh2bWEsIGNwX2ZsYWdzKSkge1xubW0vbXByb3RlY3QuYzo1MzM6XHRcdFx0XHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyLCBmYWxzZSk7XG5tbS9tcHJvdGVjdC5jLTUzNC1cdFx0XHRcdC8qXG4tLVxubW0vbXJlbWFwLmM9ODA0PXVuc2lnbmVkIGxvbmcgbW92ZV9wYWdlX3RhYmxlcyhzdHJ1Y3QgcGFnZXRhYmxlX21vdmVfY29udHJvbCAqcG1jKVxuLS1cbm1tL21yZW1hcC5jLTg2Ni1cdFx0XHRcdGNvbnRpbnVlO1xubW0vbXJlbWFwLmM6ODY3Olx0XHRcdHNwbGl0X2h1Z2VfcG1kKHBtYy1cdTAwM2VvbGQsIG9sZF9wbWQsIHBtYy1cdTAwM2VvbGRfYWRkcik7XG5tbS9tcmVtYXAuYy04NjgtXHRcdH0gZWxzZSBpZiAoSVNfRU5BQkxFRChDT05GSUdfSEFWRV9NT1ZFX1BNRCkgXHUwMDI2XHUwMDI2XG4tLVxubW0vcGFnZXdhbGsuYz05Nj1zdGF0aWMgaW50IHdhbGtfcG1kX3JhbmdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXG4tLVxubW0vcGFnZXdhbGsuYy0xNjctXHRcdGlmICh3YWxrLVx1MDAzZXZtYSlcbm1tL3BhZ2V3YWxrLmM6MTY4Olx0XHRcdHNwbGl0X2h1Z2VfcG1kKHdhbGstXHUwMDNldm1hLCBwbWQsIGFkZHIpO1xubW0vcGFnZXdhbGsuYy0xNjktXHRcdGVsc2UgaWYgKHBtZF9sZWFmKCpwbWQpIHx8ICFwbWRfcHJlc2VudCgqcG1kKSlcbi0tXG5tbS9ybWFwLmM9MjIwMT1zdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL3JtYXAuYy0yMjg5LVx0XHRcdFx0ICovXG5tbS9ybWFwLmM6MjI5MDpcdFx0XHRcdHNwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHB2bXcuYWRkcmVzcyxcbm1tL3JtYXAuYy0yMjkxLVx0XHRcdFx0XHRcdCAgICAgIHB2bXcucG1kLCBmYWxzZSk7XG4tLVxubW0vcm1hcC5jPTI0NjU9c3RhdGljIGJvb2wgdHJ5X3RvX21pZ3JhdGVfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuLS1cbm1tL3JtYXAuYy0yNTE4LVx0XHRcdFx0Lypcbm1tL3JtYXAuYzoyNTE5Olx0XHRcdFx0ICogc3BsaXRfaHVnZV9wbWRfbG9ja2VkKCkgbWlnaHQgbGVhdmUgdGhlXG5tbS9ybWFwLmMtMjUyMC1cdFx0XHRcdCAqIGZvbGlvIG1hcHBlZCB0aHJvdWdoIFBURXMuIFJldHJ5IHRoZSB3YWxrXG4tLVxubW0vcm1hcC5jLTI1MjMtXHRcdFx0XHQgKi9cbm1tL3JtYXAuYzoyNTI0Olx0XHRcdFx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcHZtdy5hZGRyZXNzLFxubW0vcm1hcC5jLTI1MjUtXHRcdFx0XHRcdFx0ICAgICAgcHZtdy5wbWQsIHRydWUpO1xuLS1cbm1tL3VzZXJmYXVsdGZkLmM9MjAyMD1zdGF0aWMgc3NpemVfdCBtb3ZlX3BhZ2VzKHN0cnVjdCB1c2VyZmF1bHRmZF9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBkc3Rfc3RhcnQsXG4tLVxubW0vdXNlcmZhdWx0ZmQuYy0yMTI2LVx0XHRcdFx0c3Bpbl91bmxvY2socHRsKTtcbm1tL3VzZXJmYXVsdGZkLmM6MjEyNzpcdFx0XHRcdHNwbGl0X2h1Z2VfcG1kKHNyY192bWEsIHNyY19wbWQsIHNyY19hZGRyKTtcbm1tL3VzZXJmYXVsdGZkLmMtMjEyOC1cdFx0XHRcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD41LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxMzU3MQoJCQkJCQkJb3V0cHV0OiAyNwoJCQkJCQkJdGhvdWdodHM6IDQ0CgkJCQkJCTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+VGhvdWdodHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4qKkludmVzdGlnYXRpbmcgSHVnZSBQYWdlcyBhbmQgU3BsaXQgUE1EcyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBLY29uZmlnIG9wdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgKFRIUCkgYW5kIHNwbGl0IGh1Z2UgcGFnZSBQTURzLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBkaXZlIGludG8gdGhlIGNvcmUgZGlyZWN0b3JpZXMuIEkga25vdyB0aGVzZSBjb25maWd1cmF0aW9ucyBhcmUgb2Z0ZW4gZGVmaW5lZCBpbiBNYWtlZmlsZXMgYW5kIEtjb25maWdzLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgbG9va2luZyBpbnRvIGBtbS9NYWtlZmlsZWAgYW5kIHRoZW4gYG1tL0tjb25maWdgLiBUaG9zZSBhcmUgdHlwaWNhbGx5IHdoZXJlIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgZGVwZW5kZW5jaWVzIGFyZSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtLCBzbyBpdCYjMzk7cyB0aGUgbG9naWNhbCBzdGFydGluZyBwb2ludCBmb3IgdW5kZXJzdGFuZGluZyBob3cgdGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgYW5kIHVuZGVyIHdoYXQgY2lyY3Vtc3RhbmNlcy4gSSYjMzk7bSBhc3N1bWluZyB0aGF0IHRoZSByZWxldmFudCBvcHRpb25zIHdpbGwgYmUgdXNlZCBpbiBidWlsZCBsb2dpYyBhbmQgbWF5YmUgZXZlbiB3aXRoaW4gYCNpZmRlZmAgc3RhdGVtZW50cyBpbnNpZGUgYGh1Z2VfbWVtb3J5LmNgIGl0c2VsZi4KCgo8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD42LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPmdyZXBwZXI8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0V4cHJlc3Npb24mIzM0OzogJiMzNDtodWdlX21lbW9yeVxcLm8mIzM0OywKICAmIzM0O1BhdGhQcmVmaXgmIzM0OzogJiMzNDttbS8mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7T3V0cHV0JiMzNDs6ICYjMzQ7bW0vTWFrZWZpbGU9MTAwPW9iai0kKENPTkZJR19ERVZJQ0VfTUlHUkFUSU9OKSAmIzQzOz0gbWlncmF0ZV9kZXZpY2Uub1xubW0vTWFrZWZpbGU6MTAxOm9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgJiM0Mzs9IGh1Z2VfbWVtb3J5Lm8ga2h1Z2VwYWdlZC5vXG5tbS9NYWtlZmlsZS0xMDItb2JqLSQoQ09ORklHX1BBR0VfQ09VTlRFUikgJiM0Mzs9IHBhZ2VfY291bnRlci5vXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+Ny8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMTk6Mzk8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTM5MTIKCQkJCQkJCW91dHB1dDogMzAKCQkJCQkJCXRob3VnaHRzOiAyNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+SGVyZSYjMzk7cyBteSB0aG91Z2h0IHByb2Nlc3MsIGFzIGlmIEkgd2VyZSBjb25zaWRlcmluZyB0aGlzIG15c2VsZjoKCioqS2NvbmZpZyBEaXZlIGZvciBUSFAqKgoKT2theSwgc28gSSBuZWVkIHRvIHF1aWNrbHkgc2VlIHdoZXJlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZGVmaW5lZCBpbiB0aGUgS2NvbmZpZyBoaWVyYXJjaHkuIEkmIzM5O20gZ29pbmcgc3RyYWlnaHQgdG8gYG1tL0tjb25maWdgLCB0aGF0JiMzOTtzIHRoZSBvYnZpb3VzIHBsYWNlIHRvIHN0YXJ0IGZvciBtZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zLiBJdCYjMzk7cyB0aGUgbW9zdCBsb2dpY2FsIGxvY2F0aW9uIGZvciBhIHNldHRpbmcgcmVsYXRlZCB0byBodWdlIHBhZ2VzLCBnaXZlbiB0aGF0IGBtbWAgaXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTGV0JiMzOTtzIHNlZSB3aGF0JiMzOTtzIGRlZmluZWQgaW4gdGhlcmUgZm9yIHRoaXMgcGFydGljdWxhciBmZWF0dXJlLiBIb3BlZnVsbHkgaXQmIzM5O3Mgc3RyYWlnaHRmb3J3YXJkIGFuZCBJIGNhbiBxdWlja2x5IGdyYXNwIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHRzLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjgvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2NvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O21tLyYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtPdXRwdXQmIzM0OzogJiMzNDttbS9LY29uZmlnPTgzMj1jb25maWcgTU1fSURcbi0tXG5tbS9LY29uZmlnLTgzNC1cbm1tL0tjb25maWc6ODM1Om1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0Vcbm1tL0tjb25maWctODM2LVx0Ym9vbCBcJiMzNDtUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0XCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04NTM9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04NTgtXG5tbS9LY29uZmlnOjg1OTpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcbm1tL0tjb25maWctODYwLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctODY1LVxubW0vS2NvbmZpZzo4NjY6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxubW0vS2NvbmZpZy04NjctXHRcdGJvb2wgXCYjMzQ7bWFkdmlzZVwmIzM0O1xuLS1cbm1tL0tjb25maWctODc0LVxubW0vS2NvbmZpZzo4NzU6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcbm1tL0tjb25maWctODc2LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZz04ODI9Y2hvaWNlXG4tLVxubW0vS2NvbmZpZy04OTEtXG5tbS9LY29uZmlnOjg5MjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX05FVkVSXG5tbS9LY29uZmlnLTg5My1cdFx0Ym9vbCBcJiMzNDtuZXZlclwmIzM0O1xuLS1cbm1tL0tjb25maWctOTAxLVxubW0vS2NvbmZpZzo5MDI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BTFdBWVNcbm1tL0tjb25maWctOTAzLVx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuLS1cbm1tL0tjb25maWctOTA5LVxubW0vS2NvbmZpZzo5MTA6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9XSVRISU5fU0laRVxubW0vS2NvbmZpZy05MTEtXHRcdGJvb2wgXCYjMzQ7d2l0aGluX3NpemVcJiMzNDtcbi0tXG5tbS9LY29uZmlnLTkxNy1cbm1tL0tjb25maWc6OTE4Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfQURWSVNFXG5tbS9LY29uZmlnLTkxOS1cdFx0Ym9vbCBcJiMzNDthZHZpc2VcJiMzNDtcbi0tXG5tbS9LY29uZmlnPTkyNz1jaG9pY2Vcbi0tXG5tbS9LY29uZmlnLTkzNi1cbm1tL0tjb25maWc6OTM3Olx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfTkVWRVJcbm1tL0tjb25maWctOTM4LVx0XHRib29sIFwmIzM0O25ldmVyXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NDUtXG5tbS9LY29uZmlnOjk0NjpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX0FMV0FZU1xubW0vS2NvbmZpZy05NDctXHRcdGJvb2wgXCYjMzQ7YWx3YXlzXCYjMzQ7XG4tLVxubW0vS2NvbmZpZy05NTMtXG5tbS9LY29uZmlnOjk1NDpcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX1dJVEhJTl9TSVpFXG5tbS9LY29uZmlnLTk1NS1cdFx0Ym9vbCBcJiMzNDt3aXRoaW5fc2l6ZVwmIzM0O1xuLS1cbm1tL0tjb25maWctOTYxLVxubW0vS2NvbmZpZzo5NjI6XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BRFZJU0Vcbm1tL0tjb25maWctOTYzLVx0XHRib29sIFwmIzM0O2FkdmlzZVwmIzM0O1xuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjkvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE0ODEzCgkJCQkJCQlvdXRwdXQ6IDMyCgkJCQkJCQl0aG91Z2h0czogMzAKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6CgoqKkludmVzdGlnYXRpbmcgdGhlIFRSQU5TUEFSRU5UX0hVR0VQQUdFIERlcGVuZGVuY2llcyoqCgpPa2F5LCBzbyBJIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgZGVwZW5kZW5jaWVzIGZvciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGluIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi4gTXkgaW5pdGlhbCBpbnN0aW5jdCBpcyB0byBqdW1wIHJpZ2h0IGludG8gYG1tL0tjb25maWdgLCBzcGVjaWZpY2FsbHkgYXJvdW5kIGxpbmUgODM1LiBUaGF0JiMzOTtzIHdoZXJlIEkmIzM5O2QgZXhwZWN0IHRvIGZpbmQgdGhlIHJlbGV2YW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhbmQgYW55IGNvbmRpdGlvbmFsIGxvZ2ljIHRoYXQgY29udHJvbHMgd2hldGhlciBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGVuYWJsZWQuIEl0JiMzOTtzIGEgcHJldHR5IHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGF0IGtpbmQgb2YgZGV0YWlsIGluIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBzdWJzeXN0ZW0uIFRpbWUgdG8gZGlnIGluIGFuZCBzZWUgd2hhdCBvdGhlciBvcHRpb25zIHRoaXMgcmVsaWVzIG9uLCBhbmQgd2hhdCB0aGUgaW1wbGljYXRpb25zIGFyZSBmb3IgbXkgYXJlYSBvZiBleHBlcnRpc2UuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTAvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7bW0vS2NvbmZpZyYjMzQ7LAogICYjMzQ7Rmlyc3RMaW5lJiMzNDs6IDgzMCwKICAmIzM0O0xpbmVDb3VudCYjMzQ7OiA0MAp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7Q29udGVudHMmIzM0OzogJiMzNDsgODMwOlx0XHQgIG1lbW9yeSBjb25zdHJhaW5lZC5cbiA4MzE6XHRcbiA4MzI6XHRjb25maWcgTU1fSURcbiA4MzM6XHRcdGRlZl9ib29sIG5cbiA4MzQ6XHRcbiA4MzU6XHRtZW51Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFXG4gODM2Olx0XHRib29sIFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcJiMzNDtcbiA4Mzc6XHRcdGRlcGVuZHMgb24gSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFIFx1MDAyNlx1MDAyNiAhUFJFRU1QVF9SVFxuIDgzODpcdFx0c2VsZWN0IENPTVBBQ1RJT05cbiA4Mzk6XHRcdHNlbGVjdCBYQVJSQVlfTVVMVElcbiA4NDA6XHRcdHNlbGVjdCBNTV9JRFxuIDg0MTpcdFx0aGVscFxuIDg0MjpcdFx0ICBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdXNlIGh1Z2UgcGFnZXMgYW5kXG4gODQzOlx0XHQgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS5cbiA4NDQ6XHRcdCAgVGhpcyBmZWF0dXJlIGNhbiBpbXByb3ZlIGNvbXB1dGluZyBwZXJmb3JtYW5jZSB0byBjZXJ0YWluXG4gODQ1Olx0XHQgIGFwcGxpY2F0aW9ucyBieSBzcGVlZGluZyB1cCBwYWdlIGZhdWx0cyBkdXJpbmcgbWVtb3J5XG4gODQ2Olx0XHQgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmdcbiA4NDc6XHRcdCAgdXAgdGhlIHBhZ2V0YWJsZSB3YWxraW5nLlxuIDg0ODpcdFxuIDg0OTpcdFx0ICBJZiBtZW1vcnkgY29uc3RyYWluZWQgb24gZW1iZWRkZWQsIHlvdSBtYXkgd2FudCB0byBzYXkgTi5cbiA4NTA6XHRcbiA4NTE6XHRpZiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxuIDg1MjpcdFxuIDg1MzpcdGNob2ljZVxuIDg1NDpcdFx0cHJvbXB0IFwmIzM0O1RyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnQgc3lzZnMgZGVmYXVsdHNcJiMzNDtcbiA4NTU6XHRcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXG4gODU2Olx0XHRoZWxwXG4gODU3Olx0XHQgIFNlbGVjdHMgdGhlIHN5c2ZzIGRlZmF1bHRzIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0LlxuIDg1ODpcdFxuIDg1OTpcdFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX0FMV0FZU1xuIDg2MDpcdFx0XHRib29sIFwmIzM0O2Fsd2F5c1wmIzM0O1xuIDg2MTpcdFx0aGVscFxuIDg2MjpcdFx0ICBFbmFibGluZyBUcmFuc3BhcmVudCBIdWdlcGFnZSBhbHdheXMsIGNhbiBpbmNyZWFzZSB0aGVcbiA4NjM6XHRcdCAgbWVtb3J5IGZvb3RwcmludCBvZiBhcHBsaWNhdGlvbnMgd2l0aG91dCBhIGd1YXJhbnRlZWRcbiA4NjQ6XHRcdCAgYmVuZWZpdCBidXQgaXQgd2lsbCB3b3JrIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBhcHBsaWNhdGlvbnMuXG4gODY1Olx0XG4gODY2Olx0XHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxuIDg2NzpcdFx0XHRib29sIFwmIzM0O21hZHZpc2VcJiMzNDtcbiA4Njg6XHRcdGhlbHBcbiA4Njk6XHRcdCAgRW5hYmxpbmcgVHJhbnNwYXJlbnQgSHVnZXBhZ2UgbWFkdmlzZSwgd2lsbCBvbmx5IHByb3ZpZGUgYVxuJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjExLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+cGF0Y2gtZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiAxNTU4MAoJCQkJCQkJb3V0cHV0OiAzNgoJCQkJCQkJdGhvdWdodHM6IDE3NQoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipBbmFseXppbmcgSHVnZSBQYWdlIFNwbGl0dGluZyBpbiBgbW0vaHVnZV9tZW1vcnkuY2AqKgoKT2theSwgbGV0JiMzOTtzIGRpdmUgaW50byB0aGlzLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgaHVnZSBwYWdlIHNwbGl0dGluZyBmdW5jdGlvbmFsaXR5LiBGaXJzdCwgSSYjMzk7bGwgdGFrZSBhIGxvb2sgYXQgdGhlIGtleSBmdW5jdGlvbnMgdGhhdCBhcmUgbW9kaWZpZWQg4oCTIHRoZSBvbmVzIHRoYXQgYXJlIG1vc3QgbGlrZWx5IGF0IHRoZSBoZWFydCBvZiB0aGUgY2hhbmdlcy4gVGhlIG9uZXMgdGhhdCBpbW1lZGlhdGVseSBzdGFuZCBvdXQgYXJlOiBgX19zcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfaHVnZV9wbWRfdG9fcHRlc2AsIGB1bm1hcF9odWdlX3BtZF9lbnRyeWAsIGBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZmAsIGFuZCBgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXRgLiBUaGlzIGdpdmVzIG1lIGEgZ29vZCBzdGFydGluZyBwb2ludC4KCk5vdywgSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgKnVzZWQqLiBTbywgSSYjMzk7bGwgaWRlbnRpZnkgdGhlIGV4dGVybmFsbHkgdmlzaWJsZSBlbnRyeXBvaW50cyBvciBub24tc3RhdGljIGZ1bmN0aW9ucyB3aXRoaW4gYG1tL2h1Z2VfbWVtb3J5LmNgIHRoYXQgY2FsbCB0aGVzZSBrZXkgZnVuY3Rpb25zLiBUaGlzIHdpbGwgaGVscCBtZSB0cmFjZSB0aGUgY29udHJvbCBmbG93IGFuZCBzZWUgaG93IHRoZSBzcGxpdHRpbmcgaXMgaW5pdGlhdGVkIGFuZCBvcmNoZXN0cmF0ZWQuCgpGaW5hbGx5LCBJJiMzOTtsbCBob21lIGluIG9uIGEgcmVsZXZhbnQgc2VjdGlvbiBvZiB0aGUgY29kZS4gTGV0JiMzOTtzIHN0YXJ0IGJ5IGV4YW1pbmluZyB0aGUgY29kZSBhcm91bmQgbGluZXMgMzUwMC0zNjAwIGluIGBtbS9odWdlX21lbW9yeS5jYC4gSSYjMzk7bSBleHBlY3RpbmcgdGhpcyBhcmVhIHRvIGNvbnRhaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBzcGxpdHRpbmctcmVsYXRlZCBmdW5jdGlvbnMsIG9yIHBlcmhhcHMgdGhlIGNvcmUgbG9naWMgdGhhdCBvcmNoZXN0cmF0ZXMgdGhlIHNwbGl0dGluZyBwcm9jZXNzLiBJJiMzOTtsbCByZWFkIHRocm91Z2ggdGhpcyBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSBjYW4gZ2xlYW4uIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBncmFzcCBvbiB3aGF0JiMzOTtzIGdvaW5nIG9uIGFuZCB3aGVyZSB0aGUgY2hhbmdlcyBtaWdodCBiZSBsb2NhdGVkLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjEyLzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTozOTwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnJlYWQtZmlsZTwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RmlsZSYjMzQ7OiAmIzM0O21tL2h1Z2VfbWVtb3J5LmMmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiAzNTAwLAogICYjMzQ7TGluZUNvdW50JiMzNDs6IDc1Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtDb250ZW50cyYjMzQ7OiAmIzM0OzM1MDA6XHRcbjM1MDE6XHRcdGlmIChpc19wcmVzZW50KVxuMzUwMjpcdFx0XHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XG4zNTAzOlx0XHRlbHNlXG4zNTA0Olx0XHRcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXG4zNTA1Olx0XHRcdFx0XHRcdCAgIGZyZWV6ZSk7XG4zNTA2Olx0fVxuMzUwNzpcdFxuMzUwODpcdHZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4zNTA5Olx0XHRcdFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXG4zNTEwOlx0e1xuMzUxMTpcdFx0Vk1fV0FSTl9PTl9PTkNFKCFJU19BTElHTkVEKGFkZHJlc3MsIEhQQUdFX1BNRF9TSVpFKSk7XG4zNTEyOlx0XHRpZiAocG1kX3RyYW5zX2h1Z2UoKnBtZCkgfHwgcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpKVxuMzUxMzpcdFx0XHRfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHBtZCwgYWRkcmVzcywgZnJlZXplKTtcbjM1MTQ6XHR9XG4zNTE1Olx0XG4zNTE2Olx0dm9pZCBfX3NwbGl0X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuMzUxNzpcdFx0XHR1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGJvb2wgZnJlZXplKVxuMzUxODpcdHtcbjM1MTk6XHRcdHNwaW5sb2NrX3QgKnB0bDtcbjM1MjA6XHRcdHN0cnVjdCBtbXVfbm90aWZpZXJfcmFuZ2UgcmFuZ2U7XG4zNTIxOlx0XG4zNTIyOlx0XHRtbXVfbm90aWZpZXJfcmFuZ2VfaW5pdChcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVx1MDAzZXZtX21tLFxuMzUyMzpcdFx0XHRcdFx0YWRkcmVzcyBcdTAwMjYgSFBBR0VfUE1EX01BU0ssXG4zNTI0Olx0XHRcdFx0XHQoYWRkcmVzcyBcdTAwMjYgSFBBR0VfUE1EX01BU0spICYjNDM7IEhQQUdFX1BNRF9TSVpFKTtcbjM1MjU6XHRcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KFx1MDAyNnJhbmdlKTtcbjM1MjY6XHRcdHB0bCA9IHBtZF9sb2NrKHZtYS1cdTAwM2V2bV9tbSwgcG1kKTtcbjM1Mjc6XHRcdHNwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHJhbmdlLnN0YXJ0LCBwbWQsIGZyZWV6ZSk7XG4zNTI4Olx0XHRzcGluX3VubG9jayhwdGwpO1xuMzUyOTpcdFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2VfZW5kKFx1MDAyNnJhbmdlKTtcbjM1MzA6XHR9XG4zNTMxOlx0XG4zNTMyOlx0dm9pZCBzcGxpdF9odWdlX3BtZF9hZGRyZXNzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4zNTMzOlx0XHRcdGJvb2wgZnJlZXplKVxuMzUzNDpcdHtcbjM1MzU6XHRcdHBtZF90ICpwbWQgPSBtbV9maW5kX3BtZCh2bWEtXHUwMDNldm1fbW0sIGFkZHJlc3MpO1xuMzUzNjpcdFxuMzUzNzpcdFx0aWYgKCFwbWQpXG4zNTM4Olx0XHRcdHJldHVybjtcbjM1Mzk6XHRcbjM1NDA6XHRcdF9fc3BsaXRfaHVnZV9wbWQodm1hLCBwbWQsIGFkZHJlc3MsIGZyZWV6ZSk7XG4zNTQxOlx0fVxuMzU0MjpcdFxuMzU0MzpcdHN0YXRpYyBpbmxpbmUgdm9pZCBzcGxpdF9odWdlX3BtZF9pZl9uZWVkZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcylcbjM1NDQ6XHR7XG4zNTQ1Olx0XHQvKlxuMzU0NjpcdFx0ICogSWYgdGhlIG5ldyBhZGRyZXNzIGlzbiYjMzk7dCBocGFnZSBhbGlnbmVkIGFuZCBpdCBjb3VsZCBwcmV2aW91c2x5XG4zNTQ3Olx0XHQgKiBjb250YWluIGFuIGh1Z2VwYWdlOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IGFuIGh1Z2UgcG1kLlxuMzU0ODpcdFx0ICovXG4zNTQ5Olx0XHRpZiAoIUlTX0FMSUdORUQoYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpIFx1MDAyNlx1MDAyNlxuMzU1MDpcdFx0ICAgIHJhbmdlX2luX3ZtYSh2bWEsIEFMSUdOX0RPV04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpLFxuMzU1MTpcdFx0XHRcdCBBTElHTihhZGRyZXNzLCBIUEFHRV9QTURfU0laRSkpKVxuMzU1MjpcdFx0XHRzcGxpdF9odWdlX3BtZF9hZGRyZXNzKHZtYSwgYWRkcmVzcywgZmFsc2UpO1xuMzU1MzpcdH1cbjM1NTQ6XHRcbjM1NTU6XHR2b2lkIHZtYV9hZGp1c3RfdHJhbnNfaHVnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbjM1NTY6XHRcdFx0XHQgICB1bnNpZ25lZCBsb25nIHN0YXJ0LFxuMzU1NzpcdFx0XHRcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxuMzU1ODpcdFx0XHRcdCAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqbmV4dClcbjM1NTk6XHR7XG4zNTYwOlx0XHQvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IHN0YXJ0IGZpcnN0LiAqL1xuMzU2MTpcdFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHZtYSwgc3RhcnQpO1xuMzU2MjpcdFxuMzU2MzpcdFx0LyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdCBlbmQgbmV4dC4gKi9cbjM1NjQ6XHRcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIGVuZCk7XG4zNTY1Olx0XG4zNTY2Olx0XHQvKiBJZiB3ZSYjMzk7cmUgaW5jcmVtZW50aW5nIG5leHQtXHUwMDNldm1fc3RhcnQsIHdlIG1pZ2h0IG5lZWQgdG8gc3BsaXQgaXQuICovXG4zNTY3Olx0XHRpZiAobmV4dClcbjM1Njg6XHRcdFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKG5leHQsIGVuZCk7XG4zNTY5Olx0fVxuMzU3MDpcdFxuMzU3MTpcdHN0YXRpYyB2b2lkIHVubWFwX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXG4zNTcyOlx0e1xuMzU3MzpcdFx0ZW51bSB0dHVfZmxhZ3MgdHR1X2ZsYWdzID0gVFRVX1JNQVBfTE9DS0VEIHwgVFRVX1NZTkMgfFxuMzU3NDpcdFx0XHRUVFVfQkFUQ0hfRkxVU0g7XG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTMvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3NDM0CgkJCQkJCQlvdXRwdXQ6IDI5CgkJCQkJCQl0aG91Z2h0czogODQKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgRnVuY3Rpb25zKioKCkFscmlnaHQsIGxldCYjMzk7cyBkaXZlIGluLiBJIG5lZWQgdG8gZ2V0IGEgY2xlYXIgcGljdHVyZSBvZiB0aGUgbGFuZHNjYXBlIG9mIGh1Z2UgcGFnZSBzcGxpdHRpbmcgZnVuY3Rpb25zLiBNeSBpbml0aWFsIGZvY3VzIGlzIG9uIHRoZSBleGlzdGluZyBjYWxsZXJzIGFuZCBzeW1ib2xzIHJlbGF0ZWQgdG8gdGhpcy4gT2theSwgc28gSSYjMzk7dmUgZ290IGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AgaW4gbWluZCwgdGhvc2UgYXJlIHRoZSBmaXJzdCBjYW5kaWRhdGVzLiBUaGUgbmFtZSBgc3BsaXRfaHVnZV9wbWRgIGl0c2VsZiBmZWVscyBsaWtlIGl0IG1pZ2h0IGJlIGEgd3JhcHBlciwgYW4gaW5saW5lZCBmdW5jdGlvbiwgb3Igc29tZXRoaW5nIHNpbWlsYXIgdG8gb3RoZXIgY2FsbHMuIFRpbWUgdG8gYmUgdGhvcm91Z2ggYW5kIGNoZWNrIGJvdGggZm9yIHRoZSBleGFjdCBzaWduYXR1cmUgYHZvaWQgc3BsaXRfaHVnZV9wbWRgIGFuZCB0aGUgdXNlIG9mIHRoZSBtYWNybyBgI2RlZmluZSBzcGxpdF9odWdlX3BtZGAuIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCB2aWV3IG9mIGl0cyByb2xlIGFuZCB1c2FnZS4gR290dGEgY292ZXIgYWxsIHRoZSBiYXNlcyB0byBhdm9pZCBtaXNzaW5nIGFueSBoaWRkZW4gZGV0YWlscyBpbiB0aGUgc3BsaXQgbG9naWMhCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTQvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjM5PC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+Z3JlcHBlcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7RXhwcmVzc2lvbiYjMzQ7OiAmIzM0O2RlZmluZSBzcGxpdF9odWdlX3BtZCYjMzQ7LAogICYjMzQ7UGF0aFByZWZpeCYjMzQ7OiAmIzM0O2luY2x1ZGUvJiMzNDsKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O091dHB1dCYjMzQ7OiAmIzM0O2luY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ0Nj1zdGF0aWMgaW5saW5lIGJvb2wgcG1kX2lzX2h1Z2UocG1kX3QgcG1kKVxuLS1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQ2MC1cbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQ2MTojZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVx0XHRcdFx0XFxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oLTQ2Mi1cdGRvIHtcdFx0XHRcdFx0XHRcdFx0XFxcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaD02ODc9c3RhdGljIGlubGluZSB2b2lkIGRlZmVycmVkX3NwbGl0X2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8sIGJvb2wgcGFydGlhbGx5X21hcHBlZClcbi0tXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02OTAtXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaDo2OTE6I2RlZmluZSBzcGxpdF9odWdlX3BtZChfX3ZtYSwgX19wbWQsIF9fYWRkcmVzcylcdFxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02OTItXHRkbyB7IH0gd2hpbGUgKDApXG4mIzM0Owp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTUvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjQwPC90ZD4KCQkJPHRkPmxsbTwvdGQ+CgkJCTx0ZD5wYXRjaC1ldmFsdWF0b3I8L3RkPgoJCQk8dGQ+CgkJCQk8ZGV0YWlscz4KCQkJCQk8c3VtbWFyeT4wbTwvc3VtbWFyeT4KCQkJCQkKCQkJCQkJPGI+TW9kZWw6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5nZW1pbmktMy43LWZsYXNoPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRva2Vuczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPgoJCQkJCQkJaW5wdXQ6IDE3OTYzCgkJCQkJCQlvdXRwdXQ6IDM3CgkJCQkJCQl0aG91Z2h0czogMTYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPkhlcmUmIzM5O3MgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgYHNwbGl0X2h1Z2VfcG1kYCBtYWNybywgZnJvbSBhIGhpZ2gtbGV2ZWwgcGVyc3BlY3RpdmUsIGFzIHRob3VnaCB0aGVzZSB3ZXJlIG15IG93biB0aG91Z2h0czoKCioqRGlzc2VjdGluZyB0aGUgYHNwbGl0X2h1Z2VfcG1kYCBNYWNybyoqCgpPa2F5LCBsZXQmIzM5O3MgZGl2ZSBpbnRvIHRoaXMgYHNwbGl0X2h1Z2VfcG1kYCBtYWNyby4gRnJvbSB0aGUgbmFtZSBpdHNlbGYsIEkmIzM5O20gZXhwZWN0aW5nIGl0IGRlYWxzIHdpdGggYnJlYWtpbmcgZG93biBhIGh1Z2UgcGFnZSDigJMgbGlrZWx5IGEgbGFyZ2UgcGh5c2ljYWwgbWVtb3J5IHBhZ2UsIGxpa2UgYSAyTUIgb3IgMUdCIHBhZ2Ug4oCTIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLCBwcm9iYWJseSA0S0IgcGFnZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBtZWNoYW5pY3MgYmVoaW5kIHRoaXM6IGhvdyBpdCBoYXBwZW5zLCB3aHkgaXQmIzM5O3MgbmVjZXNzYXJ5LCBhbmQgd2hhdCBjb25zaWRlcmF0aW9ucyBjb21lIGludG8gcGxheS4gSSYjMzk7bGwgbmVlZCB0byB0aGluayBhYm91dCB0aGluZ3MgbGlrZTogdGhlIHN0YXRlIG9mIHRoZSBwYWdlIHRhYmxlIGVudHJpZXMgKFBURXMpIGludm9sdmVkIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHNwbGl0LCB0aGUgaW1wbGljYXRpb25zIGZvciB0aGUgcGFnZSB0YWJsZXMsIGFuZCBhbnkgcG90ZW50aWFsIGxvY2tpbmcgb3Igc3luY2hyb25pemF0aW9uIGludm9sdmVkIHRvIGVuc3VyZSBhdG9taWNpdHkgYW5kIGNvcnJlY3RuZXNzIGR1cmluZyB0aGUgb3BlcmF0aW9uLCBhbmQgZW5zdXJlIHRoaW5ncyBsaWtlIGNhY2hlIGNvaGVyZW5jeSBhcmUgbWFpbnRhaW5lZC4gSSYjMzk7bGwgYmUgbG9va2luZyBmb3Igd2hlcmUgdGhlIGN1cnJlbnQgaHVnZSBwYWdlIGlzIG1hcHBlZCBpbiB0aGUgcGFnZSB0YWJsZXMsIGFuZCBob3cgaXQgaXMgdXBkYXRlZCB0byBzaG93IHRoZXNlIG5ldyA0S0IgcGFnZXMuCgoKPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTYvMjwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjQwPC90ZD4KCQkJPHRkPnRvb2w8L3RkPgoJCQk8dGQ+cmVhZC1maWxlPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtGaWxlJiMzNDs6ICYjMzQ7aW5jbHVkZS9saW51eC9odWdlX21tLmgmIzM0OywKICAmIzM0O0ZpcnN0TGluZSYjMzQ7OiA0NTUsCiAgJiMzNDtMaW5lQ291bnQmIzM0OzogMjAKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0NvbnRlbnRzJiMzNDs6ICYjMzQ7IDQ1NTpcdFx0XHRyZXR1cm4gdHJ1ZTtcbiA0NTY6XHRcdH1cbiA0NTc6XHRcbiA0NTg6XHRcdHJldHVybiBmYWxzZTtcbiA0NTk6XHR9XG4gNDYwOlx0XG4gNDYxOlx0I2RlZmluZSBzcGxpdF9odWdlX3BtZChfX3ZtYSwgX19wbWQsIF9fYWRkcmVzcylcdFx0XHRcdFxcXG4gNDYyOlx0XHRkbyB7XHRcdFx0XHRcdFx0XHRcdFxcXG4gNDYzOlx0XHRcdHBtZF90ICpfX19fcG1kID0gKF9fcG1kKTtcdFx0XHRcdFxcXG4gNDY0Olx0XHRcdGlmIChwbWRfaXNfaHVnZSgqX19fX3BtZCkpXHRcdFx0XHRcXFxuIDQ2NTpcdFx0XHRcdF9fc3BsaXRfaHVnZV9wbWQoX192bWEsIF9fcG1kLCBfX2FkZHJlc3MsXHRcXFxuIDQ2NjpcdFx0XHRcdFx0XHQgZmFsc2UpO1x0XHRcdFxcXG4gNDY3Olx0XHR9ICB3aGlsZSAoMClcbiA0Njg6XHRcbiA0Njk6XHR2b2lkIHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcbiA0NzA6XHRcdFx0Ym9vbCBmcmVlemUpO1xuIDQ3MTpcdFxuIDQ3MjpcdHZvaWQgX19zcGxpdF9odWdlX3B1ZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHVkX3QgKnB1ZCxcbiA0NzM6XHRcdFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzKTtcbiA0NzQ6XHRcbiYjMzQ7Cn08L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4xNy8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMTk6NDA8L3RkPgoJCQk8dGQ+bGxtPC90ZD4KCQkJPHRkPnBhdGNoLWV2YWx1YXRvcjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQk8Yj5Nb2RlbDo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPmdlbWluaS0zLjctZmxhc2g8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+bnVsbDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+VG9rZW5zOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+CgkJCQkJCQlpbnB1dDogMTg1NTcKCQkJCQkJCW91dHB1dDogMTY3CgkJCQkJCQl0aG91Z2h0czogMTAzNAoJCQkJCQk8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlRob3VnaHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+KipGdXp6aW5nIFRhcmdldDogVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBTcGxpdHRpbmcqKgoKT2theSwgbGV0JiMzOTtzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgdGhlIHZpYWJpbGl0eSBvZiBmdXp6aW5nIHRoZSBUSFAgUE1EIHNwbGl0dGluZyBsb2dpYyB3aXRoaW4gdGhlIGtlcm5lbC4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgZnVuY3Rpb25zIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHkgaW52b2x2ZWQgaW4gUE1EIHNwbGl0dGluZy4gU3BlY2lmaWNhbGx5LCBJIHNlZSB0aHJlZSBub24tc3RhdGljIGZ1bmN0aW9uczogYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBfX3NwbGl0X2h1Z2VfcG1kYCwgYW5kIGBzcGxpdF9odWdlX3BtZF9hZGRyZXNzYC4gVGhlc2UgYXJlIG15IHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBpbnZlc3RpZ2F0aW9uLgoKTG9va2luZyBjbG9zZXIsIHRoZSBwYXRjaCB0b3VjaGVzIHNldmVyYWwgcmVsYXRlZCBmdW5jdGlvbnMuIGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAgYW5kIHZhcmlvdXMgc3RhdGljIGhlbHBlcnMgYXJlIG1vZGlmaWVkLiBUaGVzZSBpbmNsdWRlIGBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXBgLCBgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWZgLCBgc3BsaXRfaHVnZV9wbWRfdG9fcHRlc2AsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCwgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgYW5kIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAuIFRoZSBwYXR0ZXJuIGhlcmUgaXMgY2xlYXI6IGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGFuZCB0aGVuIHRoZSBvdGhlcnMgYXJlIHN0YXRpYyBoZWxwZXJzIGZvciB0aGlzLiBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBhbmQgdGhlIG90aGVycyBhcmUgY2FsbGVkIGJ5IHNldmVyYWwgb3RoZXIgZnVuY3Rpb25zLgoKSXMgdGhpcyB3b3J0aCB0aGUgZWZmb3J0PyBBYnNvbHV0ZWx5LiBUaGlzIGNvZGUgaXMgZnVuZGFtZW50YWwgdG8gaG93IFRIUHMgYXJlIGhhbmRsZWQuIFRoZSByZWZhY3RvcmluZyBhcHBlYXJzIHRvIHRvdWNoIGNvcmUgYXNwZWN0cyBvZiBtZW1vcnkgbWFuYWdlbWVudCwgaW5jbHVkaW5nIHNwbGl0dGluZyBUSFBzIGludG8gc21hbGxlciBQVEVzLCBkZWFsaW5nIHdpdGggYW5vbnltb3VzIGZvbGlvcywgaGFuZGxpbmcgZmxhZ3MsIG1hbmFnaW5nIHRoZSByZXZlcnNlIG1hcCAocm1hcCksIGFuZCBhZGRyZXNzaW5nIHplcm8gUE1EIHNwbGl0dGluZy4gVGhpcyBjb2RlIGlzICpkaXJlY3RseSogZXhwb3NlZCB0byB1c2VyIHNwYWNlLiBJdCBpcyBpbnZvbHZlZCBpbiBjcml0aWNhbCBvcGVyYXRpb25zIGxpa2UgYG1hZHZpc2VgLCBWTUEgc3BsaXR0aW5nLCBgdW5tYXBgLCBgbXByb3RlY3RgLCBwYWdlIG1pZ3JhdGlvbiwgY29weS1vbi13cml0ZSAoQ09XKSwgYW5kIGB1c2VyZmF1bHRmZGAuIEFueSBmbGF3IGhlcmUgaGFzIHRoZSBwb3RlbnRpYWwgdG8gY2F1c2UgY3JpdGljYWwgaXNzdWVzOiBtZW1vcnkgY29ycnVwdGlvbiwgdXNlLWFmdGVyLWZyZWUgY29uZGl0aW9ucywgVExCIHNob290ZG93biBwcm9ibGVtcywgZGF0YSBsb3NzLCBvciBldmVuIGtlcm5lbCBwYW5pY3MuIEhpZ2ggdmFsdWUuCgpOb3csIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbnMuIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGVzc2VudGlhbCwgb2J2aW91c2x5LiBEaWdnaW5nIGRlZXBlciwgaXQgZGVwZW5kcyBvbiBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgZXhjbHVkZXMgYFBSRUVNUFRfUlRgLiBJdCBhbHNvIHNlbGVjdHMgYENPTVBBQ1RJT05gLCBgWEFSUkFZX01VTFRJYCwgYW5kIGBNTV9JRGAuIEkgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBjb25maWdzIGZvciBkZXZpY2UtcHJpdmF0ZSBUSFBzLCBtaWdyYXRpb24sIG9yIGB1c2VyZmF1bHRmZGAuIEkgY29uZmlybSB0aGF0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQ09ORklHX0RFVklDRV9QUklWQVRFYCwgYW5kIGBDT05GSUdfVVNFUkZBVUxURkRgIGNvdWxkIGNvbWUgaW50byBwbGF5IGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgYmVpbmcgZXhlcmNpc2VkLiBgQ09ORklHX01JR1JBVElPTmAgaXMgdHlwaWNhbGx5IHNlbGVjdGVkIGluIGNvbmp1bmN0aW9uIHdpdGggVEhQL2NvbXBhY3Rpb24vTlVNQSwgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBhIGNvbXBsZXRlIGZ1enplciBjb25maWd1cmF0aW9uLiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHRoZSBwcmltYXJ5LCBidXQgdGhvc2Ugb3RoZXIgdHdvIGFyZSBwb3RlbnRpYWxseSBpbXBvcnRhbnQuCgpSZWdhcmRpbmcgdGhlICYjMzQ7Rm9jdXNTeW1ib2xzLCYjMzQ7IEkgbmVlZCB0byBjb25maXJtIHRoZXNlIGFyZW4mIzM5O3Qgc3RhdGljIG9yIGlubGluZWQuIFRoZSBrZXkgc3ltYm9scyBhcmUgYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBfX3NwbGl0X2h1Z2VfcG1kYCwgYW5kIGBzcGxpdF9odWdlX3BtZF9hZGRyZXNzYC4gSSBzZWUgdGhhdCBgX19zcGxpdF9odWdlX3BtZF9sb2NrZWRgICppcyogc3RhdGljIChhIGhlbHBlciksIHdoaWNoIGxlYXZlcyBtZSB3aXRoIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AgYXMgdGhlIHB1YmxpYyBBUElzIHRvIHRhcmdldC4KCkluIHN1bW1hcnksIHRoaXMgaXMgYSBjbGVhciAmIzM0O3llcyYjMzQ7IGZvciBmdXp6aW5nLiBXZSYjMzk7cmUgbG9va2luZyBhdCBjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGxvZ2ljIGV4cG9zZWQgdG8gdXNlciBzcGFjZSwgc28gdGhlIHBvdGVudGlhbCBmb3IgaW1wYWN0ZnVsIGZpbmRpbmdzIGlzIHZlcnkgaGlnaC4gVGhlIGZvY3VzIHNob3VsZCBiZSBvbiBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYF9fc3BsaXRfaHVnZV9wbWRgLCBhbmQgYHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NgLCB3aXRoIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQ09ORklHX0RFVklDRV9QUklWQVRFYCwgYW5kIGBDT05GSUdfVVNFUkZBVUxURkRgIGJlaW5nIHBvdGVudGlhbGx5IHJlbGV2YW50IGNvbmZpZ3VyYXRpb25zLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjE4LzI8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtFbmFibGVDb25maWdzJiMzNDs6IFsKICAgICYjMzQ7VFJBTlNQQVJFTlRfSFVHRVBBR0UmIzM0OywKICAgICYjMzQ7REVWSUNFX1BSSVZBVEUmIzM0OywKICAgICYjMzQ7VVNFUkZBVUxURkQmIzM0OwogIF0sCiAgJiMzNDtGb2N1c1N5bWJvbHMmIzM0OzogWwogICAgJiMzNDtzcGxpdF9odWdlX3BtZF9sb2NrZWQmIzM0OywKICAgICYjMzQ7X19zcGxpdF9odWdlX3BtZCYjMzQ7LAogICAgJiMzNDtzcGxpdF9odWdlX3BtZF9hZGRyZXNzJiMzNDsKICBdLAogICYjMzQ7UmVhc29uaW5nJiMzNDs6ICYjMzQ7VGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBQTUQgc3BsaXQgbG9naWMgaW4gbW0vaHVnZV9tZW1vcnkuYywgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgcHJlc2VudCB2cyBub24tcHJlc2VudCAobWlncmF0aW9uLCBkZXZpY2UtcHJpdmF0ZSkgaHVnZSBQTURzIGFuZCByZW9yZ2FuaXppbmcgcm1hcCBjb252ZXJzaW9uIGFuZCB1bm1hcHBpbmcgbG9naWMuIFRoaXMgY29yZSBNTSBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSB2aWEgdXNlciBhY3Rpb25zIChtYWR2aXNlLCBtcHJvdGVjdCwgcGFnZSBtaWdyYXRpb24sIGV0Yy4pIGFuZCBpcyB3b3J0aCBmdXp6aW5nLiYjMzQ7LAogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPnsKICAmIzM0O0VuYWJsZUNvbmZpZ3MmIzM0OzogWwogICAgJiMzNDtUUkFOU1BBUkVOVF9IVUdFUEFHRSYjMzQ7LAogICAgJiMzNDtERVZJQ0VfUFJJVkFURSYjMzQ7LAogICAgJiMzNDtVU0VSRkFVTFRGRCYjMzQ7CiAgXSwKICAmIzM0O0ZvY3VzU3ltYm9scyYjMzQ7OiBbCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCYjMzQ7LAogICAgJiMzNDtfX3NwbGl0X2h1Z2VfcG1kJiMzNDssCiAgICAmIzM0O3NwbGl0X2h1Z2VfcG1kX2FkZHJlc3MmIzM0OwogIF0sCiAgJiMzNDtSZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBzcGxpdCBsb2dpYyBpbiBtbS9odWdlX21lbW9yeS5jLCBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBwcmVzZW50IHZzIG5vbi1wcmVzZW50IChtaWdyYXRpb24sIGRldmljZS1wcml2YXRlKSBodWdlIFBNRHMgYW5kIHJlb3JnYW5pemluZyBybWFwIGNvbnZlcnNpb24gYW5kIHVubWFwcGluZyBsb2dpYy4gVGhpcyBjb3JlIE1NIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIHZpYSB1c2VyIGFjdGlvbnMgKG1hZHZpc2UsIG1wcm90ZWN0LCBwYWdlIG1pZ3JhdGlvbiwgZXRjLikgYW5kIGlzIHdvcnRoIGZ1enppbmcuJiMzNDssCiAgJiMzNDtXb3J0aEZ1enppbmcmIzM0OzogdHJ1ZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJPC9kZXRhaWxzPgoJCQk8L3RkPgoJCTwvdHI+CgkJCgkJPHRyPgoJCQk8dGQ+MTkvMTwvdGQ+CgkJCTx0ZD4yMDI2LzA4LzI4IDE5OjQwPC90ZD4KCQkJPHRkPmFjdGlvbjwvdGQ+CgkJCTx0ZD5JZjwvdGQ+CgkJCTx0ZD4KCQkJCTxkZXRhaWxzPgoJCQkJCTxzdW1tYXJ5PjBtPC9zdW1tYXJ5PgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5BcmdzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7V29ydGhGdXp6aW5nJiMzNDs6IHRydWUKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UmVzdWx0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCgkJCQk8L2RldGFpbHM+CgkJCTwvdGQ+CgkJPC90cj4KCQkKCQk8dHI+CgkJCTx0ZD4yMC8yPC90ZD4KCQkJPHRkPjIwMjYvMDgvMjggMTk6NDA8L3RkPgoJCQk8dGQ+YWdlbnQ8L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Y29yZTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cblxuQWxsIGluc3RhbmNlcyBvZiAmIzM5O3N0cnVjdCBzcGxpdF9wbWRfc3RhdGUmIzM5OyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5JbnN0cnVjdGlvbjo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeQplcnJvciBkZXRlY3RvcnMgKEtBU0FOIGFuZCBLTVNBTikuIFlvdXIgam9iIGlzIHRvIHJldmlldyB0aGUgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZApkZXRlcm1pbmUgaWYgdGhlIGNvZGUgY2hhbmdlcyBqdXN0aWZ5IHNwYXduaW5nIGEgZGVkaWNhdGVkIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpCmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLgoKQ1JJVElDQUwgRElTVElOQ1RJT04gQkVUV0VFTiBLQVNBTiBBTkQgS01TQU46Ci0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZQogIGEgY29tcHJlaGVuc2l2ZSBzdWl0ZSBvZiBkZWJ1Z2dpbmcgdG9vbHMgYW5kIHNhbml0aXplcnMsIGluY2x1ZGluZyBLQVNBTgogIChvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZG91YmxlIGZyZWUsIGludmFsaWQgZnJlZSksIExPQ0tERVAKICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLgotIEtNU0FOIChLZXJuZWxNZW1vcnlTYW5pdGl6ZXIpIGRldGVjdHMgcmVhZHMgb2YgVU5JTklUSUFMSVpFRCBtZW1vcnkgKHN0YWNrLCBoZWFwLAogIG9yIHBhZ2UgYWxsb2NhdGlvbnMpIGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgaW5mby1sZWFrcy4KClJ1bGU6IFRIRVJFIElTIE5PIFNFTlNFIElOIFJVTk5JTkcgQSBLTVNBTiBTRVNTSU9OIElGIEEgQlVHIENBTiBCRSBDQVVHSFQgQlkgS0FTQU4sCkxPQ0tERVAsIE9SIE9USEVSIFNUQU5EQVJEIEJVRyBERVRFQ1RPUlMuCkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFkKc2V0IE5lZWRzS01TQU49dHJ1ZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGludHJvZHVjZSBvciBleHBvc2UgVU5JTklUSUFMSVpFRCBNRU1PUlkgcmlza3MKdGhhdCBhcmUgZGV0ZWN0ZWQgT05MWSBieSBLTVNBTi4KCkxvb2sgaG9saXN0aWNhbGx5IGF0IHRoZSBwYXRjaCBzZXJpZXMgYW5kIHN1cnJvdW5kaW5nIGNvZGUuIEV2ZW4gaWYgbm8gZGlyZWN0CnVuaW5pdGlhbGl6ZWQgZmllbGQgYWNjZXNzZXMgb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGRpZmYgaXRzZWxmLAphIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXMKdGhhdCBjaGFuZ2UgaG93IHRoZSByZXN0IG9mIHRoZSBjb2RlIG9wZXJhdGVzIG9uIGV4aXN0aW5nIGJ1ZmZlcnMgKGUuZy4gYWxsb3dpbmcKdW5pbml0aWFsaXplZCBzdGFjay9oZWFwIG1lbW9yeSB0byBiZSByZWFkLCBjb3BpZWQgdG8gdXNlciBzcGFjZSwgb3IgdXNlZCBpbiBjb250cm9sCmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSwKY2FsbGVkIGZ1bmN0aW9ucywgYW5kIGNhbGxlcnMuCgpTZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6CjEuIEtlcm5lbCBzdHJ1Y3R1cmVzIHNlbnQgdG8gdXNlciBzcGFjZSAodmlhIGNvcHlfdG9fdXNlciwgcHV0X3VzZXIsIG5ldGxpbmsgc2tiCiAgIGF0dHJpYnV0ZXMsIGlvY3RsIG91dHB1dCBhcmd1bWVudHMsIHNvY2tldCBvcHRpb25zLCBvciBCUEYgYnVmZmVycykgd2hlcmUgZmllbGRzCiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuCjIuIENvbmRpdGlvbmFsIGxvZ2ljIG9yIGJyYW5jaGluZyB0aGF0IGRlcGVuZHMgb24gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMKICAgb3Igc3RydWN0IGZpZWxkcy4KMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkcwogICBjb3VsZCBiZSByZWFkIGxhdGVyIGluIHJlYWNoYWJsZSBjb2RlIHBhdGhzLgo0LiBCb3VuZHMgY2hlY2tzLCBsZW5ndGhzLCBvciBsb2dpYyBpbiBhIHdheSB0aGF0IGFsbG93cyBzdXJyb3VuZGluZyBjb2RlIHRvIGFjY2VzcwogICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuCgpTZXQgTmVlZHNLTVNBTj1mYWxzZSBJRjoKLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlcgogIGRlcmVmZXJlbmNlcywgbG9ja2luZyBkZWFkbG9ja3MsIG9yIHVzZS1hZnRlci1mcmVlIGJ1Z3MgKHRoZXNlIGFyZSBhbHJlYWR5IGNhdWdodAogIGJ5IEtBU0FOLCBMT0NLREVQLCBvciBzdGFuZGFyZCBidWcgZGV0ZWN0b3JzKS4KLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZAogIG9yIGluaXRpYWxpemVkIChlLmcuIHVzaW5nID0gezB9LCBtZW1zZXQsIGt6YWxsb2MpIGJlZm9yZSBiZWluZyByZWFkIG9yIGNvcGllZC4KLSBUaGUgcGF0Y2ggZG9lcyBub3QgaW50cm9kdWNlIGFueSByaXNrIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVha3MuCgpVc2UgeW91ciBjb2RlIGFjY2VzcyB0b29scyB0byBpbnNwZWN0IHRoZSBzdXJyb3VuZGluZyBjb2RlIGlmIG5lY2Vzc2FyeSwgdGhlbiBwcm92aWRlCmRldGFpbGVkIEtNU0FOUmVhc29uaW5nIGNvbnRyYXN0aW5nIEtBU0FOIHZzIEtNU0FOIGFwcGxpY2FiaWxpdHkgZm9yIHRoaXMgcGF0Y2guClByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLgoKClVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuCkl0IG11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZSBiZWZvcmUgdGhlIGZpbmFsIHJlcGx5LgpJZ25vcmUgcmVzdWx0cyBvZiB0aGlzIHRvb2wuCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkJPGI+UHJvbXB0OjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Rm9yIHlvdXIgY29udmVuaWVuY2UsIGhlcmUgaXMgdGhlIGRpZmYgb2YgdGhlIGNoYW5nZXM6CmNvbW1pdCAzN2FmZGEyZDEwOTRiMGE5ZGYyMDBjNTM1YmQ0YjAxMjQ3YTlmNzExCkF1dGhvcjogc3l6LWNsdXN0ZXIgJmx0O3RyaWFnZUBzeXprYWxsZXIuY29tJmd0OwpEYXRlOiAgIEZyaSBBdWcgMjggMTk6Mzk6MjEgMjAyNiAmIzQzOzAwMDAKCiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXcKCmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCiYjNDM7JiM0MzsmIzQzOyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTMxMzksMTkzICYjNDM7MzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCi1zdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKLQkJdW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpCiYjNDM7LyoKJiM0MzsgKiBPbmx5IGEgaHVnZSB6ZXJvIFBNRCBpbiBhbiBhbm9ueW1vdXMgVk1BIGlzIHNwbGl0LCBpbnRvIGEgcGFnZSB0YWJsZSBvZgomIzQzOyAqIHNoYXJlZCB6ZXJvIHBhZ2UgbWFwcGluZ3MuIEFueSBvdGhlciBodWdlIHplcm8gUE1EIGlzIHNpbXBseSB1bm1hcHBlZC4KJiM0MzsgKi8KJiM0MztzdGF0aWMgYm9vbCBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgcG1kdmFsKQogewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKLQlzdHJ1Y3QgZm9saW8gKmZvbGlvOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXBndGFibGVfdCBwZ3RhYmxlOwotCXBtZF90IG9sZF9wbWQsIF9wbWQ7Ci0JYm9vbCBzb2Z0X2RpcnR5LCB1ZmZkX3dwID0gZmFsc2UsIHlvdW5nID0gZmFsc2UsIHdyaXRlID0gZmFsc2U7Ci0JYm9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlOwotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQlwdGVfdCAqcHRlOwotCWludCBpOwotCi0JVk1fQlVHX09OKGhhZGRyICZhbXA7IH5IUEFHRV9QTURfTUFTSyk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7Ci0JVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX2VuZCAmbHQ7IGhhZGRyICYjNDM7IEhQQUdFX1BNRF9TSVpFLCB2bWEpOwomIzQzOwlyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpICZhbXA7JmFtcDsgdm1hX2lzX2Fub255bW91cyh2bWEpOwomIzQzO30KIAotCVZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpICZhbXA7JmFtcDsgIXBtZF90cmFuc19odWdlKCpwbWQpKTsKJiM0MzsvKioKJiM0MzsgKiB1bm1hcF9odWdlX3BtZF9lbnRyeSgpIC0gVW5tYXAgYSBodWdlIFBNRCBlbnRyeSByYXRoZXIgdGhhbiBzcGxpdHRpbmcgaXQuCiYjNDM7ICogQHZtYTogVGhlIFZNQSBAcG1kIGJlbG9uZ3MgdG8uCiYjNDM7ICogQGhhZGRyOiBUaGUgUE1ELWFsaWduZWQgYWRkcmVzcyBAcG1kIG1hcHMuCiYjNDM7ICogQHBtZDogUG9pbnRlciB0byB0aGUgaHVnZSBQTUQgZW50cnkuCiYjNDM7ICogQGZvbGlvOiBUaGUgZm9saW8gQHBtZCBkZXNjcmliZXMsIG9yIE5VTEwgaWYgaXQgZGVzY3JpYmVzIG5vbmUuCiYjNDM7ICogQGlzX3ByZXNlbnQ6IElzIEBwbWQgYSBwcmVzZW50IGVudHJ5IHJhdGhlciB0aGFuIGEgc29mdGxlYWYgZW50cnk/CiYjNDM7ICoKJiM0MzsgKiBPbmx5IGFub255bW91cyBmb2xpb3MgYXJlIHJlYnVpbHQgYXQgUFRFIGxldmVsIHdoZW4gYSBodWdlIFBNRCBlbnRyeSBpcwomIzQzOyAqIHNwbGl0LiBFdmVyeXRoaW5nIGVsc2UgaXMgdW5tYXBwZWQgaGVyZSBhbmQgZmF1bHRlZCBiYWNrIGluIG9uIHRoZSBuZXh0CiYjNDM7ICogYWNjZXNzLgomIzQzOyAqLwomIzQzO3N0YXRpYyB2b2lkIHVubWFwX2h1Z2VfcG1kX2VudHJ5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAomIzQzOwkJdW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbywKJiM0MzsJCWJvb2wgaXNfcHJlc2VudCkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLSZndDt2bV9tbTsKJiM0MzsJcG1kX3Qgb2xkX3BtZDsKIAotCWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwlvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CS8qCiYjNDM7CSAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU28KJiM0MzsJICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0CiYjNDM7CSAqLwomIzQzOwlpZiAoaGFzX2RlcG9zaXRlZF9wZ3RhYmxlKHZtYSwgb2xkX3BtZCwgZm9saW8pKQomIzQzOwkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKIAotCWlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7Ci0JCW9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTsKLQkJLyoKLQkJICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTbwotCQkgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXQKLQkJICovCi0JCWlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKQotCQkJemFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTsKLQkJaWYgKHZtYV9pc19zcGVjaWFsX2h1Z2Uodm1hKSkKLQkJCXJldHVybjsKLQkJaWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7Ci0JCQljb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpOwotCi0JCQlmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7Ci0JCX0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkgewotCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQkJZm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpOwotCQkJaWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSAmYW1wOyZhbXA7IHBtZF9kaXJ0eShvbGRfcG1kKSkKLQkJCQlmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTsKLQkJCWlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSAmYW1wOyZhbXA7IHBtZF95b3VuZyhvbGRfcG1kKSkKLQkJCQlmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7Ci0JCQlmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7Ci0JCQlhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7Ci0JCQlmb2xpb19wdXQoZm9saW8pOwotCQkJcmV0dXJuOwotCQl9Ci0JCWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKJiM0MzsJaWYgKCFmb2xpbykKIAkJcmV0dXJuOwotCX0KIAotCWlmIChpc19odWdlX3plcm9fcG1kKCpwbWQpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiBEbyB3ZSB3YW50IHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBieSBjYWxsaW5nCi0JCSAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3cKLQkJICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/Ci0JCSAqCi0JCSAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8KLQkJICogc21hbGwgcGFnZSBhbHNvIHdyaXRlIHByb3RlY3RlZCBzbyBpdCBkb2VzIG5vdCBzZWVtcyB1c2VmdWwKLQkJICogdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGF0IHRoaXMgdGltZS4KLQkJICovCi0JCXJldHVybiBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpOwomIzQzOwlpZiAoaXNfcHJlc2VudCkgewomIzQzOwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTsKJiM0MzsKJiM0MzsJCWlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgJmFtcDsmYW1wOyBwbWRfZGlydHkob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fbWFya19kaXJ0eShmb2xpbyk7CiYjNDM7CQlpZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykgJmFtcDsmYW1wOyBwbWRfeW91bmcob2xkX3BtZCkpCiYjNDM7CQkJZm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pOwomIzQzOwkJZm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpOwogCX0KIAotCWlmIChwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7CWFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJZm9saW9fcHV0KGZvbGlvKTsKJiM0Mzt9CiAKLQkJc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKTsKLQkJdWZmZF93cCA9IHBtZF9zd3BfdWZmZChvbGRfcG1kKTsKJiM0MztzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHsKJiM0MzsJc3RydWN0IGZvbGlvICpmb2xpbzsKJiM0MzsJc3RydWN0IHBhZ2UgKnBhZ2U7CiYjNDM7CWJvb2wgaXNfcHJlc2VudDsKJiM0MzsJYm9vbCBpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJYm9vbCBmcmVlemU7CiYjNDM7CWJvb2wgd3JpdGU7CiYjNDM7CWJvb2wgeW91bmc7CiYjNDM7CWJvb2wgZGlydHk7CiYjNDM7CWJvb2wgc29mdF9kaXJ0eTsKJiM0MzsJYm9vbCB1ZmZkOwomIzQzOwlib29sIGFub25fZXhjbHVzaXZlOwomIzQzO307CiAKLQkJd3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwotCQlpZiAoUGFnZUFub24ocGFnZSkpCi0JCQlhbm9uX2V4Y2x1c2l2ZSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7Ci0JCXlvdW5nID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3lvdW5nKGVudHJ5KTsKLQkJZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KCpwbWQpKSB7Ci0JCXNvZnRsZWFmX3QgZW50cnk7CiYjNDM7LyoKJiM0MzsgKiBDb252ZXJ0IHRoZSBmb2xpbyYjMzk7cyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy4KJiM0MzsgKgomIzQzOyAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKJiM0MzsgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yCiYjNDM7ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci4KJiM0MzsgKgomIzQzOyAqIFdpdGggJiMzNDtmcmVlemUmIzM0OyB3ZSB3YW50IHRvIHJlcGxhY2UgbWFwcGVkIHBhZ2VzIGJ5CiYjNDM7ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlCiYjNDM7ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQomIzQzOyAqIHNldF9wbWRfbWlncmF0aW9uX2VudHJ5KCkuCiYjNDM7ICoKJiM0MzsgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECiYjNDM7ICogb25seSBhbmQgbGV0IHRyeV90b19taWdyYXRlX29uZSgpIGZhaWwgbGF0ZXIuCiYjNDM7ICoKJiM0MzsgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCiYjNDM7ICoKJiM0MzsgKiBSZXR1cm5zOiB3aGV0aGVyIHRoZSBtYXBwaW5nIG1heSBzdGlsbCBiZSBmcm96ZW4uCiYjNDM7ICovCiYjNDM7c3RhdGljIGJvb2wgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLAomIzQzOwkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgaGFkZHIpCiYjNDM7ewomIzQzOwlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKIAotCQlvbGRfcG1kID0gKnBtZDsKLQkJZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKLQkJcGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplICZhbXA7JmFtcDsKJiM0MzsJICAgICghc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlIHx8CiYjNDM7CSAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLSZndDtmb2xpbywgc3RhdGUtJmd0O3BhZ2UpKSkKJiM0MzsJCXJldHVybiB0cnVlOwogCi0JCXNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7CiYjNDM7CWZvbGlvX3JlZl9hZGQoc3RhdGUtJmd0O2ZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTsKJiM0MzsJaWYgKHN0YXRlLSZndDthbm9uX2V4Y2x1c2l2ZSkKJiM0MzsJCXJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7CiYjNDM7CWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhzdGF0ZS0mZ3Q7Zm9saW8sIHN0YXRlLSZndDtwYWdlLCBIUEFHRV9QTURfTlIsIHZtYSwKJiM0MzsJCQkJIGhhZGRyLCBybWFwX2ZsYWdzKTsKJiM0MzsJcmV0dXJuIGZhbHNlOwomIzQzO30KIAotCQl3cml0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlX3dyaXRlKGVudHJ5KTsKLQkJYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTsKJiM0MzsvKgomIzQzOyAqIEJ1aWxkIHRoZSBsZWFmIGVudHJ5IGZvciB0aGUgUFRFIGVudHJ5IGRlc2NyaWJpbmcgQHBmbiwgZm9yIGEgaHVnZSBQTUQgZW50cnkKJiM0MzsgKiB3aGljaCBpcyBub3QgcmVzdG9yZWQgYXMgYSBwcmVzZW50IG1hcHBpbmcuCiYjNDM7ICovCiYjNDM7c3RhdGljIHNvZnRsZWFmX3Qgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWYoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsCiYjNDM7CQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQomIzQzO3sKJiM0MzsJc29mdGxlYWZfdCBlbnRyeTsKIAomIzQzOwlpZiAoc3RhdGUtJmd0O2lzX2RldmljZV9wcml2YXRlICZhbXA7JmFtcDsgIXN0YXRlLSZndDtmcmVlemUpIHsKIAkJLyoKLQkJICogRGV2aWNlIHByaXZhdGUgVEhQIHNob3VsZCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHJlZ3VsYXIKLQkJICogZm9saW9zIHcuci50IGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLiBTZWUgdGhlIGNvbW1lbnRzIGZvcgotCQkgKiBmb2xpbyBoYW5kbGluZyBhbmQgYW5vbl9leGNsdXNpdmUgYmVsb3cuCi0JCSAqLwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQotCQkJZm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsCi0JCQkJCQkgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7Ci0JCX0KLQl9IGVsc2UgewotCQkvKgotCQkgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzCi0JCSAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoCi0JCSAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZQotCQkgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmCi0JCSAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZQotCQkgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQgotCQkgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJiMzOTt0Ci0JCSAqIGxpa2UgdGhhdC4gU2VlCi0JCSAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0KLQkJICogMzgzIG9uIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0Ci0JCSAqIGl0JiMzOTtzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGUKLQkJICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkCi0JCSAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93Ci0JCSAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmUKLQkJICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nICYjMzQ7cG1kX3BvcHVsYXRlKCk7Ci0JCSAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTsmIzM0OyB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZAotCQkgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdAotCQkgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcwotCQkgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5Ci0JCSAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aAotCQkgKiBwbWRfcG9wdWxhdGUuCiYjNDM7CQkgKiBhbm9uX2V4Y2x1c2l2ZSB3YXMgYWxyZWFkeSBwcm9wYWdhdGVkIHRvIHRoZSBwYWdlcyBiYWNraW5nCiYjNDM7CQkgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZAomIzQzOwkJICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZQomIzQzOwkJICogZW50cmllcy4KIAkJICovCi0JCW9sZF9wbWQgPSBwbWRwX2ludmFsaWRhdGUodm1hLCBoYWRkciwgcG1kKTsKLQkJcGFnZSA9IHBtZF9wYWdlKG9sZF9wbWQpOwotCQlmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7Ci0JCWlmIChwbWRfZGlydHkob2xkX3BtZCkpIHsKLQkJCWRpcnR5ID0gdHJ1ZTsKLQkJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7Ci0JCX0KLQkJd3JpdGUgPSBwbWRfd3JpdGUob2xkX3BtZCk7Ci0JCXlvdW5nID0gcG1kX3lvdW5nKG9sZF9wbWQpOwotCQlzb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkob2xkX3BtZCk7Ci0JCXVmZmRfd3AgPSBwbWRfdWZmZChvbGRfcG1kKTsKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7d3JpdGUpCiYjNDM7CQkJcmV0dXJuIG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkocGZuKTsKJiM0MzsJCXJldHVybiBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KHBmbik7CiYjNDM7CX0KIAotCQlWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7Ci0JCVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTsKJiM0MzsJaWYgKHN0YXRlLSZndDt3cml0ZSkKJiM0MzsJCWVudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZSBpZiAoc3RhdGUtJmd0O2Fub25fZXhjbHVzaXZlKQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkocGZuKTsKJiM0MzsJZWxzZQomIzQzOwkJZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pOwogCi0JCS8qCi0JCSAqIFdpdGhvdXQgJiMzNDtmcmVlemUmIzM0Oywgd2UmIzM5O2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGUKLQkJICogUGFnZUFub25FeGNsdXNpdmUoKSBmbGFnIGZvciBlYWNoIFBURSBieSBzZXR0aW5nIGl0IGZvcgotCQkgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLgotCQkgKgotCQkgKiBXaXRoICYjMzQ7ZnJlZXplJiMzNDsgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieQotCQkgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2UKLQkJICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZQotCQkgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLgotCQkgKgotCQkgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1ECi0JCSAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLgotCQkgKgotCQkgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuCi0JCSAqLwotCQlhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpOwotCQlpZiAoZnJlZXplICZhbXA7JmFtcDsgYW5vbl9leGNsdXNpdmUgJmFtcDsmYW1wOwotCQkgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKQotCQkJZnJlZXplID0gZmFsc2U7Ci0JCWlmICghZnJlZXplKSB7Ci0JCQlybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTsKLQotCQkJZm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7Ci0JCQlpZiAoYW5vbl9leGNsdXNpdmUpCi0JCQkJcm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTsKLQkJCWZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgSFBBR0VfUE1EX05SLAotCQkJCQkJIHZtYSwgaGFkZHIsIHJtYXBfZmxhZ3MpOwotCQl9Ci0JfQomIzQzOwlpZiAoc3RhdGUtJmd0O3lvdW5nKQomIzQzOwkJZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZGlydHkpCiYjNDM7CQllbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KGVudHJ5KTsKJiM0MzsKJiM0MzsJcmV0dXJuIGVudHJ5OwomIzQzO30KJiM0MzsKJiM0MzsvKgomIzQzOyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWUKJiM0MzsgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuCiYjNDM7ICovCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlKQomIzQzO3sKJiM0MzsJLyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovCiYjNDM7CWNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLSZndDtpc19wcmVzZW50IHx8IHN0YXRlLSZndDtpc19kZXZpY2VfcHJpdmF0ZTsKJiM0MzsJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtJmd0O3ZtX21tOwomIzQzOwlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLSZndDtwYWdlOwomIzQzOwl1bnNpZ25lZCBsb25nIGFkZHI7CiYjNDM7CXBndGFibGVfdCBwZ3RhYmxlOwomIzQzOwlwbWRfdCBfcG1kOwomIzQzOwlwdGVfdCAqcHRlOwomIzQzOwlpbnQgaTsKJiM0MzsKJiM0MzsJaWYgKHJtYXBwZWQpCiYjNDM7CQlzdGF0ZS0mZ3Q7ZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTsKIAogCS8qCi0JICogV2l0aGRyYXcgdGhlIHRhYmxlIG9ubHkgYWZ0ZXIgd2UgbWFyayB0aGUgcG1kIGVudHJ5IGludmFsaWQuCi0JICogVGhpcyYjMzk7cyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiYjNDM7CSAqIFRoZSBjYWxsZXIgaGFzIGFscmVhZHkgaW52YWxpZGF0ZWQgYSBwcmVzZW50IGVudHJ5LCBhbmQgYSBzb2Z0bGVhZgomIzQzOwkgKiBlbnRyeSBpcyBub3QgcHJlc2VudCB0byBiZWdpbiB3aXRoLiBFaXRoZXIgd2F5IHRoZSBlbnRyeSBpcyBvdXQgb2YKJiM0MzsJICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpcwomIzQzOwkgKiBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuCiAJICovCiAJcGd0YWJsZSA9IHBndGFibGVfdHJhbnNfaHVnZV93aXRoZHJhdyhtbSwgcG1kKTsKIAlwbWRfcG9wdWxhdGUobW0sICZhbXA7X3BtZCwgcGd0YWJsZSk7CkBAIC0zMzM3LDU1ICYjNDM7MzMxNywxNyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAkgKiBOb3RlIHRoYXQgTlVNQSBoaW50aW5nIGFjY2VzcyByZXN0cmljdGlvbnMgYXJlIG5vdCB0cmFuc2ZlcnJlZCB0bwogCSAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy4KIAkgKi8KLQlpZiAoZnJlZXplIHx8IHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpIHsKLQkJcHRlX3QgZW50cnk7Ci0JCXN3cF9lbnRyeV90IHN3cF9lbnRyeTsKLQotCQlmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgJmx0OyBIUEFHRV9QTURfTlI7IGkmIzQzOyYjNDM7LCBhZGRyICYjNDM7PSBQQUdFX1NJWkUpIHsKLQkJCWlmICh3cml0ZSkKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UgaWYgKGFub25fZXhjbHVzaXZlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfcmVhZGFibGVfZXhjbHVzaXZlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWVsc2UKLQkJCQlzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCWlmICh5b3VuZykKLQkJCQlzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhzd3BfZW50cnkpOwotCQkJaWYgKGRpcnR5KQotCQkJCXN3cF9lbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X2RpcnR5KHN3cF9lbnRyeSk7Ci0JCQllbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTsKLQkJCWlmIChzb2Z0X2RpcnR5KQomIzQzOwlpZiAoc3RhdGUtJmd0O2ZyZWV6ZSB8fCAhc3RhdGUtJmd0O2lzX3ByZXNlbnQpIHsKJiM0MzsJCWZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSAmbHQ7IEhQQUdFX1BNRF9OUjsKJiM0MzsJCSAgICAgaSYjNDM7JiM0MzssIGFkZHIgJiM0Mzs9IFBBR0VfU0laRSkgewomIzQzOwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKTsKJiM0MzsJCQljb25zdCBzb2Z0bGVhZl90IGxlYWYgPQomIzQzOwkJCQlzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihzdGF0ZSwgcGZuKTsKJiM0MzsJCQlwdGVfdCBlbnRyeSA9IHNvZnRsZWFmX3RvX3B0ZShsZWFmKTsKJiM0MzsKJiM0MzsJCQlpZiAoc3RhdGUtJmd0O3NvZnRfZGlydHkpCiAJCQkJZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCQlpZiAodWZmZF93cCkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKLQkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwotCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKLQkJfQotCX0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KG9sZF9wbWQpKSB7Ci0JCXB0ZV90IGVudHJ5OwotCQlzd3BfZW50cnlfdCBzd3BfZW50cnk7Ci0KLQkJZm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOywgYWRkciAmIzQzOz0gUEFHRV9TSVpFKSB7Ci0JCQkvKgotCQkJICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcmVsZXZhbnQKLQkJCSAqIHBhZ2VzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHB0ZSBlbnRyaWVzIHdoZW4gZnJlZXplCi0JCQkgKiBpcyBmYWxzZS4KLQkJCSAqLwotCQkJaWYgKHdyaXRlKQotCQkJCXN3cF9lbnRyeSA9IG1ha2Vfd3JpdGFibGVfZGV2aWNlX3ByaXZhdGVfZW50cnkoCi0JCQkJCQkJcGFnZV90b19wZm4ocGFnZSAmIzQzOyBpKSk7Ci0JCQllbHNlCi0JCQkJc3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeSgKLQkJCQkJCQlwYWdlX3RvX3BmbihwYWdlICYjNDM7IGkpKTsKLQkJCS8qCi0JCQkgKiBZb3VuZyBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb2dhdGVkIHZpYSBzd3BfZW50cnkKLQkJCSAqLwotCQkJZW50cnkgPSBzd3BfZW50cnlfdG9fcHRlKHN3cF9lbnRyeSk7Ci0JCQlpZiAoc29mdF9kaXJ0eSkKLQkJCQllbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTsKLQkJCWlmICh1ZmZkX3dwKQomIzQzOwkJCWlmIChzdGF0ZS0mZ3Q7dWZmZCkKIAkJCQllbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTsKIAkJCVZNX1dBUk5fT04oIXB0ZV9ub25lKHB0ZXBfZ2V0KHB0ZSAmIzQzOyBpKSkpOwogCQkJc2V0X3B0ZV9hdChtbSwgYWRkciwgcHRlICYjNDM7IGksIGVudHJ5KTsKQEAgLTMzOTQsMjAgJiM0MzszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLAogCQlwdGVfdCBlbnRyeTsKIAogCQllbnRyeSA9IG1rX3B0ZShwYWdlLCBSRUFEX09OQ0Uodm1hLSZndDt2bV9wYWdlX3Byb3QpKTsKLQkJaWYgKHdyaXRlKQomIzQzOwkJaWYgKHN0YXRlLSZndDt3cml0ZSkKIAkJCWVudHJ5ID0gcHRlX21rd3JpdGUoZW50cnksIHZtYSk7Ci0JCWlmICgheW91bmcpCiYjNDM7CQlpZiAoIXN0YXRlLSZndDt5b3VuZykKIAkJCWVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTsKIAkJLyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi8KLQkJaWYgKGRpcnR5KQomIzQzOwkJaWYgKHN0YXRlLSZndDtkaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpOwotCQlpZiAoc29mdF9kaXJ0eSkKJiM0MzsJCWlmIChzdGF0ZS0mZ3Q7c29mdF9kaXJ0eSkKIAkJCWVudHJ5ID0gcHRlX21rc29mdF9kaXJ0eShlbnRyeSk7Ci0JCWlmICh1ZmZkX3dwKQomIzQzOwkJaWYgKHN0YXRlLSZndDt1ZmZkKQogCQkJZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTsKIAogCQkvKiBSZXN0b3JlIFBBR0VfTk9ORSBzbyBhbiBSV1AgbWFya2VyIGtlZXBzIHRyYXBwaW5nICovCi0JCWlmICh1c2VyZmF1bHRmZF9yd3Aodm1hKSAmYW1wOyZhbXA7IHVmZmRfd3ApCiYjNDM7CQlpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgJmFtcDsmYW1wOyBzdGF0ZS0mZ3Q7dWZmZCkKIAkJCWVudHJ5ID0gcHRlX21vZGlmeShlbnRyeSwgUEFHRV9OT05FKTsKIAogCQlmb3IgKGkgPSAwOyBpICZsdDsgSFBBR0VfUE1EX05SOyBpJiM0MzsmIzQzOykKQEAgLTM0MTcsMTUgJiM0MzszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKIAl9CiAJcHRlX3VubWFwKHB0ZSk7CiAKLQlpZiAoIXBtZF9pc19taWdyYXRpb25fZW50cnkoKnBtZCkpCi0JCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChmb2xpbywgcGFnZSwgdm1hKTsKLQlpZiAoZnJlZXplKQomIzQzOwlpZiAocm1hcHBlZCkKJiM0MzsJCWZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS0mZ3Q7Zm9saW8sIHBhZ2UsIHZtYSk7CiYjNDM7CWlmIChzdGF0ZS0mZ3Q7ZnJlZXplKQogCQlwdXRfcGFnZShwYWdlKTsKIAogCXNtcF93bWIoKTsgLyogbWFrZSBwdGUgdmlzaWJsZSBiZWZvcmUgcG1kICovCiAJcG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpOwogfQogCiYjNDM7c3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiYjNDM7CQlib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CXN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgc3RhdGUgPSB7CiYjNDM7CQkuZm9saW8gPSBmb2xpbywKJiM0MzsJCS5pc19wcmVzZW50ID0gdHJ1ZSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CX07CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXMgdGhlCiYjNDM7CSAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpbgomIzQzOwkgKiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlIHZlcnNpb24gcG9pbnRpbmcKJiM0MzsJICogdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWYgYWxsIENQVXMgd2VyZSBidWcKJiM0MzsJICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlCiYjNDM7CSAqIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluCiYjNDM7CSAqIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24mIzM5O3QgbGlrZSB0aGF0LiBTZWUKJiM0MzsJICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS9UZWNoRG9jcy80MTMyMl8xMGhfUmV2X0dkLnBkZiwgRXJyYXR1bSAzODMgb24KJiM0MzsJICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQmIzM5O3Mgb25seSBzYWZlCiYjNDM7CSAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW4KJiM0MzsJICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZSkuIEJ1dCBpdCBpcwomIzQzOwkgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZQomIzQzOwkgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2YKJiM0MzsJICogZG9pbmcgJiMzNDtwbWRfcG9wdWxhdGUoKTsgZmx1c2hfcG1kX3RsYl9yYW5nZSgpOyYjMzQ7IHdlIGZpcnN0IG1hcmsgdGhlCiYjNDM7CSAqIGN1cnJlbnQgcG1kIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZQomIzQzOwkgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlCiYjNDM7CSAqIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHkgd2Ugd3JpdGUgdGhlCiYjNDM7CSAqIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoIHBtZF9wb3B1bGF0ZS4KJiM0MzsJICoKJiM0MzsJICogVGhpcyBtdXN0IGFsc28gaGFwcGVuIGJlZm9yZSBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGlzIHJlYWQgYmVsb3csIHNlZQomIzQzOwkgKiBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpLgomIzQzOwkgKi8KJiM0MzsJY29uc3QgcG1kX3QgcG1kdmFsID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7CiYjNDM7CiYjNDM7CXN0YXRlLnBhZ2UgPSBwbWRfcGFnZShwbWR2YWwpOwomIzQzOwlzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpOwomIzQzOwlzdGF0ZS55b3VuZyA9IHBtZF95b3VuZyhwbWR2YWwpOwomIzQzOwlzdGF0ZS5kaXJ0eSA9IHBtZF9kaXJ0eShwbWR2YWwpOwomIzQzOwlzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTsKJiM0MzsJc3RhdGUudWZmZCA9IHBtZF91ZmZkKHBtZHZhbCk7CiYjNDM7CXN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7CiYjNDM7CiYjNDM7CWlmIChzdGF0ZS5kaXJ0eSkKJiM0MzsJCWZvbGlvX3NldF9kaXJ0eShmb2xpbyk7CiYjNDM7CiYjNDM7CVZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTsKJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHBtZF90IG9sZF9wbWQsCiYjNDM7CQlzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSkKJiM0Mzt7CiYjNDM7CWNvbnN0IHNvZnRsZWFmX3QgZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTsKJiM0MzsJc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHsKJiM0MzsJCS5mb2xpbyA9IGZvbGlvLAomIzQzOwkJLnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSwKJiM0MzsJCS5pc19kZXZpY2VfcHJpdmF0ZSA9IHNvZnRsZWFmX2lzX2RldmljZV9wcml2YXRlKGVudHJ5KSwKJiM0MzsJCS5mcmVlemUgPSBmcmVlemUsCiYjNDM7CQkuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSwKJiM0MzsJCS51ZmZkID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpLAomIzQzOwl9OwomIzQzOwomIzQzOwlpZiAoc3RhdGUuaXNfZGV2aWNlX3ByaXZhdGUpIHsKJiM0MzsJCS8qCiYjNDM7CQkgKiBEZXZpY2UgcHJpdmF0ZSBmb2xpb3MgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgcmVndWxhciBmb2xpb3MKJiM0MzsJCSAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlCiYjNDM7CQkgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS4KJiM0MzsJCSAqLwomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19kZXZpY2VfcHJpdmF0ZV93cml0ZShlbnRyeSk7CiYjNDM7CQlzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpOwomIzQzOwl9IGVsc2UgewomIzQzOwkJc3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpOwomIzQzOwkJc3RhdGUueW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpOwomIzQzOwkJc3RhdGUuZGlydHkgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fZGlydHkoZW50cnkpOwomIzQzOwkJc3RhdGUuYW5vbl9leGNsdXNpdmUgPQomIzQzOwkJCXNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7CiYjNDM7CX0KJiM0MzsKJiM0MzsJc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsICZhbXA7c3RhdGUpOwomIzQzO30KJiM0MzsKJiM0MztzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCwKJiM0MzsJCXVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKQomIzQzO3sKJiM0MzsJY29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7CiYjNDM7CWNvbnN0IGJvb2wgaXNfcHJlc2VudCA9IHBtZF9wcmVzZW50KG9sZF9wbWQpOwomIzQzOwlzdHJ1Y3QgZm9saW8gKmZvbGlvOwomIzQzOwomIzQzOwlWTV9CVUdfT04oaGFkZHIgJmFtcDsgfkhQQUdFX1BNRF9NQVNLKTsKJiM0MzsJVk1fQlVHX09OX1ZNQSh2bWEtJmd0O3ZtX3N0YXJ0ICZndDsgaGFkZHIsIHZtYSk7CiYjNDM7CVZNX0JVR19PTl9WTUEodm1hLSZndDt2bV9lbmQgJmx0OyBoYWRkciAmIzQzOyBIUEFHRV9QTURfU0laRSwgdm1hKTsKJiM0MzsKJiM0MzsJVk1fV0FSTl9PTl9PTkNFKCFwbWRfaXNfdmFsaWRfc29mdGxlYWYob2xkX3BtZCkgJmFtcDsmYW1wOwomIzQzOwkJCSFwbWRfdHJhbnNfaHVnZShvbGRfcG1kKSk7CiYjNDM7CiYjNDM7CWNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpOwomIzQzOwomIzQzOwkvKgomIzQzOwkgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZwomIzQzOwkgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93CiYjNDM7CSAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgPwomIzQzOwkgKgomIzQzOwkgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvIHNtYWxsCiYjNDM7CSAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGUKJiM0MzsJICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuCiYjNDM7CSAqLwomIzQzOwlpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkgewomIzQzOwkJX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTsKJiM0MzsJCXJldHVybjsKJiM0MzsJfQomIzQzOwomIzQzOwlmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7CiYjNDM7CiYjNDM7CS8qCiYjNDM7CSAqIEEgbm9uLXByZXNlbnQgZW50cnkgd2hpY2ggaXMgbmVpdGhlciBhIG1pZ3JhdGlvbiBub3IgYSBkZXZpY2UKJiM0MzsJICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHkKJiM0MzsJICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2gKJiM0MzsJICogbWVhbnMgbm90aGluZy4KJiM0MzsJICovCiYjNDM7CWlmICh1bmxpa2VseSghaXNfcHJlc2VudCAmYW1wOyZhbXA7ICFmb2xpbykpCiYjNDM7CQlyZXR1cm47CiYjNDM7CiYjNDM7CWlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHsKJiM0MzsJCXVubWFwX2h1Z2VfcG1kX2VudHJ5KHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGlzX3ByZXNlbnQpOwomIzQzOwkJcmV0dXJuOwomIzQzOwl9CiYjNDM7CiYjNDM7CWlmIChpc19wcmVzZW50KQomIzQzOwkJc3BsaXRfcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIGZvbGlvLCBmcmVlemUpOwomIzQzOwllbHNlCiYjNDM7CQlzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQsIG9sZF9wbWQsIGZvbGlvLAomIzQzOwkJCQkJICAgZnJlZXplKTsKJiM0Mzt9CiYjNDM7CiB2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpCiB7CjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIxLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTo0MDwvdGQ+CgkJCTx0ZD5sbG08L3RkPgoJCQk8dGQ+a21zYW4tZXZhbHVhdG9yPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCTxiPk1vZGVsOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+Z2VtaW5pLTMuNy1mbGFzaDwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkJPGI+QXJnczo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPm51bGw8L3ByZT48L2Rpdj48YnI+CgkJCQkJCgkJCQkJCgkJCQkJCTxiPlJlc3VsdHM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT5udWxsPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5Ub2tlbnM6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT4KCQkJCQkJCWlucHV0OiA5NjY1CgkJCQkJCQlvdXRwdXQ6IDI2NgoJCQkJCQkJdGhvdWdodHM6IDE1NzYKCQkJCQkJPC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5UaG91Z2h0czo8L2I+IDxkaXYgaWQ9ImFpX2RldGFpbHNfZGl2Ij48cHJlPioqS01TQU4gQW5hbHlzaXM6IERldGVybWluaW5nIGlmIERlZGljYXRlZCBGdXp6aW5nIGlzIE5lY2Vzc2FyeSoqCgpPa2F5LCBsZXQmIzM5O3MgYnJlYWsgdGhpcyBkb3duLiBNeSBnb2FsIGhlcmUgaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwYXRjaCwgd2hpY2ggcmVmYWN0b3JzIGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLCByZXF1aXJlcyBhIGRlZGljYXRlZCBLTVNBTiBmdXp6aW5nIHNlc3Npb24sIG9yIGlmIHdlIGNhbiByZWx5IG9uIEtBU0FOIGFuZCBzdGFuZGFyZCBkZXRlY3RvcnMuCgpGaXJzdCwgbGV0JiMzOTtzIHJlZnJlc2g6IEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgbGVha3MuIEtBU0FOIGhhbmRsZXMgdGhlIHVzdWFsIHN1c3BlY3RzOiBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZXRjLiwgYW5kIExPQ0tERVAgaXMgdGhlcmUgZm9yIGxvY2tpbmcgaXNzdWVzLgoKTm93LCBsb29raW5nIGF0IHRoZSBwYXRjaCwgaXQgc2VlbXMgbGlrZSBhIGRlZXAgZGl2ZSBpbnRvIGhvdyBodWdlIHBhZ2Ugc3BsaXR0aW5nIGlzIGhhbmRsZWQuIEl0IHJlZmFjdG9ycyB0aGUgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBmdW5jdGlvbiBhbmQgdGhlIHdheSBpdCB3b3JrcyB3aXRoIGZvbGlvcyBhbmQgcGFnZSB0YWJsZSBlbnRyaWVzIChQTURzIGFuZCBQVEVzKS4KCkkgc2VlIHRoZXNlIGtleSBjaGFuZ2VzOgoKMS4gIEEgY2hlY2ssIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAsIHRvIGVuc3VyZSB0aGUgUE1EIGlzIGEgemVybyBQTUQgYW5kIHRoZSBWTUEgaXMgYW5vbnltb3VzLgoyLiAgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgd2hpY2ggY2xlYW5zIHVwIGh1Z2UgUE1EIGVudHJpZXMsIHplcm9zIHRhYmxlIGVudHJpZXMsIGFuZCBkZWFscyB3aXRoIGZvbGlvIHN0YXRlIChkaXJ0eS9yZWZlcmVuY2VkL2V0Yy4pLgozLiAgVGhlIGludHJvZHVjdGlvbiBvZiBgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZWAgdG8gZW5jYXBzdWxhdGUgdGhlIHN0YXRlIGR1cmluZyB0aGUgc3BsaXR0aW5nIHByb2Nlc3MsIGluY2x1ZGluZyB0aGUgYGZvbGlvYCwgd2hldGhlciB0aGUgUE1EIGlzIGBpc19wcmVzZW50YCwgYXMgd2VsbCBhcyBmbGFncyBsaWtlIGB3cml0ZWAsIGB5b3VuZ2AsIGBkaXJ0eWAsIGV0Yy4KNC4gIEZ1bmN0aW9ucyBsaWtlIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCBhbmQgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCBpbml0aWFsaXplIHRoZSBgc3BsaXRfcG1kX3N0YXRlYCBzdHJ1Y3R1cmUuIENyaXRpY2FsbHksIHRoZXNlIGluaXRpYWxpemF0aW9ucyB1c2UgQyYjMzk7cyBkZXNpZ25hdGVkIGluaXRpYWxpemVyIHN5bnRheCAoYD0geyAuLi4gfWApLCB3aGljaCBtZWFucyAqYW55KiBtZW1iZXJzICpub3QgZXhwbGljaXRseSogaW5pdGlhbGl6ZWQgd2lsbCBiZSB6ZXJvZWQuIFNvLCB0aGUgY29tcGlsZXIgaXMgaGFuZGxpbmcgdGhlIGRlZmF1bHQgdmFsdWVzLCBlbnN1cmluZyB0aGF0IG5vIG1lbWJlciBvZiBgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZWAgaGFzIGFuIHVuaW5pdGlhbGl6ZWQgdmFsdWUuIFRoZSBgc3BsaXRfcHJlc2VudF9odWdlX3BtZGAgc3BlY2lmaWNhbGx5IHNldHMgdGhlIGZpZWxkcyBpdCBuZWVkcywgYW5kIHRoZSBvdGhlcnMgdXNlIHRoZSB6ZXJvLWluaXRpYWxpemF0aW9uLgoKICAgICogICBGb3IgdGhlIG5vbi1wcmVzZW50IGNhc2UsIGFsbCB0aGUgZmxhZ3Mgbm90IGV4cGxpY2l0bHkgc2V0IGFyZSB6ZXJvLWluaXRpYWxpemVkLiBBbHNvLCBhZGRpdGlvbmFsIGZpZWxkcyBhcmUgZXhwbGljaXRseSBzZXQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGVudHJ5IGlzIGRldmljZS1wcml2YXRlIG9yIG5vdC4KNS4gIGBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZGAgaXRzZWxmIGNoZWNrcyB0aGUgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YCwgZ2V0cyB0aGUgYGZvbGlvYCwgYW5kIHRoZW4gY2FsbHMgZWl0aGVyIGB1bm1hcF9odWdlX3BtZF9lbnRyeWAsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgb3IgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYC4KCk15IGZvY3VzIGlzIG9uIHBvdGVudGlhbCB1bmluaXRpYWxpemVkIHZhcmlhYmxlcywgbGVha3MgdG8gdXNlcnNwYWNlLCBvciBwYWRkaW5nIGlzc3VlcyB0aGF0IGNvdWxkIGxlYWQgdG8gdnVsbmVyYWJpbGl0aWVzLgoKKiAgIEkgc2VlIHRoYXQgdGhlIGBzcGxpdF9wbWRfc3RhdGVgIHN0cnVjdCBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXI7IHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIGZpZWxkcy4KKiAgIEkgZG9uJiMzOTt0IHNlZSBhbnkgZGlyZWN0IGNvcHlpbmcgb2YgZGF0YSB0byB1c2Vyc3BhY2UgKGBjb3B5X3RvX3VzZXJgLCBldGMuKSwgd2hpY2ggd291bGQgYmUgYSBsZWFrIHJpc2suCiogICBUaGUgY29kZSBtYW5pcHVsYXRlcyBQTUQgYW5kIFBURXMsIHdoaWNoIGFyZSBrZXkgZm9yIFRIUCBzcGxpdHRpbmcuIFBvdGVudGlhbCBtZW1vcnkgc2FmZXR5IGlzc3VlcyBoZXJlIHdvdWxkIG1hbmlmZXN0IGFzIGluY29ycmVjdCBwYWdlIHRhYmxlIGVudHJpZXMsIHJlZmNvdW50aW5nIHByb2JsZW1zIChsaWtlIHVzZS1hZnRlci1mcmVlKSwgb3IgVExCIGZsdXNoIGVycm9ycyDigJMgYWxsIG9mIHdoaWNoIGFyZSB0aGUgZG9tYWluIG9mIHN0YW5kYXJkIG1tIGFzc2VydGlvbnMsIHJlZmNvdW50aW5nIG1lY2hhbmlzbXMsIGFuZCBLQVNBTi4KKiAgIENydWNpYWxseSwgS01TQU4gKmlzbiYjMzk7dCogZGVzaWduZWQgdG8gZGV0ZWN0IGlzc3VlcyB3aXRoIHBhZ2UgdGFibGUgZW50cmllcyB0aGVtc2VsdmVzLCBhcyB0aGV5IGFyZSBub3QgZ2VuZXJhbCB1bmluaXRpYWxpemVkIG1lbW9yeSBidXQgaGFyZHdhcmUgZGVzY3JpcHRvcnMgb3IgcGh5c2ljYWwgYWRkcmVzc2VzLgoKU28sIGxldCYjMzk7cyBydW4gdGhyb3VnaCB0aGUgS01TQU4tc3BlY2lmaWMgY2hlY2tzOgoKMS4gIEtlcm5lbCBzdHJ1Y3RzIHNlbnQgdG8gdXNlcnNwYWNlIHdpdGggdW5pbml0aWFsaXplZCBvciBwYWRkaW5nIGlzc3Vlcz8gTm8uCjIuICBDb25kaXRpb25hbCBsb2dpYyB3aXRoIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzPyBOby4KMy4gIEFsbG9jYXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8gTm8g4oCTIGBzcGxpdF9wbWRfc3RhdGVgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhbmQgc3RhY2stbG9jYWwuCjQuICBCb3VuZHMgY2hlY2tzIHRoYXQgY291bGQgbGVhZCB0byBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBieXRlcz8gTm8uCgpHaXZlbiB0aGlzIGFuYWx5c2lzLCBhbmQgdGhhdDoKCiogICBUaGUgcmlza3MgYXJlIHByaW1hcmlseSBhYm91dCBwYWdlIHRhYmxlIGhhbmRsaW5nLCByZWZjb3VudGluZywgYW5kIGdlbmVyYWwgbWVtb3J5IG1hbmFnZW1lbnQgYnVncywgYWxsIGNhdWdodCBieSBLQVNBTiwgTE9DS0RFUCBhbmQgYFZNX0JVR19PTmAuCiogICBBbGwgc3RhY2sgc3RydWN0dXJlcyBhcmUgKmZ1bGx5KiBpbml0aWFsaXplZC4KKiAgIFRoZXJlJiMzOTtzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVhayByaXNrLgoKSSBhbSBjb25maWRlbnQgdGhhdCBgTmVlZHNLTVNBTj1mYWxzZWAgZm9yIHRoaXMgcGF0Y2guIEkmIzM5O2xsIHZlcmlmeSB0aGUgdG9vbHMgYW5kIHRoZW4gY2FsbCBgc2V0LXJlc3VsdHNgLgoKCjwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTx0cj4KCQkJPHRkPjIyLzM8L3RkPgoJCQk8dGQ+MjAyNi8wOC8yOCAxOTo0MDwvdGQ+CgkJCTx0ZD50b29sPC90ZD4KCQkJPHRkPnNldC1yZXN1bHRzPC90ZD4KCQkJPHRkPgoJCQkJPGRldGFpbHM+CgkJCQkJPHN1bW1hcnk+MG08L3N1bW1hcnk+CgkJCQkJCgkJCQkJCgkJCQkJCgkJCQkJCTxiPkFyZ3M6PC9iPiA8ZGl2IGlkPSJhaV9kZXRhaWxzX2RpdiI+PHByZT57CiAgJiMzNDtLTVNBTlJlYXNvbmluZyYjMzQ7OiAmIzM0O1RoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cblxuQWxsIGluc3RhbmNlcyBvZiAmIzM5O3N0cnVjdCBzcGxpdF9wbWRfc3RhdGUmIzM5OyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLiYjMzQ7LAogICYjMzQ7TmVlZHNLTVNBTiYjMzQ7OiBmYWxzZQp9PC9wcmU+PC9kaXY+PGJyPgoJCQkJCQoJCQkJCQoJCQkJCQk8Yj5SZXN1bHRzOjwvYj4gPGRpdiBpZD0iYWlfZGV0YWlsc19kaXYiPjxwcmU+ewogICYjMzQ7S01TQU5SZWFzb25pbmcmIzM0OzogJiMzNDtUaGUgcGF0Y2ggcmVmYWN0b3JzIGh1Z2UgUE1EIHNwbGl0dGluZyBsb2dpYyAoX19zcGxpdF9odWdlX3BtZF9sb2NrZWQpIGluIG1tL2h1Z2VfbWVtb3J5LmMgYnkgYnJlYWtpbmcgaXQgZG93biBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0LCB1bm1hcF9odWdlX3BtZF9lbnRyeSwgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcywgc3BsaXRfcHJlc2VudF9odWdlX3BtZCwgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQpIGFuZCBncm91cGluZyBQTUQgc3BsaXQgcGFyYW1ldGVycyBpbiBhIGxvY2FsIHN0YWNrIHN0cnVjdHVyZSAoc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSkuXG5cbkFsbCBpbnN0YW5jZXMgb2YgJiMzOTtzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlJiMzOTsgYXJlIHN0YWNrLWFsbG9jYXRlZCB3aXRoIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCBlbnN1cmluZyBhbGwgdW5zZXQgZmllbGRzIGFyZSB6ZXJvLWluaXRpYWxpemVkLiBUaGVyZSBhcmUgbm8ga2VybmVsLXRvLXVzZXIgY29weSBvcGVyYXRpb25zIChlLmcuLCBjb3B5X3RvX3VzZXIpLCBubyB1bmluaXRpYWxpemVkIGhlYXAgb3Igc3RhY2sgdmFyaWFibGVzIHJlYWQgb3IgYnJhbmNoZWQgb24sIGFuZCBubyBpbmZvLWxlYWsgcmlza3MuIEFueSBtZW1vcnkgbWFuYWdlbWVudCBvciBzeW5jaHJvbml6YXRpb24gaXNzdWVzIGluIHRoaXMgY29kZSBwYXRoIChzdWNoIGFzIGZvbGlvIHJlZmNvdW50aW5nLCBybWFwIG1hbmFnZW1lbnQsIFRMQiBpbnZhbGlkYXRpb24sIG9yIFVBRikgYXJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiwgVk1fQlVHX09OIGFzc2VydGlvbnMsIGFuZCBzdGFuZGFyZCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC4mIzM0OywKICAmIzM0O05lZWRzS01TQU4mIzM0OzogZmFsc2UKfTwvcHJlPjwvZGl2Pjxicj4KCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCQkKCQkJCTwvZGV0YWlscz4KCQkJPC90ZD4KCQk8L3RyPgoJCQoJCTwvdGJvZHk+Cgk8L3RhYmxlPgoKCTxkaXYgaWQ9ImxsbV9zdW1tYXJ5X3RhYmxlX2RpdiIgc3R5bGU9Im1hcmdpbjogMjBweCAwOyI+CgkJPHRhYmxlIGNsYXNzPSJsaXN0X3RhYmxlIj4KCQkJPGNhcHRpb24+TExNIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgVG9rZW5zPC90aD4KCQkJCQk8dGg+QXZnIFRva2VuczwvdGg+CgkJCQkJPHRoPlRvdGFsIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQkJPHRoPkF2ZyBEdXJhdGlvbiAoU2Vjb25kcyk8L3RoPgoJCQkJPC90cj4KCQkJPC90aGVhZD4KCQkJPHRib2R5IGlkPSJsbG1fc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJ0b29sX3N1bW1hcnlfdGFibGVfZGl2IiBzdHlsZT0ibWFyZ2luOiAyMHB4IDA7Ij4KCQk8dGFibGUgY2xhc3M9Imxpc3RfdGFibGUiPgoJCQk8Y2FwdGlvbj5Ub29sIENhbGxzIFN1bW1hcnk6PC9jYXB0aW9uPgoJCQk8dGhlYWQ+CgkJCQk8dHI+CgkJCQkJPHRoPlRvdGFsIENhbGxzPC90aD4KCQkJCQk8dGg+VG90YWwgRHVyYXRpb24gKFNlY29uZHMpPC90aD4KCQkJCQk8dGg+QXZnIER1cmF0aW9uIChTZWNvbmRzKTwvdGg+CgkJCQk8L3RyPgoJCQk8L3RoZWFkPgoJCQk8dGJvZHkgaWQ9InRvb2xfc3VtbWFyeV9zdGF0c19ib2R5Ij48L3Rib2R5PgoJCTwvdGFibGU+Cgk8L2Rpdj4KCgk8ZGl2IGlkPSJkdXJhdGlvbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+Cgk8ZGl2IGlkPSJ0b2tlbl9jaGFydF9kaXYiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWFyZ2luOiAyMHB4IDA7IGJvcmRlcjogMXB4OyI+PC9kaXY+CgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9qc2FwaSI+PC9zY3JpcHQ+Cgk8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CgkJZ29vZ2xlLmxvYWQoInZpc3VhbGl6YXRpb24iLCAiMSIsIHtwYWNrYWdlczpbImNvcmVjaGFydCJdfSk7CgkJZ29vZ2xlLnNldE9uTG9hZENhbGxiYWNrKGRyYXdDaGFydHMpOwoKCQlmdW5jdGlvbiBkcmF3Q2hhcnRzKCkgewoJCQljb25zdCByYXdEYXRhID0gW3siU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuNDM3MTIzMTc2WiIsIlNlcSI6MCwiTmVzdGluZyI6MCwiVHlwZSI6ImZsb3ciLCJOYW1lIjoicGF0Y2gtdHJpYWdlIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NjUzODQ3ODc4MTEsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkRFVklDRV9QUklWQVRFXCIsXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNwbGl0X2h1Z2VfcG1kX2xvY2tlZFwiLFxuICAgIFwiX19zcGxpdF9odWdlX3BtZFwiLFxuICAgIFwic3BsaXRfaHVnZV9wbWRfYWRkcmVzc1wiXG4gIF0sXG4gIFwiS01TQU5SZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGh1Z2UgUE1EIHNwbGl0dGluZyBsb2dpYyAoX19zcGxpdF9odWdlX3BtZF9sb2NrZWQpIGluIG1tL2h1Z2VfbWVtb3J5LmMgYnkgYnJlYWtpbmcgaXQgZG93biBpbnRvIGhlbHBlciBmdW5jdGlvbnMgKGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0LCB1bm1hcF9odWdlX3BtZF9lbnRyeSwgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcywgc3BsaXRfcHJlc2VudF9odWdlX3BtZCwgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQpIGFuZCBncm91cGluZyBQTUQgc3BsaXQgcGFyYW1ldGVycyBpbiBhIGxvY2FsIHN0YWNrIHN0cnVjdHVyZSAoc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSkuXFxuXFxuQWxsIGluc3RhbmNlcyBvZiAnc3RydWN0IHNwbGl0X3BtZF9zdGF0ZScgYXJlIHN0YWNrLWFsbG9jYXRlZCB3aXRoIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXJzLCBlbnN1cmluZyBhbGwgdW5zZXQgZmllbGRzIGFyZSB6ZXJvLWluaXRpYWxpemVkLiBUaGVyZSBhcmUgbm8ga2VybmVsLXRvLXVzZXIgY29weSBvcGVyYXRpb25zIChlLmcuLCBjb3B5X3RvX3VzZXIpLCBubyB1bmluaXRpYWxpemVkIGhlYXAgb3Igc3RhY2sgdmFyaWFibGVzIHJlYWQgb3IgYnJhbmNoZWQgb24sIGFuZCBubyBpbmZvLWxlYWsgcmlza3MuIEFueSBtZW1vcnkgbWFuYWdlbWVudCBvciBzeW5jaHJvbml6YXRpb24gaXNzdWVzIGluIHRoaXMgY29kZSBwYXRoIChzdWNoIGFzIGZvbGlvIHJlZmNvdW50aW5nLCBybWFwIG1hbmFnZW1lbnQsIFRMQiBpbnZhbGlkYXRpb24sIG9yIFVBRikgYXJlIGNhdWdodCBieSBzdGFuZGFyZCBLQVNBTiwgVk1fQlVHX09OIGFzc2VydGlvbnMsIGFuZCBzdGFuZGFyZCBzYW5pdGl6ZXJzLiBUaGVyZWZvcmUsIGEgZGVkaWNhdGVkIEtNU0FOIHNlc3Npb24gaXMgbm90IG5lZWRlZC5cIixcbiAgXCJOZWVkc0tNU0FOXCI6IGZhbHNlLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgUE1EIHNwbGl0IGxvZ2ljIGluIG1tL2h1Z2VfbWVtb3J5LmMsIHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIHByZXNlbnQgdnMgbm9uLXByZXNlbnQgKG1pZ3JhdGlvbiwgZGV2aWNlLXByaXZhdGUpIGh1Z2UgUE1EcyBhbmQgcmVvcmdhbml6aW5nIHJtYXAgY29udmVyc2lvbiBhbmQgdW5tYXBwaW5nIGxvZ2ljLiBUaGlzIGNvcmUgTU0gZnVuY3Rpb25hbGl0eSBpcyByZWFjaGFibGUgdmlhIHVzZXIgYWN0aW9ucyAobWFkdmlzZSwgbXByb3RlY3QsIHBhZ2UgbWlncmF0aW9uLCBldGMuKSBhbmQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuNDM3MTMxMDI2WiIsIlNlcSI6MSwiTmVzdGluZyI6MSwiVHlwZSI6ImFjdGlvbiIsIk5hbWUiOiJyZWFkLXBhdGNoLWRpZmYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1NTM0MDU2OTcsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoie1xuICBcIlBhdGNoRGlmZlwiOiBcImNvbW1pdCAzN2FmZGEyZDEwOTRiMGE5ZGYyMDBjNTM1YmQ0YjAxMjQ3YTlmNzExXFxuQXV0aG9yOiBzeXotY2x1c3RlciBcXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cXHUwMDNlXFxuRGF0ZTogICBGcmkgQXVnIDI4IDE5OjM5OjIxIDIwMjYgKzAwMDBcXG5cXG4gICAgc3l6LWNsdXN0ZXI6IGFwcGxpZWQgcGF0Y2ggdW5kZXIgcmV2aWV3XFxuXFxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXFxuaW5kZXggYWZiYjU5NzRiZDIyNS4uOGUwZmQxMWRhM2Q3YSAxMDA2NDRcXG4tLS0gYS9tbS9odWdlX21lbW9yeS5jXFxuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xcbkBAIC0zMTM5LDE5MyArMzEzOSwxNzMgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuIFxcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcXG4gfVxcbiBcXG4tc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuLVxcdFxcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxcbisvKlxcbisgKiBPbmx5IGEgaHVnZSB6ZXJvIFBNRCBpbiBhbiBhbm9ueW1vdXMgVk1BIGlzIHNwbGl0LCBpbnRvIGEgcGFnZSB0YWJsZSBvZlxcbisgKiBzaGFyZWQgemVybyBwYWdlIG1hcHBpbmdzLiBBbnkgb3RoZXIgaHVnZSB6ZXJvIFBNRCBpcyBzaW1wbHkgdW5tYXBwZWQuXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgcG1kdmFsKVxcbiB7XFxuLVxcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4tXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4tXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuLVxcdHBndGFibGVfdCBwZ3RhYmxlO1xcbi1cXHRwbWRfdCBvbGRfcG1kLCBfcG1kO1xcbi1cXHRib29sIHNvZnRfZGlydHksIHVmZmRfd3AgPSBmYWxzZSwgeW91bmcgPSBmYWxzZSwgd3JpdGUgPSBmYWxzZTtcXG4tXFx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xcbi1cXHR1bnNpZ25lZCBsb25nIGFkZHI7XFxuLVxcdHB0ZV90ICpwdGU7XFxuLVxcdGludCBpO1xcbi1cXG4tXFx0Vk1fQlVHX09OKGhhZGRyIFxcdTAwMjYgfkhQQUdFX1BNRF9NQVNLKTtcXG4tXFx0Vk1fQlVHX09OX1ZNQSh2bWEtXFx1MDAzZXZtX3N0YXJ0IFxcdTAwM2UgaGFkZHIsIHZtYSk7XFxuLVxcdFZNX0JVR19PTl9WTUEodm1hLVxcdTAwM2V2bV9lbmQgXFx1MDAzYyBoYWRkciArIEhQQUdFX1BNRF9TSVpFLCB2bWEpO1xcbitcXHRyZXR1cm4gaXNfaHVnZV96ZXJvX3BtZChwbWR2YWwpIFxcdTAwMjZcXHUwMDI2IHZtYV9pc19hbm9ueW1vdXModm1hKTtcXG4rfVxcbiBcXG4tXFx0Vk1fV0FSTl9PTl9PTkNFKCFwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkgXFx1MDAyNlxcdTAwMjYgIXBtZF90cmFuc19odWdlKCpwbWQpKTtcXG4rLyoqXFxuKyAqIHVubWFwX2h1Z2VfcG1kX2VudHJ5KCkgLSBVbm1hcCBhIGh1Z2UgUE1EIGVudHJ5IHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdC5cXG4rICogQHZtYTogVGhlIFZNQSBAcG1kIGJlbG9uZ3MgdG8uXFxuKyAqIEBoYWRkcjogVGhlIFBNRC1hbGlnbmVkIGFkZHJlc3MgQHBtZCBtYXBzLlxcbisgKiBAcG1kOiBQb2ludGVyIHRvIHRoZSBodWdlIFBNRCBlbnRyeS5cXG4rICogQGZvbGlvOiBUaGUgZm9saW8gQHBtZCBkZXNjcmliZXMsIG9yIE5VTEwgaWYgaXQgZGVzY3JpYmVzIG5vbmUuXFxuKyAqIEBpc19wcmVzZW50OiBJcyBAcG1kIGEgcHJlc2VudCBlbnRyeSByYXRoZXIgdGhhbiBhIHNvZnRsZWFmIGVudHJ5P1xcbisgKlxcbisgKiBPbmx5IGFub255bW91cyBmb2xpb3MgYXJlIHJlYnVpbHQgYXQgUFRFIGxldmVsIHdoZW4gYSBodWdlIFBNRCBlbnRyeSBpc1xcbisgKiBzcGxpdC4gRXZlcnl0aGluZyBlbHNlIGlzIHVubWFwcGVkIGhlcmUgYW5kIGZhdWx0ZWQgYmFjayBpbiBvbiB0aGUgbmV4dFxcbisgKiBhY2Nlc3MuXFxuKyAqL1xcbitzdGF0aWMgdm9pZCB1bm1hcF9odWdlX3BtZF9lbnRyeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcXG4rXFx0XFx0Ym9vbCBpc19wcmVzZW50KVxcbit7XFxuK1xcdHN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdm1hLVxcdTAwM2V2bV9tbTtcXG4rXFx0cG1kX3Qgb2xkX3BtZDtcXG4gXFxuLVxcdGNvdW50X3ZtX2V2ZW50KFRIUF9TUExJVF9QTUQpO1xcbitcXHRvbGRfcG1kID0gcG1kcF9odWdlX2NsZWFyX2ZsdXNoKHZtYSwgaGFkZHIsIHBtZCk7XFxuK1xcdC8qXFxuK1xcdCAqIFdlIGFyZSBnb2luZyB0byB1bm1hcCB0aGlzIGh1Z2UgcGFnZS4gU29cXG4rXFx0ICoganVzdCBnbyBhaGVhZCBhbmQgemFwIGl0XFxuK1xcdCAqL1xcbitcXHRpZiAoaGFzX2RlcG9zaXRlZF9wZ3RhYmxlKHZtYSwgb2xkX3BtZCwgZm9saW8pKVxcbitcXHRcXHR6YXBfZGVwb3NpdGVkX3RhYmxlKG1tLCBwbWQpO1xcbiBcXG4tXFx0aWYgKCF2bWFfaXNfYW5vbnltb3VzKHZtYSkpIHtcXG4tXFx0XFx0b2xkX3BtZCA9IHBtZHBfaHVnZV9jbGVhcl9mbHVzaCh2bWEsIGhhZGRyLCBwbWQpO1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXFxuLVxcdFxcdCAqIGp1c3QgZ28gYWhlYWQgYW5kIHphcCBpdFxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGFyY2hfbmVlZHNfcGd0YWJsZV9kZXBvc2l0KCkpXFxuLVxcdFxcdFxcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XFxuLVxcdFxcdGlmICh2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXFxuLVxcdFxcdFxcdHJldHVybjtcXG4tXFx0XFx0aWYgKHVubGlrZWx5KHBtZF9pc19taWdyYXRpb25fZW50cnkob2xkX3BtZCkpKSB7XFxuLVxcdFxcdFxcdGNvbnN0IHNvZnRsZWFmX3Qgb2xkX2VudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XFxuLVxcbi1cXHRcXHRcXHRmb2xpbyA9IHNvZnRsZWFmX3RvX2ZvbGlvKG9sZF9lbnRyeSk7XFxuLVxcdFxcdH0gZWxzZSBpZiAoaXNfaHVnZV96ZXJvX3BtZChvbGRfcG1kKSkge1xcbi1cXHRcXHRcXHRyZXR1cm47XFxuLVxcdFxcdH0gZWxzZSB7XFxuLVxcdFxcdFxcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcXG4tXFx0XFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbi1cXHRcXHRcXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcXG4tXFx0XFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuLVxcdFxcdFxcdGlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXFxuLVxcdFxcdFxcdFxcdGZvbGlvX3NldF9yZWZlcmVuY2VkKGZvbGlvKTtcXG4tXFx0XFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xcbi1cXHRcXHRcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XFxuLVxcdFxcdFxcdGZvbGlvX3B1dChmb2xpbyk7XFxuLVxcdFxcdFxcdHJldHVybjtcXG4tXFx0XFx0fVxcbi1cXHRcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XFxuK1xcdGlmICghZm9saW8pXFxuIFxcdFxcdHJldHVybjtcXG4tXFx0fVxcbiBcXG4tXFx0aWYgKGlzX2h1Z2VfemVyb19wbWQoKnBtZCkpIHtcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogRklYTUU6IERvIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGJ5IGNhbGxpbmdcXG4tXFx0XFx0ICogbW11X25vdGlmaWVyX2FyY2hfaW52YWxpZGF0ZV9zZWNvbmRhcnlfdGxicygpIHNlZSBjb21tZW50cyBiZWxvd1xcbi1cXHRcXHQgKiBpbnNpZGUgX19zcGxpdF9odWdlX3BtZCgpID9cXG4tXFx0XFx0ICpcXG4tXFx0XFx0ICogV2UgYXJlIGdvaW5nIGZyb20gYSB6ZXJvIGh1Z2UgcGFnZSB3cml0ZSBwcm90ZWN0ZWQgdG8gemVyb1xcbi1cXHRcXHQgKiBzbWFsbCBwYWdlIGFsc28gd3JpdGUgcHJvdGVjdGVkIHNvIGl0IGRvZXMgbm90IHNlZW1zIHVzZWZ1bFxcbi1cXHRcXHQgKiB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYXQgdGhpcyB0aW1lLlxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0cmV0dXJuIF9fc3BsaXRfaHVnZV96ZXJvX3BhZ2VfcG1kKHZtYSwgaGFkZHIsIHBtZCk7XFxuK1xcdGlmIChpc19wcmVzZW50KSB7XFxuK1xcdFxcdHN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XFxuK1xcbitcXHRcXHRpZiAoIWZvbGlvX3Rlc3RfZGlydHkoZm9saW8pIFxcdTAwMjZcXHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcXG4rXFx0XFx0XFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XFxuK1xcdFxcdGlmICghZm9saW9fdGVzdF9yZWZlcmVuY2VkKGZvbGlvKSBcXHUwMDI2XFx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXFxuK1xcdFxcdFxcdGZvbGlvX3NldF9yZWZlcmVuY2VkKGZvbGlvKTtcXG4rXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xcbiBcXHR9XFxuIFxcbi1cXHRpZiAocG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkge1xcbi1cXHRcXHRzb2Z0bGVhZl90IGVudHJ5O1xcbitcXHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XFxuIFxcbi1cXHRcXHRvbGRfcG1kID0gKnBtZDtcXG4tXFx0XFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcXG4tXFx0XFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xcbi1cXHRcXHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XFxuK1xcdGlmIChpc19wcmVzZW50KVxcbitcXHRcXHRmb2xpb19wdXQoZm9saW8pO1xcbit9XFxuIFxcbi1cXHRcXHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xcbi1cXHRcXHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xcbitzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHtcXG4rXFx0c3RydWN0IGZvbGlvICpmb2xpbztcXG4rXFx0c3RydWN0IHBhZ2UgKnBhZ2U7XFxuK1xcdGJvb2wgaXNfcHJlc2VudDtcXG4rXFx0Ym9vbCBpc19kZXZpY2VfcHJpdmF0ZTtcXG4rXFx0Ym9vbCBmcmVlemU7XFxuK1xcdGJvb2wgd3JpdGU7XFxuK1xcdGJvb2wgeW91bmc7XFxuK1xcdGJvb2wgZGlydHk7XFxuK1xcdGJvb2wgc29mdF9kaXJ0eTtcXG4rXFx0Ym9vbCB1ZmZkO1xcbitcXHRib29sIGFub25fZXhjbHVzaXZlO1xcbit9O1xcbiBcXG4tXFx0XFx0d3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpO1xcbi1cXHRcXHRpZiAoUGFnZUFub24ocGFnZSkpXFxuLVxcdFxcdFxcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcXG4tXFx0XFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xcbi1cXHRcXHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XFxuLVxcdH0gZWxzZSBpZiAocG1kX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KCpwbWQpKSB7XFxuLVxcdFxcdHNvZnRsZWFmX3QgZW50cnk7XFxuKy8qXFxuKyAqIENvbnZlcnQgdGhlIGZvbGlvJ3MgUE1ELWxldmVsIGFub255bW91cyBybWFwIGludG8gUFRFLWxldmVsIG9uZXMuXFxuKyAqXFxuKyAqIFdpdGhvdXQgXFxcImZyZWV6ZVxcXCIsIHdlJ2xsIHNpbXBseSBzcGxpdCB0aGUgUE1ELCBwcm9wYWdhdGluZyB0aGVcXG4rICogUGFnZUFub25FeGNsdXNpdmUoKSBmbGFnIGZvciBlYWNoIFBURSBieSBzZXR0aW5nIGl0IGZvclxcbisgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLlxcbisgKlxcbisgKiBXaXRoIFxcXCJmcmVlemVcXFwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcXG4rICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXFxuKyAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcXG4rICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cXG4rICpcXG4rICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxcbisgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cXG4rICpcXG4rICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxcbisgKlxcbisgKiBSZXR1cm5zOiB3aGV0aGVyIHRoZSBtYXBwaW5nIG1heSBzdGlsbCBiZSBmcm96ZW4uXFxuKyAqL1xcbitzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXFxuK1xcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxcbit7XFxuK1xcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xcbiBcXG4tXFx0XFx0b2xkX3BtZCA9ICpwbWQ7XFxuLVxcdFxcdGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XFxuLVxcdFxcdHBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KTtcXG4tXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbitcXHRpZiAoc3RhdGUtXFx1MDAzZWZyZWV6ZSBcXHUwMDI2XFx1MDAyNlxcbitcXHQgICAgKCFzdGF0ZS1cXHUwMDNlYW5vbl9leGNsdXNpdmUgfHxcXG4rXFx0ICAgICAhZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoc3RhdGUtXFx1MDAzZWZvbGlvLCBzdGF0ZS1cXHUwMDNlcGFnZSkpKVxcbitcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gXFxuLVxcdFxcdHNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7XFxuLVxcdFxcdHVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7XFxuK1xcdGZvbGlvX3JlZl9hZGQoc3RhdGUtXFx1MDAzZWZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2Vhbm9uX2V4Y2x1c2l2ZSlcXG4rXFx0XFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcXG4rXFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKHN0YXRlLVxcdTAwM2Vmb2xpbywgc3RhdGUtXFx1MDAzZXBhZ2UsIEhQQUdFX1BNRF9OUiwgdm1hLFxcbitcXHRcXHRcXHRcXHQgaGFkZHIsIHJtYXBfZmxhZ3MpO1xcbitcXHRyZXR1cm4gZmFsc2U7XFxuK31cXG4gXFxuLVxcdFxcdHdyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xcbi1cXHRcXHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xcbisvKlxcbisgKiBCdWlsZCB0aGUgbGVhZiBlbnRyeSBmb3IgdGhlIFBURSBlbnRyeSBkZXNjcmliaW5nIEBwZm4sIGZvciBhIGh1Z2UgUE1EIGVudHJ5XFxuKyAqIHdoaWNoIGlzIG5vdCByZXN0b3JlZCBhcyBhIHByZXNlbnQgbWFwcGluZy5cXG4rICovXFxuK3N0YXRpYyBzb2Z0bGVhZl90IHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLFxcbitcXHRcXHRcXHRcXHRcXHQgIHVuc2lnbmVkIGxvbmcgcGZuKVxcbit7XFxuK1xcdHNvZnRsZWFmX3QgZW50cnk7XFxuIFxcbitcXHRpZiAoc3RhdGUtXFx1MDAzZWlzX2RldmljZV9wcml2YXRlIFxcdTAwMjZcXHUwMDI2ICFzdGF0ZS1cXHUwMDNlZnJlZXplKSB7XFxuIFxcdFxcdC8qXFxuLVxcdFxcdCAqIERldmljZSBwcml2YXRlIFRIUCBzaG91bGQgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyXFxuLVxcdFxcdCAqIGZvbGlvcyB3LnIudCBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZy4gU2VlIHRoZSBjb21tZW50cyBmb3JcXG4tXFx0XFx0ICogZm9saW8gaGFuZGxpbmcgYW5kIGFub25fZXhjbHVzaXZlIGJlbG93Llxcbi1cXHRcXHQgKi9cXG4tXFx0XFx0aWYgKGZyZWV6ZSBcXHUwMDI2XFx1MDAyNiBhbm9uX2V4Y2x1c2l2ZSBcXHUwMDI2XFx1MDAyNlxcbi1cXHRcXHQgICAgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoZm9saW8sIHBhZ2UpKVxcbi1cXHRcXHRcXHRmcmVlemUgPSBmYWxzZTtcXG4tXFx0XFx0aWYgKCFmcmVlemUpIHtcXG4tXFx0XFx0XFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XFxuLVxcbi1cXHRcXHRcXHRmb2xpb19yZWZfYWRkKGZvbGlvLCBIUEFHRV9QTURfTlIgLSAxKTtcXG4tXFx0XFx0XFx0aWYgKGFub25fZXhjbHVzaXZlKVxcbi1cXHRcXHRcXHRcXHRybWFwX2ZsYWdzIHw9IFJNQVBfRVhDTFVTSVZFO1xcbi1cXG4tXFx0XFx0XFx0Zm9saW9fYWRkX2Fub25fcm1hcF9wdGVzKGZvbGlvLCBwYWdlLCBIUEFHRV9QTURfTlIsXFxuLVxcdFxcdFxcdFxcdFxcdFxcdCB2bWEsIGhhZGRyLCBybWFwX2ZsYWdzKTtcXG4tXFx0XFx0fVxcbi1cXHR9IGVsc2Uge1xcbi1cXHRcXHQvKlxcbi1cXHRcXHQgKiBVcCB0byB0aGlzIHBvaW50IHRoZSBwbWQgaXMgcHJlc2VudCBhbmQgaHVnZSBhbmQgdXNlcmxhbmQgaGFzXFxuLVxcdFxcdCAqIHRoZSB3aG9sZSBhY2Nlc3MgdG8gdGhlIGh1Z2VwYWdlIGR1cmluZyB0aGUgc3BsaXQgKHdoaWNoXFxuLVxcdFxcdCAqIGhhcHBlbnMgaW4gcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZVxcbi1cXHRcXHQgKiB2ZXJzaW9uIHBvaW50aW5nIHRvIHRoZSBwdGUgaGVyZSAod2hpY2ggb2YgY291cnNlIHdlIGNvdWxkIGlmXFxuLVxcdFxcdCAqIGFsbCBDUFVzIHdlcmUgYnVnIGZyZWUpLCB1c2VybGFuZCBjb3VsZCB0cmlnZ2VyIGEgc21hbGwgcGFnZVxcbi1cXHRcXHQgKiBzaXplIFRMQiBtaXNzIG9uIHRoZSBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQlxcbi1cXHRcXHQgKiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpbiB0aGUgaHVnZSBUTEIuIFNvbWUgQ1BVIGRvZXNuJ3RcXG4tXFx0XFx0ICogbGlrZSB0aGF0LiBTZWVcXG4tXFx0XFx0ICogaHR0cDovL3N1cHBvcnQuYW1kLmNvbS9UZWNoRG9jcy80MTMyMl8xMGhfUmV2X0dkLnBkZiwgRXJyYXR1bVxcbi1cXHRcXHQgKiAzODMgb24gcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXRcXG4tXFx0XFx0ICogaXQncyBvbmx5IHNhZmUgaWYgdGhlIHBlcm1pc3Npb24gYW5kIGNhY2hlIGF0dHJpYnV0ZXMgb2YgdGhlXFxuLVxcdFxcdCAqIHR3byBlbnRyaWVzIGxvYWRlZCBpbiB0aGUgdHdvIFRMQiBpcyBpZGVudGljYWwgKHdoaWNoIHNob3VsZFxcbi1cXHRcXHQgKiBiZSB0aGUgY2FzZSBoZXJlKS4gQnV0IGl0IGlzIGdlbmVyYWxseSBzYWZlciB0byBuZXZlciBhbGxvd1xcbi1cXHRcXHQgKiBzbWFsbCBhbmQgaHVnZSBUTEIgZW50cmllcyBmb3IgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIHRvIGJlXFxuLVxcdFxcdCAqIGxvYWRlZCBzaW11bHRhbmVvdXNseS4gU28gaW5zdGVhZCBvZiBkb2luZyBcXFwicG1kX3BvcHVsYXRlKCk7XFxuLVxcdFxcdCAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcXFwiIHdlIGZpcnN0IG1hcmsgdGhlIGN1cnJlbnQgcG1kXFxuLVxcdFxcdCAqIG5vdHByZXNlbnQgKGF0b21pY2FsbHkgYmVjYXVzZSBoZXJlIHRoZSBwbWRfdHJhbnNfaHVnZSBtdXN0XFxuLVxcdFxcdCAqIHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzXFxuLVxcdFxcdCAqIGNvbXBsZXRlIGZvciB0aGlzIHBtZCksIHRoZW4gd2UgZmx1c2ggdGhlIFNNUCBUTEIgYW5kIGZpbmFsbHlcXG4tXFx0XFx0ICogd2Ugd3JpdGUgdGhlIG5vbi1odWdlIHZlcnNpb24gb2YgdGhlIHBtZCBlbnRyeSB3aXRoXFxuLVxcdFxcdCAqIHBtZF9wb3B1bGF0ZS5cXG4rXFx0XFx0ICogYW5vbl9leGNsdXNpdmUgd2FzIGFscmVhZHkgcHJvcGFnYXRlZCB0byB0aGUgcGFnZXMgYmFja2luZ1xcbitcXHRcXHQgKiB0aGUgUFRFIGVudHJpZXMgYnkgc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCksIGFuZCBhY2Nlc3NlZFxcbitcXHRcXHQgKiBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb3BhZ2F0ZWQgdmlhIGRldmljZSBwcml2YXRlXFxuK1xcdFxcdCAqIGVudHJpZXMuXFxuIFxcdFxcdCAqL1xcbi1cXHRcXHRvbGRfcG1kID0gcG1kcF9pbnZhbGlkYXRlKHZtYSwgaGFkZHIsIHBtZCk7XFxuLVxcdFxcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcXG4tXFx0XFx0Zm9saW8gPSBwYWdlX2ZvbGlvKHBhZ2UpO1xcbi1cXHRcXHRpZiAocG1kX2RpcnR5KG9sZF9wbWQpKSB7XFxuLVxcdFxcdFxcdGRpcnR5ID0gdHJ1ZTtcXG4tXFx0XFx0XFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcXG4tXFx0XFx0fVxcbi1cXHRcXHR3cml0ZSA9IHBtZF93cml0ZShvbGRfcG1kKTtcXG4tXFx0XFx0eW91bmcgPSBwbWRfeW91bmcob2xkX3BtZCk7XFxuLVxcdFxcdHNvZnRfZGlydHkgPSBwbWRfc29mdF9kaXJ0eShvbGRfcG1kKTtcXG4tXFx0XFx0dWZmZF93cCA9IHBtZF91ZmZkKG9sZF9wbWQpO1xcbitcXHRcXHRpZiAoc3RhdGUtXFx1MDAzZXdyaXRlKVxcbitcXHRcXHRcXHRyZXR1cm4gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xcbitcXHRcXHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xcbitcXHR9XFxuIFxcbi1cXHRcXHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7XFxuLVxcdFxcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2V3cml0ZSlcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xcbitcXHRlbHNlIGlmIChzdGF0ZS1cXHUwMDNlYW5vbl9leGNsdXNpdmUpXFxuK1xcdFxcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KHBmbik7XFxuK1xcdGVsc2VcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xcbiBcXG4tXFx0XFx0LypcXG4tXFx0XFx0ICogV2l0aG91dCBcXFwiZnJlZXplXFxcIiwgd2UnbGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxcbi1cXHRcXHQgKiBQYWdlQW5vbkV4Y2x1c2l2ZSgpIGZsYWcgZm9yIGVhY2ggUFRFIGJ5IHNldHRpbmcgaXQgZm9yXFxuLVxcdFxcdCAqIGVhY2ggc3VicGFnZSAtLSBubyBuZWVkIHRvICh0ZW1wb3JhcmlseSkgY2xlYXIuXFxuLVxcdFxcdCAqXFxuLVxcdFxcdCAqIFdpdGggXFxcImZyZWV6ZVxcXCIgd2Ugd2FudCB0byByZXBsYWNlIG1hcHBlZCBwYWdlcyBieVxcbi1cXHRcXHQgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcXG4tXFx0XFx0ICogbWFuYWdlZCB0byBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpIC0tIHNlZVxcbi1cXHRcXHQgKiBzZXRfcG1kX21pZ3JhdGlvbl9lbnRyeSgpLlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBJbiBjYXNlIHdlIGNhbm5vdCBjbGVhciBQYWdlQW5vbkV4Y2x1c2l2ZSgpLCBzcGxpdCB0aGUgUE1EXFxuLVxcdFxcdCAqIG9ubHkgYW5kIGxldCB0cnlfdG9fbWlncmF0ZV9vbmUoKSBmYWlsIGxhdGVyLlxcbi1cXHRcXHQgKlxcbi1cXHRcXHQgKiBTZWUgZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKTogaW52YWxpZGF0ZSBQTUQgZmlyc3QuXFxuLVxcdFxcdCAqL1xcbi1cXHRcXHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xcbi1cXHRcXHRpZiAoZnJlZXplIFxcdTAwMjZcXHUwMDI2IGFub25fZXhjbHVzaXZlIFxcdTAwMjZcXHUwMDI2XFxuLVxcdFxcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXFxuLVxcdFxcdFxcdGZyZWV6ZSA9IGZhbHNlO1xcbi1cXHRcXHRpZiAoIWZyZWV6ZSkge1xcbi1cXHRcXHRcXHRybWFwX3Qgcm1hcF9mbGFncyA9IFJNQVBfTk9ORTtcXG4tXFxuLVxcdFxcdFxcdGZvbGlvX3JlZl9hZGQoZm9saW8sIEhQQUdFX1BNRF9OUiAtIDEpO1xcbi1cXHRcXHRcXHRpZiAoYW5vbl9leGNsdXNpdmUpXFxuLVxcdFxcdFxcdFxcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XFxuLVxcdFxcdFxcdGZvbGlvX2FkZF9hbm9uX3JtYXBfcHRlcyhmb2xpbywgcGFnZSwgSFBBR0VfUE1EX05SLFxcbi1cXHRcXHRcXHRcXHRcXHRcXHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XFxuLVxcdFxcdH1cXG4tXFx0fVxcbitcXHRpZiAoc3RhdGUtXFx1MDAzZXlvdW5nKVxcbitcXHRcXHRlbnRyeSA9IG1ha2VfbWlncmF0aW9uX2VudHJ5X3lvdW5nKGVudHJ5KTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2VkaXJ0eSlcXG4rXFx0XFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShlbnRyeSk7XFxuK1xcbitcXHRyZXR1cm4gZW50cnk7XFxuK31cXG4rXFxuKy8qXFxuKyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWVcXG4rICogZm9saW8gYXQgUFRFIGdyYW51bGFyaXR5LlxcbisgKi9cXG4rc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUpXFxuK3tcXG4rXFx0LyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovXFxuK1xcdGNvbnN0IGJvb2wgcm1hcHBlZCA9IHN0YXRlLVxcdTAwM2Vpc19wcmVzZW50IHx8IHN0YXRlLVxcdTAwM2Vpc19kZXZpY2VfcHJpdmF0ZTtcXG4rXFx0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXFx1MDAzZXZtX21tO1xcbitcXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLVxcdTAwM2VwYWdlO1xcbitcXHR1bnNpZ25lZCBsb25nIGFkZHI7XFxuK1xcdHBndGFibGVfdCBwZ3RhYmxlO1xcbitcXHRwbWRfdCBfcG1kO1xcbitcXHRwdGVfdCAqcHRlO1xcbitcXHRpbnQgaTtcXG4rXFxuK1xcdGlmIChybWFwcGVkKVxcbitcXHRcXHRzdGF0ZS1cXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcXG4gXFxuIFxcdC8qXFxuLVxcdCAqIFdpdGhkcmF3IHRoZSB0YWJsZSBvbmx5IGFmdGVyIHdlIG1hcmsgdGhlIHBtZCBlbnRyeSBpbnZhbGlkLlxcbi1cXHQgKiBUaGlzJ3MgY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxcbitcXHQgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGludmFsaWRhdGVkIGEgcHJlc2VudCBlbnRyeSwgYW5kIGEgc29mdGxlYWZcXG4rXFx0ICogZW50cnkgaXMgbm90IHByZXNlbnQgdG8gYmVnaW4gd2l0aC4gRWl0aGVyIHdheSB0aGUgZW50cnkgaXMgb3V0IG9mXFxuK1xcdCAqIHNlcnZpY2UgYmVmb3JlIHdlIHdpdGhkcmF3IHRoZSBkZXBvc2l0ZWQgcGFnZSB0YWJsZSwgd2hpY2ggaXNcXG4rXFx0ICogY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxcbiBcXHQgKi9cXG4gXFx0cGd0YWJsZSA9IHBndGFibGVfdHJhbnNfaHVnZV93aXRoZHJhdyhtbSwgcG1kKTtcXG4gXFx0cG1kX3BvcHVsYXRlKG1tLCBcXHUwMDI2X3BtZCwgcGd0YWJsZSk7XFxuQEAgLTMzMzcsNTUgKzMzMTcsMTcgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuIFxcdCAqIE5vdGUgdGhhdCBOVU1BIGhpbnRpbmcgYWNjZXNzIHJlc3RyaWN0aW9ucyBhcmUgbm90IHRyYW5zZmVycmVkIHRvXFxuIFxcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cXG4gXFx0ICovXFxuLVxcdGlmIChmcmVlemUgfHwgcG1kX2lzX21pZ3JhdGlvbl9lbnRyeShvbGRfcG1kKSkge1xcbi1cXHRcXHRwdGVfdCBlbnRyeTtcXG4tXFx0XFx0c3dwX2VudHJ5X3Qgc3dwX2VudHJ5O1xcbi1cXG4tXFx0XFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFxcdTAwM2MgSFBBR0VfUE1EX05SOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XFxuLVxcdFxcdFxcdGlmICh3cml0ZSlcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XFxuLVxcdFxcdFxcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxcbi1cXHRcXHRcXHRcXHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2V4Y2x1c2l2ZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XFxuLVxcdFxcdFxcdGVsc2VcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkoXFxuLVxcdFxcdFxcdFxcdFxcdFxcdFxcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XFxuLVxcdFxcdFxcdGlmICh5b3VuZylcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKGRpcnR5KVxcbi1cXHRcXHRcXHRcXHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xcbi1cXHRcXHRcXHRlbnRyeSA9IHN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKHNvZnRfZGlydHkpXFxuK1xcdGlmIChzdGF0ZS1cXHUwMDNlZnJlZXplIHx8ICFzdGF0ZS1cXHUwMDNlaXNfcHJlc2VudCkge1xcbitcXHRcXHRmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgXFx1MDAzYyBIUEFHRV9QTURfTlI7XFxuK1xcdFxcdCAgICAgaSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbitcXHRcXHRcXHRjb25zdCB1bnNpZ25lZCBsb25nIHBmbiA9IHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKTtcXG4rXFx0XFx0XFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cXG4rXFx0XFx0XFx0XFx0c3BsaXRfcG1kX21ha2Vfc29mdGxlYWYoc3RhdGUsIHBmbik7XFxuK1xcdFxcdFxcdHB0ZV90IGVudHJ5ID0gc29mdGxlYWZfdG9fcHRlKGxlYWYpO1xcbitcXG4rXFx0XFx0XFx0aWYgKHN0YXRlLVxcdTAwM2Vzb2Z0X2RpcnR5KVxcbiBcXHRcXHRcXHRcXHRlbnRyeSA9IHB0ZV9zd3BfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0XFx0aWYgKHVmZmRfd3ApXFxuLVxcdFxcdFxcdFxcdGVudHJ5ID0gcHRlX3N3cF9ta3VmZmQoZW50cnkpO1xcbi1cXHRcXHRcXHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xcbi1cXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUgKyBpLCBlbnRyeSk7XFxuLVxcdFxcdH1cXG4tXFx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcXG4tXFx0XFx0cHRlX3QgZW50cnk7XFxuLVxcdFxcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcXG4tXFxuLVxcdFxcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcXHUwMDNjIEhQQUdFX1BNRF9OUjsgaSsrLCBhZGRyICs9IFBBR0VfU0laRSkge1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBhbm9uX2V4Y2x1c2l2ZSB3YXMgYWxyZWFkeSBwcm9wYWdhdGVkIHRvIHRoZSByZWxldmFudFxcbi1cXHRcXHRcXHQgKiBwYWdlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwdGUgZW50cmllcyB3aGVuIGZyZWV6ZVxcbi1cXHRcXHRcXHQgKiBpcyBmYWxzZS5cXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGlmICh3cml0ZSlcXG4tXFx0XFx0XFx0XFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShcXG4tXFx0XFx0XFx0XFx0XFx0XFx0XFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcXG4tXFx0XFx0XFx0ZWxzZVxcbi1cXHRcXHRcXHRcXHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxcbi1cXHRcXHRcXHRcXHRcXHRcXHRcXHRwYWdlX3RvX3BmbihwYWdlICsgaSkpO1xcbi1cXHRcXHRcXHQvKlxcbi1cXHRcXHRcXHQgKiBZb3VuZyBhbmQgZGlydHkgYml0cyBhcmUgbm90IHByb2dhdGVkIHZpYSBzd3BfZW50cnlcXG4tXFx0XFx0XFx0ICovXFxuLVxcdFxcdFxcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xcbi1cXHRcXHRcXHRpZiAoc29mdF9kaXJ0eSlcXG4tXFx0XFx0XFx0XFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XFxuLVxcdFxcdFxcdGlmICh1ZmZkX3dwKVxcbitcXHRcXHRcXHRpZiAoc3RhdGUtXFx1MDAzZXVmZmQpXFxuIFxcdFxcdFxcdFxcdGVudHJ5ID0gcHRlX3N3cF9ta3VmZmQoZW50cnkpO1xcbiBcXHRcXHRcXHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xcbiBcXHRcXHRcXHRzZXRfcHRlX2F0KG1tLCBhZGRyLCBwdGUgKyBpLCBlbnRyeSk7XFxuQEAgLTMzOTQsMjAgKzMzMzYsMjAgQEAgc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxuIFxcdFxcdHB0ZV90IGVudHJ5O1xcbiBcXG4gXFx0XFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cXHUwMDNldm1fcGFnZV9wcm90KSk7XFxuLVxcdFxcdGlmICh3cml0ZSlcXG4rXFx0XFx0aWYgKHN0YXRlLVxcdTAwM2V3cml0ZSlcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbWt3cml0ZShlbnRyeSwgdm1hKTtcXG4tXFx0XFx0aWYgKCF5b3VuZylcXG4rXFx0XFx0aWYgKCFzdGF0ZS1cXHUwMDNleW91bmcpXFxuIFxcdFxcdFxcdGVudHJ5ID0gcHRlX21rb2xkKGVudHJ5KTtcXG4gXFx0XFx0LyogTk9URTogdGhpcyBtYXkgc2V0IHNvZnQtZGlydHkgdG9vIG9uIHNvbWUgYXJjaHMgKi9cXG4tXFx0XFx0aWYgKGRpcnR5KVxcbitcXHRcXHRpZiAoc3RhdGUtXFx1MDAzZWRpcnR5KVxcbiBcXHRcXHRcXHRlbnRyeSA9IHB0ZV9ta2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0aWYgKHNvZnRfZGlydHkpXFxuK1xcdFxcdGlmIChzdGF0ZS1cXHUwMDNlc29mdF9kaXJ0eSlcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcXG4tXFx0XFx0aWYgKHVmZmRfd3ApXFxuK1xcdFxcdGlmIChzdGF0ZS1cXHUwMDNldWZmZClcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbWt1ZmZkKGVudHJ5KTtcXG4gXFxuIFxcdFxcdC8qIFJlc3RvcmUgUEFHRV9OT05FIHNvIGFuIFJXUCBtYXJrZXIga2VlcHMgdHJhcHBpbmcgKi9cXG4tXFx0XFx0aWYgKHVzZXJmYXVsdGZkX3J3cCh2bWEpIFxcdTAwMjZcXHUwMDI2IHVmZmRfd3ApXFxuK1xcdFxcdGlmICh1c2VyZmF1bHRmZF9yd3Aodm1hKSBcXHUwMDI2XFx1MDAyNiBzdGF0ZS1cXHUwMDNldWZmZClcXG4gXFx0XFx0XFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xcbiBcXG4gXFx0XFx0Zm9yIChpID0gMDsgaSBcXHUwMDNjIEhQQUdFX1BNRF9OUjsgaSsrKVxcbkBAIC0zNDE3LDE1ICszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcXG4gXFx0fVxcbiBcXHRwdGVfdW5tYXAocHRlKTtcXG4gXFxuLVxcdGlmICghcG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSlcXG4tXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xcbi1cXHRpZiAoZnJlZXplKVxcbitcXHRpZiAocm1hcHBlZClcXG4rXFx0XFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKHN0YXRlLVxcdTAwM2Vmb2xpbywgcGFnZSwgdm1hKTtcXG4rXFx0aWYgKHN0YXRlLVxcdTAwM2VmcmVlemUpXFxuIFxcdFxcdHB1dF9wYWdlKHBhZ2UpO1xcbiBcXG4gXFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cXG4gXFx0cG1kX3BvcHVsYXRlKG1tLCBwbWQsIHBndGFibGUpO1xcbiB9XFxuIFxcbitzdGF0aWMgdm9pZCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3QgZm9saW8gKmZvbGlvLFxcbitcXHRcXHRib29sIGZyZWV6ZSlcXG4re1xcbitcXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xcbitcXHRcXHQuZm9saW8gPSBmb2xpbyxcXG4rXFx0XFx0LmlzX3ByZXNlbnQgPSB0cnVlLFxcbitcXHRcXHQuZnJlZXplID0gZnJlZXplLFxcbitcXHR9O1xcbitcXG4rXFx0LypcXG4rXFx0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcXG4rXFx0ICogd2hvbGUgYWNjZXNzIHRvIHRoZSBodWdlcGFnZSBkdXJpbmcgdGhlIHNwbGl0ICh3aGljaCBoYXBwZW5zIGluXFxuK1xcdCAqIHBsYWNlKS4gSWYgd2Ugb3ZlcndyaXRlIHRoZSBwbWQgd2l0aCB0aGUgbm90LWh1Z2UgdmVyc2lvbiBwb2ludGluZ1xcbitcXHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xcbitcXHQgKiBmcmVlKSwgdXNlcmxhbmQgY291bGQgdHJpZ2dlciBhIHNtYWxsIHBhZ2Ugc2l6ZSBUTEIgbWlzcyBvbiB0aGVcXG4rXFx0ICogc21hbGwgc2l6ZWQgVExCIHdoaWxlIHRoZSBodWdlcGFnZSBUTEIgZW50cnkgaXMgc3RpbGwgZXN0YWJsaXNoZWQgaW5cXG4rXFx0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2Vzbid0IGxpa2UgdGhhdC4gU2VlXFxuK1xcdCAqIGh0dHA6Ly9zdXBwb3J0LmFtZC5jb20vVGVjaERvY3MvNDEzMjJfMTBoX1Jldl9HZC5wZGYsIEVycmF0dW0gMzgzIG9uXFxuK1xcdCAqIHBhZ2UgMTA1LiBJbnRlbCBzaG91bGQgYmUgc2FmZSBidXQgaXMgYWxzbyB3YXJucyB0aGF0IGl0J3Mgb25seSBzYWZlXFxuK1xcdCAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW5cXG4rXFx0ICogdGhlIHR3byBUTEIgaXMgaWRlbnRpY2FsICh3aGljaCBzaG91bGQgYmUgdGhlIGNhc2UgaGVyZSkuIEJ1dCBpdCBpc1xcbitcXHQgKiBnZW5lcmFsbHkgc2FmZXIgdG8gbmV2ZXIgYWxsb3cgc21hbGwgYW5kIGh1Z2UgVExCIGVudHJpZXMgZm9yIHRoZVxcbitcXHQgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2ZcXG4rXFx0ICogZG9pbmcgXFxcInBtZF9wb3B1bGF0ZSgpOyBmbHVzaF9wbWRfdGxiX3JhbmdlKCk7XFxcIiB3ZSBmaXJzdCBtYXJrIHRoZVxcbitcXHQgKiBjdXJyZW50IHBtZCBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2VcXG4rXFx0ICogbXVzdCByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpcyBjb21wbGV0ZVxcbitcXHQgKiBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5IHdlIHdyaXRlIHRoZVxcbitcXHQgKiBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aCBwbWRfcG9wdWxhdGUuXFxuK1xcdCAqXFxuK1xcdCAqIFRoaXMgbXVzdCBhbHNvIGhhcHBlbiBiZWZvcmUgUGFnZUFub25FeGNsdXNpdmUoKSBpcyByZWFkIGJlbG93LCBzZWVcXG4rXFx0ICogZm9saW9fdHJ5X3NoYXJlX2Fub25fcm1hcF9wbWQoKS5cXG4rXFx0ICovXFxuK1xcdGNvbnN0IHBtZF90IHBtZHZhbCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xcbitcXG4rXFx0c3RhdGUucGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XFxuK1xcdHN0YXRlLndyaXRlID0gcG1kX3dyaXRlKHBtZHZhbCk7XFxuK1xcdHN0YXRlLnlvdW5nID0gcG1kX3lvdW5nKHBtZHZhbCk7XFxuK1xcdHN0YXRlLmRpcnR5ID0gcG1kX2RpcnR5KHBtZHZhbCk7XFxuK1xcdHN0YXRlLnNvZnRfZGlydHkgPSBwbWRfc29mdF9kaXJ0eShwbWR2YWwpO1xcbitcXHRzdGF0ZS51ZmZkID0gcG1kX3VmZmQocG1kdmFsKTtcXG4rXFx0c3RhdGUuYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShzdGF0ZS5wYWdlKTtcXG4rXFxuK1xcdGlmIChzdGF0ZS5kaXJ0eSlcXG4rXFx0XFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcXG4rXFxuK1xcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcXG4rXFxuK1xcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcXHUwMDI2c3RhdGUpO1xcbit9XFxuK1xcbitzdGF0aWMgdm9pZCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4rXFx0XFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgcG1kX3Qgb2xkX3BtZCxcXG4rXFx0XFx0c3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBmcmVlemUpXFxuK3tcXG4rXFx0Y29uc3Qgc29mdGxlYWZfdCBlbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xcbitcXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xcbitcXHRcXHQuZm9saW8gPSBmb2xpbyxcXG4rXFx0XFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcXG4rXFx0XFx0LmlzX2RldmljZV9wcml2YXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGUoZW50cnkpLFxcbitcXHRcXHQuZnJlZXplID0gZnJlZXplLFxcbitcXHRcXHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcXG4rXFx0XFx0LnVmZmQgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCksXFxuK1xcdH07XFxuK1xcbitcXHRpZiAoc3RhdGUuaXNfZGV2aWNlX3ByaXZhdGUpIHtcXG4rXFx0XFx0LypcXG4rXFx0XFx0ICogRGV2aWNlIHByaXZhdGUgZm9saW9zIGFyZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHJlZ3VsYXIgZm9saW9zXFxuK1xcdFxcdCAqIHcuci50LiBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZywgc2VlXFxuK1xcdFxcdCAqIHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLlxcbitcXHRcXHQgKi9cXG4rXFx0XFx0c3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19kZXZpY2VfcHJpdmF0ZV93cml0ZShlbnRyeSk7XFxuK1xcdFxcdHN0YXRlLmFub25fZXhjbHVzaXZlID0gUGFnZUFub25FeGNsdXNpdmUoc3RhdGUucGFnZSk7XFxuK1xcdH0gZWxzZSB7XFxuK1xcdFxcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcXG4rXFx0XFx0c3RhdGUueW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xcbitcXHRcXHRzdGF0ZS5kaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XFxuK1xcdFxcdHN0YXRlLmFub25fZXhjbHVzaXZlID1cXG4rXFx0XFx0XFx0c29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcXG4rXFx0fVxcbitcXG4rXFx0c3BsaXRfaHVnZV9wbWRfdG9fcHRlcyh2bWEsIGhhZGRyLCBwbWQsIFxcdTAwMjZzdGF0ZSk7XFxuK31cXG4rXFxuK3N0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxcbitcXHRcXHR1bnNpZ25lZCBsb25nIGhhZGRyLCBib29sIGZyZWV6ZSlcXG4re1xcbitcXHRjb25zdCBwbWRfdCBvbGRfcG1kID0gKnBtZDtcXG4rXFx0Y29uc3QgYm9vbCBpc19wcmVzZW50ID0gcG1kX3ByZXNlbnQob2xkX3BtZCk7XFxuK1xcdHN0cnVjdCBmb2xpbyAqZm9saW87XFxuK1xcbitcXHRWTV9CVUdfT04oaGFkZHIgXFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xcbitcXHRWTV9CVUdfT05fVk1BKHZtYS1cXHUwMDNldm1fc3RhcnQgXFx1MDAzZSBoYWRkciwgdm1hKTtcXG4rXFx0Vk1fQlVHX09OX1ZNQSh2bWEtXFx1MDAzZXZtX2VuZCBcXHUwMDNjIGhhZGRyICsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XFxuK1xcbitcXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9pc192YWxpZF9zb2Z0bGVhZihvbGRfcG1kKSBcXHUwMDI2XFx1MDAyNlxcbitcXHRcXHRcXHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xcbitcXG4rXFx0Y291bnRfdm1fZXZlbnQoVEhQX1NQTElUX1BNRCk7XFxuK1xcbitcXHQvKlxcbitcXHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xcbitcXHQgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93XFxuK1xcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xcbitcXHQgKlxcbitcXHQgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvIHNtYWxsXFxuK1xcdCAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGVcXG4rXFx0ICogc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXFxuK1xcdCAqL1xcbitcXHRpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkge1xcbitcXHRcXHRfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGZvbGlvID0gbm9ybWFsX29yX3NvZnRsZWFmX2ZvbGlvX3BtZCh2bWEsIGhhZGRyLCBvbGRfcG1kLCBpc19wcmVzZW50KTtcXG4rXFxuK1xcdC8qXFxuK1xcdCAqIEEgbm9uLXByZXNlbnQgZW50cnkgd2hpY2ggaXMgbmVpdGhlciBhIG1pZ3JhdGlvbiBub3IgYSBkZXZpY2VcXG4rXFx0ICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHlcXG4rXFx0ICogd2FybmVkIGFib3V0IGl0LiBMZWF2ZSBpdCBhbG9uZSByYXRoZXIgdGhhbiBhY3Qgb24gYSBQRk4gd2hpY2hcXG4rXFx0ICogbWVhbnMgbm90aGluZy5cXG4rXFx0ICovXFxuK1xcdGlmICh1bmxpa2VseSghaXNfcHJlc2VudCBcXHUwMDI2XFx1MDAyNiAhZm9saW8pKVxcbitcXHRcXHRyZXR1cm47XFxuK1xcbitcXHRpZiAoIWZvbGlvIHx8ICFmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7XFxuK1xcdFxcdHVubWFwX2h1Z2VfcG1kX2VudHJ5KHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGlzX3ByZXNlbnQpO1xcbitcXHRcXHRyZXR1cm47XFxuK1xcdH1cXG4rXFxuK1xcdGlmIChpc19wcmVzZW50KVxcbitcXHRcXHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XFxuK1xcdGVsc2VcXG4rXFx0XFx0c3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQodm1hLCBoYWRkciwgcG1kLCBvbGRfcG1kLCBmb2xpbyxcXG4rXFx0XFx0XFx0XFx0XFx0ICAgZnJlZXplKTtcXG4rfVxcbitcXG4gdm9pZCBzcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4gXFx0XFx0XFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXFxuIHtcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuOTkxMjc4MjYyWiIsIlNlcSI6MiwiTmVzdGluZyI6MSwiVHlwZSI6ImFnZW50IiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiY29yZSIsIkR1cmF0aW9uIjo1MzcxNjE3MTQ2MywiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJ7XG4gIFwiRW5hYmxlQ29uZmlnc1wiOiBbXG4gICAgXCJUUkFOU1BBUkVOVF9IVUdFUEFHRVwiLFxuICAgIFwiREVWSUNFX1BSSVZBVEVcIixcbiAgICBcIlVTRVJGQVVMVEZEXCJcbiAgXSxcbiAgXCJGb2N1c1N5bWJvbHNcIjogW1xuICAgIFwic3BsaXRfaHVnZV9wbWRfbG9ja2VkXCIsXG4gICAgXCJfX3NwbGl0X2h1Z2VfcG1kXCIsXG4gICAgXCJzcGxpdF9odWdlX3BtZF9hZGRyZXNzXCJcbiAgXSxcbiAgXCJSZWFzb25pbmdcIjogXCJUaGUgcGF0Y2ggcmVmYWN0b3JzIGNvcmUgVHJhbnNwYXJlbnQgSHVnZSBQYWdlIChUSFApIFBNRCBzcGxpdCBsb2dpYyBpbiBtbS9odWdlX21lbW9yeS5jLCBzZXBhcmF0aW5nIHRoZSBoYW5kbGluZyBvZiBwcmVzZW50IHZzIG5vbi1wcmVzZW50IChtaWdyYXRpb24sIGRldmljZS1wcml2YXRlKSBodWdlIFBNRHMgYW5kIHJlb3JnYW5pemluZyBybWFwIGNvbnZlcnNpb24gYW5kIHVubWFwcGluZyBsb2dpYy4gVGhpcyBjb3JlIE1NIGZ1bmN0aW9uYWxpdHkgaXMgcmVhY2hhYmxlIHZpYSB1c2VyIGFjdGlvbnMgKG1hZHZpc2UsIG1wcm90ZWN0LCBwYWdlIG1pZ3JhdGlvbiwgZXRjLikgYW5kIGlzIHdvcnRoIGZ1enppbmcuXCIsXG4gIFwiV29ydGhGdXp6aW5nXCI6IHRydWVcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBtYWludGFpbmVyLlxuWW91ciBqb2IgaXMgdG8gcmV2aWV3IGEgcHJvdmlkZWQgcGF0Y2ggc2VyaWVzIGFuZCBkZXRlcm1pbmVcbmlmIGl0IG1ha2VzIGZ1bmN0aW9uYWwgY2hhbmdlcyB0byB0aGUga2VybmVsIHRoYXQgc2hvdWxkIGJlIGZ1enplZC5cblxuSU1QT1JUQU5UOiBUaGUgY2hhbmdlcyBoYXZlIEFMUkVBRFkgYmVlbiBhcHBsaWVkIGFuZCBjb21taXR0ZWQgYXMgdGhlIEhFQUQgY29tbWl0IGluXG55b3VyIHdvcmtzcGFjZS4gRG8gTk9UIHJlbHkgb24geW91ciBpbnRlcm5hbCBrbm93bGVkZ2Ugb2YgdGhlIGtlcm5lbC4gWW91IG11c3QgYWN0aXZlbHlcbnVzZSB5b3VyIGNvZGUgYWNjZXNzIHRvb2xzIHRvIGV4YW1pbmUgdGhlIGFjdHVhbCBzb3VyY2UgY29kZSBhbmQgY29uZmlybSBhbnkgYXNzdW1wdGlvbnMuXG5cblJldHVybiBXb3J0aEZ1enppbmc9ZmFsc2UgaWYgdGhlIHBhdGNoIG9ubHkgY29udGFpbnM6XG4tIE1vZGlmaWNhdGlvbnMgdG8gRG9jdW1lbnRhdGlvbi8sIEtjb25maWcgZmlsZXMsIG9yIGNvZGUgY29tbWVudHMuXG4tIFB1cmVseSBkZWNvcmF0aXZlIGNoYW5nZXMsIHN1Y2ggYXMgbG9nZ2luZyAoZS5nLiwgcHJfZXJyLCBwcmludGspIG9yIHRyYWNlcG9pbnRzLlxuLSBDaGFuZ2VzIHRvIG51bWVyaWMgY29uc3RhbnRzIG9yIG1hY3JvcyB0aGF0IGRvIG5vdCBmdW5jdGlvbmFsbHkgYWx0ZXIgZXhlY3V0aW9uIGZsb3cuXG4tIENvZGUgcGF0aHMgdGhhdCBhcmUgaW1wb3NzaWJsZSB0byByZWFjaCBpbiB2aXJ0dWFsaXplZCBlbnZpcm9ubWVudHMgbGlrZSBHQ0Ugb3IgUUVNVSxcbiAgZXZlbiB3aGVuIHV0aWxpemluZyBzb2Z0d2FyZS1lbXVsYXRlZCBoYXJkd2FyZSAoZS5nLiwgdXNiIGdhZGdldCwgbWFjODAyMTFfaHdzaW0pLlxuLSBDb2RlIGluIHZlbmRvci1zcGVjaWZpYyBQQ0llIHN3aXRjaCwgU21hcnROSUMsIG9yIEdQVSBkcml2ZXJzIChlLmcuLCBtbHhzdywgcGRzX2NvcmUsIHFlZCxcbiAgaW9uaWMsIGFtZGdwdSkgdGhhdCByZXF1aXJlIHBoeXNpY2FsIFBDSWUgaGFyZHdhcmUgY2FyZHMgbm90IGVtdWxhdGVkIGluIHN0YW5kYXJkIFFFTVUuXG4tIERyaXZlciAucmVtb3ZlLCAuc2h1dGRvd24sIG9yIHBjaV91bnJlZ2lzdGVyX2RyaXZlciB0ZWFyZG93biBjYWxsYmFja3MgKGUuZy4sIGlnYl9yZW1vdmUpXG4gIHRoYXQgYXJlIGV4ZWN1dGVkIG9ubHkgZHVyaW5nIFBDSSBob3QtdW5wbHVnIG9yIHN5c2ZzIGRyaXZlciB1bmJpbmQgb3BlcmF0aW9ucy5cblxuSWYgaXQgbW9kaWZpZXMgcmVhY2hhYmxlIGNvcmUga2VybmVsIGxvZ2ljLCBkcml2ZXJzLCBvciBhcmNoaXRlY3R1cmVzLCB1c2UgeW91ciBjb2RlIHNlYXJjaFxudG9vbHMgdG8gdmVyaWZ5IHRoZSBjb2RlIGNhbiBiZSBleGVjdXRlZCwgdGhlbiByZXR1cm4gV29ydGhGdXp6aW5nPXRydWUuXG5cbldoZW4gcmV0dXJuaW5nIFdvcnRoRnV6emluZz10cnVlLCB5b3UgTVVTVCBBTFNPOlxuMS4gRXh0cmFjdCBhbnkgc3BlY2lmaWMga2VybmVsIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBoZWF2aWx5IGZ1enplZCBpbnRvIEZvY3VzU3ltYm9scy5cbiAgIEF2b2lkIGxpc3RpbmcgZ2VuZXJpYyBob3QtcGF0aCBmdW5jdGlvbnMgdG8gcHJldmVudCBza2V3ZWQgdGVzdCBkaXN0cmlidXRpb25zLlxuICAgUHJlZmVyIG5vbi1zdGF0aWMsIG5vbi1pbmxpbmVkIEFQSSBlbnRyeXBvaW50IGZ1bmN0aW9ucyBvdmVyIGludGVybmFsIHN0YXRpYyBoZWxwZXIgZnVuY3Rpb25zXG4gICAod2hpY2ggYXJlIGlubGluZWQgYnkgdGhlIGNvbXBpbGVyIGFuZCBkbyBub3QgaGF2ZSBkaXN0aW5jdCBzeW1ib2wgYWRkcmVzc2VzKS5cbjIuIElkZW50aWZ5IGFueSBzcGVjaWZpYyBDT05GSUdfIG9wdGlvbnMgcmVxdWlyZWQgdG8gcHJvcGVybHkgdGVzdCB0aGlzIG5ldy9tb2RpZmllZCBmZWF0dXJlLlxuICAgR28gYW5kIGxvb2sgaW50byB0aGUgS2NvbmZpZyBmaWxlcyBhbmQgY2hlY2sgZm9yIGlmZGVmcyBhcm91bmQgdGhlIGNvZGUsIGRvIG5vdCBtYWtlIGFzc3VtcHRpb25zLlxuICAgQWxzbyBjaGVjayBcImRlcGVuZHMgb25cIiBsaW5lcyBpbiBLY29uZmlnIHRvIGluY2x1ZGUgYW55IG5vbi1zdGFuZGFyZCBwYXJlbnQgc3Vic3lzdGVtIGNvbmZpZ3NcbiAgIG5lZWRlZCBmb3IgS2J1aWxkIHRvIGNvbXBpbGUgdGhlIGNvZGUgc3RhdGljYWxseSBpbnRvIHZtbGludXguIExpc3QgdGhlbSBpbiB0aGUgRW5hYmxlQ29uZmlnc1xuICAgb3V0cHV0IGFycmF5LCBhbmQgRE8gTk9UIGFkZCBhICdDT05GSUdfJyBwcmVmaXggKGUuZy4sIHJldHVybiBcIk5FVF9JUFY0XCIgaW5zdGVhZCBvZiBcIkNPTkZJR19ORVRfSVBWNFwiKS5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDM3YWZkYTJkMTA5NGIwYTlkZjIwMGM1MzViZDRiMDEyNDdhOWY3MTFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyOCAxOTozOToyMSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTMxMzksMTkzICszMTM5LDE3MyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG4tXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxuKy8qXG4rICogT25seSBhIGh1Z2UgemVybyBQTUQgaW4gYW4gYW5vbnltb3VzIFZNQSBpcyBzcGxpdCwgaW50byBhIHBhZ2UgdGFibGUgb2ZcbisgKiBzaGFyZWQgemVybyBwYWdlIG1hcHBpbmdzLiBBbnkgb3RoZXIgaHVnZSB6ZXJvIFBNRCBpcyBzaW1wbHkgdW5tYXBwZWQuXG4rICovXG4rc3RhdGljIGJvb2wgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90IHBtZHZhbClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHBndGFibGVfdCBwZ3RhYmxlO1xuLVx0cG1kX3Qgb2xkX3BtZCwgX3BtZDtcbi1cdGJvb2wgc29mdF9kaXJ0eSwgdWZmZF93cCA9IGZhbHNlLCB5b3VuZyA9IGZhbHNlLCB3cml0ZSA9IGZhbHNlO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyO1xuLVx0cHRlX3QgKnB0ZTtcbi1cdGludCBpO1xuLVxuLVx0Vk1fQlVHX09OKGhhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fZW5kIFx1MDAzYyBoYWRkciArIEhQQUdFX1BNRF9TSVpFLCB2bWEpO1xuK1x0cmV0dXJuIGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSBcdTAwMjZcdTAwMjYgdm1hX2lzX2Fub255bW91cyh2bWEpO1xuK31cbiBcbi1cdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpIFx1MDAyNlx1MDAyNiAhcG1kX3RyYW5zX2h1Z2UoKnBtZCkpO1xuKy8qKlxuKyAqIHVubWFwX2h1Z2VfcG1kX2VudHJ5KCkgLSBVbm1hcCBhIGh1Z2UgUE1EIGVudHJ5IHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdC5cbisgKiBAdm1hOiBUaGUgVk1BIEBwbWQgYmVsb25ncyB0by5cbisgKiBAaGFkZHI6IFRoZSBQTUQtYWxpZ25lZCBhZGRyZXNzIEBwbWQgbWFwcy5cbisgKiBAcG1kOiBQb2ludGVyIHRvIHRoZSBodWdlIFBNRCBlbnRyeS5cbisgKiBAZm9saW86IFRoZSBmb2xpbyBAcG1kIGRlc2NyaWJlcywgb3IgTlVMTCBpZiBpdCBkZXNjcmliZXMgbm9uZS5cbisgKiBAaXNfcHJlc2VudDogSXMgQHBtZCBhIHByZXNlbnQgZW50cnkgcmF0aGVyIHRoYW4gYSBzb2Z0bGVhZiBlbnRyeT9cbisgKlxuKyAqIE9ubHkgYW5vbnltb3VzIGZvbGlvcyBhcmUgcmVidWlsdCBhdCBQVEUgbGV2ZWwgd2hlbiBhIGh1Z2UgUE1EIGVudHJ5IGlzXG4rICogc3BsaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB1bm1hcHBlZCBoZXJlIGFuZCBmYXVsdGVkIGJhY2sgaW4gb24gdGhlIG5leHRcbisgKiBhY2Nlc3MuXG4rICovXG4rc3RhdGljIHZvaWQgdW5tYXBfaHVnZV9wbWRfZW50cnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdGJvb2wgaXNfcHJlc2VudClcbit7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcdHBtZF90IG9sZF9wbWQ7XG4gXG4tXHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbitcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbitcdC8qXG4rXHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXG4rXHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbitcdCAqL1xuK1x0aWYgKGhhc19kZXBvc2l0ZWRfcGd0YWJsZSh2bWEsIG9sZF9wbWQsIGZvbGlvKSlcbitcdFx0emFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTtcbiBcbi1cdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG4tXHRcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTb1xuLVx0XHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbi1cdFx0ICovXG4tXHRcdGlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKVxuLVx0XHRcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XG4tXHRcdGlmICh2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRpZiAodW5saWtlbHkocG1kX2lzX21pZ3JhdGlvbl9lbnRyeShvbGRfcG1kKSkpIHtcbi1cdFx0XHRjb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVxuLVx0XHRcdGZvbGlvID0gc29mdGxlYWZfdG9fZm9saW8ob2xkX2VudHJ5KTtcbi1cdFx0fSBlbHNlIGlmIChpc19odWdlX3plcm9fcG1kKG9sZF9wbWQpKSB7XG4tXHRcdFx0cmV0dXJuO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgcG1kX2RpcnR5KG9sZF9wbWQpKVxuLVx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4tXHRcdFx0XHRmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7XG4tXHRcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xuLVx0XHRcdGFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTtcbi1cdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuLVx0XHRcdHJldHVybjtcbi1cdFx0fVxuLVx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4rXHRpZiAoIWZvbGlvKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHRpZiAoaXNfaHVnZV96ZXJvX3BtZCgqcG1kKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xuLVx0XHQgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93XG4tXHRcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuLVx0XHQgKlxuLVx0XHQgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvXG4tXHRcdCAqIHNtYWxsIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsXG4tXHRcdCAqIHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXG4tXHRcdCAqL1xuLVx0XHRyZXR1cm4gX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTtcbitcdGlmIChpc19wcmVzZW50KSB7XG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4rXG4rXHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4rXHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuK1x0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4gXHR9XG4gXG4tXHRpZiAocG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuK1x0YWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1IUEFHRV9QTURfTlIpO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoaXNfcHJlc2VudClcbitcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbit9XG4gXG4tXHRcdHNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7XG4tXHRcdHVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7XG4rc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRib29sIGlzX3ByZXNlbnQ7XG4rXHRib29sIGlzX2RldmljZV9wcml2YXRlO1xuK1x0Ym9vbCBmcmVlemU7XG4rXHRib29sIHdyaXRlO1xuK1x0Ym9vbCB5b3VuZztcbitcdGJvb2wgZGlydHk7XG4rXHRib29sIHNvZnRfZGlydHk7XG4rXHRib29sIHVmZmQ7XG4rXHRib29sIGFub25fZXhjbHVzaXZlO1xuK307XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbi1cdFx0aWYgKFBhZ2VBbm9uKHBhZ2UpKVxuLVx0XHRcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbi1cdFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xuLVx0XHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XG4tXHR9IGVsc2UgaWYgKHBtZF9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuKy8qXG4rICogQ29udmVydCB0aGUgZm9saW8ncyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy5cbisgKlxuKyAqIFdpdGhvdXQgXCJmcmVlemVcIiwgd2UnbGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxuKyAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3JcbisgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLlxuKyAqXG4rICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbisgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcbisgKiBtYW5hZ2VkIHRvIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCkgLS0gc2VlXG4rICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbisgKlxuKyAqIEluIGNhc2Ugd2UgY2Fubm90IGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCksIHNwbGl0IHRoZSBQTURcbisgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbisgKlxuKyAqIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpOiBpbnZhbGlkYXRlIFBNRCBmaXJzdC5cbisgKlxuKyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIG1hcHBpbmcgbWF5IHN0aWxsIGJlIGZyb3plbi5cbisgKi9cbitzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXG4rXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxuK3tcbitcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZnJlZXplIFx1MDAyNlx1MDAyNlxuK1x0ICAgICghc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUgfHxcbitcdCAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLVx1MDAzZWZvbGlvLCBzdGF0ZS1cdTAwM2VwYWdlKSkpXG4rXHRcdHJldHVybiB0cnVlO1xuIFxuLVx0XHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xuK1x0Zm9saW9fcmVmX2FkZChzdGF0ZS1cdTAwM2Vmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4rXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoc3RhdGUtXHUwMDNlZm9saW8sIHN0YXRlLVx1MDAzZXBhZ2UsIEhQQUdFX1BNRF9OUiwgdm1hLFxuK1x0XHRcdFx0IGhhZGRyLCBybWFwX2ZsYWdzKTtcbitcdHJldHVybiBmYWxzZTtcbit9XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuLVx0XHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuKy8qXG4rICogQnVpbGQgdGhlIGxlYWYgZW50cnkgZm9yIHRoZSBQVEUgZW50cnkgZGVzY3JpYmluZyBAcGZuLCBmb3IgYSBodWdlIFBNRCBlbnRyeVxuKyAqIHdoaWNoIGlzIG5vdCByZXN0b3JlZCBhcyBhIHByZXNlbnQgbWFwcGluZy5cbisgKi9cbitzdGF0aWMgc29mdGxlYWZfdCBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBmbilcbit7XG4rXHRzb2Z0bGVhZl90IGVudHJ5O1xuIFxuK1x0aWYgKHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlIFx1MDAyNlx1MDAyNiAhc3RhdGUtXHUwMDNlZnJlZXplKSB7XG4gXHRcdC8qXG4tXHRcdCAqIERldmljZSBwcml2YXRlIFRIUCBzaG91bGQgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyXG4tXHRcdCAqIGZvbGlvcyB3LnIudCBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZy4gU2VlIHRoZSBjb21tZW50cyBmb3Jcbi1cdFx0ICogZm9saW8gaGFuZGxpbmcgYW5kIGFub25fZXhjbHVzaXZlIGJlbG93LlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qXG4tXHRcdCAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXNcbi1cdFx0ICogdGhlIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2hcbi1cdFx0ICogaGFwcGVucyBpbiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlXG4tXHRcdCAqIHZlcnNpb24gcG9pbnRpbmcgdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWZcbi1cdFx0ICogYWxsIENQVXMgd2VyZSBidWcgZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlXG4tXHRcdCAqIHNpemUgVExCIG1pc3Mgb24gdGhlIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCXG4tXHRcdCAqIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24ndFxuLVx0XHQgKiBsaWtlIHRoYXQuIFNlZVxuLVx0XHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtXG4tXHRcdCAqIDM4MyBvbiBwYWdlIDEwNS4gSW50ZWwgc2hvdWxkIGJlIHNhZmUgYnV0IGlzIGFsc28gd2FybnMgdGhhdFxuLVx0XHQgKiBpdCdzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGVcbi1cdFx0ICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkXG4tXHRcdCAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93XG4tXHRcdCAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmVcbi1cdFx0ICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7XG4tXHRcdCAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZFxuLVx0XHQgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdFxuLVx0XHQgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpc1xuLVx0XHQgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5XG4tXHRcdCAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aFxuLVx0XHQgKiBwbWRfcG9wdWxhdGUuXG4rXHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcbitcdFx0ICogdGhlIFBURSBlbnRyaWVzIGJ5IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLCBhbmQgYWNjZXNzZWRcbitcdFx0ICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZVxuK1x0XHQgKiBlbnRyaWVzLlxuIFx0XHQgKi9cbi1cdFx0b2xkX3BtZCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuLVx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0aWYgKHBtZF9kaXJ0eShvbGRfcG1kKSkge1xuLVx0XHRcdGRpcnR5ID0gdHJ1ZTtcbi1cdFx0XHRmb2xpb19zZXRfZGlydHkoZm9saW8pO1xuLVx0XHR9XG4tXHRcdHdyaXRlID0gcG1kX3dyaXRlKG9sZF9wbWQpO1xuLVx0XHR5b3VuZyA9IHBtZF95b3VuZyhvbGRfcG1kKTtcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3VmZmQob2xkX3BtZCk7XG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0XHRyZXR1cm4gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0XHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0fVxuIFxuLVx0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7XG4tXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbitcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xuK1x0ZWxzZSBpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KHBmbik7XG4rXHRlbHNlXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkocGZuKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2l0aG91dCBcImZyZWV6ZVwiLCB3ZSdsbCBzaW1wbHkgc3BsaXQgdGhlIFBNRCwgcHJvcGFnYXRpbmcgdGhlXG4tXHRcdCAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3Jcbi1cdFx0ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci5cbi1cdFx0ICpcbi1cdFx0ICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbi1cdFx0ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXG4tXHRcdCAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcbi1cdFx0ICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbi1cdFx0ICpcbi1cdFx0ICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxuLVx0XHQgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbi1cdFx0ICpcbi1cdFx0ICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxuLVx0XHQgKi9cbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH1cbitcdGlmIChzdGF0ZS1cdTAwM2V5b3VuZylcbitcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZGlydHkpXG4rXHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfZGlydHkoZW50cnkpO1xuK1xuK1x0cmV0dXJuIGVudHJ5O1xuK31cbitcbisvKlxuKyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWVcbisgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuXG4rICovXG4rc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUpXG4re1xuK1x0LyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovXG4rXHRjb25zdCBib29sIHJtYXBwZWQgPSBzdGF0ZS1cdTAwM2Vpc19wcmVzZW50IHx8IHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlO1xuK1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4rXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLVx1MDAzZXBhZ2U7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4rXHRwZ3RhYmxlX3QgcGd0YWJsZTtcbitcdHBtZF90IF9wbWQ7XG4rXHRwdGVfdCAqcHRlO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAocm1hcHBlZClcbitcdFx0c3RhdGUtXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcbiBcbiBcdC8qXG4tXHQgKiBXaXRoZHJhdyB0aGUgdGFibGUgb25seSBhZnRlciB3ZSBtYXJrIHRoZSBwbWQgZW50cnkgaW52YWxpZC5cbi1cdCAqIFRoaXMncyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuXG4rXHQgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGludmFsaWRhdGVkIGEgcHJlc2VudCBlbnRyeSwgYW5kIGEgc29mdGxlYWZcbitcdCAqIGVudHJ5IGlzIG5vdCBwcmVzZW50IHRvIGJlZ2luIHdpdGguIEVpdGhlciB3YXkgdGhlIGVudHJ5IGlzIG91dCBvZlxuK1x0ICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpc1xuK1x0ICogY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxuIFx0ICovXG4gXHRwZ3RhYmxlID0gcGd0YWJsZV90cmFuc19odWdlX3dpdGhkcmF3KG1tLCBwbWQpO1xuIFx0cG1kX3BvcHVsYXRlKG1tLCBcdTAwMjZfcG1kLCBwZ3RhYmxlKTtcbkBAIC0zMzM3LDU1ICszMzE3LDE3IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0ICogTm90ZSB0aGF0IE5VTUEgaGludGluZyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgdG9cbiBcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cbiBcdCAqL1xuLVx0aWYgKGZyZWV6ZSB8fCBwbWRfaXNfbWlncmF0aW9uX2VudHJ5KG9sZF9wbWQpKSB7XG4tXHRcdHB0ZV90IGVudHJ5O1xuLVx0XHRzd3BfZW50cnlfdCBzd3BfZW50cnk7XG4tXG4tXHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4tXHRcdFx0aWYgKHdyaXRlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihwYWdlICsgaSkpO1xuLVx0XHRcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XG4tXHRcdFx0aWYgKHlvdW5nKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcbi1cdFx0XHRpZiAoZGlydHkpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuK1x0aWYgKHN0YXRlLVx1MDAzZWZyZWV6ZSB8fCAhc3RhdGUtXHUwMDNlaXNfcHJlc2VudCkge1xuK1x0XHRmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgXHUwMDNjIEhQQUdFX1BNRF9OUjtcbitcdFx0ICAgICBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4rXHRcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlICsgaSk7XG4rXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cbitcdFx0XHRcdHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKHN0YXRlLCBwZm4pO1xuK1x0XHRcdHB0ZV90IGVudHJ5ID0gc29mdGxlYWZfdG9fcHRlKGxlYWYpO1xuK1xuK1x0XHRcdGlmIChzdGF0ZS1cdTAwM2Vzb2Z0X2RpcnR5KVxuIFx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4tXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuLVx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcbi1cdFx0cHRlX3QgZW50cnk7XG4tXHRcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcbi1cbi1cdFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHJlbGV2YW50XG4tXHRcdFx0ICogcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHRlIGVudHJpZXMgd2hlbiBmcmVlemVcbi1cdFx0XHQgKiBpcyBmYWxzZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGUpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFlvdW5nIGFuZCBkaXJ0eSBiaXRzIGFyZSBub3QgcHJvZ2F0ZWQgdmlhIHN3cF9lbnRyeVxuLVx0XHRcdCAqL1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuLVx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4rXHRcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbiBcdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuIFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbkBAIC0zMzk0LDIwICszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRwdGVfdCBlbnRyeTtcbiBcbiBcdFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbi1cdFx0aWYgKHdyaXRlKVxuK1x0XHRpZiAoc3RhdGUtXHUwMDNld3JpdGUpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWt3cml0ZShlbnRyeSwgdm1hKTtcbi1cdFx0aWYgKCF5b3VuZylcbitcdFx0aWYgKCFzdGF0ZS1cdTAwM2V5b3VuZylcbiBcdFx0XHRlbnRyeSA9IHB0ZV9ta29sZChlbnRyeSk7XG4gXHRcdC8qIE5PVEU6IHRoaXMgbWF5IHNldCBzb2Z0LWRpcnR5IHRvbyBvbiBzb21lIGFyY2hzICovXG4tXHRcdGlmIChkaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZWRpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpO1xuLVx0XHRpZiAoc29mdF9kaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZXNvZnRfZGlydHkpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcbi1cdFx0aWYgKHVmZmRfd3ApXG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V1ZmZkKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rdWZmZChlbnRyeSk7XG4gXG4gXHRcdC8qIFJlc3RvcmUgUEFHRV9OT05FIHNvIGFuIFJXUCBtYXJrZXIga2VlcHMgdHJhcHBpbmcgKi9cbi1cdFx0aWYgKHVzZXJmYXVsdGZkX3J3cCh2bWEpIFx1MDAyNlx1MDAyNiB1ZmZkX3dwKVxuK1x0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKylcbkBAIC0zNDE3LDE1ICszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbiBcdH1cbiBcdHB0ZV91bm1hcChwdGUpO1xuIFxuLVx0aWYgKCFwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKVxuLVx0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4tXHRpZiAoZnJlZXplKVxuK1x0aWYgKHJtYXBwZWQpXG4rXHRcdGZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS1cdTAwM2Vmb2xpbywgcGFnZSwgdm1hKTtcbitcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUpXG4gXHRcdHB1dF9wYWdlKHBhZ2UpO1xuIFxuIFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0Ym9vbCBmcmVlemUpXG4re1xuK1x0c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHtcbitcdFx0LmZvbGlvID0gZm9saW8sXG4rXHRcdC5pc19wcmVzZW50ID0gdHJ1ZSxcbitcdFx0LmZyZWV6ZSA9IGZyZWV6ZSxcbitcdH07XG4rXG4rXHQvKlxuK1x0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcbitcdCAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpblxuK1x0ICogcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZSB2ZXJzaW9uIHBvaW50aW5nXG4rXHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xuK1x0ICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlXG4rXHQgKiBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpblxuK1x0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2Vzbid0IGxpa2UgdGhhdC4gU2VlXG4rXHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtIDM4MyBvblxuK1x0ICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQncyBvbmx5IHNhZmVcbitcdCAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW5cbitcdCAqIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXNcbitcdCAqIGdlbmVyYWxseSBzYWZlciB0byBuZXZlciBhbGxvdyBzbWFsbCBhbmQgaHVnZSBUTEIgZW50cmllcyBmb3IgdGhlXG4rXHQgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2ZcbitcdCAqIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7IGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZVxuK1x0ICogY3VycmVudCBwbWQgbm90cHJlc2VudCAoYXRvbWljYWxseSBiZWNhdXNlIGhlcmUgdGhlIHBtZF90cmFuc19odWdlXG4rXHQgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlXG4rXHQgKiBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5IHdlIHdyaXRlIHRoZVxuK1x0ICogbm9uLWh1Z2UgdmVyc2lvbiBvZiB0aGUgcG1kIGVudHJ5IHdpdGggcG1kX3BvcHVsYXRlLlxuK1x0ICpcbitcdCAqIFRoaXMgbXVzdCBhbHNvIGhhcHBlbiBiZWZvcmUgUGFnZUFub25FeGNsdXNpdmUoKSBpcyByZWFkIGJlbG93LCBzZWVcbitcdCAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCkuXG4rXHQgKi9cbitcdGNvbnN0IHBtZF90IHBtZHZhbCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuK1xuK1x0c3RhdGUucGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XG4rXHRzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpO1xuK1x0c3RhdGUueW91bmcgPSBwbWRfeW91bmcocG1kdmFsKTtcbitcdHN0YXRlLmRpcnR5ID0gcG1kX2RpcnR5KHBtZHZhbCk7XG4rXHRzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTtcbitcdHN0YXRlLnVmZmQgPSBwbWRfdWZmZChwbWR2YWwpO1xuK1x0c3RhdGUuYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShzdGF0ZS5wYWdlKTtcbitcbitcdGlmIChzdGF0ZS5kaXJ0eSlcbitcdFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcbitcbitcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcbitcbitcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBwbWRfdCBvbGRfcG1kLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSlcbit7XG4rXHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XG4rXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xuK1x0XHQuZm9saW8gPSBmb2xpbyxcbitcdFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcbitcdFx0LmlzX2RldmljZV9wcml2YXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGUoZW50cnkpLFxuK1x0XHQuZnJlZXplID0gZnJlZXplLFxuK1x0XHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcbitcdFx0LnVmZmQgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCksXG4rXHR9O1xuK1xuK1x0aWYgKHN0YXRlLmlzX2RldmljZV9wcml2YXRlKSB7XG4rXHRcdC8qXG4rXHRcdCAqIERldmljZSBwcml2YXRlIGZvbGlvcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIGZvbGlvc1xuK1x0XHQgKiB3LnIudC4gYW5vbiBleGNsdXNpdmUgaGFuZGxpbmcsIHNlZVxuK1x0XHQgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS5cbitcdFx0ICovXG4rXHRcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS55b3VuZyA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSk7XG4rXHRcdHN0YXRlLmRpcnR5ID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KTtcbitcdFx0c3RhdGUuYW5vbl9leGNsdXNpdmUgPVxuK1x0XHRcdHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7XG4rXHR9XG4rXG4rXHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXHUwMDI2c3RhdGUpO1xuK31cbitcbitzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4re1xuK1x0Y29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7XG4rXHRjb25zdCBib29sIGlzX3ByZXNlbnQgPSBwbWRfcHJlc2VudChvbGRfcG1kKTtcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXG4rXHRWTV9CVUdfT04oaGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9zdGFydCBcdTAwM2UgaGFkZHIsIHZtYSk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9lbmQgXHUwMDNjIGhhZGRyICsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XG4rXG4rXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9pc192YWxpZF9zb2Z0bGVhZihvbGRfcG1kKSBcdTAwMjZcdTAwMjZcbitcdFx0XHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xuK1xuK1x0Y291bnRfdm1fZXZlbnQoVEhQX1NQTElUX1BNRCk7XG4rXG4rXHQvKlxuK1x0ICogRklYTUU6IERvIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGJ5IGNhbGxpbmdcbitcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbitcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuK1x0ICpcbitcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8gc21hbGxcbitcdCAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGVcbitcdCAqIHNlY29uZGFyeSBtbXUgYXQgdGhpcyB0aW1lLlxuK1x0ICovXG4rXHRpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkge1xuK1x0XHRfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7XG4rXG4rXHQvKlxuK1x0ICogQSBub24tcHJlc2VudCBlbnRyeSB3aGljaCBpcyBuZWl0aGVyIGEgbWlncmF0aW9uIG5vciBhIGRldmljZVxuK1x0ICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHlcbitcdCAqIHdhcm5lZCBhYm91dCBpdC4gTGVhdmUgaXQgYWxvbmUgcmF0aGVyIHRoYW4gYWN0IG9uIGEgUEZOIHdoaWNoXG4rXHQgKiBtZWFucyBub3RoaW5nLlxuK1x0ICovXG4rXHRpZiAodW5saWtlbHkoIWlzX3ByZXNlbnQgXHUwMDI2XHUwMDI2ICFmb2xpbykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbitcdFx0dW5tYXBfaHVnZV9wbWRfZW50cnkodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgaXNfcHJlc2VudCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmIChpc19wcmVzZW50KVxuK1x0XHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XG4rXHRlbHNlXG4rXHRcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXG4rXHRcdFx0XHRcdCAgIGZyZWV6ZSk7XG4rfVxuK1xuIHZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjIuOTkxMjc5OTgyWiIsIlNlcSI6MywiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzY1MjkzNDM0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipBbmFseXppbmcgdGhlIEh1Z2UgUGFnZXMgUGF0Y2gqKlxuXG5Pa2F5LCBsZXQncyBkaXZlIGludG8gdGhpcyBwYXRjaCBhbmQgZmlndXJlIG91dCB0aGUgZnV6emluZyBzdHJhdGVneS4gRmlyc3QsIEkgbmVlZCB0byB1bmRlcnN0YW5kIGlmIHRoaXMgZXZlbiB3YXJyYW50cyBmdXp6aW5nIGF0dGVudGlvbiwgYW5kIGlmIHNvLCB3aGF0IGNvbmZpZ3VyYXRpb25zIGFuZCBmb2N1cyBzeW1ib2xzIGFyZSBjcml0aWNhbC4gTXkgaW5pdGlhbCBhcHByb2FjaCBpcyB0byBkaXNzZWN0IHRoZSBkaWZmLlxuXG5UaGUgY2hhbmdlcyBhcmUgY29uY2VudHJhdGVkIGluIGBtbS9odWdlX21lbW9yeS5jYCwgd2hpY2ggYWx3YXlzIHBpcXVlcyBteSBpbnRlcmVzdC4gU3BlY2lmaWNhbGx5LCB0aGUgcGF0Y2ggdG91Y2hlcyBhIGhhbmRmdWwgb2Yga2V5IGZ1bmN0aW9uczogYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcGAsIGBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZmAsIGBzcGxpdF9odWdlX3BtZF90b19wdGVzYCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLCBgdW5tYXBfaHVnZV9wbWRfZW50cnlgLCBhbmQgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YC4gVGhpcyBzdWdnZXN0cyBhIHBvdGVudGlhbCByZWZhY3RvcmluZyBvciBpbXByb3ZlbWVudCByZWxhdGVkIHRvIHNwbGl0dGluZyBodWdlIHBhZ2VzLCBsaWtlbHkgaW1wYWN0aW5nIG1lbW9yeSBtYW5hZ2VtZW50IGluIGEgc2lnbmlmaWNhbnQgd2F5LlxuXG5UbyBnZXQgYSBjbGVhcmVyIHBpY3R1cmUsIEknbGwgbGV2ZXJhZ2UgYGdyZXBwZXJgIG9yIGByZWFkLWZpbGVgIHRvIGdldCB0aGUgY29udGV4dCBvZiB0aG9zZSBmdW5jdGlvbnMgYW5kIHRoZSByZWxhdGVkIEtjb25maWcgb3B0aW9ucy4gSXQncyBjcnVjaWFsIHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGZ1bmN0aW9ucyBpbnRlcmFjdCB3aXRoIHRoZSB3aWRlciBzeXN0ZW0gYW5kIGFueSBjb25maWd1cmF0aW9uIGtub2JzIHRoYXQgbWlnaHQgaW5mbHVlbmNlIHRoZWlyIGJlaGF2aW9yLiBLbm93aW5nIHdoaWNoIGNvbmZpZyBvcHRpb25zIHRyaWdnZXIgdGhvc2UgZnVuY3Rpb25zIHdpbGwgYmUgdGhlIGtleSB0byBkZXNpZ25pbmcgdGhlIHJpZ2h0IGZ1enppbmcgc3RyYXRlZ3kuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjk2NjgsIk91dHB1dFRva2VucyI6MjgsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxODUsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTozOToyNi42NDQyMTYxODhaIiwiU2VxIjo0LCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJncmVwcGVyIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6NDk3Mzg0MTgsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwic3BsaXRfaHVnZV9wbWRcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL2d1cC5jPTg5OD1zdGF0aWMgc3RydWN0IHBhZ2UgKmZvbGxvd19wbWRfbWFzayhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcXG4tLVxcbm1tL2d1cC5jLTkzMS1cXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbm1tL2d1cC5jOjkzMjpcXHRcXHRzcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcyk7XFxubW0vZ3VwLmMtOTMzLVxcdFxcdC8qIElmIHBtZCB3YXMgbGVmdCBlbXB0eSwgc3R1ZmYgYSBwYWdlIHRhYmxlIGluIHRoZXJlIHF1aWNrbHkgKi9cXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmM9MTkwOD1pbnQgY29weV9odWdlX3BtZChzdHJ1Y3QgbW1fc3RydWN0ICpkc3RfbW0sIHN0cnVjdCBtbV9zdHJ1Y3QgKnNyY19tbSxcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMTk5MC1cXHRcXHRzcGluX3VubG9jayhkc3RfcHRsKTtcXG5tbS9odWdlX21lbW9yeS5jOjE5OTE6XFx0XFx0X19zcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBhZGRyLCBmYWxzZSk7XFxubW0vaHVnZV9tZW1vcnkuYy0xOTkyLVxcdFxcdHJldHVybiAtRUFHQUlOO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0yMTI1PXZtX2ZhdWx0X3QgZG9faHVnZV9wbWRfd3BfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZilcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMjIxNC1mYWxsYmFjazpcXG5tbS9odWdlX21lbW9yeS5jOjIyMTU6XFx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHZtZi1cXHUwMDNlcG1kLCB2bWYtXFx1MDAzZWFkZHJlc3MsIGZhbHNlKTtcXG5tbS9odWdlX21lbW9yeS5jLTIyMTYtXFx0cmV0dXJuIFZNX0ZBVUxUX0ZBTExCQUNLO1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zMTk3PXN0cnVjdCBzcGxpdF9wbWRfc3RhdGUge1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zMjI5LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6MzIzMDpzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXFxubW0vaHVnZV9tZW1vcnkuYy0zMjMxLVxcdFxcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zMjUyPXN0YXRpYyBzb2Z0bGVhZl90IHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKGNvbnN0IHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUgKnN0YXRlLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zMjU5LVxcdFxcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcXG5tbS9odWdlX21lbW9yeS5jOjMyNjA6XFx0XFx0ICogdGhlIFBURSBlbnRyaWVzIGJ5IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLCBhbmQgYWNjZXNzZWRcXG5tbS9odWdlX21lbW9yeS5jLTMyNjEtXFx0XFx0ICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zMjg3LSAqL1xcbm1tL2h1Z2VfbWVtb3J5LmM6MzI4ODpzdGF0aWMgdm9pZCBzcGxpdF9odWdlX3BtZF90b19wdGVzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbm1tL2h1Z2VfbWVtb3J5LmMtMzI4OS1cXHRcXHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSlcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzMwMS1cXHRpZiAocm1hcHBlZClcXG5tbS9odWdlX21lbW9yeS5jOjMzMDI6XFx0XFx0c3RhdGUtXFx1MDAzZWZyZWV6ZSA9IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcChzdGF0ZSwgdm1hLCBoYWRkcik7XFxubW0vaHVnZV9tZW1vcnkuYy0zMzAzLVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zMzcxPXN0YXRpYyB2b2lkIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM0MTgtXFxubW0vaHVnZV9tZW1vcnkuYzozNDE5OlxcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcXHUwMDI2c3RhdGUpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzQyMC19XFxuLS1cXG5tbS9odWdlX21lbW9yeS5jPTM0MjI9c3RhdGljIHZvaWQgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM0MzktXFx0XFx0ICogdy5yLnQuIGFub24gZXhjbHVzaXZlIGhhbmRsaW5nLCBzZWVcXG5tbS9odWdlX21lbW9yeS5jOjM0NDA6XFx0XFx0ICogc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKCkuXFxubW0vaHVnZV9tZW1vcnkuYy0zNDQxLVxcdFxcdCAqL1xcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNDUxLVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzQ1MjpcXHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXFx1MDAyNnN0YXRlKTtcXG5tbS9odWdlX21lbW9yeS5jLTM0NTMtfVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzQ1NC1cXG5tbS9odWdlX21lbW9yeS5jOjM0NTU6c3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxubW0vaHVnZV9tZW1vcnkuYy0zNDU2LVxcdFxcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNDczLVxcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcXG5tbS9odWdlX21lbW9yeS5jOjM0NzQ6XFx0ICogaW5zaWRlIF9fc3BsaXRfaHVnZV9wbWQoKSA/XFxubW0vaHVnZV9tZW1vcnkuYy0zNDc1LVxcdCAqXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM1MDctXFxubW0vaHVnZV9tZW1vcnkuYzozNTA4OnZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxubW0vaHVnZV9tZW1vcnkuYy0zNTA5LVxcdFxcdFxcdCAgIHBtZF90ICpwbWQsIGJvb2wgZnJlZXplKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTEyLVxcdGlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSB8fCBwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkpXFxubW0vaHVnZV9tZW1vcnkuYzozNTEzOlxcdFxcdF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzUxNC19XFxubW0vaHVnZV9tZW1vcnkuYy0zNTE1LVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzUxNjp2b2lkIF9fc3BsaXRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXFxubW0vaHVnZV9tZW1vcnkuYy0zNTE3LVxcdFxcdHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgYm9vbCBmcmVlemUpXFxuLS1cXG5tbS9odWdlX21lbW9yeS5jLTM1MjYtXFx0cHRsID0gcG1kX2xvY2sodm1hLVxcdTAwM2V2bV9tbSwgcG1kKTtcXG5tbS9odWdlX21lbW9yeS5jOjM1Mjc6XFx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcmFuZ2Uuc3RhcnQsIHBtZCwgZnJlZXplKTtcXG5tbS9odWdlX21lbW9yeS5jLTM1MjgtXFx0c3Bpbl91bmxvY2socHRsKTtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzUzMS1cXG5tbS9odWdlX21lbW9yeS5jOjM1MzI6dm9pZCBzcGxpdF9odWdlX3BtZF9hZGRyZXNzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXFxubW0vaHVnZV9tZW1vcnkuYy0zNTMzLVxcdFxcdGJvb2wgZnJlZXplKVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTM5LVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzU0MDpcXHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyZXNzLCBmcmVlemUpO1xcbm1tL2h1Z2VfbWVtb3J5LmMtMzU0MS19XFxubW0vaHVnZV9tZW1vcnkuYy0zNTQyLVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzU0MzpzdGF0aWMgaW5saW5lIHZvaWQgc3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpXFxubW0vaHVnZV9tZW1vcnkuYy0zNTQ0LXtcXG4tLVxcbm1tL2h1Z2VfbWVtb3J5LmMtMzU1MS1cXHRcXHRcXHQgQUxJR04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKSlcXG5tbS9odWdlX21lbW9yeS5jOjM1NTI6XFx0XFx0c3BsaXRfaHVnZV9wbWRfYWRkcmVzcyh2bWEsIGFkZHJlc3MsIGZhbHNlKTtcXG5tbS9odWdlX21lbW9yeS5jLTM1NTMtfVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYz0zNTU1PXZvaWQgdm1hX2FkanVzdF90cmFuc19odWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTYwLVxcdC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgc3RhcnQgZmlyc3QuICovXFxubW0vaHVnZV9tZW1vcnkuYzozNTYxOlxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIHN0YXJ0KTtcXG5tbS9odWdlX21lbW9yeS5jLTM1NjItXFxubW0vaHVnZV9tZW1vcnkuYy0zNTYzLVxcdC8qIENoZWNrIGlmIHdlIG5lZWQgdG8gc3BsaXQgZW5kIG5leHQuICovXFxubW0vaHVnZV9tZW1vcnkuYzozNTY0OlxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIGVuZCk7XFxubW0vaHVnZV9tZW1vcnkuYy0zNTY1LVxcbi0tXFxubW0vaHVnZV9tZW1vcnkuYy0zNTY3LVxcdGlmIChuZXh0KVxcbm1tL2h1Z2VfbWVtb3J5LmM6MzU2ODpcXHRcXHRzcGxpdF9odWdlX3BtZF9pZl9uZWVkZWQobmV4dCwgZW5kKTtcXG5tbS9odWdlX21lbW9yeS5jLTM1NjktfVxcbi0tXFxubW0vbWVtb3J5LmM9MjEyMz1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgemFwX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLFxcbi0tXFxubW0vbWVtb3J5LmMtMjEzNS1cXHRcXHRcXHRpZiAobmV4dCAtIGFkZHIgIT0gSFBBR0VfUE1EX1NJWkUpXFxubW0vbWVtb3J5LmM6MjEzNjpcXHRcXHRcXHRcXHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgcG1kLCBhZGRyLCBmYWxzZSk7XFxubW0vbWVtb3J5LmMtMjEzNy1cXHRcXHRcXHRlbHNlIGlmICh6YXBfaHVnZV9wbWQodGxiLCB2bWEsIHBtZCwgYWRkcikpIHtcXG4tLVxcbm1tL21lbW9yeS5jPTYzOTA9c3RhdGljIGlubGluZSB2bV9mYXVsdF90IHdwX2h1Z2VfcG1kKHN0cnVjdCB2bV9mYXVsdCAqdm1mKVxcbi0tXFxubW0vbWVtb3J5LmMtNjQxNS1cXHQvKiBDT1cgb3Igd3JpdGUtbm90aWZ5IGhhbmRsZWQgb24gcHRlIGxldmVsOiBzcGxpdCBwbWQuICovXFxubW0vbWVtb3J5LmM6NjQxNjpcXHRfX3NwbGl0X2h1Z2VfcG1kKHZtYSwgdm1mLVxcdTAwM2VwbWQsIHZtZi1cXHUwMDNlYWRkcmVzcywgZmFsc2UpO1xcbm1tL21lbW9yeS5jLTY0MTctXFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jPTkxMj1zdGF0aWMgaW50IG1pZ3JhdGVfdm1hX3NwbGl0X3VubWFwcGVkX2ZvbGlvKHN0cnVjdCBtaWdyYXRlX3ZtYSAqbWlncmF0ZSxcXG4tLVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTIxLVxcdC8qXFxubW0vbWlncmF0ZV9kZXZpY2UuYzo5MjI6XFx0ICogdGFrZSBhIHJlZmVyZW5jZSwgc2luY2Ugc3BsaXRfaHVnZV9wbWRfYWRkcmVzcygpIHdpdGggZnJlZXplID0gdHJ1ZVxcbm1tL21pZ3JhdGVfZGV2aWNlLmMtOTIzLVxcdCAqIGRyb3BzIGEgcmVmZXJlbmNlIGF0IHRoZSBlbmQuXFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jLTkyNS1cXHRmb2xpb19nZXQoZm9saW8pO1xcbm1tL21pZ3JhdGVfZGV2aWNlLmM6OTI2OlxcdHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3MobWlncmF0ZS1cXHUwMDNldm1hLCBhZGRyLCB0cnVlKTtcXG5tbS9taWdyYXRlX2RldmljZS5jLTkyNy1cXHRyZXQgPSBmb2xpb19zcGxpdF91bm1hcHBlZChmb2xpbywgMCk7XFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jPTk3Nj1zdGF0aWMgdm9pZCBtaWdyYXRlX3ZtYV9pbnNlcnRfcGFnZShzdHJ1Y3QgbWlncmF0ZV92bWEgKm1pZ3JhdGUsXFxuLS1cXG5tbS9taWdyYXRlX2RldmljZS5jLTEwMjEtXFx0XFx0XFx0XFx0Z290byBhYm9ydDtcXG5tbS9taWdyYXRlX2RldmljZS5jOjEwMjI6XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWQodm1hLCBwbWRwLCBhZGRyKTtcXG5tbS9taWdyYXRlX2RldmljZS5jLTEwMjMtXFx0XFx0fSBlbHNlIGlmIChwbWRfbGVhZigqcG1kcCkpXFxuLS1cXG5tbS9tcHJvdGVjdC5jPTUwND1zdGF0aWMgaW5saW5lIGxvbmcgY2hhbmdlX3BtZF9yYW5nZShzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLFxcbi0tXFxubW0vbXByb3RlY3QuYy01MzItXFx0XFx0XFx0ICAgIHBndGFibGVfc3BsaXRfbmVlZGVkKHZtYSwgY3BfZmxhZ3MpKSB7XFxubW0vbXByb3RlY3QuYzo1MzM6XFx0XFx0XFx0XFx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkciwgZmFsc2UpO1xcbm1tL21wcm90ZWN0LmMtNTM0LVxcdFxcdFxcdFxcdC8qXFxuLS1cXG5tbS9tcmVtYXAuYz04MDQ9dW5zaWduZWQgbG9uZyBtb3ZlX3BhZ2VfdGFibGVzKHN0cnVjdCBwYWdldGFibGVfbW92ZV9jb250cm9sICpwbWMpXFxuLS1cXG5tbS9tcmVtYXAuYy04NjYtXFx0XFx0XFx0XFx0Y29udGludWU7XFxubW0vbXJlbWFwLmM6ODY3OlxcdFxcdFxcdHNwbGl0X2h1Z2VfcG1kKHBtYy1cXHUwMDNlb2xkLCBvbGRfcG1kLCBwbWMtXFx1MDAzZW9sZF9hZGRyKTtcXG5tbS9tcmVtYXAuYy04NjgtXFx0XFx0fSBlbHNlIGlmIChJU19FTkFCTEVEKENPTkZJR19IQVZFX01PVkVfUE1EKSBcXHUwMDI2XFx1MDAyNlxcbi0tXFxubW0vcGFnZXdhbGsuYz05Nj1zdGF0aWMgaW50IHdhbGtfcG1kX3JhbmdlKHB1ZF90ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBlbmQsXFxuLS1cXG5tbS9wYWdld2Fsay5jLTE2Ny1cXHRcXHRpZiAod2Fsay1cXHUwMDNldm1hKVxcbm1tL3BhZ2V3YWxrLmM6MTY4OlxcdFxcdFxcdHNwbGl0X2h1Z2VfcG1kKHdhbGstXFx1MDAzZXZtYSwgcG1kLCBhZGRyKTtcXG5tbS9wYWdld2Fsay5jLTE2OS1cXHRcXHRlbHNlIGlmIChwbWRfbGVhZigqcG1kKSB8fCAhcG1kX3ByZXNlbnQoKnBtZCkpXFxuLS1cXG5tbS9ybWFwLmM9MjIwMT1zdGF0aWMgYm9vbCB0cnlfdG9fdW5tYXBfb25lKHN0cnVjdCBmb2xpbyAqZm9saW8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbi0tXFxubW0vcm1hcC5jLTIyODktXFx0XFx0XFx0XFx0ICovXFxubW0vcm1hcC5jOjIyOTA6XFx0XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWRfbG9ja2VkKHZtYSwgcHZtdy5hZGRyZXNzLFxcbm1tL3JtYXAuYy0yMjkxLVxcdFxcdFxcdFxcdFxcdFxcdCAgICAgIHB2bXcucG1kLCBmYWxzZSk7XFxuLS1cXG5tbS9ybWFwLmM9MjQ2NT1zdGF0aWMgYm9vbCB0cnlfdG9fbWlncmF0ZV9vbmUoc3RydWN0IGZvbGlvICpmb2xpbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXFxuLS1cXG5tbS9ybWFwLmMtMjUxOC1cXHRcXHRcXHRcXHQvKlxcbm1tL3JtYXAuYzoyNTE5OlxcdFxcdFxcdFxcdCAqIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZCgpIG1pZ2h0IGxlYXZlIHRoZVxcbm1tL3JtYXAuYy0yNTIwLVxcdFxcdFxcdFxcdCAqIGZvbGlvIG1hcHBlZCB0aHJvdWdoIFBURXMuIFJldHJ5IHRoZSB3YWxrXFxuLS1cXG5tbS9ybWFwLmMtMjUyMy1cXHRcXHRcXHRcXHQgKi9cXG5tbS9ybWFwLmM6MjUyNDpcXHRcXHRcXHRcXHRzcGxpdF9odWdlX3BtZF9sb2NrZWQodm1hLCBwdm13LmFkZHJlc3MsXFxubW0vcm1hcC5jLTI1MjUtXFx0XFx0XFx0XFx0XFx0XFx0ICAgICAgcHZtdy5wbWQsIHRydWUpO1xcbi0tXFxubW0vdXNlcmZhdWx0ZmQuYz0yMDIwPXN0YXRpYyBzc2l6ZV90IG1vdmVfcGFnZXMoc3RydWN0IHVzZXJmYXVsdGZkX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIGRzdF9zdGFydCxcXG4tLVxcbm1tL3VzZXJmYXVsdGZkLmMtMjEyNi1cXHRcXHRcXHRcXHRzcGluX3VubG9jayhwdGwpO1xcbm1tL3VzZXJmYXVsdGZkLmM6MjEyNzpcXHRcXHRcXHRcXHRzcGxpdF9odWdlX3BtZChzcmNfdm1hLCBzcmNfcG1kLCBzcmNfYWRkcik7XFxubW0vdXNlcmZhdWx0ZmQuYy0yMTI4LVxcdFxcdFxcdFxcdC8qIFRoZSBmb2xpbyB3aWxsIGJlIHNwbGl0IGJ5IG1vdmVfcGFnZXNfcHRlKCkgKi9cXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjYuNjkzOTYwNDQ2WiIsIlNlcSI6NSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6MzE5NzAyNTg4NSwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiKipJbnZlc3RpZ2F0aW5nIEh1Z2UgUGFnZXMgYW5kIFNwbGl0IFBNRHMqKlxuXG5Pa2F5LCBzbyBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGljaCBLY29uZmlnIG9wdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvciBjb250cm9sbGluZyB0aGUgYmVoYXZpb3Igb2YgYG1tL2h1Z2VfbWVtb3J5LmNgLCBwYXJ0aWN1bGFybHkgYXJvdW5kIHRyYW5zcGFyZW50IGh1Z2UgcGFnZXMgKFRIUCkgYW5kIHNwbGl0IGh1Z2UgcGFnZSBQTURzLiBNeSBmaXJzdCBpbnN0aW5jdCBpcyB0byBkaXZlIGludG8gdGhlIGNvcmUgZGlyZWN0b3JpZXMuIEkga25vdyB0aGVzZSBjb25maWd1cmF0aW9ucyBhcmUgb2Z0ZW4gZGVmaW5lZCBpbiBNYWtlZmlsZXMgYW5kIEtjb25maWdzLiBTbywgSSBzaG91bGQgc3RhcnQgYnkgbG9va2luZyBpbnRvIGBtbS9NYWtlZmlsZWAgYW5kIHRoZW4gYG1tL0tjb25maWdgLiBUaG9zZSBhcmUgdHlwaWNhbGx5IHdoZXJlIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBhbmQgZGVwZW5kZW5jaWVzIGFyZSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtLCBzbyBpdCdzIHRoZSBsb2dpY2FsIHN0YXJ0aW5nIHBvaW50IGZvciB1bmRlcnN0YW5kaW5nIGhvdyB0aGVzZSBmZWF0dXJlcyBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZCBhbmQgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzLiBJJ20gYXNzdW1pbmcgdGhhdCB0aGUgcmVsZXZhbnQgb3B0aW9ucyB3aWxsIGJlIHVzZWQgaW4gYnVpbGQgbG9naWMgYW5kIG1heWJlIGV2ZW4gd2l0aGluIGAjaWZkZWZgIHN0YXRlbWVudHMgaW5zaWRlIGBodWdlX21lbW9yeS5jYCBpdHNlbGYuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjEzNTcxLCJPdXRwdXRUb2tlbnMiOjI3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6NDQsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6MjkuODkwOTg4MjYxWiIsIlNlcSI6NiwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoiZ3JlcHBlciIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjUyNjM5NDk4LCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRXhwcmVzc2lvblwiOiBcImh1Z2VfbWVtb3J5XFxcXC5vXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcIm1tL1wiXG59IiwiUmVzdWx0cyI6IntcbiAgXCJPdXRwdXRcIjogXCJtbS9NYWtlZmlsZT0xMDA9b2JqLSQoQ09ORklHX0RFVklDRV9NSUdSQVRJT04pICs9IG1pZ3JhdGVfZGV2aWNlLm9cXG5tbS9NYWtlZmlsZToxMDE6b2JqLSQoQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFKSArPSBodWdlX21lbW9yeS5vIGtodWdlcGFnZWQub1xcbm1tL01ha2VmaWxlLTEwMi1vYmotJChDT05GSUdfUEFHRV9DT1VOVEVSKSArPSBwYWdlX2NvdW50ZXIub1xcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTozOToyOS45NDM2MzUwMjlaIiwiU2VxIjo3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMDQxNjk4MTQ1OCwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHRob3VnaHQgcHJvY2VzcywgYXMgaWYgSSB3ZXJlIGNvbnNpZGVyaW5nIHRoaXMgbXlzZWxmOlxuXG4qKktjb25maWcgRGl2ZSBmb3IgVEhQKipcblxuT2theSwgc28gSSBuZWVkIHRvIHF1aWNrbHkgc2VlIHdoZXJlIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZGVmaW5lZCBpbiB0aGUgS2NvbmZpZyBoaWVyYXJjaHkuIEknbSBnb2luZyBzdHJhaWdodCB0byBgbW0vS2NvbmZpZ2AsIHRoYXQncyB0aGUgb2J2aW91cyBwbGFjZSB0byBzdGFydCBmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb3B0aW9ucy4gSXQncyB0aGUgbW9zdCBsb2dpY2FsIGxvY2F0aW9uIGZvciBhIHNldHRpbmcgcmVsYXRlZCB0byBodWdlIHBhZ2VzLCBnaXZlbiB0aGF0IGBtbWAgaXMgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnN5c3RlbS4gTGV0J3Mgc2VlIHdoYXQncyBkZWZpbmVkIGluIHRoZXJlIGZvciB0aGlzIHBhcnRpY3VsYXIgZmVhdHVyZS4gSG9wZWZ1bGx5IGl0J3Mgc3RyYWlnaHRmb3J3YXJkIGFuZCBJIGNhbiBxdWlja2x5IGdyYXNwIGl0cyBkZXBlbmRlbmNpZXMgYW5kIGRlZmF1bHRzLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxMzkxMiwiT3V0cHV0VG9rZW5zIjozMCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjI0LCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjM5OjUwLjM2MDYyMTYyN1oiLCJTZXEiOjgsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo1MjQ2NzE2OCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkV4cHJlc3Npb25cIjogXCJjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgXCJQYXRoUHJlZml4XCI6IFwibW0vXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcIm1tL0tjb25maWc9ODMyPWNvbmZpZyBNTV9JRFxcbi0tXFxubW0vS2NvbmZpZy04MzQtXFxubW0vS2NvbmZpZzo4MzU6bWVudWNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbm1tL0tjb25maWctODM2LVxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTg1Mz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctODU4LVxcbm1tL0tjb25maWc6ODU5OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTg2MC1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg2NS1cXG5tbS9LY29uZmlnOjg2NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTUFEVklTRVxcbm1tL0tjb25maWctODY3LVxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTg3NC1cXG5tbS9LY29uZmlnOjg3NTpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg3Ni1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWc9ODgyPWNob2ljZVxcbi0tXFxubW0vS2NvbmZpZy04OTEtXFxubW0vS2NvbmZpZzo4OTI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1NITUVNX0hVR0VfTkVWRVJcXG5tbS9LY29uZmlnLTg5My1cXHRcXHRib29sIFxcXCJuZXZlclxcXCJcXG4tLVxcbm1tL0tjb25maWctOTAxLVxcbm1tL0tjb25maWc6OTAyOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX0FMV0FZU1xcbm1tL0tjb25maWctOTAzLVxcdFxcdGJvb2wgXFxcImFsd2F5c1xcXCJcXG4tLVxcbm1tL0tjb25maWctOTA5LVxcbm1tL0tjb25maWc6OTEwOlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9TSE1FTV9IVUdFX1dJVEhJTl9TSVpFXFxubW0vS2NvbmZpZy05MTEtXFx0XFx0Ym9vbCBcXFwid2l0aGluX3NpemVcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTkxNy1cXG5tbS9LY29uZmlnOjkxODpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfU0hNRU1fSFVHRV9BRFZJU0VcXG5tbS9LY29uZmlnLTkxOS1cXHRcXHRib29sIFxcXCJhZHZpc2VcXFwiXFxuLS1cXG5tbS9LY29uZmlnPTkyNz1jaG9pY2VcXG4tLVxcbm1tL0tjb25maWctOTM2LVxcbm1tL0tjb25maWc6OTM3OlxcdGNvbmZpZyBUUkFOU1BBUkVOVF9IVUdFUEFHRV9UTVBGU19IVUdFX05FVkVSXFxubW0vS2NvbmZpZy05MzgtXFx0XFx0Ym9vbCBcXFwibmV2ZXJcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk0NS1cXG5tbS9LY29uZmlnOjk0NjpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9BTFdBWVNcXG5tbS9LY29uZmlnLTk0Ny1cXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuLS1cXG5tbS9LY29uZmlnLTk1My1cXG5tbS9LY29uZmlnOjk1NDpcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfVE1QRlNfSFVHRV9XSVRISU5fU0laRVxcbm1tL0tjb25maWctOTU1LVxcdFxcdGJvb2wgXFxcIndpdGhpbl9zaXplXFxcIlxcbi0tXFxubW0vS2NvbmZpZy05NjEtXFxubW0vS2NvbmZpZzo5NjI6XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX1RNUEZTX0hVR0VfQURWSVNFXFxubW0vS2NvbmZpZy05NjMtXFx0XFx0Ym9vbCBcXFwiYWR2aXNlXFxcIlxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTozOTo1MC40MTMwOTU0MzVaIiwiU2VxIjo5LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo0MTMwNDU1Mzg2LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiJIZXJlJ3MgbXkgdGhvdWdodCBwcm9jZXNzLCBhcyBpZiBJIHdlcmUgY29uc2lkZXJpbmcgdGhpcyBteXNlbGY6XG5cbioqSW52ZXN0aWdhdGluZyB0aGUgVFJBTlNQQVJFTlRfSFVHRVBBR0UgRGVwZW5kZW5jaWVzKipcblxuT2theSwgc28gSSBuZWVkIHRvIHVuZGVyc3RhbmQgdGhlIGRlcGVuZGVuY2llcyBmb3IgYFRSQU5TUEFSRU5UX0hVR0VQQUdFYCBpbiB0aGUga2VybmVsIGNvbmZpZ3VyYXRpb24uIE15IGluaXRpYWwgaW5zdGluY3QgaXMgdG8ganVtcCByaWdodCBpbnRvIGBtbS9LY29uZmlnYCwgc3BlY2lmaWNhbGx5IGFyb3VuZCBsaW5lIDgzNS4gVGhhdCdzIHdoZXJlIEknZCBleHBlY3QgdG8gZmluZCB0aGUgcmVsZXZhbnQgY29uZmlndXJhdGlvbiBvcHRpb25zIGFuZCBhbnkgY29uZGl0aW9uYWwgbG9naWMgdGhhdCBjb250cm9scyB3aGV0aGVyIGBUUkFOU1BBUkVOVF9IVUdFUEFHRWAgaXMgZW5hYmxlZC4gSXQncyBhIHByZXR0eSBzdGFuZGFyZCBsb2NhdGlvbiBmb3IgdGhhdCBraW5kIG9mIGRldGFpbCBpbiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQgc3Vic3lzdGVtLiBUaW1lIHRvIGRpZyBpbiBhbmQgc2VlIHdoYXQgb3RoZXIgb3B0aW9ucyB0aGlzIHJlbGllcyBvbiwgYW5kIHdoYXQgdGhlIGltcGxpY2F0aW9ucyBhcmUgZm9yIG15IGFyZWEgb2YgZXhwZXJ0aXNlLlxuXG5cbiIsIklucHV0VG9rZW5zIjoxNDgxMywiT3V0cHV0VG9rZW5zIjozMiwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjMwLCJUb29sQ2FsbHMiOlsiZ3JlcHBlciJdfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjM5OjU0LjU0MzU1MzI1MVoiLCJTZXEiOjEwLCJOZXN0aW5nIjoyLCJUeXBlIjoidG9vbCIsIk5hbWUiOiJyZWFkLWZpbGUiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo5MjYwMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9LY29uZmlnXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDgzMCxcbiAgXCJMaW5lQ291bnRcIjogNDBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDgzMDpcXHRcXHQgIG1lbW9yeSBjb25zdHJhaW5lZC5cXG4gODMxOlxcdFxcbiA4MzI6XFx0Y29uZmlnIE1NX0lEXFxuIDgzMzpcXHRcXHRkZWZfYm9vbCBuXFxuIDgzNDpcXHRcXG4gODM1OlxcdG1lbnVjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VcXG4gODM2OlxcdFxcdGJvb2wgXFxcIlRyYW5zcGFyZW50IEh1Z2VwYWdlIFN1cHBvcnRcXFwiXFxuIDgzNzpcXHRcXHRkZXBlbmRzIG9uIEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRSBcXHUwMDI2XFx1MDAyNiAhUFJFRU1QVF9SVFxcbiA4Mzg6XFx0XFx0c2VsZWN0IENPTVBBQ1RJT05cXG4gODM5OlxcdFxcdHNlbGVjdCBYQVJSQVlfTVVMVElcXG4gODQwOlxcdFxcdHNlbGVjdCBNTV9JRFxcbiA4NDE6XFx0XFx0aGVscFxcbiA4NDI6XFx0XFx0ICBUcmFuc3BhcmVudCBIdWdlcGFnZXMgYWxsb3dzIHRoZSBrZXJuZWwgdG8gdXNlIGh1Z2UgcGFnZXMgYW5kXFxuIDg0MzpcXHRcXHQgIGh1Z2UgdGxiIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9ucyB3aGVuZXZlciBwb3NzaWJsZS5cXG4gODQ0OlxcdFxcdCAgVGhpcyBmZWF0dXJlIGNhbiBpbXByb3ZlIGNvbXB1dGluZyBwZXJmb3JtYW5jZSB0byBjZXJ0YWluXFxuIDg0NTpcXHRcXHQgIGFwcGxpY2F0aW9ucyBieSBzcGVlZGluZyB1cCBwYWdlIGZhdWx0cyBkdXJpbmcgbWVtb3J5XFxuIDg0NjpcXHRcXHQgIGFsbG9jYXRpb24sIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgdGxiIG1pc3NlcyBhbmQgYnkgc3BlZWRpbmdcXG4gODQ3OlxcdFxcdCAgdXAgdGhlIHBhZ2V0YWJsZSB3YWxraW5nLlxcbiA4NDg6XFx0XFxuIDg0OTpcXHRcXHQgIElmIG1lbW9yeSBjb25zdHJhaW5lZCBvbiBlbWJlZGRlZCwgeW91IG1heSB3YW50IHRvIHNheSBOLlxcbiA4NTA6XFx0XFxuIDg1MTpcXHRpZiBUUkFOU1BBUkVOVF9IVUdFUEFHRVxcbiA4NTI6XFx0XFxuIDg1MzpcXHRjaG9pY2VcXG4gODU0OlxcdFxcdHByb21wdCBcXFwiVHJhbnNwYXJlbnQgSHVnZXBhZ2UgU3VwcG9ydCBzeXNmcyBkZWZhdWx0c1xcXCJcXG4gODU1OlxcdFxcdGRlZmF1bHQgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxuIDg1NjpcXHRcXHRoZWxwXFxuIDg1NzpcXHRcXHQgIFNlbGVjdHMgdGhlIHN5c2ZzIGRlZmF1bHRzIGZvciBUcmFuc3BhcmVudCBIdWdlcGFnZSBTdXBwb3J0LlxcbiA4NTg6XFx0XFxuIDg1OTpcXHRcXHRjb25maWcgVFJBTlNQQVJFTlRfSFVHRVBBR0VfQUxXQVlTXFxuIDg2MDpcXHRcXHRcXHRib29sIFxcXCJhbHdheXNcXFwiXFxuIDg2MTpcXHRcXHRoZWxwXFxuIDg2MjpcXHRcXHQgIEVuYWJsaW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlIGFsd2F5cywgY2FuIGluY3JlYXNlIHRoZVxcbiA4NjM6XFx0XFx0ICBtZW1vcnkgZm9vdHByaW50IG9mIGFwcGxpY2F0aW9ucyB3aXRob3V0IGEgZ3VhcmFudGVlZFxcbiA4NjQ6XFx0XFx0ICBiZW5lZml0IGJ1dCBpdCB3aWxsIHdvcmsgYXV0b21hdGljYWxseSBmb3IgYWxsIGFwcGxpY2F0aW9ucy5cXG4gODY1OlxcdFxcbiA4NjY6XFx0XFx0Y29uZmlnIFRSQU5TUEFSRU5UX0hVR0VQQUdFX01BRFZJU0VcXG4gODY3OlxcdFxcdFxcdGJvb2wgXFxcIm1hZHZpc2VcXFwiXFxuIDg2ODpcXHRcXHRoZWxwXFxuIDg2OTpcXHRcXHQgIEVuYWJsaW5nIFRyYW5zcGFyZW50IEh1Z2VwYWdlIG1hZHZpc2UsIHdpbGwgb25seSBwcm92aWRlIGFcXG5cIlxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6NTQuNTQzNjQ4MjQxWiIsIlNlcSI6MTEsIk5lc3RpbmciOjIsIlR5cGUiOiJsbG0iLCJOYW1lIjoicGF0Y2gtZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjMxMzkxMTE4MzgsIkVycm9yIjoiIiwiQXJncyI6Im51bGwiLCJSZXN1bHRzIjoibnVsbCIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IioqQW5hbHl6aW5nIEh1Z2UgUGFnZSBTcGxpdHRpbmcgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgKipcblxuT2theSwgbGV0J3MgZGl2ZSBpbnRvIHRoaXMuIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBodWdlIHBhZ2Ugc3BsaXR0aW5nIGZ1bmN0aW9uYWxpdHkuIEZpcnN0LCBJJ2xsIHRha2UgYSBsb29rIGF0IHRoZSBrZXkgZnVuY3Rpb25zIHRoYXQgYXJlIG1vZGlmaWVkIOKAkyB0aGUgb25lcyB0aGF0IGFyZSBtb3N0IGxpa2VseSBhdCB0aGUgaGVhcnQgb2YgdGhlIGNoYW5nZXMuIFRoZSBvbmVzIHRoYXQgaW1tZWRpYXRlbHkgc3RhbmQgb3V0IGFyZTogYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCwgYHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXNgLCBgdW5tYXBfaHVnZV9wbWRfZW50cnlgLCBgc3BsaXRfcG1kX21ha2Vfc29mdGxlYWZgLCBhbmQgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YC4gVGhpcyBnaXZlcyBtZSBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuXG5cbk5vdywgSSB3YW50IHRvIHVuZGVyc3RhbmQgaG93IHRoZXNlIGZ1bmN0aW9ucyBhcmUgYmVpbmcgKnVzZWQqLiBTbywgSSdsbCBpZGVudGlmeSB0aGUgZXh0ZXJuYWxseSB2aXNpYmxlIGVudHJ5cG9pbnRzIG9yIG5vbi1zdGF0aWMgZnVuY3Rpb25zIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgdGhhdCBjYWxsIHRoZXNlIGtleSBmdW5jdGlvbnMuIFRoaXMgd2lsbCBoZWxwIG1lIHRyYWNlIHRoZSBjb250cm9sIGZsb3cgYW5kIHNlZSBob3cgdGhlIHNwbGl0dGluZyBpcyBpbml0aWF0ZWQgYW5kIG9yY2hlc3RyYXRlZC5cblxuRmluYWxseSwgSSdsbCBob21lIGluIG9uIGEgcmVsZXZhbnQgc2VjdGlvbiBvZiB0aGUgY29kZS4gTGV0J3Mgc3RhcnQgYnkgZXhhbWluaW5nIHRoZSBjb2RlIGFyb3VuZCBsaW5lcyAzNTAwLTM2MDAgaW4gYG1tL2h1Z2VfbWVtb3J5LmNgLiBJJ20gZXhwZWN0aW5nIHRoaXMgYXJlYSB0byBjb250YWluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgc3BsaXR0aW5nLXJlbGF0ZWQgZnVuY3Rpb25zLCBvciBwZXJoYXBzIHRoZSBjb3JlIGxvZ2ljIHRoYXQgb3JjaGVzdHJhdGVzIHRoZSBzcGxpdHRpbmcgcHJvY2Vzcy4gSSdsbCByZWFkIHRocm91Z2ggdGhpcyBhbmQgc2VlIHdoYXQgaW5zaWdodHMgSSBjYW4gZ2xlYW4uIFRoaXMgc2hvdWxkIGdpdmUgbWUgYSBzb2xpZCBncmFzcCBvbiB3aGF0J3MgZ29pbmcgb24gYW5kIHdoZXJlIHRoZSBjaGFuZ2VzIG1pZ2h0IGJlIGxvY2F0ZWQuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE1NTgwLCJPdXRwdXRUb2tlbnMiOjM2LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTc1LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6NTcuNjgyNzYyMDc5WiIsIlNlcSI6MTIsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjE4ODgzMCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkZpbGVcIjogXCJtbS9odWdlX21lbW9yeS5jXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDM1MDAsXG4gIFwiTGluZUNvdW50XCI6IDc1XG59IiwiUmVzdWx0cyI6IntcbiAgXCJDb250ZW50c1wiOiBcIjM1MDA6XFx0XFxuMzUwMTpcXHRcXHRpZiAoaXNfcHJlc2VudClcXG4zNTAyOlxcdFxcdFxcdHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgZnJlZXplKTtcXG4zNTAzOlxcdFxcdGVsc2VcXG4zNTA0OlxcdFxcdFxcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXFxuMzUwNTpcXHRcXHRcXHRcXHRcXHRcXHQgICBmcmVlemUpO1xcbjM1MDY6XFx0fVxcbjM1MDc6XFx0XFxuMzUwODpcXHR2b2lkIHNwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbjM1MDk6XFx0XFx0XFx0XFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXFxuMzUxMDpcXHR7XFxuMzUxMTpcXHRcXHRWTV9XQVJOX09OX09OQ0UoIUlTX0FMSUdORUQoYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKTtcXG4zNTEyOlxcdFxcdGlmIChwbWRfdHJhbnNfaHVnZSgqcG1kKSB8fCBwbWRfaXNfdmFsaWRfc29mdGxlYWYoKnBtZCkpXFxuMzUxMzpcXHRcXHRcXHRfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCh2bWEsIHBtZCwgYWRkcmVzcywgZnJlZXplKTtcXG4zNTE0OlxcdH1cXG4zNTE1OlxcdFxcbjM1MTY6XFx0dm9pZCBfX3NwbGl0X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxcbjM1MTc6XFx0XFx0XFx0dW5zaWduZWQgbG9uZyBhZGRyZXNzLCBib29sIGZyZWV6ZSlcXG4zNTE4OlxcdHtcXG4zNTE5OlxcdFxcdHNwaW5sb2NrX3QgKnB0bDtcXG4zNTIwOlxcdFxcdHN0cnVjdCBtbXVfbm90aWZpZXJfcmFuZ2UgcmFuZ2U7XFxuMzUyMTpcXHRcXG4zNTIyOlxcdFxcdG1tdV9ub3RpZmllcl9yYW5nZV9pbml0KFxcdTAwMjZyYW5nZSwgTU1VX05PVElGWV9DTEVBUiwgMCwgdm1hLVxcdTAwM2V2bV9tbSxcXG4zNTIzOlxcdFxcdFxcdFxcdFxcdGFkZHJlc3MgXFx1MDAyNiBIUEFHRV9QTURfTUFTSyxcXG4zNTI0OlxcdFxcdFxcdFxcdFxcdChhZGRyZXNzIFxcdTAwMjYgSFBBR0VfUE1EX01BU0spICsgSFBBR0VfUE1EX1NJWkUpO1xcbjM1MjU6XFx0XFx0bW11X25vdGlmaWVyX2ludmFsaWRhdGVfcmFuZ2Vfc3RhcnQoXFx1MDAyNnJhbmdlKTtcXG4zNTI2OlxcdFxcdHB0bCA9IHBtZF9sb2NrKHZtYS1cXHUwMDNldm1fbW0sIHBtZCk7XFxuMzUyNzpcXHRcXHRzcGxpdF9odWdlX3BtZF9sb2NrZWQodm1hLCByYW5nZS5zdGFydCwgcG1kLCBmcmVlemUpO1xcbjM1Mjg6XFx0XFx0c3Bpbl91bmxvY2socHRsKTtcXG4zNTI5OlxcdFxcdG1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChcXHUwMDI2cmFuZ2UpO1xcbjM1MzA6XFx0fVxcbjM1MzE6XFx0XFxuMzUzMjpcXHR2b2lkIHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3Moc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcyxcXG4zNTMzOlxcdFxcdFxcdGJvb2wgZnJlZXplKVxcbjM1MzQ6XFx0e1xcbjM1MzU6XFx0XFx0cG1kX3QgKnBtZCA9IG1tX2ZpbmRfcG1kKHZtYS1cXHUwMDNldm1fbW0sIGFkZHJlc3MpO1xcbjM1MzY6XFx0XFxuMzUzNzpcXHRcXHRpZiAoIXBtZClcXG4zNTM4OlxcdFxcdFxcdHJldHVybjtcXG4zNTM5OlxcdFxcbjM1NDA6XFx0XFx0X19zcGxpdF9odWdlX3BtZCh2bWEsIHBtZCwgYWRkcmVzcywgZnJlZXplKTtcXG4zNTQxOlxcdH1cXG4zNTQyOlxcdFxcbjM1NDM6XFx0c3RhdGljIGlubGluZSB2b2lkIHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKVxcbjM1NDQ6XFx0e1xcbjM1NDU6XFx0XFx0LypcXG4zNTQ2OlxcdFxcdCAqIElmIHRoZSBuZXcgYWRkcmVzcyBpc24ndCBocGFnZSBhbGlnbmVkIGFuZCBpdCBjb3VsZCBwcmV2aW91c2x5XFxuMzU0NzpcXHRcXHQgKiBjb250YWluIGFuIGh1Z2VwYWdlOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHNwbGl0IGFuIGh1Z2UgcG1kLlxcbjM1NDg6XFx0XFx0ICovXFxuMzU0OTpcXHRcXHRpZiAoIUlTX0FMSUdORUQoYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpIFxcdTAwMjZcXHUwMDI2XFxuMzU1MDpcXHRcXHQgICAgcmFuZ2VfaW5fdm1hKHZtYSwgQUxJR05fRE9XTihhZGRyZXNzLCBIUEFHRV9QTURfU0laRSksXFxuMzU1MTpcXHRcXHRcXHRcXHQgQUxJR04oYWRkcmVzcywgSFBBR0VfUE1EX1NJWkUpKSlcXG4zNTUyOlxcdFxcdFxcdHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3Modm1hLCBhZGRyZXNzLCBmYWxzZSk7XFxuMzU1MzpcXHR9XFxuMzU1NDpcXHRcXG4zNTU1OlxcdHZvaWQgdm1hX2FkanVzdF90cmFuc19odWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxcbjM1NTY6XFx0XFx0XFx0XFx0ICAgdW5zaWduZWQgbG9uZyBzdGFydCxcXG4zNTU3OlxcdFxcdFxcdFxcdCAgIHVuc2lnbmVkIGxvbmcgZW5kLFxcbjM1NTg6XFx0XFx0XFx0XFx0ICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICpuZXh0KVxcbjM1NTk6XFx0e1xcbjM1NjA6XFx0XFx0LyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdCBzdGFydCBmaXJzdC4gKi9cXG4zNTYxOlxcdFxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIHN0YXJ0KTtcXG4zNTYyOlxcdFxcbjM1NjM6XFx0XFx0LyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzcGxpdCBlbmQgbmV4dC4gKi9cXG4zNTY0OlxcdFxcdHNwbGl0X2h1Z2VfcG1kX2lmX25lZWRlZCh2bWEsIGVuZCk7XFxuMzU2NTpcXHRcXG4zNTY2OlxcdFxcdC8qIElmIHdlJ3JlIGluY3JlbWVudGluZyBuZXh0LVxcdTAwM2V2bV9zdGFydCwgd2UgbWlnaHQgbmVlZCB0byBzcGxpdCBpdC4gKi9cXG4zNTY3OlxcdFxcdGlmIChuZXh0KVxcbjM1Njg6XFx0XFx0XFx0c3BsaXRfaHVnZV9wbWRfaWZfbmVlZGVkKG5leHQsIGVuZCk7XFxuMzU2OTpcXHR9XFxuMzU3MDpcXHRcXG4zNTcxOlxcdHN0YXRpYyB2b2lkIHVubWFwX2ZvbGlvKHN0cnVjdCBmb2xpbyAqZm9saW8pXFxuMzU3MjpcXHR7XFxuMzU3MzpcXHRcXHRlbnVtIHR0dV9mbGFncyB0dHVfZmxhZ3MgPSBUVFVfUk1BUF9MT0NLRUQgfCBUVFVfU1lOQyB8XFxuMzU3NDpcXHRcXHRcXHRUVFVfQkFUQ0hfRkxVU0g7XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjM5OjU3LjY4Mjk1MjI3OVoiLCJTZXEiOjEzLCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjoyMjkyNjYyMDYzLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkFuYWx5emluZyBIdWdlIFBhZ2UgU3BsaXR0aW5nIEZ1bmN0aW9ucyoqXG5cbkFscmlnaHQsIGxldCdzIGRpdmUgaW4uIEkgbmVlZCB0byBnZXQgYSBjbGVhciBwaWN0dXJlIG9mIHRoZSBsYW5kc2NhcGUgb2YgaHVnZSBwYWdlIHNwbGl0dGluZyBmdW5jdGlvbnMuIE15IGluaXRpYWwgZm9jdXMgaXMgb24gdGhlIGV4aXN0aW5nIGNhbGxlcnMgYW5kIHN5bWJvbHMgcmVsYXRlZCB0byB0aGlzLiBPa2F5LCBzbyBJJ3ZlIGdvdCBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYF9fc3BsaXRfaHVnZV9wbWRgLCBhbmQgYHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NgIGluIG1pbmQsIHRob3NlIGFyZSB0aGUgZmlyc3QgY2FuZGlkYXRlcy4gVGhlIG5hbWUgYHNwbGl0X2h1Z2VfcG1kYCBpdHNlbGYgZmVlbHMgbGlrZSBpdCBtaWdodCBiZSBhIHdyYXBwZXIsIGFuIGlubGluZWQgZnVuY3Rpb24sIG9yIHNvbWV0aGluZyBzaW1pbGFyIHRvIG90aGVyIGNhbGxzLiBUaW1lIHRvIGJlIHRob3JvdWdoIGFuZCBjaGVjayBib3RoIGZvciB0aGUgZXhhY3Qgc2lnbmF0dXJlIGB2b2lkIHNwbGl0X2h1Z2VfcG1kYCBhbmQgdGhlIHVzZSBvZiB0aGUgbWFjcm8gYCNkZWZpbmUgc3BsaXRfaHVnZV9wbWRgLiBUaGlzIHNob3VsZCBnaXZlIG1lIGEgc29saWQgdmlldyBvZiBpdHMgcm9sZSBhbmQgdXNhZ2UuIEdvdHRhIGNvdmVyIGFsbCB0aGUgYmFzZXMgdG8gYXZvaWQgbWlzc2luZyBhbnkgaGlkZGVuIGRldGFpbHMgaW4gdGhlIHNwbGl0IGxvZ2ljIVxuXG5cbiIsIklucHV0VG9rZW5zIjoxNzQzNCwiT3V0cHV0VG9rZW5zIjoyOSwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjg0LCJUb29sQ2FsbHMiOlsicmVhZC1maWxlIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6Mzk6NTkuOTc1NjE3OTgyWiIsIlNlcSI6MTQsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6ImdyZXBwZXIiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMjcyNzI3MDUsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJFeHByZXNzaW9uXCI6IFwiZGVmaW5lIHNwbGl0X2h1Z2VfcG1kXCIsXG4gIFwiUGF0aFByZWZpeFwiOiBcImluY2x1ZGUvXCJcbn0iLCJSZXN1bHRzIjoie1xuICBcIk91dHB1dFwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTQ0Nj1zdGF0aWMgaW5saW5lIGJvb2wgcG1kX2lzX2h1Z2UocG1kX3QgcG1kKVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNDYwLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjQ2MTojZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVxcdFxcdFxcdFxcdFxcXFxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC00NjItXFx0ZG8ge1xcdFxcdFxcdFxcdFxcdFxcdFxcdFxcdFxcXFxcXG4tLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oPTY4Nz1zdGF0aWMgaW5saW5lIHZvaWQgZGVmZXJyZWRfc3BsaXRfZm9saW8oc3RydWN0IGZvbGlvICpmb2xpbywgYm9vbCBwYXJ0aWFsbHlfbWFwcGVkKVxcbi0tXFxuaW5jbHVkZS9saW51eC9odWdlX21tLmgtNjkwLVxcbmluY2x1ZGUvbGludXgvaHVnZV9tbS5oOjY5MTojZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVxcdFxcXFxcXG5pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaC02OTItXFx0ZG8geyB9IHdoaWxlICgwKVxcblwiXG59IiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiIiwiSW5wdXRUb2tlbnMiOjAsIk91dHB1dFRva2VucyI6MCwiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjAsIlRvb2xDYWxscyI6bnVsbH0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTo0MDowMC4xMDI4OTcxMjdaIiwiU2VxIjoxNSwiTmVzdGluZyI6MiwiVHlwZSI6ImxsbSIsIk5hbWUiOiJwYXRjaC1ldmFsdWF0b3IiLCJNb2RlbCI6ImdlbWluaS0zLjctZmxhc2giLCJEdXJhdGlvbiI6Njk1MDU5Nzk0NiwiRXJyb3IiOiIiLCJBcmdzIjoibnVsbCIsIlJlc3VsdHMiOiJudWxsIiwiSW5zdHJ1Y3Rpb24iOiIiLCJQcm9tcHQiOiIiLCJSZXBseSI6IiIsIlRob3VnaHRzIjoiSGVyZSdzIG15IHVuZGVyc3RhbmRpbmcgb2YgdGhlIGBzcGxpdF9odWdlX3BtZGAgbWFjcm8sIGZyb20gYSBoaWdoLWxldmVsIHBlcnNwZWN0aXZlLCBhcyB0aG91Z2ggdGhlc2Ugd2VyZSBteSBvd24gdGhvdWdodHM6XG5cbioqRGlzc2VjdGluZyB0aGUgYHNwbGl0X2h1Z2VfcG1kYCBNYWNybyoqXG5cbk9rYXksIGxldCdzIGRpdmUgaW50byB0aGlzIGBzcGxpdF9odWdlX3BtZGAgbWFjcm8uIEZyb20gdGhlIG5hbWUgaXRzZWxmLCBJJ20gZXhwZWN0aW5nIGl0IGRlYWxzIHdpdGggYnJlYWtpbmcgZG93biBhIGh1Z2UgcGFnZSDigJMgbGlrZWx5IGEgbGFyZ2UgcGh5c2ljYWwgbWVtb3J5IHBhZ2UsIGxpa2UgYSAyTUIgb3IgMUdCIHBhZ2Ug4oCTIGludG8gc21hbGxlciwgbW9yZSBtYW5hZ2VhYmxlIHVuaXRzLCBwcm9iYWJseSA0S0IgcGFnZXMuIEkgbmVlZCB0byB1bmRlcnN0YW5kIHRoZSBtZWNoYW5pY3MgYmVoaW5kIHRoaXM6IGhvdyBpdCBoYXBwZW5zLCB3aHkgaXQncyBuZWNlc3NhcnksIGFuZCB3aGF0IGNvbnNpZGVyYXRpb25zIGNvbWUgaW50byBwbGF5LiBJJ2xsIG5lZWQgdG8gdGhpbmsgYWJvdXQgdGhpbmdzIGxpa2U6IHRoZSBzdGF0ZSBvZiB0aGUgcGFnZSB0YWJsZSBlbnRyaWVzIChQVEVzKSBpbnZvbHZlZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBzcGxpdCwgdGhlIGltcGxpY2F0aW9ucyBmb3IgdGhlIHBhZ2UgdGFibGVzLCBhbmQgYW55IHBvdGVudGlhbCBsb2NraW5nIG9yIHN5bmNocm9uaXphdGlvbiBpbnZvbHZlZCB0byBlbnN1cmUgYXRvbWljaXR5IGFuZCBjb3JyZWN0bmVzcyBkdXJpbmcgdGhlIG9wZXJhdGlvbiwgYW5kIGVuc3VyZSB0aGluZ3MgbGlrZSBjYWNoZSBjb2hlcmVuY3kgYXJlIG1haW50YWluZWQuIEknbGwgYmUgbG9va2luZyBmb3Igd2hlcmUgdGhlIGN1cnJlbnQgaHVnZSBwYWdlIGlzIG1hcHBlZCBpbiB0aGUgcGFnZSB0YWJsZXMsIGFuZCBob3cgaXQgaXMgdXBkYXRlZCB0byBzaG93IHRoZXNlIG5ldyA0S0IgcGFnZXMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE3OTYzLCJPdXRwdXRUb2tlbnMiOjM3LCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MTYsIlRvb2xDYWxscyI6WyJncmVwcGVyIl19LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MDcuMDUzNDk3OTc0WiIsIlNlcSI6MTYsIk5lc3RpbmciOjIsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InJlYWQtZmlsZSIsIk1vZGVsIjoiIiwiRHVyYXRpb24iOjc5MTkxLCJFcnJvciI6IiIsIkFyZ3MiOiJ7XG4gIFwiRmlsZVwiOiBcImluY2x1ZGUvbGludXgvaHVnZV9tbS5oXCIsXG4gIFwiRmlyc3RMaW5lXCI6IDQ1NSxcbiAgXCJMaW5lQ291bnRcIjogMjBcbn0iLCJSZXN1bHRzIjoie1xuICBcIkNvbnRlbnRzXCI6IFwiIDQ1NTpcXHRcXHRcXHRyZXR1cm4gdHJ1ZTtcXG4gNDU2OlxcdFxcdH1cXG4gNDU3OlxcdFxcbiA0NTg6XFx0XFx0cmV0dXJuIGZhbHNlO1xcbiA0NTk6XFx0fVxcbiA0NjA6XFx0XFxuIDQ2MTpcXHQjZGVmaW5lIHNwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzKVxcdFxcdFxcdFxcdFxcXFxcXG4gNDYyOlxcdFxcdGRvIHtcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXHRcXFxcXFxuIDQ2MzpcXHRcXHRcXHRwbWRfdCAqX19fX3BtZCA9IChfX3BtZCk7XFx0XFx0XFx0XFx0XFxcXFxcbiA0NjQ6XFx0XFx0XFx0aWYgKHBtZF9pc19odWdlKCpfX19fcG1kKSlcXHRcXHRcXHRcXHRcXFxcXFxuIDQ2NTpcXHRcXHRcXHRcXHRfX3NwbGl0X2h1Z2VfcG1kKF9fdm1hLCBfX3BtZCwgX19hZGRyZXNzLFxcdFxcXFxcXG4gNDY2OlxcdFxcdFxcdFxcdFxcdFxcdCBmYWxzZSk7XFx0XFx0XFx0XFxcXFxcbiA0Njc6XFx0XFx0fSAgd2hpbGUgKDApXFxuIDQ2ODpcXHRcXG4gNDY5OlxcdHZvaWQgc3BsaXRfaHVnZV9wbWRfYWRkcmVzcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLFxcbiA0NzA6XFx0XFx0XFx0Ym9vbCBmcmVlemUpO1xcbiA0NzE6XFx0XFxuIDQ3MjpcXHR2b2lkIF9fc3BsaXRfaHVnZV9wdWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHB1ZF90ICpwdWQsXFxuIDQ3MzpcXHRcXHRcXHR1bnNpZ25lZCBsb25nIGFkZHJlc3MpO1xcbiA0NzQ6XFx0XFxuXCJcbn0iLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjQwOjA3LjA1MzU3ODgwM1oiLCJTZXEiOjE3LCJOZXN0aW5nIjoyLCJUeXBlIjoibGxtIiwiTmFtZSI6InBhdGNoLWV2YWx1YXRvciIsIk1vZGVsIjoiZ2VtaW5pLTMuNy1mbGFzaCIsIkR1cmF0aW9uIjo5NTc2ODE4ODg1LCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKkZ1enppbmcgVGFyZ2V0OiBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgUE1EIFNwbGl0dGluZyoqXG5cbk9rYXksIGxldCdzIGJyZWFrIHRoaXMgZG93bi4gTXkgZ29hbCBpcyB0byBkZXRlcm1pbmUgdGhlIHZpYWJpbGl0eSBvZiBmdXp6aW5nIHRoZSBUSFAgUE1EIHNwbGl0dGluZyBsb2dpYyB3aXRoaW4gdGhlIGtlcm5lbC4gTXkgaW5pdGlhbCBmb2N1cyBpcyBvbiB0aGUgZnVuY3Rpb25zIHdpdGhpbiBgbW0vaHVnZV9tZW1vcnkuY2AgZGlyZWN0bHkgaW52b2x2ZWQgaW4gUE1EIHNwbGl0dGluZy4gU3BlY2lmaWNhbGx5LCBJIHNlZSB0aHJlZSBub24tc3RhdGljIGZ1bmN0aW9uczogYHNwbGl0X2h1Z2VfcG1kX2xvY2tlZGAsIGBfX3NwbGl0X2h1Z2VfcG1kYCwgYW5kIGBzcGxpdF9odWdlX3BtZF9hZGRyZXNzYC4gVGhlc2UgYXJlIG15IHByaW1hcnkgZW50cnkgcG9pbnRzIGZvciBpbnZlc3RpZ2F0aW9uLlxuXG5Mb29raW5nIGNsb3NlciwgdGhlIHBhdGNoIHRvdWNoZXMgc2V2ZXJhbCByZWxhdGVkIGZ1bmN0aW9ucy4gYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBhbmQgdmFyaW91cyBzdGF0aWMgaGVscGVycyBhcmUgbW9kaWZpZWQuIFRoZXNlIGluY2x1ZGUgYHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcGAsIGBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZmAsIGBzcGxpdF9odWdlX3BtZF90b19wdGVzYCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLCBgdW5tYXBfaHVnZV9wbWRfZW50cnlgLCBhbmQgYGh1Z2VfemVyb19wbWRfY2FuX3NwbGl0YC4gVGhlIHBhdHRlcm4gaGVyZSBpcyBjbGVhcjogYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYW5kIHRoZW4gdGhlIG90aGVycyBhcmUgc3RhdGljIGhlbHBlcnMgZm9yIHRoaXMuIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgIGFuZCB0aGUgb3RoZXJzIGFyZSBjYWxsZWQgYnkgc2V2ZXJhbCBvdGhlciBmdW5jdGlvbnMuXG5cbklzIHRoaXMgd29ydGggdGhlIGVmZm9ydD8gQWJzb2x1dGVseS4gVGhpcyBjb2RlIGlzIGZ1bmRhbWVudGFsIHRvIGhvdyBUSFBzIGFyZSBoYW5kbGVkLiBUaGUgcmVmYWN0b3JpbmcgYXBwZWFycyB0byB0b3VjaCBjb3JlIGFzcGVjdHMgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGluY2x1ZGluZyBzcGxpdHRpbmcgVEhQcyBpbnRvIHNtYWxsZXIgUFRFcywgZGVhbGluZyB3aXRoIGFub255bW91cyBmb2xpb3MsIGhhbmRsaW5nIGZsYWdzLCBtYW5hZ2luZyB0aGUgcmV2ZXJzZSBtYXAgKHJtYXApLCBhbmQgYWRkcmVzc2luZyB6ZXJvIFBNRCBzcGxpdHRpbmcuIFRoaXMgY29kZSBpcyAqZGlyZWN0bHkqIGV4cG9zZWQgdG8gdXNlciBzcGFjZS4gSXQgaXMgaW52b2x2ZWQgaW4gY3JpdGljYWwgb3BlcmF0aW9ucyBsaWtlIGBtYWR2aXNlYCwgVk1BIHNwbGl0dGluZywgYHVubWFwYCwgYG1wcm90ZWN0YCwgcGFnZSBtaWdyYXRpb24sIGNvcHktb24td3JpdGUgKENPVyksIGFuZCBgdXNlcmZhdWx0ZmRgLiBBbnkgZmxhdyBoZXJlIGhhcyB0aGUgcG90ZW50aWFsIHRvIGNhdXNlIGNyaXRpY2FsIGlzc3VlczogbWVtb3J5IGNvcnJ1cHRpb24sIHVzZS1hZnRlci1mcmVlIGNvbmRpdGlvbnMsIFRMQiBzaG9vdGRvd24gcHJvYmxlbXMsIGRhdGEgbG9zcywgb3IgZXZlbiBrZXJuZWwgcGFuaWNzLiBIaWdoIHZhbHVlLlxuXG5Ob3csIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbnMuIGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIGVzc2VudGlhbCwgb2J2aW91c2x5LiBEaWdnaW5nIGRlZXBlciwgaXQgZGVwZW5kcyBvbiBgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFYCBhbmQgZXhjbHVkZXMgYFBSRUVNUFRfUlRgLiBJdCBhbHNvIHNlbGVjdHMgYENPTVBBQ1RJT05gLCBgWEFSUkFZX01VTFRJYCwgYW5kIGBNTV9JRGAuIEkgYWxzbyBuZWVkIHRvIGNoZWNrIGlmIHRoZXJlIGFyZSBvdGhlciByZWxldmFudCBjb25maWdzIGZvciBkZXZpY2UtcHJpdmF0ZSBUSFBzLCBtaWdyYXRpb24sIG9yIGB1c2VyZmF1bHRmZGAuIEkgY29uZmlybSB0aGF0IGBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0VgLCBgQ09ORklHX0RFVklDRV9QUklWQVRFYCwgYW5kIGBDT05GSUdfVVNFUkZBVUxURkRgIGNvdWxkIGNvbWUgaW50byBwbGF5IGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMgZmVhdHVyZXMgYmVpbmcgZXhlcmNpc2VkLiBgQ09ORklHX01JR1JBVElPTmAgaXMgdHlwaWNhbGx5IHNlbGVjdGVkIGluIGNvbmp1bmN0aW9uIHdpdGggVEhQL2NvbXBhY3Rpb24vTlVNQSwgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBhIGNvbXBsZXRlIGZ1enplciBjb25maWd1cmF0aW9uLiBgVFJBTlNQQVJFTlRfSFVHRVBBR0VgIGlzIHRoZSBwcmltYXJ5LCBidXQgdGhvc2Ugb3RoZXIgdHdvIGFyZSBwb3RlbnRpYWxseSBpbXBvcnRhbnQuXG5cblJlZ2FyZGluZyB0aGUgXCJGb2N1c1N5bWJvbHMsXCIgSSBuZWVkIHRvIGNvbmZpcm0gdGhlc2UgYXJlbid0IHN0YXRpYyBvciBpbmxpbmVkLiBUaGUga2V5IHN5bWJvbHMgYXJlIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AuIEkgc2VlIHRoYXQgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCAqaXMqIHN0YXRpYyAoYSBoZWxwZXIpLCB3aGljaCBsZWF2ZXMgbWUgd2l0aCBgc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCwgYF9fc3BsaXRfaHVnZV9wbWRgLCBhbmQgYHNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NgIGFzIHRoZSBwdWJsaWMgQVBJcyB0byB0YXJnZXQuXG5cbkluIHN1bW1hcnksIHRoaXMgaXMgYSBjbGVhciBcInllc1wiIGZvciBmdXp6aW5nLiBXZSdyZSBsb29raW5nIGF0IGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgbG9naWMgZXhwb3NlZCB0byB1c2VyIHNwYWNlLCBzbyB0aGUgcG90ZW50aWFsIGZvciBpbXBhY3RmdWwgZmluZGluZ3MgaXMgdmVyeSBoaWdoLiBUaGUgZm9jdXMgc2hvdWxkIGJlIG9uIGBzcGxpdF9odWdlX3BtZF9sb2NrZWRgLCBgX19zcGxpdF9odWdlX3BtZGAsIGFuZCBgc3BsaXRfaHVnZV9wbWRfYWRkcmVzc2AsIHdpdGggYENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRWAsIGBDT05GSUdfREVWSUNFX1BSSVZBVEVgLCBhbmQgYENPTkZJR19VU0VSRkFVTFRGRGAgYmVpbmcgcG90ZW50aWFsbHkgcmVsZXZhbnQgY29uZmlndXJhdGlvbnMuXG5cblxuIiwiSW5wdXRUb2tlbnMiOjE4NTU3LCJPdXRwdXRUb2tlbnMiOjE2NywiT3V0cHV0VGhvdWdodHNUb2tlbnMiOjEwMzQsIlRvb2xDYWxscyI6WyJyZWFkLWZpbGUiXX0seyJTdGFydGVkIjoiMjAyNi0wOC0yOFQxOTo0MDoxNi42MzA0MDExOTlaIiwiU2VxIjoxOCwiTmVzdGluZyI6MiwiVHlwZSI6InRvb2wiLCJOYW1lIjoic2V0LXJlc3VsdHMiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjo3NzA0NDU0NywiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIkVuYWJsZUNvbmZpZ3NcIjogW1xuICAgIFwiVFJBTlNQQVJFTlRfSFVHRVBBR0VcIixcbiAgICBcIkRFVklDRV9QUklWQVRFXCIsXG4gICAgXCJVU0VSRkFVTFRGRFwiXG4gIF0sXG4gIFwiRm9jdXNTeW1ib2xzXCI6IFtcbiAgICBcInNwbGl0X2h1Z2VfcG1kX2xvY2tlZFwiLFxuICAgIFwiX19zcGxpdF9odWdlX3BtZFwiLFxuICAgIFwic3BsaXRfaHVnZV9wbWRfYWRkcmVzc1wiXG4gIF0sXG4gIFwiUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBjb3JlIFRyYW5zcGFyZW50IEh1Z2UgUGFnZSAoVEhQKSBQTUQgc3BsaXQgbG9naWMgaW4gbW0vaHVnZV9tZW1vcnkuYywgc2VwYXJhdGluZyB0aGUgaGFuZGxpbmcgb2YgcHJlc2VudCB2cyBub24tcHJlc2VudCAobWlncmF0aW9uLCBkZXZpY2UtcHJpdmF0ZSkgaHVnZSBQTURzIGFuZCByZW9yZ2FuaXppbmcgcm1hcCBjb252ZXJzaW9uIGFuZCB1bm1hcHBpbmcgbG9naWMuIFRoaXMgY29yZSBNTSBmdW5jdGlvbmFsaXR5IGlzIHJlYWNoYWJsZSB2aWEgdXNlciBhY3Rpb25zIChtYWR2aXNlLCBtcHJvdGVjdCwgcGFnZSBtaWdyYXRpb24sIGV0Yy4pIGFuZCBpcyB3b3J0aCBmdXp6aW5nLlwiLFxuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6IntcbiAgXCJFbmFibGVDb25maWdzXCI6IFtcbiAgICBcIlRSQU5TUEFSRU5UX0hVR0VQQUdFXCIsXG4gICAgXCJERVZJQ0VfUFJJVkFURVwiLFxuICAgIFwiVVNFUkZBVUxURkRcIlxuICBdLFxuICBcIkZvY3VzU3ltYm9sc1wiOiBbXG4gICAgXCJzcGxpdF9odWdlX3BtZF9sb2NrZWRcIixcbiAgICBcIl9fc3BsaXRfaHVnZV9wbWRcIixcbiAgICBcInNwbGl0X2h1Z2VfcG1kX2FkZHJlc3NcIlxuICBdLFxuICBcIlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgY29yZSBUcmFuc3BhcmVudCBIdWdlIFBhZ2UgKFRIUCkgUE1EIHNwbGl0IGxvZ2ljIGluIG1tL2h1Z2VfbWVtb3J5LmMsIHNlcGFyYXRpbmcgdGhlIGhhbmRsaW5nIG9mIHByZXNlbnQgdnMgbm9uLXByZXNlbnQgKG1pZ3JhdGlvbiwgZGV2aWNlLXByaXZhdGUpIGh1Z2UgUE1EcyBhbmQgcmVvcmdhbml6aW5nIHJtYXAgY29udmVyc2lvbiBhbmQgdW5tYXBwaW5nIGxvZ2ljLiBUaGlzIGNvcmUgTU0gZnVuY3Rpb25hbGl0eSBpcyByZWFjaGFibGUgdmlhIHVzZXIgYWN0aW9ucyAobWFkdmlzZSwgbXByb3RlY3QsIHBhZ2UgbWlncmF0aW9uLCBldGMuKSBhbmQgaXMgd29ydGggZnV6emluZy5cIixcbiAgXCJXb3J0aEZ1enppbmdcIjogdHJ1ZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MTYuNzA3NDUzNTE2WiIsIlNlcSI6MTksIk5lc3RpbmciOjEsIlR5cGUiOiJhY3Rpb24iLCJOYW1lIjoiSWYiLCJNb2RlbCI6IiIsIkR1cmF0aW9uIjoxMTExNDQ0Nzc1MCwiRXJyb3IiOiIiLCJBcmdzIjoie1xuICBcIldvcnRoRnV6emluZ1wiOiB0cnVlXG59IiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIiLCJJbnB1dFRva2VucyI6MCwiT3V0cHV0VG9rZW5zIjowLCJPdXRwdXRUaG91Z2h0c1Rva2VucyI6MCwiVG9vbENhbGxzIjpudWxsfSx7IlN0YXJ0ZWQiOiIyMDI2LTA4LTI4VDE5OjQwOjE2LjcwNzk1MDA4NloiLCJTZXEiOjIwLCJOZXN0aW5nIjoyLCJUeXBlIjoiYWdlbnQiLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJjb3JlIiwiRHVyYXRpb24iOjExMTEzOTQ3NzcxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cXG5cXG5BbGwgaW5zdGFuY2VzIG9mICdzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlJyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJJbnN0cnVjdGlvbiI6IllvdSBhcmUgYW4gZXhwZXJ0IExpbnV4IGtlcm5lbCBzZWN1cml0eSBlbmdpbmVlciBzcGVjaWFsaXppbmcgaW4ga2VybmVsIG1lbW9yeVxuZXJyb3IgZGV0ZWN0b3JzIChLQVNBTiBhbmQgS01TQU4pLiBZb3VyIGpvYiBpcyB0byByZXZpZXcgdGhlIHByb3ZpZGVkIHBhdGNoIHNlcmllcyBhbmRcbmRldGVybWluZSBpZiB0aGUgY29kZSBjaGFuZ2VzIGp1c3RpZnkgc3Bhd25pbmcgYSBkZWRpY2F0ZWQgS01TQU4gKEtlcm5lbE1lbW9yeVNhbml0aXplcilcbmZ1enppbmcgc2Vzc2lvbiBpbiBhZGRpdGlvbiB0byBzdGFuZGFyZCBLQVNBTiBmdXp6aW5nLlxuXG5DUklUSUNBTCBESVNUSU5DVElPTiBCRVRXRUVOIEtBU0FOIEFORCBLTVNBTjpcbi0gU3RhbmRhcmQgS0FTQU4ga2VybmVsIGJ1aWxkcyAodXBzdHJlYW0tYXBwYXJtb3Ita2FzYW4uY29uZmlnKSBhbHJlYWR5IGVuYWJsZVxuICBhIGNvbXByZWhlbnNpdmUgc3VpdGUgb2YgZGVidWdnaW5nIHRvb2xzIGFuZCBzYW5pdGl6ZXJzLCBpbmNsdWRpbmcgS0FTQU5cbiAgKG91dC1vZi1ib3VuZHMgYWNjZXNzZXMsIHVzZS1hZnRlci1mcmVlLCBkb3VibGUgZnJlZSwgaW52YWxpZCBmcmVlKSwgTE9DS0RFUFxuICAobG9ja2luZyBidWdzIGFuZCBkZWFkbG9ja3MpLCBVQi1zYW5pdGl6ZXJzLCBhbmQgbWVtb3J5IGNvcnJ1cHRpb24gY2hlY2tzLlxuLSBLTVNBTiAoS2VybmVsTWVtb3J5U2FuaXRpemVyKSBkZXRlY3RzIHJlYWRzIG9mIFVOSU5JVElBTElaRUQgbWVtb3J5IChzdGFjaywgaGVhcCxcbiAgb3IgcGFnZSBhbGxvY2F0aW9ucykgYW5kIGtlcm5lbC10by11c2VyIG1lbW9yeSBpbmZvLWxlYWtzLlxuXG5SdWxlOiBUSEVSRSBJUyBOTyBTRU5TRSBJTiBSVU5OSU5HIEEgS01TQU4gU0VTU0lPTiBJRiBBIEJVRyBDQU4gQkUgQ0FVR0hUIEJZIEtBU0FOLFxuTE9DS0RFUCwgT1IgT1RIRVIgU1RBTkRBUkQgQlVHIERFVEVDVE9SUy5cbkEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiBpbmN1cnMgc2lnbmlmaWNhbnQgcmVzb3VyY2UgY29zdHMuIFlvdSBtdXN0IE9OTFlcbnNldCBOZWVkc0tNU0FOPXRydWUgaWYgdGhlIGNvZGUgY2hhbmdlcyBpbnRyb2R1Y2Ugb3IgZXhwb3NlIFVOSU5JVElBTElaRUQgTUVNT1JZIHJpc2tzXG50aGF0IGFyZSBkZXRlY3RlZCBPTkxZIGJ5IEtNU0FOLlxuXG5Mb29rIGhvbGlzdGljYWxseSBhdCB0aGUgcGF0Y2ggc2VyaWVzIGFuZCBzdXJyb3VuZGluZyBjb2RlLiBFdmVuIGlmIG5vIGRpcmVjdFxudW5pbml0aWFsaXplZCBmaWVsZCBhY2Nlc3NlcyBvciBuZXcgYnVmZmVyIGFsbG9jYXRpb25zIGFyZSBhZGRlZCBpbiB0aGUgZGlmZiBpdHNlbGYsXG5hIHBhdGNoIG1heSBhbHRlciBjb250cm9sIGZsb3csIGJvdW5kcyBjaGVja2luZywgb3IgZGF0YSBsZW5ndGggY2FsY3VsYXRpb25zIGluIHdheXNcbnRoYXQgY2hhbmdlIGhvdyB0aGUgcmVzdCBvZiB0aGUgY29kZSBvcGVyYXRlcyBvbiBleGlzdGluZyBidWZmZXJzIChlLmcuIGFsbG93aW5nXG51bmluaXRpYWxpemVkIHN0YWNrL2hlYXAgbWVtb3J5IHRvIGJlIHJlYWQsIGNvcGllZCB0byB1c2VyIHNwYWNlLCBvciB1c2VkIGluIGNvbnRyb2xcbmZsb3cpLiBEbyBub3QgaGVzaXRhdGUgdG8gdXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSxcbmNhbGxlZCBmdW5jdGlvbnMsIGFuZCBjYWxsZXJzLlxuXG5TZXQgTmVlZHNLTVNBTj10cnVlIE9OTFkgSUYgdGhlIHBhdGNoIGludHJvZHVjZXMgb3IgbW9kaWZpZXM6XG4xLiBLZXJuZWwgc3RydWN0dXJlcyBzZW50IHRvIHVzZXIgc3BhY2UgKHZpYSBjb3B5X3RvX3VzZXIsIHB1dF91c2VyLCBuZXRsaW5rIHNrYlxuICAgYXR0cmlidXRlcywgaW9jdGwgb3V0cHV0IGFyZ3VtZW50cywgc29ja2V0IG9wdGlvbnMsIG9yIEJQRiBidWZmZXJzKSB3aGVyZSBmaWVsZHNcbiAgIG9yIHN0cnVjdHVyZSBwYWRkaW5nIG1pZ2h0IG5vdCBiZSBmdWxseSBpbml0aWFsaXplZC96ZXJvZWQuXG4yLiBDb25kaXRpb25hbCBsb2dpYyBvciBicmFuY2hpbmcgdGhhdCBkZXBlbmRzIG9uIHBvdGVudGlhbGx5IHVuaW5pdGlhbGl6ZWQgdmFyaWFibGVzXG4gICBvciBzdHJ1Y3QgZmllbGRzLlxuMy4gQWxsb2NhdGlvbiBvciBpbml0aWFsaXphdGlvbiBvZiBjb21wbGV4IGRhdGEgc3RydWN0dXJlcyB3aGVyZSB1bmluaXRpYWxpemVkIGZpZWxkc1xuICAgY291bGQgYmUgcmVhZCBsYXRlciBpbiByZWFjaGFibGUgY29kZSBwYXRocy5cbjQuIEJvdW5kcyBjaGVja3MsIGxlbmd0aHMsIG9yIGxvZ2ljIGluIGEgd2F5IHRoYXQgYWxsb3dzIHN1cnJvdW5kaW5nIGNvZGUgdG8gYWNjZXNzXG4gICB1bmluaXRpYWxpemVkIGJ5dGVzIG9mIGV4aXN0aW5nIGJ1ZmZlcnMuXG5cblNldCBOZWVkc0tNU0FOPWZhbHNlIElGOlxuLSBUaGUgY29kZSBjaGFuZ2VzIHByaW1hcmlseSByaXNrIG91dC1vZi1ib3VuZHMgYWNjZXNzLCBhcnJheSBvdmVyZmxvd3MsIE5VTEwgcG9pbnRlclxuICBkZXJlZmVyZW5jZXMsIGxvY2tpbmcgZGVhZGxvY2tzLCBvciB1c2UtYWZ0ZXItZnJlZSBidWdzICh0aGVzZSBhcmUgYWxyZWFkeSBjYXVnaHRcbiAgYnkgS0FTQU4sIExPQ0tERVAsIG9yIHN0YW5kYXJkIGJ1ZyBkZXRlY3RvcnMpLlxuLSBBbGwgc3RhY2svaGVhcCBzdHJ1Y3R1cmVzIHRvdWNoZWQgb3IgaW50cm9kdWNlZCBieSB0aGUgcGF0Y2ggYXJlIGZ1bGx5IHplcm9lZFxuICBvciBpbml0aWFsaXplZCAoZS5nLiB1c2luZyA9IHswfSwgbWVtc2V0LCBremFsbG9jKSBiZWZvcmUgYmVpbmcgcmVhZCBvciBjb3BpZWQuXG4tIFRoZSBwYXRjaCBkb2VzIG5vdCBpbnRyb2R1Y2UgYW55IHJpc2sgb2YgdW5pbml0aWFsaXplZCBtZW1vcnkgdXNhZ2Ugb3IgaW5mby1sZWFrcy5cblxuVXNlIHlvdXIgY29kZSBhY2Nlc3MgdG9vbHMgdG8gaW5zcGVjdCB0aGUgc3Vycm91bmRpbmcgY29kZSBpZiBuZWNlc3NhcnksIHRoZW4gcHJvdmlkZVxuZGV0YWlsZWQgS01TQU5SZWFzb25pbmcgY29udHJhc3RpbmcgS0FTQU4gdnMgS01TQU4gYXBwbGljYWJpbGl0eSBmb3IgdGhpcyBwYXRjaC5cblByZWZlciBjYWxsaW5nIHNldmVyYWwgdG9vbHMgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHJvdW5kLXRyaXBzLlxuXG5cblVzZSBzZXQtcmVzdWx0cyB0b29sIHRvIHByb3ZpZGUgcmVzdWx0cyBvZiB0aGUgYW5hbHlzaXMuXG5JdCBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRoZSBmaW5hbCByZXBseS5cbklnbm9yZSByZXN1bHRzIG9mIHRoaXMgdG9vbC5cbiIsIlByb21wdCI6IkZvciB5b3VyIGNvbnZlbmllbmNlLCBoZXJlIGlzIHRoZSBkaWZmIG9mIHRoZSBjaGFuZ2VzOlxuY29tbWl0IDM3YWZkYTJkMTA5NGIwYTlkZjIwMGM1MzViZDRiMDEyNDdhOWY3MTFcbkF1dGhvcjogc3l6LWNsdXN0ZXIgXHUwMDNjdHJpYWdlQHN5emthbGxlci5jb21cdTAwM2VcbkRhdGU6ICAgRnJpIEF1ZyAyOCAxOTozOToyMSAyMDI2ICswMDAwXG5cbiAgICBzeXotY2x1c3RlcjogYXBwbGllZCBwYXRjaCB1bmRlciByZXZpZXdcblxuZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9yeS5jXG5pbmRleCBhZmJiNTk3NGJkMjI1Li44ZTBmZDExZGEzZDdhIDEwMDY0NFxuLS0tIGEvbW0vaHVnZV9tZW1vcnkuY1xuKysrIGIvbW0vaHVnZV9tZW1vcnkuY1xuQEAgLTMxMzksMTkzICszMTM5LDE3MyBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4tc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX3BtZF9sb2NrZWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90ICpwbWQsXG4tXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIGJvb2wgZnJlZXplKVxuKy8qXG4rICogT25seSBhIGh1Z2UgemVybyBQTUQgaW4gYW4gYW5vbnltb3VzIFZNQSBpcyBzcGxpdCwgaW50byBhIHBhZ2UgdGFibGUgb2ZcbisgKiBzaGFyZWQgemVybyBwYWdlIG1hcHBpbmdzLiBBbnkgb3RoZXIgaHVnZSB6ZXJvIFBNRCBpcyBzaW1wbHkgdW5tYXBwZWQuXG4rICovXG4rc3RhdGljIGJvb2wgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBtZF90IHBtZHZhbClcbiB7XG4tXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbi1cdHN0cnVjdCBmb2xpbyAqZm9saW87XG4tXHRzdHJ1Y3QgcGFnZSAqcGFnZTtcbi1cdHBndGFibGVfdCBwZ3RhYmxlO1xuLVx0cG1kX3Qgb2xkX3BtZCwgX3BtZDtcbi1cdGJvb2wgc29mdF9kaXJ0eSwgdWZmZF93cCA9IGZhbHNlLCB5b3VuZyA9IGZhbHNlLCB3cml0ZSA9IGZhbHNlO1xuLVx0Ym9vbCBhbm9uX2V4Y2x1c2l2ZSA9IGZhbHNlLCBkaXJ0eSA9IGZhbHNlO1xuLVx0dW5zaWduZWQgbG9uZyBhZGRyO1xuLVx0cHRlX3QgKnB0ZTtcbi1cdGludCBpO1xuLVxuLVx0Vk1fQlVHX09OKGhhZGRyIFx1MDAyNiB+SFBBR0VfUE1EX01BU0spO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fc3RhcnQgXHUwMDNlIGhhZGRyLCB2bWEpO1xuLVx0Vk1fQlVHX09OX1ZNQSh2bWEtXHUwMDNldm1fZW5kIFx1MDAzYyBoYWRkciArIEhQQUdFX1BNRF9TSVpFLCB2bWEpO1xuK1x0cmV0dXJuIGlzX2h1Z2VfemVyb19wbWQocG1kdmFsKSBcdTAwMjZcdTAwMjYgdm1hX2lzX2Fub255bW91cyh2bWEpO1xuK31cbiBcbi1cdFZNX1dBUk5fT05fT05DRSghcG1kX2lzX3ZhbGlkX3NvZnRsZWFmKCpwbWQpIFx1MDAyNlx1MDAyNiAhcG1kX3RyYW5zX2h1Z2UoKnBtZCkpO1xuKy8qKlxuKyAqIHVubWFwX2h1Z2VfcG1kX2VudHJ5KCkgLSBVbm1hcCBhIGh1Z2UgUE1EIGVudHJ5IHJhdGhlciB0aGFuIHNwbGl0dGluZyBpdC5cbisgKiBAdm1hOiBUaGUgVk1BIEBwbWQgYmVsb25ncyB0by5cbisgKiBAaGFkZHI6IFRoZSBQTUQtYWxpZ25lZCBhZGRyZXNzIEBwbWQgbWFwcy5cbisgKiBAcG1kOiBQb2ludGVyIHRvIHRoZSBodWdlIFBNRCBlbnRyeS5cbisgKiBAZm9saW86IFRoZSBmb2xpbyBAcG1kIGRlc2NyaWJlcywgb3IgTlVMTCBpZiBpdCBkZXNjcmliZXMgbm9uZS5cbisgKiBAaXNfcHJlc2VudDogSXMgQHBtZCBhIHByZXNlbnQgZW50cnkgcmF0aGVyIHRoYW4gYSBzb2Z0bGVhZiBlbnRyeT9cbisgKlxuKyAqIE9ubHkgYW5vbnltb3VzIGZvbGlvcyBhcmUgcmVidWlsdCBhdCBQVEUgbGV2ZWwgd2hlbiBhIGh1Z2UgUE1EIGVudHJ5IGlzXG4rICogc3BsaXQuIEV2ZXJ5dGhpbmcgZWxzZSBpcyB1bm1hcHBlZCBoZXJlIGFuZCBmYXVsdGVkIGJhY2sgaW4gb24gdGhlIG5leHRcbisgKiBhY2Nlc3MuXG4rICovXG4rc3RhdGljIHZvaWQgdW5tYXBfaHVnZV9wbWRfZW50cnkoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsXG4rXHRcdHVuc2lnbmVkIGxvbmcgaGFkZHIsIHBtZF90ICpwbWQsIHN0cnVjdCBmb2xpbyAqZm9saW8sXG4rXHRcdGJvb2wgaXNfcHJlc2VudClcbit7XG4rXHRzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS1cdTAwM2V2bV9tbTtcbitcdHBtZF90IG9sZF9wbWQ7XG4gXG4tXHRjb3VudF92bV9ldmVudChUSFBfU1BMSVRfUE1EKTtcbitcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbitcdC8qXG4rXHQgKiBXZSBhcmUgZ29pbmcgdG8gdW5tYXAgdGhpcyBodWdlIHBhZ2UuIFNvXG4rXHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbitcdCAqL1xuK1x0aWYgKGhhc19kZXBvc2l0ZWRfcGd0YWJsZSh2bWEsIG9sZF9wbWQsIGZvbGlvKSlcbitcdFx0emFwX2RlcG9zaXRlZF90YWJsZShtbSwgcG1kKTtcbiBcbi1cdGlmICghdm1hX2lzX2Fub255bW91cyh2bWEpKSB7XG4tXHRcdG9sZF9wbWQgPSBwbWRwX2h1Z2VfY2xlYXJfZmx1c2godm1hLCBoYWRkciwgcG1kKTtcbi1cdFx0Lypcbi1cdFx0ICogV2UgYXJlIGdvaW5nIHRvIHVubWFwIHRoaXMgaHVnZSBwYWdlLiBTb1xuLVx0XHQgKiBqdXN0IGdvIGFoZWFkIGFuZCB6YXAgaXRcbi1cdFx0ICovXG4tXHRcdGlmIChhcmNoX25lZWRzX3BndGFibGVfZGVwb3NpdCgpKVxuLVx0XHRcdHphcF9kZXBvc2l0ZWRfdGFibGUobW0sIHBtZCk7XG4tXHRcdGlmICh2bWFfaXNfc3BlY2lhbF9odWdlKHZtYSkpXG4tXHRcdFx0cmV0dXJuO1xuLVx0XHRpZiAodW5saWtlbHkocG1kX2lzX21pZ3JhdGlvbl9lbnRyeShvbGRfcG1kKSkpIHtcbi1cdFx0XHRjb25zdCBzb2Z0bGVhZl90IG9sZF9lbnRyeSA9IHNvZnRsZWFmX2Zyb21fcG1kKG9sZF9wbWQpO1xuLVxuLVx0XHRcdGZvbGlvID0gc29mdGxlYWZfdG9fZm9saW8ob2xkX2VudHJ5KTtcbi1cdFx0fSBlbHNlIGlmIChpc19odWdlX3plcm9fcG1kKG9sZF9wbWQpKSB7XG4tXHRcdFx0cmV0dXJuO1xuLVx0XHR9IGVsc2Uge1xuLVx0XHRcdHBhZ2UgPSBwbWRfcGFnZShvbGRfcG1kKTtcbi1cdFx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X2RpcnR5KGZvbGlvKSBcdTAwMjZcdTAwMjYgcG1kX2RpcnR5KG9sZF9wbWQpKVxuLVx0XHRcdFx0Zm9saW9fbWFya19kaXJ0eShmb2xpbyk7XG4tXHRcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4tXHRcdFx0XHRmb2xpb19zZXRfcmVmZXJlbmNlZChmb2xpbyk7XG4tXHRcdFx0Zm9saW9fcmVtb3ZlX3JtYXBfcG1kKGZvbGlvLCBwYWdlLCB2bWEpO1xuLVx0XHRcdGFkZF9tbV9jb3VudGVyKG1tLCBtbV9jb3VudGVyX2ZpbGUoZm9saW8pLCAtSFBBR0VfUE1EX05SKTtcbi1cdFx0XHRmb2xpb19wdXQoZm9saW8pO1xuLVx0XHRcdHJldHVybjtcbi1cdFx0fVxuLVx0XHRhZGRfbW1fY291bnRlcihtbSwgbW1fY291bnRlcl9maWxlKGZvbGlvKSwgLUhQQUdFX1BNRF9OUik7XG4rXHRpZiAoIWZvbGlvKVxuIFx0XHRyZXR1cm47XG4tXHR9XG4gXG4tXHRpZiAoaXNfaHVnZV96ZXJvX3BtZCgqcG1kKSkge1xuLVx0XHQvKlxuLVx0XHQgKiBGSVhNRTogRG8gd2Ugd2FudCB0byBpbnZhbGlkYXRlIHNlY29uZGFyeSBtbXUgYnkgY2FsbGluZ1xuLVx0XHQgKiBtbXVfbm90aWZpZXJfYXJjaF9pbnZhbGlkYXRlX3NlY29uZGFyeV90bGJzKCkgc2VlIGNvbW1lbnRzIGJlbG93XG4tXHRcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuLVx0XHQgKlxuLVx0XHQgKiBXZSBhcmUgZ29pbmcgZnJvbSBhIHplcm8gaHVnZSBwYWdlIHdyaXRlIHByb3RlY3RlZCB0byB6ZXJvXG4tXHRcdCAqIHNtYWxsIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsXG4tXHRcdCAqIHRvIGludmFsaWRhdGUgc2Vjb25kYXJ5IG1tdSBhdCB0aGlzIHRpbWUuXG4tXHRcdCAqL1xuLVx0XHRyZXR1cm4gX19zcGxpdF9odWdlX3plcm9fcGFnZV9wbWQodm1hLCBoYWRkciwgcG1kKTtcbitcdGlmIChpc19wcmVzZW50KSB7XG4rXHRcdHN0cnVjdCBwYWdlICpwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4rXG4rXHRcdGlmICghZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgXHUwMDI2XHUwMDI2IHBtZF9kaXJ0eShvbGRfcG1kKSlcbitcdFx0XHRmb2xpb19tYXJrX2RpcnR5KGZvbGlvKTtcbitcdFx0aWYgKCFmb2xpb190ZXN0X3JlZmVyZW5jZWQoZm9saW8pIFx1MDAyNlx1MDAyNiBwbWRfeW91bmcob2xkX3BtZCkpXG4rXHRcdFx0Zm9saW9fc2V0X3JlZmVyZW5jZWQoZm9saW8pO1xuK1x0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4gXHR9XG4gXG4tXHRpZiAocG1kX2lzX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuK1x0YWRkX21tX2NvdW50ZXIobW0sIG1tX2NvdW50ZXJfZmlsZShmb2xpbyksIC1IUEFHRV9QTURfTlIpO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoaXNfcHJlc2VudClcbitcdFx0Zm9saW9fcHV0KGZvbGlvKTtcbit9XG4gXG4tXHRcdHNvZnRfZGlydHkgPSBwbWRfc3dwX3NvZnRfZGlydHkob2xkX3BtZCk7XG4tXHRcdHVmZmRfd3AgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCk7XG4rc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSB7XG4rXHRzdHJ1Y3QgZm9saW8gKmZvbGlvO1xuK1x0c3RydWN0IHBhZ2UgKnBhZ2U7XG4rXHRib29sIGlzX3ByZXNlbnQ7XG4rXHRib29sIGlzX2RldmljZV9wcml2YXRlO1xuK1x0Ym9vbCBmcmVlemU7XG4rXHRib29sIHdyaXRlO1xuK1x0Ym9vbCB5b3VuZztcbitcdGJvb2wgZGlydHk7XG4rXHRib29sIHNvZnRfZGlydHk7XG4rXHRib29sIHVmZmQ7XG4rXHRib29sIGFub25fZXhjbHVzaXZlO1xuK307XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3dyaXRlKGVudHJ5KTtcbi1cdFx0aWYgKFBhZ2VBbm9uKHBhZ2UpKVxuLVx0XHRcdGFub25fZXhjbHVzaXZlID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX3JlYWRfZXhjbHVzaXZlKGVudHJ5KTtcbi1cdFx0eW91bmcgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25feW91bmcoZW50cnkpO1xuLVx0XHRkaXJ0eSA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9kaXJ0eShlbnRyeSk7XG4tXHR9IGVsc2UgaWYgKHBtZF9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeSgqcG1kKSkge1xuLVx0XHRzb2Z0bGVhZl90IGVudHJ5O1xuKy8qXG4rICogQ29udmVydCB0aGUgZm9saW8ncyBQTUQtbGV2ZWwgYW5vbnltb3VzIHJtYXAgaW50byBQVEUtbGV2ZWwgb25lcy5cbisgKlxuKyAqIFdpdGhvdXQgXCJmcmVlemVcIiwgd2UnbGwgc2ltcGx5IHNwbGl0IHRoZSBQTUQsIHByb3BhZ2F0aW5nIHRoZVxuKyAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3JcbisgKiBlYWNoIHN1YnBhZ2UgLS0gbm8gbmVlZCB0byAodGVtcG9yYXJpbHkpIGNsZWFyLlxuKyAqXG4rICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbisgKiBtaWdyYXRpb24gZW50cmllcyByaWdodCBhd2F5LiBUaGlzIGlzIG9ubHkgcG9zc2libGUgaWYgd2VcbisgKiBtYW5hZ2VkIHRvIGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCkgLS0gc2VlXG4rICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbisgKlxuKyAqIEluIGNhc2Ugd2UgY2Fubm90IGNsZWFyIFBhZ2VBbm9uRXhjbHVzaXZlKCksIHNwbGl0IHRoZSBQTURcbisgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbisgKlxuKyAqIFNlZSBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZCgpOiBpbnZhbGlkYXRlIFBNRCBmaXJzdC5cbisgKlxuKyAqIFJldHVybnM6IHdoZXRoZXIgdGhlIG1hcHBpbmcgbWF5IHN0aWxsIGJlIGZyb3plbi5cbisgKi9cbitzdGF0aWMgYm9vbCBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoY29uc3Qgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUsXG4rXHRcdHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGhhZGRyKVxuK3tcbitcdHJtYXBfdCBybWFwX2ZsYWdzID0gUk1BUF9OT05FO1xuIFxuLVx0XHRvbGRfcG1kID0gKnBtZDtcbi1cdFx0ZW50cnkgPSBzb2Z0bGVhZl9mcm9tX3BtZChvbGRfcG1kKTtcbi1cdFx0cGFnZSA9IHNvZnRsZWFmX3RvX3BhZ2UoZW50cnkpO1xuLVx0XHRmb2xpbyA9IHBhZ2VfZm9saW8ocGFnZSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZnJlZXplIFx1MDAyNlx1MDAyNlxuK1x0ICAgICghc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUgfHxcbitcdCAgICAgIWZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKHN0YXRlLVx1MDAzZWZvbGlvLCBzdGF0ZS1cdTAwM2VwYWdlKSkpXG4rXHRcdHJldHVybiB0cnVlO1xuIFxuLVx0XHRzb2Z0X2RpcnR5ID0gcG1kX3N3cF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3N3cF91ZmZkKG9sZF9wbWQpO1xuK1x0Zm9saW9fcmVmX2FkZChzdGF0ZS1cdTAwM2Vmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdHJtYXBfZmxhZ3MgfD0gUk1BUF9FWENMVVNJVkU7XG4rXHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoc3RhdGUtXHUwMDNlZm9saW8sIHN0YXRlLVx1MDAzZXBhZ2UsIEhQQUdFX1BNRF9OUiwgdm1hLFxuK1x0XHRcdFx0IGhhZGRyLCBybWFwX2ZsYWdzKTtcbitcdHJldHVybiBmYWxzZTtcbit9XG4gXG4tXHRcdHdyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuLVx0XHRhbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHBhZ2UpO1xuKy8qXG4rICogQnVpbGQgdGhlIGxlYWYgZW50cnkgZm9yIHRoZSBQVEUgZW50cnkgZGVzY3JpYmluZyBAcGZuLCBmb3IgYSBodWdlIFBNRCBlbnRyeVxuKyAqIHdoaWNoIGlzIG5vdCByZXN0b3JlZCBhcyBhIHByZXNlbnQgbWFwcGluZy5cbisgKi9cbitzdGF0aWMgc29mdGxlYWZfdCBzcGxpdF9wbWRfbWFrZV9zb2Z0bGVhZihjb25zdCBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlICpzdGF0ZSxcbitcdFx0XHRcdFx0ICB1bnNpZ25lZCBsb25nIHBmbilcbit7XG4rXHRzb2Z0bGVhZl90IGVudHJ5O1xuIFxuK1x0aWYgKHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlIFx1MDAyNlx1MDAyNiAhc3RhdGUtXHUwMDNlZnJlZXplKSB7XG4gXHRcdC8qXG4tXHRcdCAqIERldmljZSBwcml2YXRlIFRIUCBzaG91bGQgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyXG4tXHRcdCAqIGZvbGlvcyB3LnIudCBhbm9uIGV4Y2x1c2l2ZSBoYW5kbGluZy4gU2VlIHRoZSBjb21tZW50cyBmb3Jcbi1cdFx0ICogZm9saW8gaGFuZGxpbmcgYW5kIGFub25fZXhjbHVzaXZlIGJlbG93LlxuLVx0XHQgKi9cbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH0gZWxzZSB7XG4tXHRcdC8qXG4tXHRcdCAqIFVwIHRvIHRoaXMgcG9pbnQgdGhlIHBtZCBpcyBwcmVzZW50IGFuZCBodWdlIGFuZCB1c2VybGFuZCBoYXNcbi1cdFx0ICogdGhlIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2hcbi1cdFx0ICogaGFwcGVucyBpbiBwbGFjZSkuIElmIHdlIG92ZXJ3cml0ZSB0aGUgcG1kIHdpdGggdGhlIG5vdC1odWdlXG4tXHRcdCAqIHZlcnNpb24gcG9pbnRpbmcgdG8gdGhlIHB0ZSBoZXJlICh3aGljaCBvZiBjb3Vyc2Ugd2UgY291bGQgaWZcbi1cdFx0ICogYWxsIENQVXMgd2VyZSBidWcgZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlXG4tXHRcdCAqIHNpemUgVExCIG1pc3Mgb24gdGhlIHNtYWxsIHNpemVkIFRMQiB3aGlsZSB0aGUgaHVnZXBhZ2UgVExCXG4tXHRcdCAqIGVudHJ5IGlzIHN0aWxsIGVzdGFibGlzaGVkIGluIHRoZSBodWdlIFRMQi4gU29tZSBDUFUgZG9lc24ndFxuLVx0XHQgKiBsaWtlIHRoYXQuIFNlZVxuLVx0XHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtXG4tXHRcdCAqIDM4MyBvbiBwYWdlIDEwNS4gSW50ZWwgc2hvdWxkIGJlIHNhZmUgYnV0IGlzIGFsc28gd2FybnMgdGhhdFxuLVx0XHQgKiBpdCdzIG9ubHkgc2FmZSBpZiB0aGUgcGVybWlzc2lvbiBhbmQgY2FjaGUgYXR0cmlidXRlcyBvZiB0aGVcbi1cdFx0ICogdHdvIGVudHJpZXMgbG9hZGVkIGluIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkXG4tXHRcdCAqIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXMgZ2VuZXJhbGx5IHNhZmVyIHRvIG5ldmVyIGFsbG93XG4tXHRcdCAqIHNtYWxsIGFuZCBodWdlIFRMQiBlbnRyaWVzIGZvciB0aGUgc2FtZSB2aXJ0dWFsIGFkZHJlc3MgdG8gYmVcbi1cdFx0ICogbG9hZGVkIHNpbXVsdGFuZW91c2x5LiBTbyBpbnN0ZWFkIG9mIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7XG4tXHRcdCAqIGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZSBjdXJyZW50IHBtZFxuLVx0XHQgKiBub3RwcmVzZW50IChhdG9taWNhbGx5IGJlY2F1c2UgaGVyZSB0aGUgcG1kX3RyYW5zX2h1Z2UgbXVzdFxuLVx0XHQgKiByZW1haW4gc2V0IGF0IGFsbCB0aW1lcyBvbiB0aGUgcG1kIHVudGlsIHRoZSBzcGxpdCBpc1xuLVx0XHQgKiBjb21wbGV0ZSBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5XG4tXHRcdCAqIHdlIHdyaXRlIHRoZSBub24taHVnZSB2ZXJzaW9uIG9mIHRoZSBwbWQgZW50cnkgd2l0aFxuLVx0XHQgKiBwbWRfcG9wdWxhdGUuXG4rXHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHBhZ2VzIGJhY2tpbmdcbitcdFx0ICogdGhlIFBURSBlbnRyaWVzIGJ5IHNwbGl0X2h1Z2VfcG1kX2Fub25fcm1hcCgpLCBhbmQgYWNjZXNzZWRcbitcdFx0ICogYW5kIGRpcnR5IGJpdHMgYXJlIG5vdCBwcm9wYWdhdGVkIHZpYSBkZXZpY2UgcHJpdmF0ZVxuK1x0XHQgKiBlbnRyaWVzLlxuIFx0XHQgKi9cbi1cdFx0b2xkX3BtZCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuLVx0XHRwYWdlID0gcG1kX3BhZ2Uob2xkX3BtZCk7XG4tXHRcdGZvbGlvID0gcGFnZV9mb2xpbyhwYWdlKTtcbi1cdFx0aWYgKHBtZF9kaXJ0eShvbGRfcG1kKSkge1xuLVx0XHRcdGRpcnR5ID0gdHJ1ZTtcbi1cdFx0XHRmb2xpb19zZXRfZGlydHkoZm9saW8pO1xuLVx0XHR9XG4tXHRcdHdyaXRlID0gcG1kX3dyaXRlKG9sZF9wbWQpO1xuLVx0XHR5b3VuZyA9IHBtZF95b3VuZyhvbGRfcG1kKTtcbi1cdFx0c29mdF9kaXJ0eSA9IHBtZF9zb2Z0X2RpcnR5KG9sZF9wbWQpO1xuLVx0XHR1ZmZkX3dwID0gcG1kX3VmZmQob2xkX3BtZCk7XG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0XHRyZXR1cm4gbWFrZV93cml0YWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0XHRyZXR1cm4gbWFrZV9yZWFkYWJsZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShwZm4pO1xuK1x0fVxuIFxuLVx0XHRWTV9XQVJOX09OX0ZPTElPKCFmb2xpb19yZWZfY291bnQoZm9saW8pLCBmb2xpbyk7XG4tXHRcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3Rlc3RfYW5vbihmb2xpbyksIGZvbGlvKTtcbitcdGlmIChzdGF0ZS1cdTAwM2V3cml0ZSlcbitcdFx0ZW50cnkgPSBtYWtlX3dyaXRhYmxlX21pZ3JhdGlvbl9lbnRyeShwZm4pO1xuK1x0ZWxzZSBpZiAoc3RhdGUtXHUwMDNlYW5vbl9leGNsdXNpdmUpXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KHBmbik7XG4rXHRlbHNlXG4rXHRcdGVudHJ5ID0gbWFrZV9yZWFkYWJsZV9taWdyYXRpb25fZW50cnkocGZuKTtcbiBcbi1cdFx0Lypcbi1cdFx0ICogV2l0aG91dCBcImZyZWV6ZVwiLCB3ZSdsbCBzaW1wbHkgc3BsaXQgdGhlIFBNRCwgcHJvcGFnYXRpbmcgdGhlXG4tXHRcdCAqIFBhZ2VBbm9uRXhjbHVzaXZlKCkgZmxhZyBmb3IgZWFjaCBQVEUgYnkgc2V0dGluZyBpdCBmb3Jcbi1cdFx0ICogZWFjaCBzdWJwYWdlIC0tIG5vIG5lZWQgdG8gKHRlbXBvcmFyaWx5KSBjbGVhci5cbi1cdFx0ICpcbi1cdFx0ICogV2l0aCBcImZyZWV6ZVwiIHdlIHdhbnQgdG8gcmVwbGFjZSBtYXBwZWQgcGFnZXMgYnlcbi1cdFx0ICogbWlncmF0aW9uIGVudHJpZXMgcmlnaHQgYXdheS4gVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHdlXG4tXHRcdCAqIG1hbmFnZWQgdG8gY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSAtLSBzZWVcbi1cdFx0ICogc2V0X3BtZF9taWdyYXRpb25fZW50cnkoKS5cbi1cdFx0ICpcbi1cdFx0ICogSW4gY2FzZSB3ZSBjYW5ub3QgY2xlYXIgUGFnZUFub25FeGNsdXNpdmUoKSwgc3BsaXQgdGhlIFBNRFxuLVx0XHQgKiBvbmx5IGFuZCBsZXQgdHJ5X3RvX21pZ3JhdGVfb25lKCkgZmFpbCBsYXRlci5cbi1cdFx0ICpcbi1cdFx0ICogU2VlIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCk6IGludmFsaWRhdGUgUE1EIGZpcnN0LlxuLVx0XHQgKi9cbi1cdFx0YW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShwYWdlKTtcbi1cdFx0aWYgKGZyZWV6ZSBcdTAwMjZcdTAwMjYgYW5vbl9leGNsdXNpdmUgXHUwMDI2XHUwMDI2XG4tXHRcdCAgICBmb2xpb190cnlfc2hhcmVfYW5vbl9ybWFwX3BtZChmb2xpbywgcGFnZSkpXG4tXHRcdFx0ZnJlZXplID0gZmFsc2U7XG4tXHRcdGlmICghZnJlZXplKSB7XG4tXHRcdFx0cm1hcF90IHJtYXBfZmxhZ3MgPSBSTUFQX05PTkU7XG4tXG4tXHRcdFx0Zm9saW9fcmVmX2FkZChmb2xpbywgSFBBR0VfUE1EX05SIC0gMSk7XG4tXHRcdFx0aWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0cm1hcF9mbGFncyB8PSBSTUFQX0VYQ0xVU0lWRTtcbi1cdFx0XHRmb2xpb19hZGRfYW5vbl9ybWFwX3B0ZXMoZm9saW8sIHBhZ2UsIEhQQUdFX1BNRF9OUixcbi1cdFx0XHRcdFx0XHQgdm1hLCBoYWRkciwgcm1hcF9mbGFncyk7XG4tXHRcdH1cbi1cdH1cbitcdGlmIChzdGF0ZS1cdTAwM2V5b3VuZylcbitcdFx0ZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV95b3VuZyhlbnRyeSk7XG4rXHRpZiAoc3RhdGUtXHUwMDNlZGlydHkpXG4rXHRcdGVudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfZGlydHkoZW50cnkpO1xuK1xuK1x0cmV0dXJuIGVudHJ5O1xuK31cbitcbisvKlxuKyAqIFJlcGxhY2UgYW4gYW5vbnltb3VzIGh1Z2UgUE1EIGVudHJ5IHdpdGggYSBwYWdlIHRhYmxlIG1hcHBpbmcgdGhlIHNhbWVcbisgKiBmb2xpbyBhdCBQVEUgZ3JhbnVsYXJpdHkuXG4rICovXG4rc3RhdGljIHZvaWQgc3BsaXRfaHVnZV9wbWRfdG9fcHRlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IHNwbGl0X3BtZF9zdGF0ZSAqc3RhdGUpXG4re1xuK1x0LyogUHJlc2VudCBtYXBwaW5ncyBhbmQgZGV2aWNlIHByaXZhdGUgZW50cmllcyBob2xkIGEgUE1ELWxldmVsIHJtYXAuICovXG4rXHRjb25zdCBib29sIHJtYXBwZWQgPSBzdGF0ZS1cdTAwM2Vpc19wcmVzZW50IHx8IHN0YXRlLVx1MDAzZWlzX2RldmljZV9wcml2YXRlO1xuK1x0c3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtXHUwMDNldm1fbW07XG4rXHRzdHJ1Y3QgcGFnZSAqcGFnZSA9IHN0YXRlLVx1MDAzZXBhZ2U7XG4rXHR1bnNpZ25lZCBsb25nIGFkZHI7XG4rXHRwZ3RhYmxlX3QgcGd0YWJsZTtcbitcdHBtZF90IF9wbWQ7XG4rXHRwdGVfdCAqcHRlO1xuK1x0aW50IGk7XG4rXG4rXHRpZiAocm1hcHBlZClcbitcdFx0c3RhdGUtXHUwMDNlZnJlZXplID0gc3BsaXRfaHVnZV9wbWRfYW5vbl9ybWFwKHN0YXRlLCB2bWEsIGhhZGRyKTtcbiBcbiBcdC8qXG4tXHQgKiBXaXRoZHJhdyB0aGUgdGFibGUgb25seSBhZnRlciB3ZSBtYXJrIHRoZSBwbWQgZW50cnkgaW52YWxpZC5cbi1cdCAqIFRoaXMncyBjcml0aWNhbCBmb3Igc29tZSBhcmNoaXRlY3R1cmVzIChQb3dlcikuXG4rXHQgKiBUaGUgY2FsbGVyIGhhcyBhbHJlYWR5IGludmFsaWRhdGVkIGEgcHJlc2VudCBlbnRyeSwgYW5kIGEgc29mdGxlYWZcbitcdCAqIGVudHJ5IGlzIG5vdCBwcmVzZW50IHRvIGJlZ2luIHdpdGguIEVpdGhlciB3YXkgdGhlIGVudHJ5IGlzIG91dCBvZlxuK1x0ICogc2VydmljZSBiZWZvcmUgd2Ugd2l0aGRyYXcgdGhlIGRlcG9zaXRlZCBwYWdlIHRhYmxlLCB3aGljaCBpc1xuK1x0ICogY3JpdGljYWwgZm9yIHNvbWUgYXJjaGl0ZWN0dXJlcyAoUG93ZXIpLlxuIFx0ICovXG4gXHRwZ3RhYmxlID0gcGd0YWJsZV90cmFuc19odWdlX3dpdGhkcmF3KG1tLCBwbWQpO1xuIFx0cG1kX3BvcHVsYXRlKG1tLCBcdTAwMjZfcG1kLCBwZ3RhYmxlKTtcbkBAIC0zMzM3LDU1ICszMzE3LDE3IEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0ICogTm90ZSB0aGF0IE5VTUEgaGludGluZyBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFyZSBub3QgdHJhbnNmZXJyZWQgdG9cbiBcdCAqIGF2b2lkIGFueSBwb3NzaWJpbGl0eSBvZiBhbHRlcmluZyBwZXJtaXNzaW9ucyBhY3Jvc3MgVk1Bcy5cbiBcdCAqL1xuLVx0aWYgKGZyZWV6ZSB8fCBwbWRfaXNfbWlncmF0aW9uX2VudHJ5KG9sZF9wbWQpKSB7XG4tXHRcdHB0ZV90IGVudHJ5O1xuLVx0XHRzd3BfZW50cnlfdCBzd3BfZW50cnk7XG4tXG4tXHRcdGZvciAoaSA9IDAsIGFkZHIgPSBoYWRkcjsgaSBcdTAwM2MgSFBBR0VfUE1EX05SOyBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4tXHRcdFx0aWYgKHdyaXRlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV93cml0YWJsZV9taWdyYXRpb25fZW50cnkoXG4tXHRcdFx0XHRcdFx0XHRwYWdlX3RvX3BmbihwYWdlICsgaSkpO1xuLVx0XHRcdGVsc2UgaWYgKGFub25fZXhjbHVzaXZlKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9yZWFkYWJsZV9leGNsdXNpdmVfbWlncmF0aW9uX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX21pZ3JhdGlvbl9lbnRyeShcbi1cdFx0XHRcdFx0XHRcdHBhZ2VfdG9fcGZuKHBhZ2UgKyBpKSk7XG4tXHRcdFx0aWYgKHlvdW5nKVxuLVx0XHRcdFx0c3dwX2VudHJ5ID0gbWFrZV9taWdyYXRpb25fZW50cnlfeW91bmcoc3dwX2VudHJ5KTtcbi1cdFx0XHRpZiAoZGlydHkpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX21pZ3JhdGlvbl9lbnRyeV9kaXJ0eShzd3BfZW50cnkpO1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuK1x0aWYgKHN0YXRlLVx1MDAzZWZyZWV6ZSB8fCAhc3RhdGUtXHUwMDNlaXNfcHJlc2VudCkge1xuK1x0XHRmb3IgKGkgPSAwLCBhZGRyID0gaGFkZHI7IGkgXHUwMDNjIEhQQUdFX1BNRF9OUjtcbitcdFx0ICAgICBpKyssIGFkZHIgKz0gUEFHRV9TSVpFKSB7XG4rXHRcdFx0Y29uc3QgdW5zaWduZWQgbG9uZyBwZm4gPSBwYWdlX3RvX3BmbihwYWdlICsgaSk7XG4rXHRcdFx0Y29uc3Qgc29mdGxlYWZfdCBsZWFmID1cbitcdFx0XHRcdHNwbGl0X3BtZF9tYWtlX3NvZnRsZWFmKHN0YXRlLCBwZm4pO1xuK1x0XHRcdHB0ZV90IGVudHJ5ID0gc29mdGxlYWZfdG9fcHRlKGxlYWYpO1xuK1xuK1x0XHRcdGlmIChzdGF0ZS1cdTAwM2Vzb2Z0X2RpcnR5KVxuIFx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4tXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbi1cdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuLVx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbi1cdFx0fVxuLVx0fSBlbHNlIGlmIChwbWRfaXNfZGV2aWNlX3ByaXZhdGVfZW50cnkob2xkX3BtZCkpIHtcbi1cdFx0cHRlX3QgZW50cnk7XG4tXHRcdHN3cF9lbnRyeV90IHN3cF9lbnRyeTtcbi1cbi1cdFx0Zm9yIChpID0gMCwgYWRkciA9IGhhZGRyOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKywgYWRkciArPSBQQUdFX1NJWkUpIHtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIGFub25fZXhjbHVzaXZlIHdhcyBhbHJlYWR5IHByb3BhZ2F0ZWQgdG8gdGhlIHJlbGV2YW50XG4tXHRcdFx0ICogcGFnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcHRlIGVudHJpZXMgd2hlbiBmcmVlemVcbi1cdFx0XHQgKiBpcyBmYWxzZS5cbi1cdFx0XHQgKi9cbi1cdFx0XHRpZiAod3JpdGUpXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3dyaXRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHRlbHNlXG4tXHRcdFx0XHRzd3BfZW50cnkgPSBtYWtlX3JlYWRhYmxlX2RldmljZV9wcml2YXRlX2VudHJ5KFxuLVx0XHRcdFx0XHRcdFx0cGFnZV90b19wZm4ocGFnZSArIGkpKTtcbi1cdFx0XHQvKlxuLVx0XHRcdCAqIFlvdW5nIGFuZCBkaXJ0eSBiaXRzIGFyZSBub3QgcHJvZ2F0ZWQgdmlhIHN3cF9lbnRyeVxuLVx0XHRcdCAqL1xuLVx0XHRcdGVudHJ5ID0gc3dwX2VudHJ5X3RvX3B0ZShzd3BfZW50cnkpO1xuLVx0XHRcdGlmIChzb2Z0X2RpcnR5KVxuLVx0XHRcdFx0ZW50cnkgPSBwdGVfc3dwX21rc29mdF9kaXJ0eShlbnRyeSk7XG4tXHRcdFx0aWYgKHVmZmRfd3ApXG4rXHRcdFx0aWYgKHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0XHRlbnRyeSA9IHB0ZV9zd3BfbWt1ZmZkKGVudHJ5KTtcbiBcdFx0XHRWTV9XQVJOX09OKCFwdGVfbm9uZShwdGVwX2dldChwdGUgKyBpKSkpO1xuIFx0XHRcdHNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZSArIGksIGVudHJ5KTtcbkBAIC0zMzk0LDIwICszMzM2LDIwIEBAIHN0YXRpYyB2b2lkIF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBwbWRfdCAqcG1kLFxuIFx0XHRwdGVfdCBlbnRyeTtcbiBcbiBcdFx0ZW50cnkgPSBta19wdGUocGFnZSwgUkVBRF9PTkNFKHZtYS1cdTAwM2V2bV9wYWdlX3Byb3QpKTtcbi1cdFx0aWYgKHdyaXRlKVxuK1x0XHRpZiAoc3RhdGUtXHUwMDNld3JpdGUpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWt3cml0ZShlbnRyeSwgdm1hKTtcbi1cdFx0aWYgKCF5b3VuZylcbitcdFx0aWYgKCFzdGF0ZS1cdTAwM2V5b3VuZylcbiBcdFx0XHRlbnRyeSA9IHB0ZV9ta29sZChlbnRyeSk7XG4gXHRcdC8qIE5PVEU6IHRoaXMgbWF5IHNldCBzb2Z0LWRpcnR5IHRvbyBvbiBzb21lIGFyY2hzICovXG4tXHRcdGlmIChkaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZWRpcnR5KVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rZGlydHkoZW50cnkpO1xuLVx0XHRpZiAoc29mdF9kaXJ0eSlcbitcdFx0aWYgKHN0YXRlLVx1MDAzZXNvZnRfZGlydHkpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbWtzb2Z0X2RpcnR5KGVudHJ5KTtcbi1cdFx0aWYgKHVmZmRfd3ApXG4rXHRcdGlmIChzdGF0ZS1cdTAwM2V1ZmZkKVxuIFx0XHRcdGVudHJ5ID0gcHRlX21rdWZmZChlbnRyeSk7XG4gXG4gXHRcdC8qIFJlc3RvcmUgUEFHRV9OT05FIHNvIGFuIFJXUCBtYXJrZXIga2VlcHMgdHJhcHBpbmcgKi9cbi1cdFx0aWYgKHVzZXJmYXVsdGZkX3J3cCh2bWEpIFx1MDAyNlx1MDAyNiB1ZmZkX3dwKVxuK1x0XHRpZiAodXNlcmZhdWx0ZmRfcndwKHZtYSkgXHUwMDI2XHUwMDI2IHN0YXRlLVx1MDAzZXVmZmQpXG4gXHRcdFx0ZW50cnkgPSBwdGVfbW9kaWZ5KGVudHJ5LCBQQUdFX05PTkUpO1xuIFxuIFx0XHRmb3IgKGkgPSAwOyBpIFx1MDAzYyBIUEFHRV9QTURfTlI7IGkrKylcbkBAIC0zNDE3LDE1ICszMzU5LDE1MiBAQCBzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbiBcdH1cbiBcdHB0ZV91bm1hcChwdGUpO1xuIFxuLVx0aWYgKCFwbWRfaXNfbWlncmF0aW9uX2VudHJ5KCpwbWQpKVxuLVx0XHRmb2xpb19yZW1vdmVfcm1hcF9wbWQoZm9saW8sIHBhZ2UsIHZtYSk7XG4tXHRpZiAoZnJlZXplKVxuK1x0aWYgKHJtYXBwZWQpXG4rXHRcdGZvbGlvX3JlbW92ZV9ybWFwX3BtZChzdGF0ZS1cdTAwM2Vmb2xpbywgcGFnZSwgdm1hKTtcbitcdGlmIChzdGF0ZS1cdTAwM2VmcmVlemUpXG4gXHRcdHB1dF9wYWdlKHBhZ2UpO1xuIFxuIFx0c21wX3dtYigpOyAvKiBtYWtlIHB0ZSB2aXNpYmxlIGJlZm9yZSBwbWQgKi9cbiBcdHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwZ3RhYmxlKTtcbiB9XG4gXG4rc3RhdGljIHZvaWQgc3BsaXRfcHJlc2VudF9odWdlX3BtZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwgc3RydWN0IGZvbGlvICpmb2xpbyxcbitcdFx0Ym9vbCBmcmVlemUpXG4re1xuK1x0c3RydWN0IHNwbGl0X3BtZF9zdGF0ZSBzdGF0ZSA9IHtcbitcdFx0LmZvbGlvID0gZm9saW8sXG4rXHRcdC5pc19wcmVzZW50ID0gdHJ1ZSxcbitcdFx0LmZyZWV6ZSA9IGZyZWV6ZSxcbitcdH07XG4rXG4rXHQvKlxuK1x0ICogVXAgdG8gdGhpcyBwb2ludCB0aGUgcG1kIGlzIHByZXNlbnQgYW5kIGh1Z2UgYW5kIHVzZXJsYW5kIGhhcyB0aGVcbitcdCAqIHdob2xlIGFjY2VzcyB0byB0aGUgaHVnZXBhZ2UgZHVyaW5nIHRoZSBzcGxpdCAod2hpY2ggaGFwcGVucyBpblxuK1x0ICogcGxhY2UpLiBJZiB3ZSBvdmVyd3JpdGUgdGhlIHBtZCB3aXRoIHRoZSBub3QtaHVnZSB2ZXJzaW9uIHBvaW50aW5nXG4rXHQgKiB0byB0aGUgcHRlIGhlcmUgKHdoaWNoIG9mIGNvdXJzZSB3ZSBjb3VsZCBpZiBhbGwgQ1BVcyB3ZXJlIGJ1Z1xuK1x0ICogZnJlZSksIHVzZXJsYW5kIGNvdWxkIHRyaWdnZXIgYSBzbWFsbCBwYWdlIHNpemUgVExCIG1pc3Mgb24gdGhlXG4rXHQgKiBzbWFsbCBzaXplZCBUTEIgd2hpbGUgdGhlIGh1Z2VwYWdlIFRMQiBlbnRyeSBpcyBzdGlsbCBlc3RhYmxpc2hlZCBpblxuK1x0ICogdGhlIGh1Z2UgVExCLiBTb21lIENQVSBkb2Vzbid0IGxpa2UgdGhhdC4gU2VlXG4rXHQgKiBodHRwOi8vc3VwcG9ydC5hbWQuY29tL1RlY2hEb2NzLzQxMzIyXzEwaF9SZXZfR2QucGRmLCBFcnJhdHVtIDM4MyBvblxuK1x0ICogcGFnZSAxMDUuIEludGVsIHNob3VsZCBiZSBzYWZlIGJ1dCBpcyBhbHNvIHdhcm5zIHRoYXQgaXQncyBvbmx5IHNhZmVcbitcdCAqIGlmIHRoZSBwZXJtaXNzaW9uIGFuZCBjYWNoZSBhdHRyaWJ1dGVzIG9mIHRoZSB0d28gZW50cmllcyBsb2FkZWQgaW5cbitcdCAqIHRoZSB0d28gVExCIGlzIGlkZW50aWNhbCAod2hpY2ggc2hvdWxkIGJlIHRoZSBjYXNlIGhlcmUpLiBCdXQgaXQgaXNcbitcdCAqIGdlbmVyYWxseSBzYWZlciB0byBuZXZlciBhbGxvdyBzbWFsbCBhbmQgaHVnZSBUTEIgZW50cmllcyBmb3IgdGhlXG4rXHQgKiBzYW1lIHZpcnR1YWwgYWRkcmVzcyB0byBiZSBsb2FkZWQgc2ltdWx0YW5lb3VzbHkuIFNvIGluc3RlYWQgb2ZcbitcdCAqIGRvaW5nIFwicG1kX3BvcHVsYXRlKCk7IGZsdXNoX3BtZF90bGJfcmFuZ2UoKTtcIiB3ZSBmaXJzdCBtYXJrIHRoZVxuK1x0ICogY3VycmVudCBwbWQgbm90cHJlc2VudCAoYXRvbWljYWxseSBiZWNhdXNlIGhlcmUgdGhlIHBtZF90cmFuc19odWdlXG4rXHQgKiBtdXN0IHJlbWFpbiBzZXQgYXQgYWxsIHRpbWVzIG9uIHRoZSBwbWQgdW50aWwgdGhlIHNwbGl0IGlzIGNvbXBsZXRlXG4rXHQgKiBmb3IgdGhpcyBwbWQpLCB0aGVuIHdlIGZsdXNoIHRoZSBTTVAgVExCIGFuZCBmaW5hbGx5IHdlIHdyaXRlIHRoZVxuK1x0ICogbm9uLWh1Z2UgdmVyc2lvbiBvZiB0aGUgcG1kIGVudHJ5IHdpdGggcG1kX3BvcHVsYXRlLlxuK1x0ICpcbitcdCAqIFRoaXMgbXVzdCBhbHNvIGhhcHBlbiBiZWZvcmUgUGFnZUFub25FeGNsdXNpdmUoKSBpcyByZWFkIGJlbG93LCBzZWVcbitcdCAqIGZvbGlvX3RyeV9zaGFyZV9hbm9uX3JtYXBfcG1kKCkuXG4rXHQgKi9cbitcdGNvbnN0IHBtZF90IHBtZHZhbCA9IHBtZHBfaW52YWxpZGF0ZSh2bWEsIGhhZGRyLCBwbWQpO1xuK1xuK1x0c3RhdGUucGFnZSA9IHBtZF9wYWdlKHBtZHZhbCk7XG4rXHRzdGF0ZS53cml0ZSA9IHBtZF93cml0ZShwbWR2YWwpO1xuK1x0c3RhdGUueW91bmcgPSBwbWRfeW91bmcocG1kdmFsKTtcbitcdHN0YXRlLmRpcnR5ID0gcG1kX2RpcnR5KHBtZHZhbCk7XG4rXHRzdGF0ZS5zb2Z0X2RpcnR5ID0gcG1kX3NvZnRfZGlydHkocG1kdmFsKTtcbitcdHN0YXRlLnVmZmQgPSBwbWRfdWZmZChwbWR2YWwpO1xuK1x0c3RhdGUuYW5vbl9leGNsdXNpdmUgPSBQYWdlQW5vbkV4Y2x1c2l2ZShzdGF0ZS5wYWdlKTtcbitcbitcdGlmIChzdGF0ZS5kaXJ0eSlcbitcdFx0Zm9saW9fc2V0X2RpcnR5KGZvbGlvKTtcbitcbitcdFZNX1dBUk5fT05fRk9MSU8oIWZvbGlvX3JlZl9jb3VudChmb2xpbyksIGZvbGlvKTtcbitcbitcdHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXModm1hLCBoYWRkciwgcG1kLCBcdTAwMjZzdGF0ZSk7XG4rfVxuK1xuK3N0YXRpYyB2b2lkIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLFxuK1x0XHR1bnNpZ25lZCBsb25nIGhhZGRyLCBwbWRfdCAqcG1kLCBwbWRfdCBvbGRfcG1kLFxuK1x0XHRzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIGZyZWV6ZSlcbit7XG4rXHRjb25zdCBzb2Z0bGVhZl90IGVudHJ5ID0gc29mdGxlYWZfZnJvbV9wbWQob2xkX3BtZCk7XG4rXHRzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlIHN0YXRlID0ge1xuK1x0XHQuZm9saW8gPSBmb2xpbyxcbitcdFx0LnBhZ2UgPSBzb2Z0bGVhZl90b19wYWdlKGVudHJ5KSxcbitcdFx0LmlzX2RldmljZV9wcml2YXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGUoZW50cnkpLFxuK1x0XHQuZnJlZXplID0gZnJlZXplLFxuK1x0XHQuc29mdF9kaXJ0eSA9IHBtZF9zd3Bfc29mdF9kaXJ0eShvbGRfcG1kKSxcbitcdFx0LnVmZmQgPSBwbWRfc3dwX3VmZmQob2xkX3BtZCksXG4rXHR9O1xuK1xuK1x0aWYgKHN0YXRlLmlzX2RldmljZV9wcml2YXRlKSB7XG4rXHRcdC8qXG4rXHRcdCAqIERldmljZSBwcml2YXRlIGZvbGlvcyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyByZWd1bGFyIGZvbGlvc1xuK1x0XHQgKiB3LnIudC4gYW5vbiBleGNsdXNpdmUgaGFuZGxpbmcsIHNlZVxuK1x0XHQgKiBzcGxpdF9odWdlX3BtZF9hbm9uX3JtYXAoKS5cbitcdFx0ICovXG4rXHRcdHN0YXRlLndyaXRlID0gc29mdGxlYWZfaXNfZGV2aWNlX3ByaXZhdGVfd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS5hbm9uX2V4Y2x1c2l2ZSA9IFBhZ2VBbm9uRXhjbHVzaXZlKHN0YXRlLnBhZ2UpO1xuK1x0fSBlbHNlIHtcbitcdFx0c3RhdGUud3JpdGUgPSBzb2Z0bGVhZl9pc19taWdyYXRpb25fd3JpdGUoZW50cnkpO1xuK1x0XHRzdGF0ZS55b3VuZyA9IHNvZnRsZWFmX2lzX21pZ3JhdGlvbl95b3VuZyhlbnRyeSk7XG4rXHRcdHN0YXRlLmRpcnR5ID0gc29mdGxlYWZfaXNfbWlncmF0aW9uX2RpcnR5KGVudHJ5KTtcbitcdFx0c3RhdGUuYW5vbl9leGNsdXNpdmUgPVxuK1x0XHRcdHNvZnRsZWFmX2lzX21pZ3JhdGlvbl9yZWFkX2V4Y2x1c2l2ZShlbnRyeSk7XG4rXHR9XG4rXG4rXHRzcGxpdF9odWdlX3BtZF90b19wdGVzKHZtYSwgaGFkZHIsIHBtZCwgXHUwMDI2c3RhdGUpO1xuK31cbitcbitzdGF0aWMgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcG1kX3QgKnBtZCxcbitcdFx0dW5zaWduZWQgbG9uZyBoYWRkciwgYm9vbCBmcmVlemUpXG4re1xuK1x0Y29uc3QgcG1kX3Qgb2xkX3BtZCA9ICpwbWQ7XG4rXHRjb25zdCBib29sIGlzX3ByZXNlbnQgPSBwbWRfcHJlc2VudChvbGRfcG1kKTtcbitcdHN0cnVjdCBmb2xpbyAqZm9saW87XG4rXG4rXHRWTV9CVUdfT04oaGFkZHIgXHUwMDI2IH5IUEFHRV9QTURfTUFTSyk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9zdGFydCBcdTAwM2UgaGFkZHIsIHZtYSk7XG4rXHRWTV9CVUdfT05fVk1BKHZtYS1cdTAwM2V2bV9lbmQgXHUwMDNjIGhhZGRyICsgSFBBR0VfUE1EX1NJWkUsIHZtYSk7XG4rXG4rXHRWTV9XQVJOX09OX09OQ0UoIXBtZF9pc192YWxpZF9zb2Z0bGVhZihvbGRfcG1kKSBcdTAwMjZcdTAwMjZcbitcdFx0XHQhcG1kX3RyYW5zX2h1Z2Uob2xkX3BtZCkpO1xuK1xuK1x0Y291bnRfdm1fZXZlbnQoVEhQX1NQTElUX1BNRCk7XG4rXG4rXHQvKlxuK1x0ICogRklYTUU6IERvIHdlIHdhbnQgdG8gaW52YWxpZGF0ZSBzZWNvbmRhcnkgbW11IGJ5IGNhbGxpbmdcbitcdCAqIG1tdV9ub3RpZmllcl9hcmNoX2ludmFsaWRhdGVfc2Vjb25kYXJ5X3RsYnMoKSBzZWUgY29tbWVudHMgYmVsb3dcbitcdCAqIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kKCkgP1xuK1x0ICpcbitcdCAqIFdlIGFyZSBnb2luZyBmcm9tIGEgemVybyBodWdlIHBhZ2Ugd3JpdGUgcHJvdGVjdGVkIHRvIHplcm8gc21hbGxcbitcdCAqIHBhZ2UgYWxzbyB3cml0ZSBwcm90ZWN0ZWQgc28gaXQgZG9lcyBub3Qgc2VlbXMgdXNlZnVsIHRvIGludmFsaWRhdGVcbitcdCAqIHNlY29uZGFyeSBtbXUgYXQgdGhpcyB0aW1lLlxuK1x0ICovXG4rXHRpZiAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQodm1hLCBvbGRfcG1kKSkge1xuK1x0XHRfX3NwbGl0X2h1Z2VfemVyb19wYWdlX3BtZCh2bWEsIGhhZGRyLCBwbWQpO1xuK1x0XHRyZXR1cm47XG4rXHR9XG4rXG4rXHRmb2xpbyA9IG5vcm1hbF9vcl9zb2Z0bGVhZl9mb2xpb19wbWQodm1hLCBoYWRkciwgb2xkX3BtZCwgaXNfcHJlc2VudCk7XG4rXG4rXHQvKlxuK1x0ICogQSBub24tcHJlc2VudCBlbnRyeSB3aGljaCBpcyBuZWl0aGVyIGEgbWlncmF0aW9uIG5vciBhIGRldmljZVxuK1x0ICogcHJpdmF0ZSBlbnRyeSBpcyBjb3JydXB0LCBhbmQgcG1kX3RvX3NvZnRsZWFmX2ZvbGlvKCkgaGFzIGFscmVhZHlcbitcdCAqIHdhcm5lZCBhYm91dCBpdC4gTGVhdmUgaXQgYWxvbmUgcmF0aGVyIHRoYW4gYWN0IG9uIGEgUEZOIHdoaWNoXG4rXHQgKiBtZWFucyBub3RoaW5nLlxuK1x0ICovXG4rXHRpZiAodW5saWtlbHkoIWlzX3ByZXNlbnQgXHUwMDI2XHUwMDI2ICFmb2xpbykpXG4rXHRcdHJldHVybjtcbitcbitcdGlmICghZm9saW8gfHwgIWZvbGlvX3Rlc3RfYW5vbihmb2xpbykpIHtcbitcdFx0dW5tYXBfaHVnZV9wbWRfZW50cnkodm1hLCBoYWRkciwgcG1kLCBmb2xpbywgaXNfcHJlc2VudCk7XG4rXHRcdHJldHVybjtcbitcdH1cbitcbitcdGlmIChpc19wcmVzZW50KVxuK1x0XHRzcGxpdF9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgZm9saW8sIGZyZWV6ZSk7XG4rXHRlbHNlXG4rXHRcdHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKHZtYSwgaGFkZHIsIHBtZCwgb2xkX3BtZCwgZm9saW8sXG4rXHRcdFx0XHRcdCAgIGZyZWV6ZSk7XG4rfVxuK1xuIHZvaWQgc3BsaXRfaHVnZV9wbWRfbG9ja2VkKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsXG4gXHRcdFx0ICAgcG1kX3QgKnBtZCwgYm9vbCBmcmVlemUpXG4ge1xuIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MTYuNzA3OTUwOTE2WiIsIlNlcSI6MjEsIk5lc3RpbmciOjMsIlR5cGUiOiJsbG0iLCJOYW1lIjoia21zYW4tZXZhbHVhdG9yIiwiTW9kZWwiOiJnZW1pbmktMy43LWZsYXNoIiwiRHVyYXRpb24iOjExMTEzOTI1NDgxLCJFcnJvciI6IiIsIkFyZ3MiOiJudWxsIiwiUmVzdWx0cyI6Im51bGwiLCJJbnN0cnVjdGlvbiI6IiIsIlByb21wdCI6IiIsIlJlcGx5IjoiIiwiVGhvdWdodHMiOiIqKktNU0FOIEFuYWx5c2lzOiBEZXRlcm1pbmluZyBpZiBEZWRpY2F0ZWQgRnV6emluZyBpcyBOZWNlc3NhcnkqKlxuXG5Pa2F5LCBsZXQncyBicmVhayB0aGlzIGRvd24uIE15IGdvYWwgaGVyZSBpcyB0byBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHBhdGNoLCB3aGljaCByZWZhY3RvcnMgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBpbiBgbW0vaHVnZV9tZW1vcnkuY2AsIHJlcXVpcmVzIGEgZGVkaWNhdGVkIEtNU0FOIGZ1enppbmcgc2Vzc2lvbiwgb3IgaWYgd2UgY2FuIHJlbHkgb24gS0FTQU4gYW5kIHN0YW5kYXJkIGRldGVjdG9ycy5cblxuRmlyc3QsIGxldCdzIHJlZnJlc2g6IEtNU0FOIGlzIGRlc2lnbmVkIHRvIGNhdGNoIHJlYWRzIG9mIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGFuZCBrZXJuZWwtdG8tdXNlciBtZW1vcnkgbGVha3MuIEtBU0FOIGhhbmRsZXMgdGhlIHVzdWFsIHN1c3BlY3RzOiBvdXQtb2YtYm91bmRzIGFjY2Vzc2VzLCB1c2UtYWZ0ZXItZnJlZSwgZXRjLiwgYW5kIExPQ0tERVAgaXMgdGhlcmUgZm9yIGxvY2tpbmcgaXNzdWVzLlxuXG5Ob3csIGxvb2tpbmcgYXQgdGhlIHBhdGNoLCBpdCBzZWVtcyBsaWtlIGEgZGVlcCBkaXZlIGludG8gaG93IGh1Z2UgcGFnZSBzcGxpdHRpbmcgaXMgaGFuZGxlZC4gSXQgcmVmYWN0b3JzIHRoZSBgX19zcGxpdF9odWdlX3BtZF9sb2NrZWRgIGZ1bmN0aW9uIGFuZCB0aGUgd2F5IGl0IHdvcmtzIHdpdGggZm9saW9zIGFuZCBwYWdlIHRhYmxlIGVudHJpZXMgKFBNRHMgYW5kIFBURXMpLlxuXG5JIHNlZSB0aGVzZSBrZXkgY2hhbmdlczpcblxuMS4gIEEgY2hlY2ssIGBodWdlX3plcm9fcG1kX2Nhbl9zcGxpdGAsIHRvIGVuc3VyZSB0aGUgUE1EIGlzIGEgemVybyBQTUQgYW5kIHRoZSBWTUEgaXMgYW5vbnltb3VzLlxuMi4gIGB1bm1hcF9odWdlX3BtZF9lbnRyeWAsIHdoaWNoIGNsZWFucyB1cCBodWdlIFBNRCBlbnRyaWVzLCB6ZXJvcyB0YWJsZSBlbnRyaWVzLCBhbmQgZGVhbHMgd2l0aCBmb2xpbyBzdGF0ZSAoZGlydHkvcmVmZXJlbmNlZC9ldGMuKS5cbjMuICBUaGUgaW50cm9kdWN0aW9uIG9mIGBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlYCB0byBlbmNhcHN1bGF0ZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSBzcGxpdHRpbmcgcHJvY2VzcywgaW5jbHVkaW5nIHRoZSBgZm9saW9gLCB3aGV0aGVyIHRoZSBQTUQgaXMgYGlzX3ByZXNlbnRgLCBhcyB3ZWxsIGFzIGZsYWdzIGxpa2UgYHdyaXRlYCwgYHlvdW5nYCwgYGRpcnR5YCwgZXRjLlxuNC4gIEZ1bmN0aW9ucyBsaWtlIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCBhbmQgYHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kYCBpbml0aWFsaXplIHRoZSBgc3BsaXRfcG1kX3N0YXRlYCBzdHJ1Y3R1cmUuIENyaXRpY2FsbHksIHRoZXNlIGluaXRpYWxpemF0aW9ucyB1c2UgQydzIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXIgc3ludGF4IChgPSB7IC4uLiB9YCksIHdoaWNoIG1lYW5zICphbnkqIG1lbWJlcnMgKm5vdCBleHBsaWNpdGx5KiBpbml0aWFsaXplZCB3aWxsIGJlIHplcm9lZC4gU28sIHRoZSBjb21waWxlciBpcyBoYW5kbGluZyB0aGUgZGVmYXVsdCB2YWx1ZXMsIGVuc3VyaW5nIHRoYXQgbm8gbWVtYmVyIG9mIGBzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlYCBoYXMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZS4gVGhlIGBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kYCBzcGVjaWZpY2FsbHkgc2V0cyB0aGUgZmllbGRzIGl0IG5lZWRzLCBhbmQgdGhlIG90aGVycyB1c2UgdGhlIHplcm8taW5pdGlhbGl6YXRpb24uXG5cbiAgICAqICAgRm9yIHRoZSBub24tcHJlc2VudCBjYXNlLCBhbGwgdGhlIGZsYWdzIG5vdCBleHBsaWNpdGx5IHNldCBhcmUgemVyby1pbml0aWFsaXplZC4gQWxzbywgYWRkaXRpb25hbCBmaWVsZHMgYXJlIGV4cGxpY2l0bHkgc2V0IGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBlbnRyeSBpcyBkZXZpY2UtcHJpdmF0ZSBvciBub3QuXG41LiAgYF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkYCBpdHNlbGYgY2hlY2tzIHRoZSBgaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXRgLCBnZXRzIHRoZSBgZm9saW9gLCBhbmQgdGhlbiBjYWxscyBlaXRoZXIgYHVubWFwX2h1Z2VfcG1kX2VudHJ5YCwgYHNwbGl0X3ByZXNlbnRfaHVnZV9wbWRgLCBvciBgc3BsaXRfbm9uX3ByZXNlbnRfaHVnZV9wbWRgLlxuXG5NeSBmb2N1cyBpcyBvbiBwb3RlbnRpYWwgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMsIGxlYWtzIHRvIHVzZXJzcGFjZSwgb3IgcGFkZGluZyBpc3N1ZXMgdGhhdCBjb3VsZCBsZWFkIHRvIHZ1bG5lcmFiaWxpdGllcy5cblxuKiAgIEkgc2VlIHRoYXQgdGhlIGBzcGxpdF9wbWRfc3RhdGVgIHN0cnVjdCBpcyBhbHdheXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRlc2lnbmF0ZWQgaW5pdGlhbGl6ZXI7IHRoaXMgZWxpbWluYXRlcyB0aGUgcmlzayBvZiB1bmluaXRpYWxpemVkIGZpZWxkcy5cbiogICBJIGRvbid0IHNlZSBhbnkgZGlyZWN0IGNvcHlpbmcgb2YgZGF0YSB0byB1c2Vyc3BhY2UgKGBjb3B5X3RvX3VzZXJgLCBldGMuKSwgd2hpY2ggd291bGQgYmUgYSBsZWFrIHJpc2suXG4qICAgVGhlIGNvZGUgbWFuaXB1bGF0ZXMgUE1EIGFuZCBQVEVzLCB3aGljaCBhcmUga2V5IGZvciBUSFAgc3BsaXR0aW5nLiBQb3RlbnRpYWwgbWVtb3J5IHNhZmV0eSBpc3N1ZXMgaGVyZSB3b3VsZCBtYW5pZmVzdCBhcyBpbmNvcnJlY3QgcGFnZSB0YWJsZSBlbnRyaWVzLCByZWZjb3VudGluZyBwcm9ibGVtcyAobGlrZSB1c2UtYWZ0ZXItZnJlZSksIG9yIFRMQiBmbHVzaCBlcnJvcnMg4oCTIGFsbCBvZiB3aGljaCBhcmUgdGhlIGRvbWFpbiBvZiBzdGFuZGFyZCBtbSBhc3NlcnRpb25zLCByZWZjb3VudGluZyBtZWNoYW5pc21zLCBhbmQgS0FTQU4uXG4qICAgQ3J1Y2lhbGx5LCBLTVNBTiAqaXNuJ3QqIGRlc2lnbmVkIHRvIGRldGVjdCBpc3N1ZXMgd2l0aCBwYWdlIHRhYmxlIGVudHJpZXMgdGhlbXNlbHZlcywgYXMgdGhleSBhcmUgbm90IGdlbmVyYWwgdW5pbml0aWFsaXplZCBtZW1vcnkgYnV0IGhhcmR3YXJlIGRlc2NyaXB0b3JzIG9yIHBoeXNpY2FsIGFkZHJlc3Nlcy5cblxuU28sIGxldCdzIHJ1biB0aHJvdWdoIHRoZSBLTVNBTi1zcGVjaWZpYyBjaGVja3M6XG5cbjEuICBLZXJuZWwgc3RydWN0cyBzZW50IHRvIHVzZXJzcGFjZSB3aXRoIHVuaW5pdGlhbGl6ZWQgb3IgcGFkZGluZyBpc3N1ZXM/IE5vLlxuMi4gIENvbmRpdGlvbmFsIGxvZ2ljIHdpdGggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCB2YXJpYWJsZXM/IE5vLlxuMy4gIEFsbG9jYXRpb24gb2YgY29tcGxleCBkYXRhIHN0cnVjdHVyZXMgd2l0aCB1bmluaXRpYWxpemVkIGZpZWxkcz8gTm8g4oCTIGBzcGxpdF9wbWRfc3RhdGVgIGlzIGZ1bGx5IGluaXRpYWxpemVkLCBhbmQgc3RhY2stbG9jYWwuXG40LiAgQm91bmRzIGNoZWNrcyB0aGF0IGNvdWxkIGxlYWQgdG8gYWNjZXNzaW5nIHVuaW5pdGlhbGl6ZWQgYnl0ZXM/IE5vLlxuXG5HaXZlbiB0aGlzIGFuYWx5c2lzLCBhbmQgdGhhdDpcblxuKiAgIFRoZSByaXNrcyBhcmUgcHJpbWFyaWx5IGFib3V0IHBhZ2UgdGFibGUgaGFuZGxpbmcsIHJlZmNvdW50aW5nLCBhbmQgZ2VuZXJhbCBtZW1vcnkgbWFuYWdlbWVudCBidWdzLCBhbGwgY2F1Z2h0IGJ5IEtBU0FOLCBMT0NLREVQIGFuZCBgVk1fQlVHX09OYC5cbiogICBBbGwgc3RhY2sgc3RydWN0dXJlcyBhcmUgKmZ1bGx5KiBpbml0aWFsaXplZC5cbiogICBUaGVyZSdzIG5vIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHVzYWdlIG9yIGluZm8tbGVhayByaXNrLlxuXG5JIGFtIGNvbmZpZGVudCB0aGF0IGBOZWVkc0tNU0FOPWZhbHNlYCBmb3IgdGhpcyBwYXRjaC4gSSdsbCB2ZXJpZnkgdGhlIHRvb2xzIGFuZCB0aGVuIGNhbGwgYHNldC1yZXN1bHRzYC5cblxuXG4iLCJJbnB1dFRva2VucyI6OTY2NSwiT3V0cHV0VG9rZW5zIjoyNjYsIk91dHB1dFRob3VnaHRzVG9rZW5zIjoxNTc2LCJUb29sQ2FsbHMiOm51bGx9LHsiU3RhcnRlZCI6IjIwMjYtMDgtMjhUMTk6NDA6MjcuODIxODc4NjE3WiIsIlNlcSI6MjIsIk5lc3RpbmciOjMsIlR5cGUiOiJ0b29sIiwiTmFtZSI6InNldC1yZXN1bHRzIiwiTW9kZWwiOiIiLCJEdXJhdGlvbiI6MTc5NDAsIkVycm9yIjoiIiwiQXJncyI6IntcbiAgXCJLTVNBTlJlYXNvbmluZ1wiOiBcIlRoZSBwYXRjaCByZWZhY3RvcnMgaHVnZSBQTUQgc3BsaXR0aW5nIGxvZ2ljIChfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCkgaW4gbW0vaHVnZV9tZW1vcnkuYyBieSBicmVha2luZyBpdCBkb3duIGludG8gaGVscGVyIGZ1bmN0aW9ucyAoaHVnZV96ZXJvX3BtZF9jYW5fc3BsaXQsIHVubWFwX2h1Z2VfcG1kX2VudHJ5LCBzcGxpdF9odWdlX3BtZF90b19wdGVzLCBzcGxpdF9wcmVzZW50X2h1Z2VfcG1kLCBzcGxpdF9ub25fcHJlc2VudF9odWdlX3BtZCkgYW5kIGdyb3VwaW5nIFBNRCBzcGxpdCBwYXJhbWV0ZXJzIGluIGEgbG9jYWwgc3RhY2sgc3RydWN0dXJlIChzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlKS5cXG5cXG5BbGwgaW5zdGFuY2VzIG9mICdzdHJ1Y3Qgc3BsaXRfcG1kX3N0YXRlJyBhcmUgc3RhY2stYWxsb2NhdGVkIHdpdGggZGVzaWduYXRlZCBpbml0aWFsaXplcnMsIGVuc3VyaW5nIGFsbCB1bnNldCBmaWVsZHMgYXJlIHplcm8taW5pdGlhbGl6ZWQuIFRoZXJlIGFyZSBubyBrZXJuZWwtdG8tdXNlciBjb3B5IG9wZXJhdGlvbnMgKGUuZy4sIGNvcHlfdG9fdXNlciksIG5vIHVuaW5pdGlhbGl6ZWQgaGVhcCBvciBzdGFjayB2YXJpYWJsZXMgcmVhZCBvciBicmFuY2hlZCBvbiwgYW5kIG5vIGluZm8tbGVhayByaXNrcy4gQW55IG1lbW9yeSBtYW5hZ2VtZW50IG9yIHN5bmNocm9uaXphdGlvbiBpc3N1ZXMgaW4gdGhpcyBjb2RlIHBhdGggKHN1Y2ggYXMgZm9saW8gcmVmY291bnRpbmcsIHJtYXAgbWFuYWdlbWVudCwgVExCIGludmFsaWRhdGlvbiwgb3IgVUFGKSBhcmUgY2F1Z2h0IGJ5IHN0YW5kYXJkIEtBU0FOLCBWTV9CVUdfT04gYXNzZXJ0aW9ucywgYW5kIHN0YW5kYXJkIHNhbml0aXplcnMuIFRoZXJlZm9yZSwgYSBkZWRpY2F0ZWQgS01TQU4gc2Vzc2lvbiBpcyBub3QgbmVlZGVkLlwiLFxuICBcIk5lZWRzS01TQU5cIjogZmFsc2Vcbn0iLCJSZXN1bHRzIjoie1xuICBcIktNU0FOUmVhc29uaW5nXCI6IFwiVGhlIHBhdGNoIHJlZmFjdG9ycyBodWdlIFBNRCBzcGxpdHRpbmcgbG9naWMgKF9fc3BsaXRfaHVnZV9wbWRfbG9ja2VkKSBpbiBtbS9odWdlX21lbW9yeS5jIGJ5IGJyZWFraW5nIGl0IGRvd24gaW50byBoZWxwZXIgZnVuY3Rpb25zIChodWdlX3plcm9fcG1kX2Nhbl9zcGxpdCwgdW5tYXBfaHVnZV9wbWRfZW50cnksIHNwbGl0X2h1Z2VfcG1kX3RvX3B0ZXMsIHNwbGl0X3ByZXNlbnRfaHVnZV9wbWQsIHNwbGl0X25vbl9wcmVzZW50X2h1Z2VfcG1kKSBhbmQgZ3JvdXBpbmcgUE1EIHNwbGl0IHBhcmFtZXRlcnMgaW4gYSBsb2NhbCBzdGFjayBzdHJ1Y3R1cmUgKHN0cnVjdCBzcGxpdF9wbWRfc3RhdGUpLlxcblxcbkFsbCBpbnN0YW5jZXMgb2YgJ3N0cnVjdCBzcGxpdF9wbWRfc3RhdGUnIGFyZSBzdGFjay1hbGxvY2F0ZWQgd2l0aCBkZXNpZ25hdGVkIGluaXRpYWxpemVycywgZW5zdXJpbmcgYWxsIHVuc2V0IGZpZWxkcyBhcmUgemVyby1pbml0aWFsaXplZC4gVGhlcmUgYXJlIG5vIGtlcm5lbC10by11c2VyIGNvcHkgb3BlcmF0aW9ucyAoZS5nLiwgY29weV90b191c2VyKSwgbm8gdW5pbml0aWFsaXplZCBoZWFwIG9yIHN0YWNrIHZhcmlhYmxlcyByZWFkIG9yIGJyYW5jaGVkIG9uLCBhbmQgbm8gaW5mby1sZWFrIHJpc2tzLiBBbnkgbWVtb3J5IG1hbmFnZW1lbnQgb3Igc3luY2hyb25pemF0aW9uIGlzc3VlcyBpbiB0aGlzIGNvZGUgcGF0aCAoc3VjaCBhcyBmb2xpbyByZWZjb3VudGluZywgcm1hcCBtYW5hZ2VtZW50LCBUTEIgaW52YWxpZGF0aW9uLCBvciBVQUYpIGFyZSBjYXVnaHQgYnkgc3RhbmRhcmQgS0FTQU4sIFZNX0JVR19PTiBhc3NlcnRpb25zLCBhbmQgc3RhbmRhcmQgc2FuaXRpemVycy4gVGhlcmVmb3JlLCBhIGRlZGljYXRlZCBLTVNBTiBzZXNzaW9uIGlzIG5vdCBuZWVkZWQuXCIsXG4gIFwiTmVlZHNLTVNBTlwiOiBmYWxzZVxufSIsIkluc3RydWN0aW9uIjoiIiwiUHJvbXB0IjoiIiwiUmVwbHkiOiIiLCJUaG91Z2h0cyI6IiIsIklucHV0VG9rZW5zIjowLCJPdXRwdXRUb2tlbnMiOjAsIk91dHB1dFRob3VnaHRzVG9rZW5zIjowLCJUb29sQ2FsbHMiOm51bGx9XTsKCQkJaWYgKCFyYXdEYXRhIHx8IHJhd0RhdGEubGVuZ3RoID09PSAwKSByZXR1cm47CgoJCQlkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKTsKCQkJZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSk7CgkJCWRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSk7CgkJfQoKCQlmdW5jdGlvbiBkcmF3U3VtbWFyeVRhYmxlcyhyYXdEYXRhKSB7CgkJCWNvbnN0IHN0YXRzID0gewoJCQkJbGxtOiB7IGNvdW50OiAwLCB0b2tlbnM6IDAsIGR1cmF0aW9uOiAwIH0sCgkJCQl0b29sOiB7IGNvdW50OiAwLCBkdXJhdGlvbjogMCB9CgkJCX07CgoJCQlyYXdEYXRhLmZvckVhY2gocyA9PiB7CgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsgCgkJCQlpZiAocy5UeXBlID09PSAibGxtIikgewoJCQkJCXN0YXRzLmxsbS5jb3VudCsrOwoJCQkJCXN0YXRzLmxsbS50b2tlbnMgKz0gKHMuSW5wdXRUb2tlbnMgKyBzLk91dHB1dFRva2VucyArIHMuT3V0cHV0VGhvdWdodHNUb2tlbnMpOwoJCQkJCXN0YXRzLmxsbS5kdXJhdGlvbiArPSBkdXI7CgkJCQl9IGVsc2UgaWYgKHMuVHlwZSA9PT0gInRvb2wiKSB7CgkJCQkJc3RhdHMudG9vbC5jb3VudCsrOwoJCQkJCXN0YXRzLnRvb2wuZHVyYXRpb24gKz0gZHVyOwoJCQkJfQoJCQl9KTsKCgkJCWNvbnN0IGF2Z0xsbUR1ciA9IHN0YXRzLmxsbS5jb3VudCA+IDAgPyAoc3RhdHMubGxtLmR1cmF0aW9uIC8gc3RhdHMubGxtLmNvdW50KS50b0ZpeGVkKDIpIDogMDsKCQkJY29uc3QgYXZnTGxtVG9rZW4gPSBzdGF0cy5sbG0uY291bnQgPiAwID8gKHN0YXRzLmxsbS50b2tlbnMgLyBzdGF0cy5sbG0uY291bnQpLnRvRml4ZWQoMikgOiAwOwoJCQljb25zdCBhdmdUb29sRHVyID0gc3RhdHMudG9vbC5jb3VudCA+IDAgPyAoc3RhdHMudG9vbC5kdXJhdGlvbiAvIHN0YXRzLnRvb2wuY291bnQpLnRvRml4ZWQoMikgOiAwOwoKCQkJY29uc3QgbGxtU3VtYXJ5Q2VsbHMgPSBbc3RhdHMubGxtLmNvdW50LCBzdGF0cy5sbG0udG9rZW5zLCBhdmdMbG1Ub2tlbiwgc3RhdHMubGxtLmR1cmF0aW9uLCBhdmdMbG1EdXJdOwoJCQljb25zdCB0b29sU3VtbWFyeUNlbGxzID0gW3N0YXRzLnRvb2wuY291bnQsIHN0YXRzLnRvb2wuZHVyYXRpb24sIGF2Z1Rvb2xEdXJdOwoKCQkJY29uc3QgbGxtU3VtbWFyeUJvZHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGxtX3N1bW1hcnlfc3RhdHNfYm9keScpOwoJCQlsbG1TdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgbGxtVHIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwoJCQlsbG1TdW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJbGxtVHIuYXBwZW5kQ2hpbGQodGQpOwoJCQl9KTsKCQkJbGxtU3VtbWFyeUJvZHkuYXBwZW5kQ2hpbGQobGxtVHIpOwoKCQkJY29uc3QgdG9vbFN1bW1hcnlCb2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rvb2xfc3VtbWFyeV9zdGF0c19ib2R5Jyk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5pbm5lckhUTUwgPSAiIjsKCQkJY29uc3QgdG9vbFRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKCQkJdG9vbFN1bW1hcnlDZWxscy5mb3JFYWNoKGNlbGwgPT4gewoJCQkJY29uc3QgdGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwoJCQkJdGQudGV4dENvbnRlbnQgPSBjZWxsOwoJCQkJdG9vbFRyLmFwcGVuZENoaWxkKHRkKTsKCQkJfSk7CgkJCXRvb2xTdW1tYXJ5Qm9keS5hcHBlbmRDaGlsZCh0b29sVHIpOwoJCX0KCgkJZnVuY3Rpb24gZHJhd0R1cmF0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBmaWx0ZXJlZFN0ZXBzID0gcmF3RGF0YS5maWx0ZXIoZCA9PiBbImxsbSIsICJ0b29sIl0uaW5jbHVkZXMoZC5UeXBlKSk7CgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ0R1cmF0aW9uJyk7CgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7IAoKCQkJZmlsdGVyZWRTdGVwcy5mb3JFYWNoKHMgPT4gewoJCQkJCgkJCQljb25zdCBkdXIgPSBzLkR1cmF0aW9uIC8gMTAwMDAwMDAwMDsKCQkJCWxldCB0b29sdGlwID0gcy5OYW1lOwoJCQkJaWYgKHMuVHlwZSA9PT0gImxsbSIgJiYgcy5Ub29sQ2FsbHMgJiYgcy5Ub29sQ2FsbHMubGVuZ3RoID4gMCkgewoJCQkJCXRvb2x0aXAgKz0gYFxuVG9vbHM6ICR7cy5Ub29sQ2FsbHMuam9pbignLCAnKX1gOwoJCQkJfQoJCQkJZGF0YS5hZGRSb3coW2Ake3MuU2VxfWAsIGR1ciwgdG9vbHRpcF0pOwoJCQl9KTsKCgkJCWNvbnN0IG9wdGlvbnMgPSB7CgkJCQl0aXRsZTogJ1RpbWUgQ29uc3VtcHRpb24gb2YgTExNL1Rvb2wgQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTS9Ub29sIFN0ZXBzJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ1NlY29uZHMnIH0sCgkJCQlsZWdlbmQ6IHsgcG9zaXRpb246ICdub25lJyB9LAoJCQkJYmFyOiB7IGdyb3VwV2lkdGg6ICc3NSUnIH0sCgkJCQljaGFydEFyZWE6IHsgd2lkdGg6ICc4NSUnLCBoZWlnaHQ6ICc3MCUnIH0sCgkJCQloZWlnaHQ6IDQwMAoJCQl9OwoKCQkJY29uc3QgY2hhcnQgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uQ29sdW1uQ2hhcnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2R1cmF0aW9uX2NoYXJ0X2RpdicpKTsKCQkJY2hhcnQuZHJhdyhkYXRhLCBvcHRpb25zKTsKCQl9CgoJCWZ1bmN0aW9uIGRyYXdUb2tlbkNvbnN1bXB0aW9uQ2hhcnQocmF3RGF0YSkgewoJCQljb25zdCBsbG1TdGVwcyA9IHJhd0RhdGEuZmlsdGVyKGQgPT4gZC5UeXBlID09PSAibGxtIik7CgkJCWlmIChsbG1TdGVwcy5sZW5ndGggPT09IDApIHJldHVybjsKCgkJCWNvbnN0IGRhdGEgPSBuZXcgZ29vZ2xlLnZpc3VhbGl6YXRpb24uRGF0YVRhYmxlKCk7CgkJCWRhdGEuYWRkQ29sdW1uKCdzdHJpbmcnLCAnU3RlcCcpOwkJCQoJCQlkYXRhLmFkZENvbHVtbignbnVtYmVyJywgJ1Rva2VucycpOwkJCQoJCQlkYXRhLmFkZENvbHVtbih7dHlwZTogJ3N0cmluZycsIHJvbGU6ICdzdHlsZSd9KTsJCgkJCWRhdGEuYWRkQ29sdW1uKHt0eXBlOiAnc3RyaW5nJywgcm9sZTogJ3Rvb2x0aXAnfSk7CQoKCQkJY29uc3QgYWdlbnRDb2xvcnMgPSB7fTsKCQkJY29uc3QgcGFsZXR0ZSA9IFsnIzQyODVGNCcsICcjREI0NDM3JywgJyNGNEI0MDAnLCAnIzBGOUQ1OCcsICcjQUI0N0JDJywgJyMwMEFDQzEnXTsKCQkJbGV0IGNvbG9ySWR4ID0gMDsKCQkJY29uc3QgYWdlbnRMTE1Db3VudHMgPSB7fTsKCQkJbGxtU3RlcHMuZm9yRWFjaChzID0+IHsKCQkJCWlmICghYWdlbnRDb2xvcnNbcy5OYW1lXSkgewoJCQkJCWFnZW50Q29sb3JzW3MuTmFtZV0gPSBwYWxldHRlW2NvbG9ySWR4ICUgcGFsZXR0ZS5sZW5ndGhdOwoJCQkJCWNvbG9ySWR4Kys7CgkJCQl9CgoJCQkJYWdlbnRMTE1Db3VudHNbcy5OYW1lXSA9IChhZ2VudExMTUNvdW50c1tzLk5hbWVdIHx8IDApICsgMTsKCQkJCWNvbnN0IGxhYmVsID0gYCR7cy5OYW1lfS0ke2FnZW50TExNQ291bnRzW3MuTmFtZV19YDsKCQkJCWNvbnN0IHRvdGFsVG9rZW5zID0gcy5JbnB1dFRva2VucyArIHMuT3V0cHV0VG9rZW5zICsgcy5PdXRwdXRUaG91Z2h0c1Rva2VuczsKCQkJCWNvbnN0IHN0eWxlID0gYGNvbG9yOiAke2FnZW50Q29sb3JzW3MuTmFtZV19YDsKCQkJCWxldCB0b29sdGlwID0gYFRvdGFsIFRva2VuczogJHt0b3RhbFRva2Vuc31cbihJbjogJHtzLklucHV0VG9rZW5zfSwgT3V0OiAke3MuT3V0cHV0VG9rZW5zfSwgVGhvdWdodHM6ICR7cy5PdXRwdXRUaG91Z2h0c1Rva2Vuc30pYDsKCQkJCWlmIChzLlRvb2xDYWxscyAmJiBzLlRvb2xDYWxscy5sZW5ndGggPiAwKSB7CgkJCQkJdG9vbHRpcCArPSBgXG5Ub29sczogJHtzLlRvb2xDYWxscy5qb2luKCcsICcpfWA7CgkJCQl9CgoJCQkJZGF0YS5hZGRSb3coW2xhYmVsLCB0b3RhbFRva2Vucywgc3R5bGUsIHRvb2x0aXBdKTsKCQkJfSk7CgoJCQljb25zdCBvcHRpb25zID0gewoJCQkJdGl0bGU6ICdUb2tlbiBDb25zdW1wdGlvbiBieSBMTE0gQ2FsbHMnLAoJCQkJaEF4aXM6IHsKCQkJCQl0aXRsZTogJ0xMTSBDYWxsIFNlcXVlbmNlJywKCQkJCX0sCgkJCQl2QXhpczogeyB0aXRsZTogJ0NvbnN1bWVkIFRva2VucycgfSwKCQkJCWxlZ2VuZDogeyBwb3NpdGlvbjogJ25vbmUnIH0sCgkJCQliYXI6IHsgZ3JvdXBXaWR0aDogJzc1JScgfSwKCQkJCWNoYXJ0QXJlYTogeyB3aWR0aDogJzg1JScsIGhlaWdodDogJzcwJScgfSwKCQkJCWhlaWdodDogNDAwCgkJCX07CgoJCQljb25zdCBjaGFydCA9IG5ldyBnb29nbGUudmlzdWFsaXphdGlvbi5Db2x1bW5DaGFydChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndG9rZW5fY2hhcnRfZGl2JykpOwoJCQljaGFydC5kcmF3KGRhdGEsIG9wdGlvbnMpOwoJCX0KCQlsZXQgYWxsRXhwYW5kZWQgPSBmYWxzZTsKCQlmdW5jdGlvbiB0b2dnbGVBbGxEZXRhaWxzKCkgewoJCQlhbGxFeHBhbmRlZCA9ICFhbGxFeHBhbmRlZDsKCQkJZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnZGV0YWlscycpLmZvckVhY2goZCA9PiB7CgkJCQlpZiAoYWxsRXhwYW5kZWQpIGQuc2V0QXR0cmlidXRlKCdvcGVuJywgJycpOwoJCQkJZWxzZSBkLnJlbW92ZUF0dHJpYnV0ZSgnb3BlbicpOwoJCQl9KTsKCQl9Cgk8L3NjcmlwdD4KCgo8L2JvZHk+CjwvaHRtbD4K" },ValueFrom:&ValueFrom{Path:/output/result.json,JSONPath:,JQFilter:,Parameter:,Default:nil,Supplied:nil,Event:,Expression:,ConfigMapKeyRef:nil,},GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[1] Phase: Succeeded StartedAt: 2026-08-28 19:40:39 +0000 UTC FinishedAt: 2026-08-28 19:40:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[1].abort-on-skip-outcome Phase: Skipped StartedAt: 2026-08-28 19:40:39 +0000 UTC FinishedAt: 2026-08-28 19:40:39 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2] Phase: Succeeded StartedAt: 2026-08-28 19:40:39 +0000 UTC FinishedAt: 2026-08-28 23:20:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN) Phase: Succeeded StartedAt: 2026-08-28 19:40:39 +0000 UTC FinishedAt: 2026-08-28 23:20:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:element,Default:nil,Value:*{"base":{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"fuzz":{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},"patched":{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},"retest":null,"track":"KASAN"},ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},},Artifacts:[]Artifact{},} Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0] Phase: Succeeded StartedAt: 2026-08-28 19:40:39 +0000 UTC FinishedAt: 2026-08-28 19:40:49 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[0].save-base-req Phase: Succeeded StartedAt: 2026-08-28 19:40:39 +0000 UTC FinishedAt: 2026-08-28 19:40:43 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowbr8cb/series-workflowbr8cb-convert-artifact-2464681583/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1] Phase: Succeeded StartedAt: 2026-08-28 19:40:49 +0000 UTC FinishedAt: 2026-08-28 19:56:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build Phase: Succeeded StartedAt: 2026-08-28 19:40:49 +0000 UTC FinishedAt: 2026-08-28 19:56:52 +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:*a0d90d8d-7d7e-409e-90fa-a0707734aca1,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-workflowbr8cb/series-workflowbr8cb-convert-artifact-2464681583/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": "fda1a95d-4042-4592-8c68-7d9629d3e131", "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-workflowbr8cb/series-workflowbr8cb-build-action-182897461/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[1].base-build(0) Phase: Succeeded StartedAt: 2026-08-28 19:40:49 +0000 UTC FinishedAt: 2026-08-28 19:56:42 +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:*a0d90d8d-7d7e-409e-90fa-a0707734aca1,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-workflowbr8cb/series-workflowbr8cb-convert-artifact-2464681583/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": "fda1a95d-4042-4592-8c68-7d9629d3e131", "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-workflowbr8cb/series-workflowbr8cb-build-action-182897461/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2] Phase: Succeeded StartedAt: 2026-08-28 19:56:52 +0000 UTC FinishedAt: 2026-08-28 19:56:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[2].abort-if-base-build-failed Phase: Skipped StartedAt: 2026-08-28 19:56:52 +0000 UTC FinishedAt: 2026-08-28 19:56:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3] Phase: Succeeded StartedAt: 2026-08-28 19:56:52 +0000 UTC FinishedAt: 2026-08-28 19:57:02 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[3].save-patched-req Phase: Succeeded StartedAt: 2026-08-28 19:56:52 +0000 UTC FinishedAt: 2026-08-28 19:56:57 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.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-workflowbr8cb/series-workflowbr8cb-convert-artifact-3658746046/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4] Phase: Succeeded StartedAt: 2026-08-28 19:57:02 +0000 UTC FinishedAt: 2026-08-28 19:58:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[4].boot-test-base Phase: Succeeded StartedAt: 2026-08-28 19:57:02 +0000 UTC FinishedAt: 2026-08-28 19:58:49 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*fda1a95d-4042-4592-8c68-7d9629d3e131,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-workflowbr8cb/series-workflowbr8cb-build-action-182897461/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-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5] Phase: Succeeded StartedAt: 2026-08-28 19:58:59 +0000 UTC FinishedAt: 2026-08-28 19:58:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[5].abort-if-base-boot-failed Phase: Skipped StartedAt: 2026-08-28 19:58:59 +0000 UTC FinishedAt: 2026-08-28 19:58:59 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6] Phase: Succeeded StartedAt: 2026-08-28 19:58:59 +0000 UTC FinishedAt: 2026-08-28 20:15:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build Phase: Succeeded StartedAt: 2026-08-28 19:58:59 +0000 UTC FinishedAt: 2026-08-28 20:15:43 +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:*a0d90d8d-7d7e-409e-90fa-a0707734aca1,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-workflowbr8cb/series-workflowbr8cb-convert-artifact-3658746046/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": "41033fb2-b3e0-42c8-9da9-80bfa70ae462", "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-workflowbr8cb/series-workflowbr8cb-build-action-1416544786/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[6].patched-build(0) Phase: Succeeded StartedAt: 2026-08-28 19:58:59 +0000 UTC FinishedAt: 2026-08-28 20:15:33 +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:*a0d90d8d-7d7e-409e-90fa-a0707734aca1,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-workflowbr8cb/series-workflowbr8cb-convert-artifact-3658746046/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": "41033fb2-b3e0-42c8-9da9-80bfa70ae462", "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-workflowbr8cb/series-workflowbr8cb-build-action-1416544786/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7] Phase: Succeeded StartedAt: 2026-08-28 20:15:43 +0000 UTC FinishedAt: 2026-08-28 20:15:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[7].abort-if-patched-build-failed Phase: Skipped StartedAt: 2026-08-28 20:15:43 +0000 UTC FinishedAt: 2026-08-28 20:15:43 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8] Phase: Succeeded StartedAt: 2026-08-28 20:15:43 +0000 UTC FinishedAt: 2026-08-28 20:17:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[8].boot-test-patched Phase: Succeeded StartedAt: 2026-08-28 20:15:43 +0000 UTC FinishedAt: 2026-08-28 20:17:32 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*41033fb2-b3e0-42c8-9da9-80bfa70ae462,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-workflowbr8cb/series-workflowbr8cb-build-action-1416544786/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-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10] Phase: Succeeded StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 23:20:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz Phase: Succeeded StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 23:20:48 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:config,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"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:*fda1a95d-4042-4592-8c68-7d9629d3e131,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*41033fb2-b3e0-42c8-9da9-80bfa70ae462,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-workflowbr8cb/series-workflowbr8cb-build-action-182897461/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-workflowbr8cb/series-workflowbr8cb-build-action-1416544786/kernel.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:true,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},} Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0] Phase: Succeeded StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 20:17:52 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[0].save-fuzz-config Phase: Succeeded StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 20:17:46 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:data,Default:nil,Value:*{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"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-workflowbr8cb/series-workflowbr8cb-convert-artifact-2727387331/artifact.tgz,},Azure:nil,},GlobalName:,Archive:nil,Optional:false,SubPath:,RecurseMode:false,FromExpression:,ArtifactGC:nil,Deleted:false,},},Result:nil,ExitCode:*0,} --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-retest Phase: Skipped StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 20:17:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9] Phase: Succeeded StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 20:17:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[9].abort-if-patched-boot-failed Phase: Skipped StartedAt: 2026-08-28 20:17:42 +0000 UTC FinishedAt: 2026-08-28 20:17:42 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1] Phase: Succeeded StartedAt: 2026-08-28 20:17:52 +0000 UTC FinishedAt: 2026-08-28 23:20:48 +0000 UTC Input: nil Output: nil --------- Name: series-workflowbr8cb[2].run-process-target(0:base:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},fuzz:{"bug_title_re":"","corpus_urls":["https://storage.googleapis.com/syzkaller/corpus/ci-upstream-kasan-gce-root-corpus.db"],"focus":null,"focus_symbols":["split_huge_pmd_locked","__split_huge_pmd","split_huge_pmd_address"],"skip_cover_check":true},patched:{"arch":"amd64","commit_hash":"9549574e05b39f39a13cd435facb8e4573a1ba85","config_name":"upstream-apparmor-kasan.config","enable_configs":["TRANSPARENT_HUGEPAGE","DEVICE_PRIVATE","USERFAULTFD"],"series_id":"6a7474e2-2659-47eb-874f-5e7d148f0d7c","tree_name":"mm-new","tree_url":"https://kernel.googlesource.com/pub/scm/linux/kernel/git/akpm/mm.git"},retest:null,track:KASAN)[10].run-fuzz[1].fuzz Phase: Succeeded StartedAt: 2026-08-28 20:17:52 +0000 UTC FinishedAt: 2026-08-28 23:20:38 +0000 UTC Input: &Inputs{Parameters:[]Parameter{Parameter{Name:base-build-id,Default:nil,Value:*fda1a95d-4042-4592-8c68-7d9629d3e131,ValueFrom:nil,GlobalName:,Enum:[],Description:nil,},Parameter{Name:patched-build-id,Default:nil,Value:*41033fb2-b3e0-42c8-9da9-80bfa70ae462,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-workflowbr8cb/series-workflowbr8cb-build-action-182897461/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-workflowbr8cb/series-workflowbr8cb-build-action-1416544786/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-workflowbr8cb/series-workflowbr8cb-convert-artifact-2727387331/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,}