From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joonas Lahtinen Subject: [PATCH v3] drm/i915: Split out i915_vma.c Date: Fri, 11 Nov 2016 10:59:55 +0200 Message-ID: <1478854795-18914-1-git-send-email-joonas.lahtinen@linux.intel.com> References: <1478768144-11087-1-git-send-email-joonas.lahtinen@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id 064FA6E1E6 for ; Fri, 11 Nov 2016 09:00:01 +0000 (UTC) In-Reply-To: <1478768144-11087-1-git-send-email-joonas.lahtinen@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel graphics driver community testing & development List-Id: intel-gfx@lists.freedesktop.org QXMgYSBzaWRlIHByb2R1Y3QsIGhhZCB0byBzcGxpdCB0d28gb3RoZXIgZmlsZXM7Ci0gaTkxNV9n ZW1fZmVuY2VfcmVnLmgKLSBpOTE1X2dlbV9vYmplY3QuaCAob25seSBwYXJ0cyB0aGF0IG5lZWRl ZCBpbW1lZGlhdGUgdW50YW5nbGVtZW50KQoKSSB0cmllZCB0byBtb3ZlIGNvZGUgaW4gYXMgYmln IGNodW5rcyBhcyBwb3NzaWJsZSwgdG8gbWFrZSByZXZpZXcKZWFzaWVyLiBpOTE1X3ZtYV9jb21w YXJlIHdhcyBtb3ZlZCB0byBhIGhlYWRlciB0ZW1wb3JhcmlseS4KCnYyOgotIFVzZSBpOTE1X2dl bV9mZW5jZV9yZWcue2MsaH0KCnYzOgotIFJlYmFzZWQKCkNjOiBUdnJ0a28gVXJzdWxpbiA8dHZy dGtvLnVyc3VsaW5AaW50ZWwuY29tPgpDYzogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxz b24uY28udWs+CkFja2VkLWJ5OiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51 az4KU2lnbmVkLW9mZi1ieTogSm9vbmFzIExhaHRpbmVuIDxqb29uYXMubGFodGluZW5AbGludXgu aW50ZWwuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlICAgICAgICAgICAg IHwgICAzICstCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oICAgICAgICAgICB8IDM4 NSArLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jICAgICAg ICAgICB8IDM3MSAtLS0tLS0tLS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dl bV9mZW5jZS5jICAgICB8IDcxNiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5jIHwgNzE2ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVn LmggfCAgNTEgKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyAgICAgICB8 IDI3NyArLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oICAg ICAgIHwgMjI1ICstLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVj dC5oICAgIHwgMzM3ICsrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dl bV9yZXF1ZXN0LmggICB8ICAgMyArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5jICAg ICAgICAgICB8IDY1MCArKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfdm1hLmggICAgICAgICAgIHwgMzQyICsrKysrKysrKysrKysrCiAxMiBmaWxl cyBjaGFuZ2VkLCAyMTIwIGluc2VydGlvbnMoKyksIDE5NTYgZGVsZXRpb25zKC0pCiBkZWxldGUg bW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2UuYwogY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5jCiBj cmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVn LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmpl Y3QuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5oCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9NYWtlZmlsZQppbmRleCAwODU3ZTUwLi4zZGVhNDZhIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmls ZQpAQCAtMzMsNyArMzMsNyBAQCBpOTE1LXkgKz0gaTkxNV9jbWRfcGFyc2VyLm8gXAogCSAgaTkx NV9nZW1fZG1hYnVmLm8gXAogCSAgaTkxNV9nZW1fZXZpY3QubyBcCiAJICBpOTE1X2dlbV9leGVj YnVmZmVyLm8gXAotCSAgaTkxNV9nZW1fZmVuY2UubyBcCisJICBpOTE1X2dlbV9mZW5jZV9yZWcu byBcCiAJICBpOTE1X2dlbV9ndHQubyBcCiAJICBpOTE1X2dlbV9pbnRlcm5hbC5vIFwKIAkgIGk5 MTVfZ2VtLm8gXApAQCAtNDUsNiArNDUsNyBAQCBpOTE1LXkgKz0gaTkxNV9jbWRfcGFyc2VyLm8g XAogCSAgaTkxNV9nZW1fdGltZWxpbmUubyBcCiAJICBpOTE1X2dlbV91c2VycHRyLm8gXAogCSAg aTkxNV90cmFjZV9wb2ludHMubyBcCisJICBpOTE1X3ZtYS5vIFwKIAkgIGludGVsX2JyZWFkY3J1 bWJzLm8gXAogCSAgaW50ZWxfZW5naW5lX2NzLm8gXAogCSAgaW50ZWxfaGFuZ2NoZWNrLm8gXApk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggMzA3NzdkZS4uY2NkMDM2MSAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X2Rydi5oCkBAIC02MCwxMSArNjAsMTUgQEAKICNpbmNsdWRlICJpbnRlbF9yaW5nYnVm ZmVyLmgiCiAKICNpbmNsdWRlICJpOTE1X2dlbS5oIgorI2luY2x1ZGUgImk5MTVfZ2VtX2ZlbmNl X3JlZy5oIgorI2luY2x1ZGUgImk5MTVfZ2VtX29iamVjdC5oIgogI2luY2x1ZGUgImk5MTVfZ2Vt X2d0dC5oIgogI2luY2x1ZGUgImk5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5oIgogI2luY2x1ZGUgImk5 MTVfZ2VtX3JlcXVlc3QuaCIKICNpbmNsdWRlICJpOTE1X2dlbV90aW1lbGluZS5oIgogCisjaW5j bHVkZSAiaTkxNV92bWEuaCIKKwogI2luY2x1ZGUgImludGVsX2d2dC5oIgogCiAvKiBHZW5lcmFs IGN1c3RvbWl6YXRpb246CkBAIC00NTksMjMgKzQ2Myw2IEBAIHN0cnVjdCBpbnRlbF9vcHJlZ2lv biB7CiBzdHJ1Y3QgaW50ZWxfb3ZlcmxheTsKIHN0cnVjdCBpbnRlbF9vdmVybGF5X2Vycm9yX3N0 YXRlOwogCi1zdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxp bms7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTU7Ci0Jc3RydWN0IGk5MTVfdm1hICp2 bWE7Ci0JaW50IHBpbl9jb3VudDsKLQlpbnQgaWQ7Ci0JLyoqCi0JICogV2hldGhlciB0aGUgdGls aW5nIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50bHkKLQkgKiBhc3NvY2lhdGVkIGZlbmNlIHJl Z2lzdGVyIGhhdmUgY2hhbmdlZC4gTm90ZSB0aGF0Ci0JICogZm9yIHRoZSBwdXJwb3NlcyBvZiB0 cmFja2luZyB0aWxpbmcgY2hhbmdlcyB3ZSBhbHNvCi0JICogdHJlYXQgdGhlIHVuZmVuY2VkIHJl Z2lzdGVyLCB0aGUgcmVnaXN0ZXIgc2xvdCB0aGF0Ci0JICogdGhlIG9iamVjdCBvY2N1cGllcyB3 aGlsc3QgaXQgZXhlY3V0ZXMgYSBmZW5jZWQKLQkgKiBjb21tYW5kIChzdWNoIGFzIEJMVCBvbiBn ZW4yLzMpLCBhcyBhICJmZW5jZSIuCi0JICovCi0JYm9vbCBkaXJ0eTsKLX07Ci0KIHN0cnVjdCBz ZHZvX2RldmljZV9tYXBwaW5nIHsKIAl1OCBpbml0aWFsaXplZDsKIAl1OCBkdm9fcG9ydDsKQEAg LTIxNzksMzEgKzIxNjYsNiBAQCBlbnVtIGhkbWlfZm9yY2VfYXVkaW8gewogCiAjZGVmaW5lIEk5 MTVfR1RUX09GRlNFVF9OT05FICgodTMyKS0xKQogCi1zdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dF9vcHMgewotCXVuc2lnbmVkIGludCBmbGFnczsKLSNkZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0hB U19TVFJVQ1RfUEFHRSAweDEKLSNkZWZpbmUgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklOS0FCTEUg ICAweDIKLQotCS8qIEludGVyZmFjZSBiZXR3ZWVuIHRoZSBHRU0gb2JqZWN0IGFuZCBpdHMgYmFj a2luZyBzdG9yYWdlLgotCSAqIGdldF9wYWdlcygpIGlzIGNhbGxlZCBvbmNlIHByaW9yIHRvIHRo ZSB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgc2V0Ci0JICogb2YgcGFnZXMgYmVmb3JlIHRvIGJpbmRp bmcgdGhlbSBpbnRvIHRoZSBHVFQsIGFuZCBwdXRfcGFnZXMoKSBpcwotCSAqIGNhbGxlZCBhZnRl ciB3ZSBubyBsb25nZXIgbmVlZCB0aGVtLiBBcyB3ZSBleHBlY3QgdGhlcmUgdG8gYmUKLQkgKiBh c3NvY2lhdGVkIGNvc3Qgd2l0aCBtaWdyYXRpbmcgcGFnZXMgYmV0d2VlbiB0aGUgYmFja2luZyBz dG9yYWdlCi0JICogYW5kIG1ha2luZyB0aGVtIGF2YWlsYWJsZSBmb3IgdGhlIEdQVSAoZS5nLiBj bGZsdXNoKSwgd2UgbWF5IGhvbGQKLQkgKiBvbnRvIHRoZSBwYWdlcyBhZnRlciB0aGV5IGFyZSBu byBsb25nZXIgcmVmZXJlbmNlZCBieSB0aGUgR1BVCi0JICogaW4gY2FzZSB0aGV5IG1heSBiZSB1 c2VkIGFnYWluIHNob3J0bHkgKGZvciBleGFtcGxlIG1pZ3JhdGluZyB0aGUKLQkgKiBwYWdlcyB0 byBhIGRpZmZlcmVudCBtZW1vcnkgZG9tYWluIHdpdGhpbiB0aGUgR1RUKS4gcHV0X3BhZ2VzKCkK LQkgKiB3aWxsIHRoZXJlZm9yZSBtb3N0IGxpa2VseSBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0 IGl0c2VsZiBpcwotCSAqIGJlaW5nIHJlbGVhc2VkIG9yIHVuZGVyIG1lbW9yeSBwcmVzc3VyZSAo d2hlcmUgd2UgYXR0ZW1wdCB0bwotCSAqIHJlYXAgcGFnZXMgZm9yIHRoZSBzaHJpbmtlcikuCi0J ICovCi0Jc3RydWN0IHNnX3RhYmxlICooKmdldF9wYWdlcykoc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKik7Ci0Jdm9pZCAoKnB1dF9wYWdlcykoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Kiwgc3RydWN0IHNnX3RhYmxlICopOwotCi0JaW50ICgqZG1hYnVmX2V4cG9ydCkoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKik7Ci0Jdm9pZCAoKnJlbGVhc2UpKHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICopOwotfTsKLQogLyoKICAqIEZyb250YnVmZmVyIHRyYWNraW5nIGJpdHMuIFNl dCBpbiBvYmotPmZyb250YnVmZmVyX2JpdHMgd2hpbGUgYSBnZW0gYm8gaXMKICAqIGNvbnNpZGVy ZWQgdG8gYmUgdGhlIGZyb250YnVmZmVyIGZvciB0aGUgZ2l2ZW4gcGxhbmUgaW50ZXJmYWNlLXdp c2UuIFRoaXMKQEAgLTIyMjUsMjkyICsyMTg3LDYgQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3Rfb3BzIHsKICNkZWZpbmUgSU5URUxfRlJPTlRCVUZGRVJfQUxMX01BU0socGlwZSkgXAogCSgw eGZmIDw8IChJTlRFTF9GUk9OVEJVRkZFUl9CSVRTX1BFUl9QSVBFICogKHBpcGUpKSkKIAotc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgewotCXN0cnVjdCBkcm1fZ2VtX29iamVjdCBiYXNlOwot Ci0JY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzICpvcHM7Ci0KLQkvKiogTGlz dCBvZiBWTUFzIGJhY2tlZCBieSB0aGlzIG9iamVjdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdm1h X2xpc3Q7Ci0Jc3RydWN0IHJiX3Jvb3Qgdm1hX3RyZWU7Ci0KLQkvKiogU3RvbGVuIG1lbW9yeSBm b3IgdGhpcyBvYmplY3QsIGluc3RlYWQgb2YgYmVpbmcgYmFja2VkIGJ5IHNobWVtLiAqLwotCXN0 cnVjdCBkcm1fbW1fbm9kZSAqc3RvbGVuOwotCXN0cnVjdCBsaXN0X2hlYWQgZ2xvYmFsX2xpbms7 Ci0JdW5pb24gewotCQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCQlzdHJ1Y3QgbGxpc3Rfbm9kZSBm cmVlZDsKLQl9OwotCi0JLyoqCi0JICogV2hldGhlciB0aGUgb2JqZWN0IGlzIGN1cnJlbnRseSBp biB0aGUgR0dUVCBtbWFwLgotCSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdXNlcmZhdWx0X2xpbms7 Ci0KLQkvKiogVXNlZCBpbiBleGVjYnVmIHRvIHRlbXBvcmFyaWx5IGhvbGQgYSByZWYgKi8KLQlz dHJ1Y3QgbGlzdF9oZWFkIG9ial9leGVjX2xpbms7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJhdGNo X3Bvb2xfbGluazsKLQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKioKLQkgKiBIYXZlIHdl IHRha2VuIGEgcmVmZXJlbmNlIGZvciB0aGUgb2JqZWN0IGZvciBpbmNvbXBsZXRlIEdQVQotCSAq IGFjdGl2aXR5PwotCSAqLwotI2RlZmluZSBJOTE1X0JPX0FDVElWRV9SRUYgMAotCi0JLyoKLQkg KiBJcyB0aGUgb2JqZWN0IHRvIGJlIG1hcHBlZCBhcyByZWFkLW9ubHkgdG8gdGhlIEdQVQotCSAq IE9ubHkgaG9ub3VyZWQgaWYgaGFyZHdhcmUgaGFzIHJlbGV2YW50IHB0ZSBiaXQKLQkgKi8KLQl1 bnNpZ25lZCBsb25nIGd0X3JvOjE7Ci0JdW5zaWduZWQgaW50IGNhY2hlX2xldmVsOjM7Ci0JdW5z aWduZWQgaW50IGNhY2hlX2RpcnR5OjE7Ci0KLQlhdG9taWNfdCBmcm9udGJ1ZmZlcl9iaXRzOwot CXVuc2lnbmVkIGludCBmcm9udGJ1ZmZlcl9nZ3R0X29yaWdpbjsgLyogd3JpdGUgb25jZSAqLwot Ci0JLyoqIEN1cnJlbnQgdGlsaW5nIHN0cmlkZSBmb3IgdGhlIG9iamVjdCwgaWYgaXQncyB0aWxl ZC4gKi8KLQl1bnNpZ25lZCBpbnQgdGlsaW5nX2FuZF9zdHJpZGU7Ci0jZGVmaW5lIEZFTkNFX01J TklNVU1fU1RSSURFIDEyOCAvKiBTZWUgaTkxNV90aWxpbmdfb2soKSAqLwotI2RlZmluZSBUSUxJ TkdfTUFTSyAoRkVOQ0VfTUlOSU1VTV9TVFJJREUtMSkKLSNkZWZpbmUgU1RSSURFX01BU0sgKH5U SUxJTkdfTUFTSykKLQotCS8qKiBDb3VudCBvZiBWTUEgYWN0dWFsbHkgYm91bmQgYnkgdGhpcyBv YmplY3QgKi8KLQl1bnNpZ25lZCBpbnQgYmluZF9jb3VudDsKLQl1bnNpZ25lZCBpbnQgYWN0aXZl X2NvdW50OwotCXVuc2lnbmVkIGludCBwaW5fZGlzcGxheTsKLQotCXN0cnVjdCB7Ci0JCXN0cnVj dCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGUgcGFnZXMgYW5kIHRoZWlyIHVzZSAqLwotCQlh dG9taWNfdCBwYWdlc19waW5fY291bnQ7Ci0KLQkJc3RydWN0IHNnX3RhYmxlICpwYWdlczsKLQkJ dm9pZCAqbWFwcGluZzsKLQotCQlzdHJ1Y3QgaTkxNV9nZW1fb2JqZWN0X3BhZ2VfaXRlciB7Ci0J CQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3BvczsKLQkJCXVuc2lnbmVkIGludCBzZ19pZHg7IC8q IGluIHBhZ2VzLCBidXQgMzJiaXQgZWVrISAqLwotCi0JCQlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290 IHJhZGl4OwotCQkJc3RydWN0IG11dGV4IGxvY2s7IC8qIHByb3RlY3RzIHRoaXMgY2FjaGUgKi8K LQkJfSBnZXRfcGFnZTsKLQotCQkvKioKLQkJICogQWR2aWNlOiBhcmUgdGhlIGJhY2tpbmcgcGFn ZXMgcHVyZ2VhYmxlPwotCQkgKi8KLQkJdW5zaWduZWQgaW50IG1hZHY6MjsKLQotCQkvKioKLQkJ ICogVGhpcyBpcyBzZXQgaWYgdGhlIG9iamVjdCBoYXMgYmVlbiB3cml0dGVuIHRvIHNpbmNlIHRo ZQotCQkgKiBwYWdlcyB3ZXJlIGxhc3QgYWNxdWlyZWQuCi0JCSAqLwotCQlib29sIGRpcnR5OjE7 Ci0KLQkJLyoqCi0JCSAqIFRoaXMgaXMgc2V0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gcGlubmVk IGR1ZSB0byB1bmtub3duCi0JCSAqIHN3aXp6bGluZy4KLQkJICovCi0JCWJvb2wgcXVpcmtlZDox OwotCX0gbW07Ci0KLQkvKiogQnJlYWRjcnVtYiBvZiBsYXN0IHJlbmRlcmluZyB0byB0aGUgYnVm ZmVyLgotCSAqIFRoZXJlIGNhbiBvbmx5IGJlIG9uZSB3cml0ZXIsIGJ1dCB3ZSBhbGxvdyBmb3Ig bXVsdGlwbGUgcmVhZGVycy4KLQkgKiBJZiB0aGVyZSBpcyBhIHdyaXRlciB0aGF0IG5lY2Vzc2Fy aWx5IGltcGxpZXMgdGhhdCBhbGwgb3RoZXIKLQkgKiByZWFkIHJlcXVlc3RzIGFyZSBjb21wbGV0 ZSAtIGJ1dCB3ZSBtYXkgb25seSBiZSBsYXppbHkgY2xlYXJpbmcKLQkgKiB0aGUgcmVhZCByZXF1 ZXN0cy4gQSByZWFkIHJlcXVlc3QgaXMgbmF0dXJhbGx5IHRoZSBtb3N0IHJlY2VudAotCSAqIHJl cXVlc3Qgb24gYSByaW5nLCBzbyB3ZSBtYXkgaGF2ZSB0d28gZGlmZmVyZW50IHdyaXRlIGFuZCBy ZWFkCi0JICogcmVxdWVzdHMgb24gb25lIHJpbmcgd2hlcmUgdGhlIHdyaXRlIHJlcXVlc3QgaXMg b2xkZXIgdGhhbiB0aGUKLQkgKiByZWFkIHJlcXVlc3QuIFRoaXMgYWxsb3dzIGZvciB0aGUgQ1BV IHRvIHJlYWQgZnJvbSBhbiBhY3RpdmUKLQkgKiBidWZmZXIgYnkgb25seSB3YWl0aW5nIGZvciB0 aGUgd3JpdGUgdG8gY29tcGxldGUuCi0JICovCi0Jc3RydWN0IHJlc2VydmF0aW9uX29iamVjdCAq cmVzdjsKLQotCS8qKiBSZWZlcmVuY2VzIGZyb20gZnJhbWVidWZmZXJzLCBsb2NrcyBvdXQgdGls aW5nIGNoYW5nZXMuICovCi0JdW5zaWduZWQgbG9uZyBmcmFtZWJ1ZmZlcl9yZWZlcmVuY2VzOwot Ci0JLyoqIFJlY29yZCBvZiBhZGRyZXNzIGJpdCAxNyBvZiBlYWNoIHBhZ2UgYXQgbGFzdCB1bmJp bmQuICovCi0JdW5zaWduZWQgbG9uZyAqYml0XzE3OwotCi0Jc3RydWN0IGk5MTVfZ2VtX3VzZXJw dHIgewotCQl1aW50cHRyX3QgcHRyOwotCQl1bnNpZ25lZCByZWFkX29ubHkgOjE7Ci0KLQkJc3Ry dWN0IGk5MTVfbW1fc3RydWN0ICptbTsKLQkJc3RydWN0IGk5MTVfbW11X29iamVjdCAqbW11X29i amVjdDsKLQkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrOwotCX0gdXNlcnB0cjsKLQotCS8qKiBm b3IgcGh5cyBhbGxvY2F0ZWQgb2JqZWN0cyAqLwotCXN0cnVjdCBkcm1fZG1hX2hhbmRsZSAqcGh5 c19oYW5kbGU7Ci0KLQlzdHJ1Y3QgcmVzZXJ2YXRpb25fb2JqZWN0IF9fYnVpbHRpbl9yZXN2Owot fTsKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi10b19pbnRl bF9ibyhzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKmdlbSkKLXsKLQkvKiBBc3NlcnQgdGhhdCB0b19p bnRlbF9ibyhOVUxMKSA9PSBOVUxMICovCi0JQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0LCBiYXNlKSk7Ci0KLQlyZXR1cm4gY29udGFpbmVyX29mKGdlbSwg c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QsIGJhc2UpOwotfQotCi0vKioKLSAqIGk5MTVfZ2Vt X29iamVjdF9sb29rdXBfcmN1IC0gbG9vayB1cCBhIHRlbXBvcmFyeSBHRU0gb2JqZWN0IGZyb20g aXRzIGhhbmRsZQotICogQGZpbHA6IERSTSBmaWxlIHByaXZhdGUgZGF0ZQotICogQGhhbmRsZTog dXNlcnNwYWNlIGhhbmRsZQotICoKLSAqIFJldHVybnM6Ci0gKgotICogQSBwb2ludGVyIHRvIHRo ZSBvYmplY3QgbmFtZWQgYnkgdGhlIGhhbmRsZSBpZiBzdWNoIGV4aXN0cyBvbiBAZmlscCwgTlVM TAotICogb3RoZXJ3aXNlLiBUaGlzIG9iamVjdCBpcyBvbmx5IHZhbGlkIHdoaWxzdCB1bmRlciB0 aGUgUkNVIHJlYWQgbG9jaywgYW5kCi0gKiBub3RlIGNhcmVmdWxseSB0aGUgb2JqZWN0IG1heSBi ZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cm95ZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUg c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgotaTkxNV9nZW1fb2JqZWN0X2xvb2t1cF9yY3Uo c3RydWN0IGRybV9maWxlICpmaWxlLCB1MzIgaGFuZGxlKQotewotI2lmZGVmIENPTkZJR19MT0NL REVQCi0JV0FSTl9PTihkZWJ1Z19sb2NrcyAmJiAhbG9ja19pc19oZWxkKCZyY3VfbG9ja19tYXAp KTsKLSNlbmRpZgotCXJldHVybiBpZHJfZmluZCgmZmlsZS0+b2JqZWN0X2lkciwgaGFuZGxlKTsK LX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi1pOTE1X2dl bV9vYmplY3RfbG9va3VwKHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhhbmRsZSkKLXsKLQlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW9i aiA9IGk5MTVfZ2VtX29iamVjdF9sb29rdXBfcmN1KGZpbGUsIGhhbmRsZSk7Ci0JaWYgKG9iaiAm JiAha3JlZl9nZXRfdW5sZXNzX3plcm8oJm9iai0+YmFzZS5yZWZjb3VudCkpCi0JCW9iaiA9IE5V TEw7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXR1cm4gb2JqOwotfQotCi1fX2RlcHJlY2F0 ZWQKLWV4dGVybiBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKgotZHJtX2dlbV9vYmplY3RfbG9va3Vw KHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhhbmRsZSk7Ci0KLV9fYXR0cmlidXRlX18oKG5v bm51bGwpKQotc3RhdGljIGlubGluZSBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCi1pOTE1 X2dlbV9vYmplY3RfZ2V0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JZHJt X2dlbV9vYmplY3RfcmVmZXJlbmNlKCZvYmotPmJhc2UpOwotCXJldHVybiBvYmo7Ci19Ci0KLV9f ZGVwcmVjYXRlZAotZXh0ZXJuIHZvaWQgZHJtX2dlbV9vYmplY3RfcmVmZXJlbmNlKHN0cnVjdCBk cm1fZ2VtX29iamVjdCAqKTsKLQotX19hdHRyaWJ1dGVfXygobm9ubnVsbCkpCi1zdGF0aWMgaW5s aW5lIHZvaWQKLWk5MTVfZ2VtX29iamVjdF9wdXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaikKLXsKLQlfX2RybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwotfQot Ci1fX2RlcHJlY2F0ZWQKLWV4dGVybiB2b2lkIGRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHN0 cnVjdCBkcm1fZ2VtX29iamVjdCAqKTsKLQotX19kZXByZWNhdGVkCi1leHRlcm4gdm9pZCBkcm1f Z2VtX29iamVjdF91bnJlZmVyZW5jZV91bmxvY2tlZChzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKik7 Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9nZW1fb2JqZWN0X2lzX2RlYWQoY29uc3Qgc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJm9i ai0+YmFzZS5yZWZjb3VudC5yZWZjb3VudCkgPT0gMDsKLX0KLQotc3RhdGljIGlubGluZSBib29s Ci1pOTE1X2dlbV9vYmplY3RfaGFzX3N0cnVjdF9wYWdlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmopCi17Ci0JcmV0dXJuIG9iai0+b3BzLT5mbGFncyAmIEk5MTVfR0VNX09C SkVDVF9IQVNfU1RSVUNUX1BBR0U7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9nZW1f b2JqZWN0X2lzX3Nocmlua2FibGUoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKLXsKLQlyZXR1cm4gb2JqLT5vcHMtPmZsYWdzICYgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklO S0FCTEU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV9nZW1fb2JqZWN0X2lzX2FjdGl2 ZShjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQotewotCXJldHVybiBvYmot PmFjdGl2ZV9jb3VudDsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X2dlbV9vYmplY3Rf aGFzX2FjdGl2ZV9yZWZlcmVuY2UoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aikKLXsKLQlyZXR1cm4gdGVzdF9iaXQoSTkxNV9CT19BQ1RJVkVfUkVGLCAmb2JqLT5mbGFncyk7 Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaTkxNV9nZW1fb2JqZWN0X3NldF9hY3RpdmVfcmVm ZXJlbmNlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCi17Ci0JbG9ja2RlcF9hc3Nl cnRfaGVsZCgmb2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKLQlfX3NldF9iaXQoSTkxNV9C T19BQ1RJVkVfUkVGLCAmb2JqLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaTkx NV9nZW1fb2JqZWN0X2NsZWFyX2FjdGl2ZV9yZWZlcmVuY2Uoc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKm9iaikKLXsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJhc2UuZGV2LT5zdHJ1 Y3RfbXV0ZXgpOwotCV9fY2xlYXJfYml0KEk5MTVfQk9fQUNUSVZFX1JFRiwgJm9iai0+ZmxhZ3Mp OwotfQotCi12b2lkIF9faTkxNV9nZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2FjdGl2ZShzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKTsKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBp bnQKLWk5MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCi17Ci0JcmV0dXJuIG9iai0+dGlsaW5nX2FuZF9zdHJpZGUgJiBUSUxJTkdfTUFTSzsK LX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQoc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gaTkxNV9nZW1fb2JqZWN0X2dl dF90aWxpbmcob2JqKSAhPSBJOTE1X1RJTElOR19OT05FOwotfQotCi1zdGF0aWMgaW5saW5lIHVu c2lnbmVkIGludAotaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUoc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKLXsKLQlyZXR1cm4gb2JqLT50aWxpbmdfYW5kX3N0cmlkZSAmIFNUUklE RV9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKgotaTkx NV9nZW1fb2JqZWN0X2xhc3Rfd3JpdGVfZW5naW5lKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCi17Ci0Jc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lID0gTlVMTDsKLQlzdHJ1 Y3QgZG1hX2ZlbmNlICpmZW5jZTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlmZW5jZSA9IHJlc2Vy dmF0aW9uX29iamVjdF9nZXRfZXhjbF9yY3Uob2JqLT5yZXN2KTsKLQlyY3VfcmVhZF91bmxvY2so KTsKLQotCWlmIChmZW5jZSAmJiBkbWFfZmVuY2VfaXNfaTkxNShmZW5jZSkgJiYgIWRtYV9mZW5j ZV9pc19zaWduYWxlZChmZW5jZSkpCi0JCWVuZ2luZSA9IHRvX3JlcXVlc3QoZmVuY2UpLT5lbmdp bmU7Ci0JZG1hX2ZlbmNlX3B1dChmZW5jZSk7Ci0KLQlyZXR1cm4gZW5naW5lOwotfQotCi1zdGF0 aWMgaW5saW5lIHN0cnVjdCBpOTE1X3ZtYSAqaTkxNV92bWFfZ2V0KHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQotewotCWk5MTVfZ2VtX29iamVjdF9nZXQodm1hLT5vYmopOwotCXJldHVybiB2bWE7Ci19 Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3ZtYV9wdXQoc3RydWN0IGk5MTVfdm1hICp2bWEp Ci17Ci0JaTkxNV9nZW1fb2JqZWN0X3B1dCh2bWEtPm9iaik7Ci19Ci0KIC8qCiAgKiBPcHRpbWlz ZWQgU0dMIGl0ZXJhdG9yIGZvciBHRU0gb2JqZWN0cwogICovCkBAIC0zMjIyLDEzICsyODk4LDYg QEAgaTkxNV9nZW1fb2JqZWN0X2dndHRfcGluKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv YmosCiAJCQkgdTY0IGFsaWdubWVudCwKIAkJCSB1NjQgZmxhZ3MpOwogCi1pbnQgaTkxNV92bWFf YmluZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xl dmVsLAotCQkgIHUzMiBmbGFncyk7Ci12b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVuY2Vh YmxlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKLWludCBfX211c3RfY2hlY2sgaTkxNV92bWFfdW5i aW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKLXZvaWQgaTkxNV92bWFfY2xvc2Uoc3RydWN0IGk5 MTVfdm1hICp2bWEpOwotdm9pZCBpOTE1X3ZtYV9kZXN0cm95KHN0cnVjdCBpOTE1X3ZtYSAqdm1h KTsKLQogaW50IGk5MTVfZ2VtX29iamVjdF91bmJpbmQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaik7CiB2b2lkIGk5MTVfZ2VtX3JlbGVhc2VfbW1hcChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqKTsKIApAQCAtMzQ3OCw1NCArMzE0NywxMCBAQCBpOTE1X2dlbV9vYmplY3Rf Z2d0dF9vZmZzZXQoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm8sCiAJcmV0dXJuIGk5MTVf Z2d0dF9vZmZzZXQoaTkxNV9nZW1fb2JqZWN0X3RvX2dndHQobywgdmlldykpOwogfQogCi0vKiBp OTE1X2dlbV9mZW5jZS5jICovCisvKiBpOTE1X2dlbV9mZW5jZV9yZWcuYyAqLwogaW50IF9fbXVz dF9jaGVjayBpOTE1X3ZtYV9nZXRfZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpOwogaW50IF9f bXVzdF9jaGVjayBpOTE1X3ZtYV9wdXRfZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpOwogCi0v KioKLSAqIGk5MTVfdm1hX3Bpbl9mZW5jZSAtIHBpbiBmZW5jaW5nIHN0YXRlCi0gKiBAdm1hOiB2 bWEgdG8gcGluIGZlbmNpbmcgZm9yCi0gKgotICogVGhpcyBwaW5zIHRoZSBmZW5jaW5nIHN0YXRl ICh3aGV0aGVyIHRpbGVkIG9yIHVudGlsZWQpIHRvIG1ha2Ugc3VyZSB0aGUKLSAqIHZtYSAoYW5k IGl0cyBvYmplY3QpIGlzIHJlYWR5IHRvIGJlIHVzZWQgYXMgYSBzY2Fub3V0IHRhcmdldC4gRmVu Y2luZwotICogc3RhdHVzIG11c3QgYmUgc3luY2hyb25pemUgZmlyc3QgYnkgY2FsbGluZyBpOTE1 X3ZtYV9nZXRfZmVuY2UoKToKLSAqCi0gKiBUaGUgcmVzdWx0aW5nIGZlbmNlIHBpbiByZWZlcmVu Y2UgbXVzdCBiZSByZWxlYXNlZCBhZ2FpbiB3aXRoCi0gKiBpOTE1X3ZtYV91bnBpbl9mZW5jZSgp LgotICoKLSAqIFJldHVybnM6Ci0gKgotICogVHJ1ZSBpZiB0aGUgdm1hIGhhcyBhIGZlbmNlLCBm YWxzZSBvdGhlcndpc2UuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbAotaTkxNV92bWFfcGluX2Zl bmNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+ dm0tPmRldi0+c3RydWN0X211dGV4KTsKLQlpZiAodm1hLT5mZW5jZSkgewotCQl2bWEtPmZlbmNl LT5waW5fY291bnQrKzsKLQkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlCi0JCXJldHVybiBmYWxzZTsK LX0KLQotLyoqCi0gKiBpOTE1X3ZtYV91bnBpbl9mZW5jZSAtIHVucGluIGZlbmNpbmcgc3RhdGUK LSAqIEB2bWE6IHZtYSB0byB1bnBpbiBmZW5jaW5nIGZvcgotICoKLSAqIFRoaXMgcmVsZWFzZXMg dGhlIGZlbmNlIHBpbiByZWZlcmVuY2UgYWNxdWlyZWQgdGhyb3VnaAotICogaTkxNV92bWFfcGlu X2ZlbmNlLiBJdCB3aWxsIGhhbmRsZSBib3RoIG9iamVjdHMgd2l0aCBhbmQgd2l0aG91dCBhbgot ICogYXR0YWNoZWQgZmVuY2UgY29ycmVjdGx5LCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRvIGRpc3Rp bmd1aXNoIHRoaXMuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotaTkxNV92bWFfdW5waW5fZmVu Y2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmdm1hLT52 bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmICh2bWEtPmZlbmNlKSB7Ci0JCUdFTV9CVUdfT04o dm1hLT5mZW5jZS0+cGluX2NvdW50IDw9IDApOwotCQl2bWEtPmZlbmNlLT5waW5fY291bnQtLTsK LQl9Ci19Ci0KIHZvaWQgaTkxNV9nZW1fcmVzdG9yZV9mZW5jZXMoc3RydWN0IGRybV9kZXZpY2Ug KmRldik7CiAKIHZvaWQgaTkxNV9nZW1fZGV0ZWN0X2JpdF82X3N3aXp6bGUoc3RydWN0IGRybV9k ZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5j IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCAxYzIwZWRiLi5kNTFmYjVk IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTI5MTksMTE3ICsyOTE5LDYgQEAgaTkxNV9n ZW1fd2FpdF9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLCBzdHJ1Y3Qg ZHJtX2ZpbGUgKmZpbGUpCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19pOTE1X3Zt YV9pb3VubWFwKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04oaTkxNV92bWFf aXNfcGlubmVkKHZtYSkpOwotCi0JaWYgKHZtYS0+aW9tYXAgPT0gTlVMTCkKLQkJcmV0dXJuOwot Ci0JaW9fbWFwcGluZ191bm1hcCh2bWEtPmlvbWFwKTsKLQl2bWEtPmlvbWFwID0gTlVMTDsKLX0K LQotaW50IGk5MTVfdm1hX3VuYmluZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7Ci0JdW5zaWduZWQgbG9uZyBhY3Rp dmU7Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm9iai0+YmFzZS5kZXYtPnN0 cnVjdF9tdXRleCk7Ci0KLQkvKiBGaXJzdCB3YWl0IHVwb24gYW55IGFjdGl2aXR5IGFzIHJldGly aW5nIHRoZSByZXF1ZXN0IG1heQotCSAqIGhhdmUgc2lkZS1lZmZlY3RzIHN1Y2ggYXMgdW5waW5u aW5nIG9yIGV2ZW4gdW5iaW5kaW5nIHRoaXMgdm1hLgotCSAqLwotCWFjdGl2ZSA9IGk5MTVfdm1h X2dldF9hY3RpdmUodm1hKTsKLQlpZiAoYWN0aXZlKSB7Ci0JCWludCBpZHg7Ci0KLQkJLyogV2hl biBhIGNsb3NlZCBWTUEgaXMgcmV0aXJlZCwgaXQgaXMgdW5ib3VuZCAtIGVlay4KLQkJICogSW4g b3JkZXIgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlY3Vyc2l2ZWx5IGNsb3NlZCwKLQkJICog dGFrZSBhIHBpbiBvbiB0aGUgdm1hIHNvIHRoYXQgdGhlIHNlY29uZCB1bmJpbmQgaXMKLQkJICog YWJvcnRlZC4KLQkJICoKLQkJICogRXZlbiBtb3JlIHNjYXJ5IGlzIHRoYXQgdGhlIHJldGlyZSBj YWxsYmFjayBtYXkgZnJlZQotCQkgKiB0aGUgb2JqZWN0IChsYXN0IGFjdGl2ZSB2bWEpLiBUbyBw cmV2ZW50IHRoZSBleHBsb3Npb24KLQkJICogd2UgZGVmZXIgdGhlIGFjdHVhbCBvYmplY3QgZnJl ZSB0byBhIHdvcmtlciB0aGF0IGNhbgotCQkgKiBvbmx5IHByb2NlZWQgb25jZSBpdCBhY3F1aXJl cyB0aGUgc3RydWN0X211dGV4ICh3aGljaAotCQkgKiB3ZSBjdXJyZW50bHkgaG9sZCwgdGhlcmVm b3JlIGl0IGNhbm5vdCBmcmVlIHRoaXMgb2JqZWN0Ci0JCSAqIGJlZm9yZSB3ZSBhcmUgZmluaXNo ZWQpLgotCQkgKi8KLQkJX19pOTE1X3ZtYV9waW4odm1hKTsKLQotCQlmb3JfZWFjaF9hY3RpdmUo YWN0aXZlLCBpZHgpIHsKLQkJCXJldCA9IGk5MTVfZ2VtX2FjdGl2ZV9yZXRpcmUoJnZtYS0+bGFz dF9yZWFkW2lkeF0sCi0JCQkJCQkgICAmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQkJ aWYgKHJldCkKLQkJCQlicmVhazsKLQkJfQotCi0JCV9faTkxNV92bWFfdW5waW4odm1hKTsKLQkJ aWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJR0VNX0JVR19PTihpOTE1X3ZtYV9pc19hY3Rp dmUodm1hKSk7Ci0JfQotCi0JaWYgKGk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKQotCQlyZXR1cm4g LUVCVVNZOwotCi0JaWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpCi0JCWdv dG8gZGVzdHJveTsKLQotCUdFTV9CVUdfT04ob2JqLT5iaW5kX2NvdW50ID09IDApOwotCUdFTV9C VUdfT04oIWk5MTVfZ2VtX29iamVjdF9oYXNfcGlubmVkX3BhZ2VzKG9iaikpOwotCi0JaWYgKGk5 MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkpIHsKLQkJLyogcmVsZWFzZSB0aGUgZmVu Y2UgcmVnIF9hZnRlcl8gZmx1c2hpbmcgKi8KLQkJcmV0ID0gaTkxNV92bWFfcHV0X2ZlbmNlKHZt YSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCS8qIEZvcmNlIGEgcGFnZWZhdWx0 IGZvciBkb21haW4gdHJhY2tpbmcgb24gbmV4dCB1c2VyIGFjY2VzcyAqLwotCQlpOTE1X2dlbV9y ZWxlYXNlX21tYXAob2JqKTsKLQotCQlfX2k5MTVfdm1hX2lvdW5tYXAodm1hKTsKLQkJdm1hLT5m bGFncyAmPSB+STkxNV9WTUFfQ0FOX0ZFTkNFOwotCX0KLQotCWlmIChsaWtlbHkoIXZtYS0+dm0t PmNsb3NlZCkpIHsKLQkJdHJhY2VfaTkxNV92bWFfdW5iaW5kKHZtYSk7Ci0JCXZtYS0+dm0tPnVu YmluZF92bWEodm1hKTsKLQl9Ci0Jdm1hLT5mbGFncyAmPSB+KEk5MTVfVk1BX0dMT0JBTF9CSU5E IHwgSTkxNV9WTUFfTE9DQUxfQklORCk7Ci0KLQlkcm1fbW1fcmVtb3ZlX25vZGUoJnZtYS0+bm9k ZSk7Ci0JbGlzdF9tb3ZlX3RhaWwoJnZtYS0+dm1fbGluaywgJnZtYS0+dm0tPnVuYm91bmRfbGlz dCk7Ci0KLQlpZiAodm1hLT5wYWdlcyAhPSBvYmotPm1tLnBhZ2VzKSB7Ci0JCUdFTV9CVUdfT04o IXZtYS0+cGFnZXMpOwotCQlzZ19mcmVlX3RhYmxlKHZtYS0+cGFnZXMpOwotCQlrZnJlZSh2bWEt PnBhZ2VzKTsKLQl9Ci0Jdm1hLT5wYWdlcyA9IE5VTEw7Ci0KLQkvKiBTaW5jZSB0aGUgdW5ib3Vu ZCBsaXN0IGlzIGdsb2JhbCwgb25seSBtb3ZlIHRvIHRoYXQgbGlzdCBpZgotCSAqIG5vIG1vcmUg Vk1BcyBleGlzdC4gKi8KLQlpZiAoLS1vYmotPmJpbmRfY291bnQgPT0gMCkKLQkJbGlzdF9tb3Zl X3RhaWwoJm9iai0+Z2xvYmFsX2xpbmssCi0JCQkgICAgICAgJnRvX2k5MTUob2JqLT5iYXNlLmRl diktPm1tLnVuYm91bmRfbGlzdCk7Ci0KLQkvKiBBbmQgZmluYWxseSBub3cgdGhlIG9iamVjdCBp cyBjb21wbGV0ZWx5IGRlY291cGxlZCBmcm9tIHRoaXMgdm1hLAotCSAqIHdlIGNhbiBkcm9wIGl0 cyBob2xkIG9uIHRoZSBiYWNraW5nIHN0b3JhZ2UgYW5kIGFsbG93IGl0IHRvIGJlCi0JICogcmVh cGVkIGJ5IHRoZSBzaHJpbmtlci4KLQkgKi8KLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMo b2JqKTsKLQotZGVzdHJveToKLQlpZiAodW5saWtlbHkoaTkxNV92bWFfaXNfY2xvc2VkKHZtYSkp KQotCQlpOTE1X3ZtYV9kZXN0cm95KHZtYSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlu dCB3YWl0X2Zvcl90aW1lbGluZShzdHJ1Y3QgaTkxNV9nZW1fdGltZWxpbmUgKnRsLCB1bnNpZ25l ZCBpbnQgZmxhZ3MpCiB7CiAJaW50IHJldCwgaTsKQEAgLTMwNTcsMTcyICsyOTQ2LDYgQEAgaW50 IGk5MTVfZ2VtX3dhaXRfZm9yX2lkbGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHVu c2lnbmVkIGludCBmbGFncykKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGJvb2wgaTkxNV9nZW1f dmFsaWRfZ3R0X3NwYWNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJCSAgICAgdW5zaWduZWQg bG9uZyBjYWNoZV9sZXZlbCkKLXsKLQlzdHJ1Y3QgZHJtX21tX25vZGUgKmd0dF9zcGFjZSA9ICZ2 bWEtPm5vZGU7Ci0Jc3RydWN0IGRybV9tbV9ub2RlICpvdGhlcjsKLQotCS8qCi0JICogT24gc29t ZSBtYWNoaW5lcyB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2hlbiBwdXR0aW5nIGRpZmZlcmluZyB0 eXBlcwotCSAqIG9mIHNub29wYWJsZSBtZW1vcnkgdG9nZXRoZXIgdG8gYXZvaWQgdGhlIHByZWZl dGNoZXIgY3Jvc3NpbmcgbWVtb3J5Ci0JICogZG9tYWlucyBhbmQgZHlpbmcuIER1cmluZyB2bSBp bml0aWFsaXNhdGlvbiwgd2UgZGVjaWRlIHdoZXRoZXIgb3Igbm90Ci0JICogdGhlc2UgY29uc3Ry YWludHMgYXBwbHkgYW5kIHNldCB0aGUgZHJtX21tLmNvbG9yX2FkanVzdAotCSAqIGFwcHJvcHJp YXRlbHkuCi0JICovCi0JaWYgKHZtYS0+dm0tPm1tLmNvbG9yX2FkanVzdCA9PSBOVUxMKQotCQly ZXR1cm4gdHJ1ZTsKLQotCWlmICghZHJtX21tX25vZGVfYWxsb2NhdGVkKGd0dF9zcGFjZSkpCi0J CXJldHVybiB0cnVlOwotCi0JaWYgKGxpc3RfZW1wdHkoJmd0dF9zcGFjZS0+bm9kZV9saXN0KSkK LQkJcmV0dXJuIHRydWU7Ci0KLQlvdGhlciA9IGxpc3RfZW50cnkoZ3R0X3NwYWNlLT5ub2RlX2xp c3QucHJldiwgc3RydWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOwotCWlmIChvdGhlci0+YWxs b2NhdGVkICYmICFvdGhlci0+aG9sZV9mb2xsb3dzICYmIG90aGVyLT5jb2xvciAhPSBjYWNoZV9s ZXZlbCkKLQkJcmV0dXJuIGZhbHNlOwotCi0Jb3RoZXIgPSBsaXN0X2VudHJ5KGd0dF9zcGFjZS0+ bm9kZV9saXN0Lm5leHQsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbm9kZV9saXN0KTsKLQlpZiAob3Ro ZXItPmFsbG9jYXRlZCAmJiAhZ3R0X3NwYWNlLT5ob2xlX2ZvbGxvd3MgJiYgb3RoZXItPmNvbG9y ICE9IGNhY2hlX2xldmVsKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQot LyoqCi0gKiBpOTE1X3ZtYV9pbnNlcnQgLSBmaW5kcyBhIHNsb3QgZm9yIHRoZSB2bWEgaW4gaXRz IGFkZHJlc3Mgc3BhY2UKLSAqIEB2bWE6IHRoZSB2bWEKLSAqIEBzaXplOiByZXF1ZXN0ZWQgc2l6 ZSBpbiBieXRlcyAoY2FuIGJlIGxhcmdlciB0aGFuIHRoZSBWTUEpCi0gKiBAYWxpZ25tZW50OiBy ZXF1aXJlZCBhbGlnbm1lbnQKLSAqIEBmbGFnczogbWFzayBvZiBQSU5fKiBmbGFncyB0byB1c2UK LSAqCi0gKiBGaXJzdCB3ZSB0cnkgdG8gYWxsb2NhdGUgc29tZSBmcmVlIHNwYWNlIHRoYXQgbWVl dHMgdGhlIHJlcXVpcmVtZW50cyBmb3IKLSAqIHRoZSBWTUEuIEZhaWxpaW5nIHRoYXQsIGlmIHRo ZSBmbGFncyBwZXJtaXQsIGl0IHdpbGwgZXZpY3QgYW4gb2xkIFZNQSwKLSAqIHByZWZlcnJhYmx5 IHRoZSBvbGRlc3QgaWRsZSBlbnRyeSB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgVk1BLgotICoK LSAqIFJldHVybnM6Ci0gKiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3 aXNlLgotICovCi1zdGF0aWMgaW50Ci1pOTE1X3ZtYV9pbnNlcnQoc3RydWN0IGk5MTVfdm1hICp2 bWEsIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCi17Ci0Jc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNSh2bWEtPnZtLT5kZXYpOwotCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKLQl1NjQgc3RhcnQsIGVuZDsKLQlp bnQgcmV0OwotCi0JR0VNX0JVR19PTih2bWEtPmZsYWdzICYgKEk5MTVfVk1BX0dMT0JBTF9CSU5E IHwgSTkxNV9WTUFfTE9DQUxfQklORCkpOwotCUdFTV9CVUdfT04oZHJtX21tX25vZGVfYWxsb2Nh dGVkKCZ2bWEtPm5vZGUpKTsKLQotCXNpemUgPSBtYXgoc2l6ZSwgdm1hLT5zaXplKTsKLQlpZiAo ZmxhZ3MgJiBQSU5fTUFQUEFCTEUpCi0JCXNpemUgPSBpOTE1X2dlbV9nZXRfZ2d0dF9zaXplKGRl dl9wcml2LCBzaXplLAotCQkJCQkgICAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmop KTsKLQotCWFsaWdubWVudCA9IG1heChtYXgoYWxpZ25tZW50LCB2bWEtPmRpc3BsYXlfYWxpZ25t ZW50KSwKLQkJCWk5MTVfZ2VtX2dldF9nZ3R0X2FsaWdubWVudChkZXZfcHJpdiwgc2l6ZSwKLQkJ CQkJCSAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopLAotCQkJCQkJICAgIGZsYWdz ICYgUElOX01BUFBBQkxFKSk7Ci0KLQlzdGFydCA9IGZsYWdzICYgUElOX09GRlNFVF9CSUFTID8g ZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0sgOiAwOwotCi0JZW5kID0gdm1hLT52bS0+dG90YWw7Ci0J aWYgKGZsYWdzICYgUElOX01BUFBBQkxFKQotCQllbmQgPSBtaW5fdCh1NjQsIGVuZCwgZGV2X3By aXYtPmdndHQubWFwcGFibGVfZW5kKTsKLQlpZiAoZmxhZ3MgJiBQSU5fWk9ORV80RykKLQkJZW5k ID0gbWluX3QodTY0LCBlbmQsICgxVUxMIDw8IDMyKSAtIFBBR0VfU0laRSk7Ci0KLQkvKiBJZiBi aW5kaW5nIHRoZSBvYmplY3QvR0dUVCB2aWV3IHJlcXVpcmVzIG1vcmUgc3BhY2UgdGhhbiB0aGUg ZW50aXJlCi0JICogYXBlcnR1cmUgaGFzLCByZWplY3QgaXQgZWFybHkgYmVmb3JlIGV2aWN0aW5n IGV2ZXJ5dGhpbmcgaW4gYSB2YWluCi0JICogYXR0ZW1wdCB0byBmaW5kIHNwYWNlLgotCSAqLwot CWlmIChzaXplID4gZW5kKSB7Ci0JCURSTV9ERUJVRygiQXR0ZW1wdGluZyB0byBiaW5kIGFuIG9i amVjdCBsYXJnZXIgdGhhbiB0aGUgYXBlcnR1cmU6IHJlcXVlc3Q9JWxsdSBbb2JqZWN0PSV6ZF0g PiAlcyBhcGVydHVyZT0lbGx1XG4iLAotCQkJICBzaXplLCBvYmotPmJhc2Uuc2l6ZSwKLQkJCSAg ZmxhZ3MgJiBQSU5fTUFQUEFCTEUgPyAibWFwcGFibGUiIDogInRvdGFsIiwKLQkJCSAgZW5kKTsK LQkJcmV0dXJuIC1FMkJJRzsKLQl9Ci0KLQlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2Vz KG9iaik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChmbGFncyAmIFBJTl9PRkZT RVRfRklYRUQpIHsKLQkJdTY0IG9mZnNldCA9IGZsYWdzICYgUElOX09GRlNFVF9NQVNLOwotCQlp ZiAob2Zmc2V0ICYgKGFsaWdubWVudCAtIDEpIHx8IG9mZnNldCA+IGVuZCAtIHNpemUpIHsKLQkJ CXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGVycl91bnBpbjsKLQkJfQotCi0JCXZtYS0+bm9kZS5z dGFydCA9IG9mZnNldDsKLQkJdm1hLT5ub2RlLnNpemUgPSBzaXplOwotCQl2bWEtPm5vZGUuY29s b3IgPSBvYmotPmNhY2hlX2xldmVsOwotCQlyZXQgPSBkcm1fbW1fcmVzZXJ2ZV9ub2RlKCZ2bWEt PnZtLT5tbSwgJnZtYS0+bm9kZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXJldCA9IGk5MTVfZ2VtX2V2 aWN0X2Zvcl92bWEodm1hKTsKLQkJCWlmIChyZXQgPT0gMCkKLQkJCQlyZXQgPSBkcm1fbW1fcmVz ZXJ2ZV9ub2RlKCZ2bWEtPnZtLT5tbSwgJnZtYS0+bm9kZSk7Ci0JCQlpZiAocmV0KQotCQkJCWdv dG8gZXJyX3VucGluOwotCQl9Ci0JfSBlbHNlIHsKLQkJdTMyIHNlYXJjaF9mbGFnLCBhbGxvY19m bGFnOwotCi0JCWlmIChmbGFncyAmIFBJTl9ISUdIKSB7Ci0JCQlzZWFyY2hfZmxhZyA9IERSTV9N TV9TRUFSQ0hfQkVMT1c7Ci0JCQlhbGxvY19mbGFnID0gRFJNX01NX0NSRUFURV9UT1A7Ci0JCX0g ZWxzZSB7Ci0JCQlzZWFyY2hfZmxhZyA9IERSTV9NTV9TRUFSQ0hfREVGQVVMVDsKLQkJCWFsbG9j X2ZsYWcgPSBEUk1fTU1fQ1JFQVRFX0RFRkFVTFQ7Ci0JCX0KLQotCQkvKiBXZSBvbmx5IGFsbG9j YXRlIGluIFBBR0VfU0laRS9HVFRfUEFHRV9TSVpFICg0MDk2KSBjaHVua3MsCi0JCSAqIHNvIHdl IGtub3cgdGhhdCB3ZSBhbHdheXMgaGF2ZSBhIG1pbmltdW0gYWxpZ25tZW50IG9mIDQwOTYuCi0J CSAqIFRoZSBkcm1fbW0gcmFuZ2UgbWFuYWdlciBpcyBvcHRpbWlzZWQgdG8gcmV0dXJuIHJlc3Vs dHMKLQkJICogd2l0aCB6ZXJvIGFsaWdubWVudCwgc28gd2hlcmUgcG9zc2libGUgdXNlIHRoZSBv cHRpbWFsCi0JCSAqIHBhdGguCi0JCSAqLwotCQlpZiAoYWxpZ25tZW50IDw9IDQwOTYpCi0JCQlh bGlnbm1lbnQgPSAwOwotCi1zZWFyY2hfZnJlZToKLQkJcmV0ID0gZHJtX21tX2luc2VydF9ub2Rl X2luX3JhbmdlX2dlbmVyaWMoJnZtYS0+dm0tPm1tLAotCQkJCQkJCSAgJnZtYS0+bm9kZSwKLQkJ CQkJCQkgIHNpemUsIGFsaWdubWVudCwKLQkJCQkJCQkgIG9iai0+Y2FjaGVfbGV2ZWwsCi0JCQkJ CQkJICBzdGFydCwgZW5kLAotCQkJCQkJCSAgc2VhcmNoX2ZsYWcsCi0JCQkJCQkJICBhbGxvY19m bGFnKTsKLQkJaWYgKHJldCkgewotCQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKHZt YS0+dm0sIHNpemUsIGFsaWdubWVudCwKLQkJCQkJCSAgICAgICBvYmotPmNhY2hlX2xldmVsLAot CQkJCQkJICAgICAgIHN0YXJ0LCBlbmQsCi0JCQkJCQkgICAgICAgZmxhZ3MpOwotCQkJaWYgKHJl dCA9PSAwKQotCQkJCWdvdG8gc2VhcmNoX2ZyZWU7Ci0KLQkJCWdvdG8gZXJyX3VucGluOwotCQl9 Ci0KLQkJR0VNX0JVR19PTih2bWEtPm5vZGUuc3RhcnQgPCBzdGFydCk7Ci0JCUdFTV9CVUdfT04o dm1hLT5ub2RlLnN0YXJ0ICsgdm1hLT5ub2RlLnNpemUgPiBlbmQpOwotCX0KLQlHRU1fQlVHX09O KCFpOTE1X2dlbV92YWxpZF9ndHRfc3BhY2Uodm1hLCBvYmotPmNhY2hlX2xldmVsKSk7Ci0KLQls aXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGluaywgJmRldl9wcml2LT5tbS5ib3VuZF9saXN0 KTsKLQlsaXN0X21vdmVfdGFpbCgmdm1hLT52bV9saW5rLCAmdm1hLT52bS0+aW5hY3RpdmVfbGlz dCk7Ci0Jb2JqLT5iaW5kX2NvdW50Kys7Ci0JR0VNX0JVR19PTihhdG9taWNfcmVhZCgmb2JqLT5t bS5wYWdlc19waW5fY291bnQpIDwgb2JqLT5iaW5kX2NvdW50KTsKLQotCXJldHVybiAwOwotCi1l cnJfdW5waW46Ci0JaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7Ci0JcmV0dXJuIHJl dDsKLX0KLQogdm9pZCBpOTE1X2dlbV9jbGZsdXNoX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqLAogCQkJICAgICBib29sIGZvcmNlKQogewpAQCAtMzgxOCwxMDAgKzM1NDEs NiBAQCBpOTE1X2dlbV9yaW5nX3Rocm90dGxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHN0cnVj dCBkcm1fZmlsZSAqZmlsZSkKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7CiB9CiAKLXN0YXRp YyBib29sCi1pOTE1X3ZtYV9taXNwbGFjZWQoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXpl LCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCi17Ci0JaWYgKCFkcm1fbW1fbm9kZV9hbGxvY2F0 ZWQoJnZtYS0+bm9kZSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmICh2bWEtPm5vZGUuc2l6ZSA8 IHNpemUpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKGFsaWdubWVudCAmJiB2bWEtPm5vZGUuc3Rh cnQgJiAoYWxpZ25tZW50IC0gMSkpCi0JCXJldHVybiB0cnVlOwotCi0JaWYgKGZsYWdzICYgUElO X01BUFBBQkxFICYmICFpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpKQotCQlyZXR1 cm4gdHJ1ZTsKLQotCWlmIChmbGFncyAmIFBJTl9PRkZTRVRfQklBUyAmJgotCSAgICB2bWEtPm5v ZGUuc3RhcnQgPCAoZmxhZ3MgJiBQSU5fT0ZGU0VUX01BU0spKQotCQlyZXR1cm4gdHJ1ZTsKLQot CWlmIChmbGFncyAmIFBJTl9PRkZTRVRfRklYRUQgJiYKLQkgICAgdm1hLT5ub2RlLnN0YXJ0ICE9 IChmbGFncyAmIFBJTl9PRkZTRVRfTUFTSykpCi0JCXJldHVybiB0cnVlOwotCi0JcmV0dXJuIGZh bHNlOwotfQotCi12b2lkIF9faTkxNV92bWFfc2V0X21hcF9hbmRfZmVuY2VhYmxlKHN0cnVjdCBp OTE1X3ZtYSAqdm1hKQotewotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEt Pm9iajsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+ YmFzZS5kZXYpOwotCWJvb2wgbWFwcGFibGUsIGZlbmNlYWJsZTsKLQl1MzIgZmVuY2Vfc2l6ZSwg ZmVuY2VfYWxpZ25tZW50OwotCi0JZmVuY2Vfc2l6ZSA9IGk5MTVfZ2VtX2dldF9nZ3R0X3NpemUo ZGV2X3ByaXYsCi0JCQkJCSAgICB2bWEtPnNpemUsCi0JCQkJCSAgICBpOTE1X2dlbV9vYmplY3Rf Z2V0X3RpbGluZyhvYmopKTsKLQlmZW5jZV9hbGlnbm1lbnQgPSBpOTE1X2dlbV9nZXRfZ2d0dF9h bGlnbm1lbnQoZGV2X3ByaXYsCi0JCQkJCQkgICAgICB2bWEtPnNpemUsCi0JCQkJCQkgICAgICBp OTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopLAotCQkJCQkJICAgICAgdHJ1ZSk7Ci0KLQlm ZW5jZWFibGUgPSAodm1hLT5ub2RlLnNpemUgPT0gZmVuY2Vfc2l6ZSAmJgotCQkgICAgICh2bWEt Pm5vZGUuc3RhcnQgJiAoZmVuY2VfYWxpZ25tZW50IC0gMSkpID09IDApOwotCi0JbWFwcGFibGUg PSAodm1hLT5ub2RlLnN0YXJ0ICsgZmVuY2Vfc2l6ZSA8PQotCQkgICAgZGV2X3ByaXYtPmdndHQu bWFwcGFibGVfZW5kKTsKLQotCS8qCi0JICogRXhwbGljaXRseSBkaXNhYmxlIGZvciByb3RhdGVk IFZNQSBzaW5jZSB0aGUgZGlzcGxheSBkb2VzIG5vdAotCSAqIG5lZWQgdGhlIGZlbmNlIGFuZCB0 aGUgVk1BIGlzIG5vdCBhY2Nlc3NpYmxlIHRvIG90aGVyIHVzZXJzLgotCSAqLwotCWlmIChtYXBw YWJsZSAmJiBmZW5jZWFibGUgJiYKLQkgICAgdm1hLT5nZ3R0X3ZpZXcudHlwZSAhPSBJOTE1X0dH VFRfVklFV19ST1RBVEVEKQotCQl2bWEtPmZsYWdzIHw9IEk5MTVfVk1BX0NBTl9GRU5DRTsKLQll bHNlCi0JCXZtYS0+ZmxhZ3MgJj0gfkk5MTVfVk1BX0NBTl9GRU5DRTsKLX0KLQotaW50IF9faTkx NV92bWFfZG9fcGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkgICAgICB1NjQgc2l6ZSwgdTY0 IGFsaWdubWVudCwgdTY0IGZsYWdzKQotewotCXVuc2lnbmVkIGludCBib3VuZCA9IHZtYS0+Zmxh Z3M7Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+c3Ry dWN0X211dGV4KTsKLQlHRU1fQlVHX09OKChmbGFncyAmIChQSU5fR0xPQkFMIHwgUElOX1VTRVIp KSA9PSAwKTsKLQlHRU1fQlVHX09OKChmbGFncyAmIFBJTl9HTE9CQUwpICYmICFpOTE1X3ZtYV9p c19nZ3R0KHZtYSkpOwotCi0JaWYgKFdBUk5fT04oYm91bmQgJiBJOTE1X1ZNQV9QSU5fT1ZFUkZM T1cpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKChib3VuZCAm IEk5MTVfVk1BX0JJTkRfTUFTSykgPT0gMCkgewotCQlyZXQgPSBpOTE1X3ZtYV9pbnNlcnQodm1h LCBzaXplLCBhbGlnbm1lbnQsIGZsYWdzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCX0K LQotCXJldCA9IGk5MTVfdm1hX2JpbmQodm1hLCB2bWEtPm9iai0+Y2FjaGVfbGV2ZWwsIGZsYWdz KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWlmICgoYm91bmQgXiB2bWEtPmZsYWdzKSAm IEk5MTVfVk1BX0dMT0JBTF9CSU5EKQotCQlfX2k5MTVfdm1hX3NldF9tYXBfYW5kX2ZlbmNlYWJs ZSh2bWEpOwotCi0JR0VNX0JVR19PTihpOTE1X3ZtYV9taXNwbGFjZWQodm1hLCBzaXplLCBhbGln bm1lbnQsIGZsYWdzKSk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlfX2k5MTVfdm1hX3VucGluKHZt YSk7Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RydWN0IGk5MTVfdm1hICoKIGk5MTVfZ2VtX29iamVj dF9nZ3R0X3BpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAogCQkJIGNvbnN0IHN0 cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtX2ZlbmNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9mZW5j ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU5ZGJjLi4wMDAwMDAwCi0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlLmMKKysrIC9kZXYvbnVsbApAQCAt MSw3MTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCDCqSAyMDA4LTIwMTUgSW50ZWwgQ29ycG9y YXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJn ZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu ZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRv IGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo b3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdl LCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVz IG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBT b2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBj b25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwg YmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUK LSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNM VURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU WSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1F TlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERF UlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKLSAqIExJQUJJTElU WSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBB UklTSU5HCi0gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS RSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCi0gKiBJTiBUSEUgU09GVFdBUkUuCi0gKi8K LQotI2luY2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSA8ZHJtL2k5MTVfZHJtLmg+Ci0jaW5j bHVkZSAiaTkxNV9kcnYuaCIKLQotLyoqCi0gKiBET0M6IGZlbmNlIHJlZ2lzdGVyIGhhbmRsaW5n Ci0gKgotICogSW1wb3J0YW50IHRvIGF2b2lkIGNvbmZ1c2lvbnM6ICJmZW5jZXMiIGluIHRoZSBp OTE1IGRyaXZlciBhcmUgbm90IGV4ZWN1dGlvbgotICogZmVuY2VzIHVzZWQgdG8gdHJhY2sgY29t bWFuZCBjb21wbGV0aW9uIGJ1dCBoYXJkd2FyZSBkZXRpbGVyIG9iamVjdHMgd2hpY2gKLSAqIHdy YXAgYSBnaXZlbiByYW5nZSBvZiB0aGUgZ2xvYmFsIEdUVC4gRWFjaCBwbGF0Zm9ybSBoYXMgb25s eSBhIGZhaXJseSBsaW1pdGVkCi0gKiBzZXQgb2YgdGhlc2Ugb2JqZWN0cy4KLSAqCi0gKiBGZW5j ZXMgYXJlIHVzZWQgdG8gZGV0aWxlIEdUVCBtZW1vcnkgbWFwcGluZ3MuIFRoZXkncmUgYWxzbyBj b25uZWN0ZWQgdG8gdGhlCi0gKiBoYXJkd2FyZSBmcm9udGJ1ZmZlciByZW5kZXIgdHJhY2tpbmcg YW5kIGhlbmNlIGludGVyYWN0IHdpdGggZnJvbnRidWZmZXIKLSAqIGNvbXByZXNzaW9uLiBGdXJ0 aGVybW9yZSBvbiBvbGRlciBwbGF0Zm9ybXMgZmVuY2VzIGFyZSByZXF1aXJlZCBmb3IgdGlsZWQK LSAqIG9iamVjdHMgdXNlZCBieSB0aGUgZGlzcGxheSBlbmdpbmUuIFRoZXkgY2FuIGFsc28gYmUg dXNlZCBieSB0aGUgcmVuZGVyCi0gKiBlbmdpbmUgLSB0aGV5J3JlIHJlcXVpcmVkIGZvciBibGl0 dGVyIGNvbW1hbmRzIGFuZCBhcmUgb3B0aW9uYWwgZm9yIHJlbmRlcgotICogY29tbWFuZHMuIEJ1 dCBvbiBnZW40KyBib3RoIGRpc3BsYXkgKHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBmYmMpIGFuZCBy ZW5kZXJpbmcKLSAqIGhhdmUgdGhlaXIgb3duIHRpbGluZyBzdGF0ZSBiaXRzIGFuZCBkb24ndCBu ZWVkIGZlbmNlcy4KLSAqCi0gKiBBbHNvIG5vdGUgdGhhdCBmZW5jZXMgb25seSBzdXBwb3J0IFgg YW5kIFkgdGlsaW5nIGFuZCBoZW5jZSBjYW4ndCBiZSB1c2VkIGZvcgotICogdGhlIGZhbmNpZXIg bmV3IHRpbGluZyBmb3JtYXRzIGxpa2UgVywgWXMgYW5kIFlmLgotICoKLSAqIEZpbmFsbHkgbm90 ZSB0aGF0IGJlY2F1c2UgZmVuY2VzIGFyZSBzdWNoIGEgcmVzdHJpY3RlZCByZXNvdXJjZSB0aGV5 J3JlCi0gKiBkeW5hbWljYWxseSBhc3NvY2lhdGVkIHdpdGggb2JqZWN0cy4gRnVydGhlcm1vcmUg ZmVuY2Ugc3RhdGUgaXMgY29tbWl0dGVkIHRvCi0gKiB0aGUgaGFyZHdhcmUgbGF6aWx5IHRvIGF2 b2lkIHVubmVjZXNzYXJ5IHN0YWxscyBvbiBnZW4yLzMuIFRoZXJlZm9yZSBjb2RlIG11c3QKLSAq IGV4cGxpY2l0bHkgY2FsbCBpOTE1X2dlbV9vYmplY3RfZ2V0X2ZlbmNlKCkgdG8gc3luY2hyb25p emUgZmVuY2luZyBzdGF0dXMKLSAqIGZvciBjcHUgYWNjZXNzLiBBbHNvIG5vdGUgdGhhdCBzb21l IGNvZGUgd2FudHMgYW4gdW5mZW5jZWQgdmlldywgZm9yIHRob3NlCi0gKiBjYXNlcyB0aGUgZmVu Y2UgY2FuIGJlIHJlbW92ZWQgZm9yY2VmdWxseSB3aXRoIGk5MTVfZ2VtX29iamVjdF9wdXRfZmVu Y2UoKS4KLSAqCi0gKiBJbnRlcm5hbGx5IHRoZXNlIGZ1bmN0aW9ucyB3aWxsIHN5bmNocm9uaXpl IHdpdGggdXNlcnNwYWNlIGFjY2VzcyBieSByZW1vdmluZwotICogQ1BVIHB0ZXMgaW50byBHVFQg bW1hcHMgKG5vdCB0aGUgR1RUIHB0ZXMgdGhlbXNlbHZlcykgYXMgbmVlZGVkLgotICovCi0KLSNk ZWZpbmUgcGlwZWxpbmVkIDAKLQotc3RhdGljIHZvaWQgaTk2NV93cml0ZV9mZW5jZV9yZWcoc3Ry dWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2UsCi0JCQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1h KQotewotCWk5MTVfcmVnX3QgZmVuY2VfcmVnX2xvLCBmZW5jZV9yZWdfaGk7Ci0JaW50IGZlbmNl X3BpdGNoX3NoaWZ0OwotCXU2NCB2YWw7Ci0KLQlpZiAoSU5URUxfSU5GTyhmZW5jZS0+aTkxNSkt PmdlbiA+PSA2KSB7Ci0JCWZlbmNlX3JlZ19sbyA9IEZFTkNFX1JFR19HRU42X0xPKGZlbmNlLT5p ZCk7Ci0JCWZlbmNlX3JlZ19oaSA9IEZFTkNFX1JFR19HRU42X0hJKGZlbmNlLT5pZCk7Ci0JCWZl bmNlX3BpdGNoX3NoaWZ0ID0gR0VONl9GRU5DRV9QSVRDSF9TSElGVDsKLQotCX0gZWxzZSB7Ci0J CWZlbmNlX3JlZ19sbyA9IEZFTkNFX1JFR185NjVfTE8oZmVuY2UtPmlkKTsKLQkJZmVuY2VfcmVn X2hpID0gRkVOQ0VfUkVHXzk2NV9ISShmZW5jZS0+aWQpOwotCQlmZW5jZV9waXRjaF9zaGlmdCA9 IEk5NjVfRkVOQ0VfUElUQ0hfU0hJRlQ7Ci0JfQotCi0JdmFsID0gMDsKLQlpZiAodm1hKSB7Ci0J CXVuc2lnbmVkIGludCB0aWxpbmcgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyh2bWEtPm9i aik7Ci0JCWJvb2wgaXNfeV90aWxlZCA9IHRpbGluZyA9PSBJOTE1X1RJTElOR19ZOwotCQl1bnNp Z25lZCBpbnQgc3RyaWRlID0gaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmopOwot CQl1MzIgcm93X3NpemUgPSBzdHJpZGUgKiAoaXNfeV90aWxlZCA/IDMyIDogOCk7Ci0JCXUzMiBz aXplID0gcm91bmRkb3duKCh1MzIpdm1hLT5ub2RlLnNpemUsIHJvd19zaXplKTsKLQotCQl2YWwg PSAoKHZtYS0+bm9kZS5zdGFydCArIHNpemUgLSA0MDk2KSAmIDB4ZmZmZmYwMDApIDw8IDMyOwot CQl2YWwgfD0gdm1hLT5ub2RlLnN0YXJ0ICYgMHhmZmZmZjAwMDsKLQkJdmFsIHw9ICh1NjQpKChz dHJpZGUgLyAxMjgpIC0gMSkgPDwgZmVuY2VfcGl0Y2hfc2hpZnQ7Ci0JCWlmIChpc195X3RpbGVk KQotCQkJdmFsIHw9IEJJVChJOTY1X0ZFTkNFX1RJTElOR19ZX1NISUZUKTsKLQkJdmFsIHw9IEk5 NjVfRkVOQ0VfUkVHX1ZBTElEOwotCX0KLQotCWlmICghcGlwZWxpbmVkKSB7Ci0JCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5pOTE1OwotCi0JCS8qIFRvIHcvYSBp bmNvaGVyZW5jeSB3aXRoIG5vbi1hdG9taWMgNjQtYml0IHJlZ2lzdGVyIHVwZGF0ZXMsCi0JCSAq IHdlIHNwbGl0IHRoZSA2NC1iaXQgdXBkYXRlIGludG8gdHdvIDMyLWJpdCB3cml0ZXMuIEluIG9y ZGVyCi0JCSAqIGZvciBhIHBhcnRpYWwgZmVuY2Ugbm90IHRvIGJlIGV2YWx1YXRlZCBiZXR3ZWVu IHdyaXRlcywgd2UKLQkJICogcHJlY2VkZSB0aGUgdXBkYXRlIHdpdGggd3JpdGUgdG8gdHVybiBv ZmYgdGhlIGZlbmNlIHJlZ2lzdGVyLAotCQkgKiBhbmQgb25seSBlbmFibGUgdGhlIGZlbmNlIGFz IHRoZSBsYXN0IHN0ZXAuCi0JCSAqCi0JCSAqIEZvciBleHRyYSBsZXZlbHMgb2YgcGFyYW5vaWEs IHdlIG1ha2Ugc3VyZSBlYWNoIHN0ZXAgbGFuZHMKLQkJICogYmVmb3JlIGFwcGx5aW5nIHRoZSBu ZXh0IHN0ZXAuCi0JCSAqLwotCQlJOTE1X1dSSVRFKGZlbmNlX3JlZ19sbywgMCk7Ci0JCVBPU1RJ TkdfUkVBRChmZW5jZV9yZWdfbG8pOwotCi0JCUk5MTVfV1JJVEUoZmVuY2VfcmVnX2hpLCB1cHBl cl8zMl9iaXRzKHZhbCkpOwotCQlJOTE1X1dSSVRFKGZlbmNlX3JlZ19sbywgbG93ZXJfMzJfYml0 cyh2YWwpKTsKLQkJUE9TVElOR19SRUFEKGZlbmNlX3JlZ19sbyk7Ci0JfQotfQotCi1zdGF0aWMg dm9pZCBpOTE1X3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5j ZSwKLQkJCQkgc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IDA7 Ci0JaWYgKHZtYSkgewotCQl1bnNpZ25lZCBpbnQgdGlsaW5nID0gaTkxNV9nZW1fb2JqZWN0X2dl dF90aWxpbmcodm1hLT5vYmopOwotCQlib29sIGlzX3lfdGlsZWQgPSB0aWxpbmcgPT0gSTkxNV9U SUxJTkdfWTsKLQkJdW5zaWduZWQgaW50IHN0cmlkZSA9IGk5MTVfZ2VtX29iamVjdF9nZXRfc3Ry aWRlKHZtYS0+b2JqKTsKLQkJaW50IHBpdGNoX3ZhbDsKLQkJaW50IHRpbGVfd2lkdGg7Ci0KLQkJ V0FSTigodm1hLT5ub2RlLnN0YXJ0ICYgfkk5MTVfRkVOQ0VfU1RBUlRfTUFTSykgfHwKLQkJICAg ICAhaXNfcG93ZXJfb2ZfMih2bWEtPm5vZGUuc2l6ZSkgfHwKLQkJICAgICAodm1hLT5ub2RlLnN0 YXJ0ICYgKHZtYS0+bm9kZS5zaXplIC0gMSkpLAotCQkgICAgICJvYmplY3QgMHglMDhsbHggW2Zl bmNlYWJsZT8gJWRdIG5vdCAxTSBvciBwb3Qtc2l6ZSAoMHglMDhsbHgpIGFsaWduZWRcbiIsCi0J CSAgICAgdm1hLT5ub2RlLnN0YXJ0LAotCQkgICAgIGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2Vh YmxlKHZtYSksCi0JCSAgICAgdm1hLT5ub2RlLnNpemUpOwotCi0JCWlmIChpc195X3RpbGVkICYm IEhBU18xMjhfQllURV9ZX1RJTElORyhmZW5jZS0+aTkxNSkpCi0JCQl0aWxlX3dpZHRoID0gMTI4 OwotCQllbHNlCi0JCQl0aWxlX3dpZHRoID0gNTEyOwotCi0JCS8qIE5vdGU6IHBpdGNoIGJldHRl ciBiZSBhIHBvd2VyIG9mIHR3byB0aWxlIHdpZHRocyAqLwotCQlwaXRjaF92YWwgPSBzdHJpZGUg LyB0aWxlX3dpZHRoOwotCQlwaXRjaF92YWwgPSBmZnMocGl0Y2hfdmFsKSAtIDE7Ci0KLQkJdmFs ID0gdm1hLT5ub2RlLnN0YXJ0OwotCQlpZiAoaXNfeV90aWxlZCkKLQkJCXZhbCB8PSBCSVQoSTgz MF9GRU5DRV9USUxJTkdfWV9TSElGVCk7Ci0JCXZhbCB8PSBJOTE1X0ZFTkNFX1NJWkVfQklUUyh2 bWEtPm5vZGUuc2l6ZSk7Ci0JCXZhbCB8PSBwaXRjaF92YWwgPDwgSTgzMF9GRU5DRV9QSVRDSF9T SElGVDsKLQkJdmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOwotCX0KLQotCWlmICghcGlwZWxp bmVkKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGZlbmNlLT5pOTE1 OwotCQlpOTE1X3JlZ190IHJlZyA9IEZFTkNFX1JFRyhmZW5jZS0+aWQpOwotCi0JCUk5MTVfV1JJ VEUocmVnLCB2YWwpOwotCQlQT1NUSU5HX1JFQUQocmVnKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lk IGk4MzBfd3JpdGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAot CQkJCSBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQl1MzIgdmFsOwotCi0JdmFsID0gMDsKLQlp ZiAodm1hKSB7Ci0JCXVuc2lnbmVkIGludCB0aWxpbmcgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X3Rp bGluZyh2bWEtPm9iaik7Ci0JCWJvb2wgaXNfeV90aWxlZCA9IHRpbGluZyA9PSBJOTE1X1RJTElO R19ZOwotCQl1bnNpZ25lZCBpbnQgc3RyaWRlID0gaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUo dm1hLT5vYmopOwotCQl1MzIgcGl0Y2hfdmFsOwotCi0JCVdBUk4oKHZtYS0+bm9kZS5zdGFydCAm IH5JODMwX0ZFTkNFX1NUQVJUX01BU0spIHx8Ci0JCSAgICAgIWlzX3Bvd2VyX29mXzIodm1hLT5u b2RlLnNpemUpIHx8Ci0JCSAgICAgKHZtYS0+bm9kZS5zdGFydCAmICh2bWEtPm5vZGUuc2l6ZSAt IDEpKSwKLQkJICAgICAib2JqZWN0IDB4JTA4bGx4IG5vdCA1MTJLIG9yIHBvdC1zaXplIDB4JTA4 bGx4IGFsaWduZWRcbiIsCi0JCSAgICAgdm1hLT5ub2RlLnN0YXJ0LCB2bWEtPm5vZGUuc2l6ZSk7 Ci0KLQkJcGl0Y2hfdmFsID0gc3RyaWRlIC8gMTI4OwotCQlwaXRjaF92YWwgPSBmZnMocGl0Y2hf dmFsKSAtIDE7Ci0KLQkJdmFsID0gdm1hLT5ub2RlLnN0YXJ0OwotCQlpZiAoaXNfeV90aWxlZCkK LQkJCXZhbCB8PSBCSVQoSTgzMF9GRU5DRV9USUxJTkdfWV9TSElGVCk7Ci0JCXZhbCB8PSBJODMw X0ZFTkNFX1NJWkVfQklUUyh2bWEtPm5vZGUuc2l6ZSk7Ci0JCXZhbCB8PSBwaXRjaF92YWwgPDwg STgzMF9GRU5DRV9QSVRDSF9TSElGVDsKLQkJdmFsIHw9IEk4MzBfRkVOQ0VfUkVHX1ZBTElEOwot CX0KLQotCWlmICghcGlwZWxpbmVkKSB7Ci0JCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IGZlbmNlLT5pOTE1OwotCQlpOTE1X3JlZ190IHJlZyA9IEZFTkNFX1JFRyhmZW5jZS0+ aWQpOwotCi0JCUk5MTVfV1JJVEUocmVnLCB2YWwpOwotCQlQT1NUSU5HX1JFQUQocmVnKTsKLQl9 Ci19Ci0KLXN0YXRpYyB2b2lkIGZlbmNlX3dyaXRlKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcg KmZlbmNlLAotCQkJc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JLyogUHJldmlvdXMgYWNjZXNz IHRocm91Z2ggdGhlIGZlbmNlIHJlZ2lzdGVyIGlzIG1hcnNoYWxsZWQgYnkKLQkgKiB0aGUgbWIo KSBpbnNpZGUgdGhlIGZhdWx0IGhhbmRsZXJzIChpOTE1X2dlbV9yZWxlYXNlX21tYXBzKQotCSAq IGFuZCBleHBsaWNpdGx5IG1hbmFnZWQgZm9yIGludGVybmFsIHVzZXJzLgotCSAqLwotCi0JaWYg KElTX0dFTjIoZmVuY2UtPmk5MTUpKQotCQlpODMwX3dyaXRlX2ZlbmNlX3JlZyhmZW5jZSwgdm1h KTsKLQllbHNlIGlmIChJU19HRU4zKGZlbmNlLT5pOTE1KSkKLQkJaTkxNV93cml0ZV9mZW5jZV9y ZWcoZmVuY2UsIHZtYSk7Ci0JZWxzZQotCQlpOTY1X3dyaXRlX2ZlbmNlX3JlZyhmZW5jZSwgdm1h KTsKLQotCS8qIEFjY2VzcyB0aHJvdWdoIHRoZSBmZW5jZWQgcmVnaW9uIGFmdGVyd2FyZHMgaXMK LQkgKiBvcmRlcmVkIGJ5IHRoZSBwb3N0aW5nIHJlYWRzIHdoaWxzdCB3cml0aW5nIHRoZSByZWdp c3RlcnMuCi0JICovCi0KLQlmZW5jZS0+ZGlydHkgPSBmYWxzZTsKLX0KLQotc3RhdGljIGludCBm ZW5jZV91cGRhdGUoc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2UsCi0JCQlzdHJ1Y3Qg aTkxNV92bWEgKnZtYSkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHZtYSkgewotCQlpZiAoIWk5MTVf dm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlp ZiAoV0FSTighaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmopIHx8Ci0JCQkgIWk5 MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKHZtYS0+b2JqKSwKLQkJCSAiYm9ndXMgZmVuY2Ugc2V0 dXAgd2l0aCBzdHJpZGU6IDB4JXgsIHRpbGluZyBtb2RlOiAlaVxuIiwKLQkJCSBpOTE1X2dlbV9v YmplY3RfZ2V0X3N0cmlkZSh2bWEtPm9iaiksCi0JCQkgaTkxNV9nZW1fb2JqZWN0X2dldF90aWxp bmcodm1hLT5vYmopKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXJldCA9IGk5MTVfZ2VtX2Fj dGl2ZV9yZXRpcmUoJnZtYS0+bGFzdF9mZW5jZSwKLQkJCQkJICAgICAmdm1hLT5vYmotPmJhc2Uu ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlp ZiAoZmVuY2UtPnZtYSkgewotCQlyZXQgPSBpOTE1X2dlbV9hY3RpdmVfcmV0aXJlKCZmZW5jZS0+ dm1hLT5sYXN0X2ZlbmNlLAotCQkJCSAgICAgICZmZW5jZS0+dm1hLT5vYmotPmJhc2UuZGV2LT5z dHJ1Y3RfbXV0ZXgpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoZmVu Y2UtPnZtYSAmJiBmZW5jZS0+dm1hICE9IHZtYSkgewotCQkvKiBFbnN1cmUgdGhhdCBhbGwgdXNl cnNwYWNlIENQVSBhY2Nlc3MgaXMgY29tcGxldGVkIGJlZm9yZQotCQkgKiBzdGVhbGluZyB0aGUg ZmVuY2UuCi0JCSAqLwotCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAoZmVuY2UtPnZtYS0+b2JqKTsK LQotCQlmZW5jZS0+dm1hLT5mZW5jZSA9IE5VTEw7Ci0JCWZlbmNlLT52bWEgPSBOVUxMOwotCi0J CWxpc3RfbW92ZSgmZmVuY2UtPmxpbmssICZmZW5jZS0+aTkxNS0+bW0uZmVuY2VfbGlzdCk7Ci0J fQotCi0JZmVuY2Vfd3JpdGUoZmVuY2UsIHZtYSk7Ci0KLQlpZiAodm1hKSB7Ci0JCWlmIChmZW5j ZS0+dm1hICE9IHZtYSkgewotCQkJdm1hLT5mZW5jZSA9IGZlbmNlOwotCQkJZmVuY2UtPnZtYSA9 IHZtYTsKLQkJfQotCi0JCWxpc3RfbW92ZV90YWlsKCZmZW5jZS0+bGluaywgJmZlbmNlLT5pOTE1 LT5tbS5mZW5jZV9saXN0KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpOTE1X3Zt YV9wdXRfZmVuY2UgLSBmb3JjZS1yZW1vdmUgZmVuY2UgZm9yIGEgVk1BCi0gKiBAdm1hOiB2bWEg dG8gbWFwIGxpbmVhcmx5IChub3QgdGhyb3VnaCBhIGZlbmNlIHJlZykKLSAqCi0gKiBUaGlzIGZ1 bmN0aW9uIGZvcmNlLXJlbW92ZXMgYW55IGZlbmNlIGZyb20gdGhlIGdpdmVuIG9iamVjdCwgd2hp Y2ggaXMgdXNlZnVsCi0gKiBpZiB0aGUga2VybmVsIHdhbnRzIHRvIGRvIHVudGlsZWQgR1RUIGFj Y2Vzcy4KLSAqCi0gKiBSZXR1cm5zOgotICoKLSAqIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJy b3IgY29kZSBvbiBmYWlsdXJlLgotICovCi1pbnQKLWk5MTVfdm1hX3B1dF9mZW5jZShzdHJ1Y3Qg aTkxNV92bWEgKnZtYSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZSA9IHZt YS0+ZmVuY2U7Ci0KLQlhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQodG9faTkxNSh2bWEtPnZtLT5k ZXYpKTsKLQotCWlmICghZmVuY2UpCi0JCXJldHVybiAwOwotCi0JaWYgKGZlbmNlLT5waW5fY291 bnQpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlyZXR1cm4gZmVuY2VfdXBkYXRlKGZlbmNlLCBOVUxM KTsKLX0KLQotc3RhdGljIHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlX2ZpbmQoc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXN0cnVjdCBkcm1faTkxNV9mZW5j ZV9yZWcgKmZlbmNlOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmZW5jZSwgJmRldl9wcml2LT5t bS5mZW5jZV9saXN0LCBsaW5rKSB7Ci0JCWlmIChmZW5jZS0+cGluX2NvdW50KQotCQkJY29udGlu dWU7Ci0KLQkJcmV0dXJuIGZlbmNlOwotCX0KLQotCS8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2Yg cGVuZGluZyBmbGlwcyB3aGljaCBjb25zdW1lIGZlbmNlcyAqLwotCWlmIChpbnRlbF9oYXNfcGVu ZGluZ19mYl91bnBpbigmZGV2X3ByaXYtPmRybSkpCi0JCXJldHVybiBFUlJfUFRSKC1FQUdBSU4p OwotCi0JcmV0dXJuIEVSUl9QVFIoLUVERUFETEspOwotfQotCi0vKioKLSAqIGk5MTVfdm1hX2dl dF9mZW5jZSAtIHNldCB1cCBmZW5jaW5nIGZvciBhIHZtYQotICogQHZtYTogdm1hIHRvIG1hcCB0 aHJvdWdoIGEgZmVuY2UgcmVnCi0gKgotICogV2hlbiBtYXBwaW5nIG9iamVjdHMgdGhyb3VnaCB0 aGUgR1RULCB1c2Vyc3BhY2Ugd2FudHMgdG8gYmUgYWJsZSB0byB3cml0ZQotICogdG8gdGhlbSB3 aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBzd2l6emxpbmcgaWYgdGhlIG9iamVjdCBpcyB0 aWxlZC4KLSAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIGZlbmNlIHJlZ3MgbG9va2luZyBmb3Ig YSBmcmVlIG9uZSBmb3IgQG9iaiwKLSAqIHN0ZWFsaW5nIG9uZSBpZiBpdCBjYW4ndCBmaW5kIGFu eS4KLSAqCi0gKiBJdCB0aGVuIHNldHMgdXAgdGhlIHJlZyBiYXNlZCBvbiB0aGUgb2JqZWN0J3Mg cHJvcGVydGllczogYWRkcmVzcywgcGl0Y2gKLSAqIGFuZCB0aWxpbmcgZm9ybWF0LgotICoKLSAq IEZvciBhbiB1bnRpbGVkIHN1cmZhY2UsIHRoaXMgcmVtb3ZlcyBhbnkgZXhpc3RpbmcgZmVuY2Uu Ci0gKgotICogUmV0dXJuczoKLSAqCi0gKiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNv ZGUgb24gZmFpbHVyZS4KLSAqLwotaW50Ci1pOTE1X3ZtYV9nZXRfZmVuY2Uoc3RydWN0IGk5MTVf dm1hICp2bWEpCi17Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2U7Ci0Jc3RydWN0 IGk5MTVfdm1hICpzZXQgPSBpOTE1X2dlbV9vYmplY3RfaXNfdGlsZWQodm1hLT5vYmopID8gdm1h IDogTlVMTDsKLQotCS8qIE5vdGUgdGhhdCB3ZSByZXZva2UgZmVuY2VzIG9uIHJ1bnRpbWUgc3Vz cGVuZC4gVGhlcmVmb3JlIHRoZSB1c2VyCi0JICogbXVzdCBrZWVwIHRoZSBkZXZpY2UgYXdha2Ug d2hpbHN0IHVzaW5nIHRoZSBmZW5jZS4KLQkgKi8KLQlhc3NlcnRfcnBtX3dha2Vsb2NrX2hlbGQo dG9faTkxNSh2bWEtPnZtLT5kZXYpKTsKLQotCS8qIEp1c3QgdXBkYXRlIG91ciBwbGFjZSBpbiB0 aGUgTFJVIGlmIG91ciBmZW5jZSBpcyBnZXR0aW5nIHJldXNlZC4gKi8KLQlpZiAodm1hLT5mZW5j ZSkgewotCQlmZW5jZSA9IHZtYS0+ZmVuY2U7Ci0JCWlmICghZmVuY2UtPmRpcnR5KSB7Ci0JCQls aXN0X21vdmVfdGFpbCgmZmVuY2UtPmxpbmssCi0JCQkJICAgICAgICZmZW5jZS0+aTkxNS0+bW0u ZmVuY2VfbGlzdCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0gZWxzZSBpZiAoc2V0KSB7Ci0JCWZl bmNlID0gZmVuY2VfZmluZCh0b19pOTE1KHZtYS0+dm0tPmRldikpOwotCQlpZiAoSVNfRVJSKGZl bmNlKSkKLQkJCXJldHVybiBQVFJfRVJSKGZlbmNlKTsKLQl9IGVsc2UKLQkJcmV0dXJuIDA7Ci0K LQlyZXR1cm4gZmVuY2VfdXBkYXRlKGZlbmNlLCBzZXQpOwotfQotCi0vKioKLSAqIGk5MTVfZ2Vt X3Jlc3RvcmVfZmVuY2VzIC0gcmVzdG9yZSBmZW5jZSBzdGF0ZQotICogQGRldjogRFJNIGRldmlj ZQotICoKLSAqIFJlc3RvcmUgdGhlIGh3IGZlbmNlIHN0YXRlIHRvIG1hdGNoIHRoZSBzb2Z0d2Fy ZSB0cmFja2luZyBhZ2FpbiwgdG8gYmUgY2FsbGVkCi0gKiBhZnRlciBhIGdwdSByZXNldCBhbmQg b24gcmVzdW1lLiBOb3RlIHRoYXQgb24gcnVudGltZSBzdXNwZW5kIHdlIG9ubHkgY2FuY2VsCi0g KiB0aGUgZmVuY2VzLCB0byBiZSByZWFjcXVpcmVkIGJ5IHRoZSB1c2VyIGxhdGVyLgotICovCi12 b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZmVuY2VzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0J c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCWludCBp OwotCi0JZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5udW1fZmVuY2VfcmVnczsgaSsrKSB7Ci0J CXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKnJlZyA9ICZkZXZfcHJpdi0+ZmVuY2VfcmVnc1tp XTsKLQkJc3RydWN0IGk5MTVfdm1hICp2bWEgPSByZWctPnZtYTsKLQotCQkvKgotCQkgKiBDb21t aXQgZGVsYXllZCB0aWxpbmcgY2hhbmdlcyBpZiB3ZSBoYXZlIGFuIG9iamVjdCBzdGlsbAotCQkg KiBhdHRhY2hlZCB0byB0aGUgZmVuY2UsIG90aGVyd2lzZSBqdXN0IGNsZWFyIHRoZSBmZW5jZS4K LQkJICovCi0JCWlmICh2bWEgJiYgIWk5MTVfZ2VtX29iamVjdF9pc190aWxlZCh2bWEtPm9iaikp IHsKLQkJCUdFTV9CVUdfT04oIXJlZy0+ZGlydHkpOwotCQkJR0VNX0JVR19PTighbGlzdF9lbXB0 eSgmdm1hLT5vYmotPnVzZXJmYXVsdF9saW5rKSk7Ci0KLQkJCWxpc3RfbW92ZSgmcmVnLT5saW5r LCAmZGV2X3ByaXYtPm1tLmZlbmNlX2xpc3QpOwotCQkJdm1hLT5mZW5jZSA9IE5VTEw7Ci0JCQl2 bWEgPSBOVUxMOwotCQl9Ci0KLQkJZmVuY2Vfd3JpdGUocmVnLCB2bWEpOwotCQlyZWctPnZtYSA9 IHZtYTsKLQl9Ci19Ci0KLS8qKgotICogRE9DOiB0aWxpbmcgc3dpenpsaW5nIGRldGFpbHMKLSAq Ci0gKiBUaGUgaWRlYSBiZWhpbmQgdGlsaW5nIGlzIHRvIGluY3JlYXNlIGNhY2hlIGhpdCByYXRl cyBieSByZWFycmFuZ2luZwotICogcGl4ZWwgZGF0YSBzbyB0aGF0IGEgZ3JvdXAgb2YgcGl4ZWwg YWNjZXNzZXMgYXJlIGluIHRoZSBzYW1lIGNhY2hlbGluZS4KLSAqIFBlcmZvcm1hbmNlIGltcHJv dmVtZW50IGZyb20gZG9pbmcgdGhpcyBvbiB0aGUgYmFjay9kZXB0aCBidWZmZXIgYXJlIG9uCi0g KiB0aGUgb3JkZXIgb2YgMzAlLgotICoKLSAqIEludGVsIGFyY2hpdGVjdHVyZXMgbWFrZSB0aGlz IHNvbWV3aGF0IG1vcmUgY29tcGxpY2F0ZWQsIHRob3VnaCwgYnkKLSAqIGFkanVzdG1lbnRzIG1h ZGUgdG8gYWRkcmVzc2luZyBvZiBkYXRhIHdoZW4gdGhlIG1lbW9yeSBpcyBpbiBpbnRlcmxlYXZl ZAotICogbW9kZSAobWF0Y2hlZCBwYWlycyBvZiBESU1NUykgdG8gaW1wcm92ZSBtZW1vcnkgYmFu ZHdpZHRoLgotICogRm9yIGludGVybGVhdmVkIG1lbW9yeSwgdGhlIENQVSBzZW5kcyBldmVyeSBz ZXF1ZW50aWFsIDY0IGJ5dGVzCi0gKiB0byBhbiBhbHRlcm5hdGUgbWVtb3J5IGNoYW5uZWwgc28g aXQgY2FuIGdldCB0aGUgYmFuZHdpZHRoIGZyb20gYm90aC4KLSAqCi0gKiBUaGUgR1BVIGFsc28g cmVhcnJhbmdlcyBpdHMgYWNjZXNzZXMgZm9yIGluY3JlYXNlZCBiYW5kd2lkdGggdG8gaW50ZXJs ZWF2ZWQKLSAqIG1lbW9yeSwgYW5kIGl0IG1hdGNoZXMgd2hhdCB0aGUgQ1BVIGRvZXMgZm9yIG5v bi10aWxlZC4gIEhvd2V2ZXIsIHdoZW4gdGlsZWQKLSAqIGl0IGRvZXMgaXQgYSBsaXR0bGUgZGlm ZmVyZW50bHksIHNpbmNlIG9uZSB3YWxrcyBhZGRyZXNzZXMgbm90IGp1c3QgaW4gdGhlCi0gKiBY IGRpcmVjdGlvbiBidXQgYWxzbyBZLiAgU28sIGFsb25nIHdpdGggYWx0ZXJuYXRpbmcgY2hhbm5l bHMgd2hlbiBiaXQKLSAqIDYgb2YgdGhlIGFkZHJlc3MgZmxpcHMsIGl0IGFsc28gYWx0ZXJuYXRl cyB3aGVuIG90aGVyIGJpdHMgZmxpcCAtLSAgQml0cyA5Ci0gKiAoZXZlcnkgNTEyIGJ5dGVzLCBh biBYIHRpbGUgc2NhbmxpbmUpIGFuZCAxMCAoZXZlcnkgdHdvIFggdGlsZSBzY2FubGluZXMpCi0g KiBhcmUgY29tbW9uIHRvIGJvdGggdGhlIDkxNSBhbmQgOTY1LWNsYXNzIGhhcmR3YXJlLgotICoK LSAqIFRoZSBDUFUgYWxzbyBzb21ldGltZXMgWE9ScyBpbiBoaWdoZXIgYml0cyBhcyB3ZWxsLCB0 byBpbXByb3ZlCi0gKiBiYW5kd2lkdGggZG9pbmcgc3RyaWRlZCBhY2Nlc3MgbGlrZSB3ZSBkbyBz byBmcmVxdWVudGx5IGluIGdyYXBoaWNzLiAgVGhpcwotICogaXMgY2FsbGVkICJDaGFubmVsIFhP UiBSYW5kb21pemF0aW9uIiBpbiB0aGUgTUNIIGRvY3VtZW50YXRpb24uICBUaGUgcmVzdWx0Ci0g KiBpcyB0aGF0IHRoZSBDUFUgaXMgWE9SaW5nIGluIGVpdGhlciBiaXQgMTEgb3IgYml0IDE3IHRv IGJpdCA2IG9mIGl0cyBhZGRyZXNzCi0gKiBkZWNvZGUuCi0gKgotICogQWxsIG9mIHRoaXMgYml0 IDYgWE9SaW5nIGhhcyBhbiBlZmZlY3Qgb24gb3VyIG1lbW9yeSBtYW5hZ2VtZW50LAotICogYXMg d2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgM2QgZHJpdmVyIGNhbiBjb3JyZWN0bHkgYWRk cmVzcyBvYmplY3QKLSAqIGNvbnRlbnRzLgotICoKLSAqIElmIHdlIGRvbid0IGhhdmUgaW50ZXJs ZWF2ZWQgbWVtb3J5LCBhbGwgdGlsaW5nIGlzIHNhZmUgYW5kIG5vIHN3aXp6bGluZyBpcwotICog cmVxdWlyZWQuCi0gKgotICogV2hlbiBiaXQgMTcgaXMgWE9SZWQgaW4sIHdlIHNpbXBseSByZWZ1 c2UgdG8gdGlsZSBhdCBhbGwuICBCaXQKLSAqIDE3IGlzIG5vdCBqdXN0IGEgcGFnZSBvZmZzZXQs IHNvIGFzIHdlIHBhZ2UgYW4gb2JqZWN0IG91dCBhbmQgYmFjayBpbiwKLSAqIGluZGl2aWR1YWwg cGFnZXMgaW4gaXQgd2lsbCBoYXZlIGRpZmZlcmVudCBiaXQgMTcgYWRkcmVzc2VzLCByZXN1bHRp bmcgaW4KLSAqIGVhY2ggNjQgYnl0ZXMgYmVpbmcgc3dhcHBlZCB3aXRoIGl0cyBuZWlnaGJvciEK LSAqCi0gKiBPdGhlcndpc2UsIGlmIGludGVybGVhdmVkLCB3ZSBoYXZlIHRvIHRlbGwgdGhlIDNk IGRyaXZlciB3aGF0IHRoZSBhZGRyZXNzCi0gKiBzd2l6emxpbmcgaXQgbmVlZHMgdG8gZG8gaXMs IHNpbmNlIGl0J3Mgd3JpdGluZyB3aXRoIHRoZSBDUFUgdG8gdGhlIHBhZ2VzCi0gKiAoYml0IDYg YW5kIHBvdGVudGlhbGx5IGJpdCAxMSBYT1JlZCBpbiksIGFuZCB0aGUgR1BVIGlzIHJlYWRpbmcg ZnJvbSB0aGUKLSAqIHBhZ2VzIChiaXQgNiwgOSwgYW5kIDEwIFhPUmVkIGluKSwgcmVzdWx0aW5n IGluIGEgY3VtdWxhdGl2ZSBiaXQgc3dpenpsaW5nCi0gKiByZXF1aXJlZCBieSB0aGUgQ1BVIG9m IFhPUmluZyBpbiBiaXQgNiwgOSwgMTAsIGFuZCBwb3RlbnRpYWxseSAxMSwgaW4gb3JkZXIKLSAq IHRvIG1hdGNoIHdoYXQgdGhlIEdQVSBleHBlY3RzLgotICovCi0KLS8qKgotICogaTkxNV9nZW1f ZGV0ZWN0X2JpdF82X3N3aXp6bGUgLSBkZXRlY3QgYml0IDYgc3dpenpsaW5nIHBhdHRlcm4KLSAq IEBkZXY6IERSTSBkZXZpY2UKLSAqCi0gKiBEZXRlY3RzIGJpdCA2IHN3aXp6bGluZyBvZiBhZGRy ZXNzIGxvb2t1cCBiZXR3ZWVuIElHRCBhY2Nlc3MgYW5kIENQVQotICogYWNjZXNzIHRocm91Z2gg bWFpbiBtZW1vcnkuCi0gKi8KLXZvaWQKLWk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6emxlKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2ID0gdG9faTkxNShkZXYpOwotCXVpbnQzMl90IHN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJ WlpMRV9VTktOT1dOOwotCXVpbnQzMl90IHN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9V TktOT1dOOwotCi0JaWYgKElOVEVMX0dFTihkZXZfcHJpdikgPj0gOCB8fCBJU19WQUxMRVlWSUVX KGRldl9wcml2KSkgewotCQkvKgotCQkgKiBPbiBCRFcrLCBzd2l6emxpbmcgaXMgbm90IHVzZWQu IFdlIGxlYXZlIHRoZSBDUFUgbWVtb3J5Ci0JCSAqIGNvbnRyb2xsZXIgaW4gY2hhcmdlIG9mIG9w dGltaXppbmcgbWVtb3J5IGFjY2Vzc2VzIHdpdGhvdXQKLQkJICogdGhlIGV4dHJhIGFkZHJlc3Mg bWFuaXB1bGF0aW9uIEdQVSBzaWRlLgotCQkgKgotCQkgKiBWTFYgYW5kIENIViBkb24ndCBoYXZl IEdQVSBzd2l6emxpbmcuCi0JCSAqLwotCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVf Tk9ORTsKLQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JfSBlbHNlIGlm IChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA2KSB7Ci0JCWlmIChkZXZfcHJpdi0+cHJlc2VydmVf Ymlvc19zd2l6emxlKSB7Ci0JCQlpZiAoSTkxNV9SRUFEKERJU1BfQVJCX0NUTCkgJgotCQkJICAg IERJU1BfVElMRV9TVVJGQUNFX1NXSVpaTElORykgewotCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklU XzZfU1dJWlpMRV85XzEwOwotCQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85Owot CQkJfSBlbHNlIHsKLQkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJ CQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJCX0KLQkJfSBlbHNlIHsK LQkJCXVpbnQzMl90IGRpbW1fYzAsIGRpbW1fYzE7Ci0JCQlkaW1tX2MwID0gSTkxNV9SRUFEKE1B RF9ESU1NX0MwKTsKLQkJCWRpbW1fYzEgPSBJOTE1X1JFQUQoTUFEX0RJTU1fQzEpOwotCQkJZGlt bV9jMCAmPSBNQURfRElNTV9BX1NJWkVfTUFTSyB8IE1BRF9ESU1NX0JfU0laRV9NQVNLOwotCQkJ ZGltbV9jMSAmPSBNQURfRElNTV9BX1NJWkVfTUFTSyB8IE1BRF9ESU1NX0JfU0laRV9NQVNLOwot CQkJLyogRW5hYmxlIHN3aXp6bGluZyB3aGVuIHRoZSBjaGFubmVscyBhcmUgcG9wdWxhdGVkCi0J CQkgKiB3aXRoIGlkZW50aWNhbGx5IHNpemVkIGRpbW1zLiBXZSBkb24ndCBuZWVkIHRvIGNoZWNr Ci0JCQkgKiB0aGUgM3JkIGNoYW5uZWwgYmVjYXVzZSBubyBjcHUgd2l0aCBncHUgYXR0YWNoZWQK LQkJCSAqIHNoaXBzIGluIHRoYXQgY29uZmlndXJhdGlvbi4gQWxzbywgc3dpenpsaW5nIG9ubHkK LQkJCSAqIG1ha2VzIHNlbnNlIGZvciAyIGNoYW5uZWxzIGFueXdheS4gKi8KLQkJCWlmIChkaW1t X2MwID09IGRpbW1fYzEpIHsKLQkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8x MDsKLQkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOTsKLQkJCX0gZWxzZSB7Ci0J CQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JCQkJc3dpenpsZV95ID0g STkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKElTX0dFTjUo ZGV2X3ByaXYpKSB7Ci0JCS8qIE9uIElyb25sYWtlIHdoYXRldmVyIERSQU0gY29uZmlnLCBHUFUg YWx3YXlzIGRvCi0JCSAqIHNhbWUgc3dpenpsaW5nIHNldHVwLgotCQkgKi8KLQkJc3dpenpsZV94 ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTA7Ci0JCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJ WlpMRV85OwotCX0gZWxzZSBpZiAoSVNfR0VOMihkZXZfcHJpdikpIHsKLQkJLyogQXMgZmFyIGFz IHdlIGtub3csIHRoZSA4NjUgZG9lc24ndCBoYXZlIHRoZXNlIGJpdCA2Ci0JCSAqIHN3aXp6bGlu ZyBpc3N1ZXMuCi0JCSAqLwotCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsK LQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7Ci0JfSBlbHNlIGlmIChJU19N T0JJTEUoZGV2X3ByaXYpIHx8IChJU19HRU4zKGRldl9wcml2KSAmJgotCQkgICAhSVNfRzMzKGRl dl9wcml2KSkpIHsKLQkJdWludDMyX3QgZGNjOwotCi0JCS8qIE9uIDl4eCBjaGlwc2V0cywgY2hh bm5lbCBpbnRlcmxlYXZlIGJ5IHRoZSBDUFUgaXMKLQkJICogZGV0ZXJtaW5lZCBieSBEQ0MuICBG b3Igc2luZ2xlLWNoYW5uZWwsIG5laXRoZXIgdGhlIENQVQotCQkgKiBub3IgdGhlIEdQVSBkbyBz d2l6emxpbmcuICBGb3IgZHVhbCBjaGFubmVsIGludGVybGVhdmVkLAotCQkgKiB0aGUgR1BVJ3Mg aW50ZXJsZWF2ZSBpcyBiaXQgOSBhbmQgMTAgZm9yIFggdGlsZWQsIGFuZCBiaXQKLQkJICogOSBm b3IgWSB0aWxlZC4gIFRoZSBDUFUncyBpbnRlcmxlYXZlIGlzIGluZGVwZW5kZW50LCBhbmQKLQkJ ICogY2FuIGJlIGJhc2VkIG9uIGVpdGhlciBiaXQgMTEgKGhhdmVuJ3Qgc2VlbiB0aGlzIHlldCkg b3IKLQkJICogYml0IDE3IChjb21tb24pLgotCQkgKi8KLQkJZGNjID0gSTkxNV9SRUFEKERDQyk7 Ci0JCXN3aXRjaCAoZGNjICYgRENDX0FERFJFU1NJTkdfTU9ERV9NQVNLKSB7Ci0JCWNhc2UgREND X0FERFJFU1NJTkdfTU9ERV9TSU5HTEVfQ0hBTk5FTDoKLQkJY2FzZSBEQ0NfQUREUkVTU0lOR19N T0RFX0RVQUxfQ0hBTk5FTF9BU1lNTUVUUklDOgotCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9T V0laWkxFX05PTkU7Ci0JCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKLQkJ CWJyZWFrOwotCQljYXNlIERDQ19BRERSRVNTSU5HX01PREVfRFVBTF9DSEFOTkVMX0lOVEVSTEVB VkVEOgotCQkJaWYgKGRjYyAmIERDQ19DSEFOTkVMX1hPUl9ESVNBQkxFKSB7Ci0JCQkJLyogVGhp cyBpcyB0aGUgYmFzZSBzd2l6emxpbmcgYnkgdGhlIEdQVSBmb3IKLQkJCQkgKiB0aWxlZCBidWZm ZXJzLgotCQkJCSAqLwotCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOwot CQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85OwotCQkJfSBlbHNlIGlmICgoZGNj ICYgRENDX0NIQU5ORUxfWE9SX0JJVF8xNykgPT0gMCkgewotCQkJCS8qIEJpdCAxMSBzd2l6emxp bmcgYnkgdGhlIENQVSBpbiBhZGRpdGlvbi4gKi8KLQkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82 X1NXSVpaTEVfOV8xMF8xMTsKLQkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8x MTsKLQkJCX0gZWxzZSB7Ci0JCQkJLyogQml0IDE3IHN3aXp6bGluZyBieSB0aGUgQ1BVIGluIGFk ZGl0aW9uLiAqLwotCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwXzE3Owot CQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzE3OwotCQkJfQotCQkJYnJlYWs7 Ci0JCX0KLQotCQkvKiBjaGVjayBmb3IgTC1zaGFwZWQgbWVtb3J5IGFrYSBtb2RpZmllZCBlbmhh bmNlZCBhZGRyZXNzaW5nICovCi0JCWlmIChJU19HRU40KGRldl9wcml2KSAmJgotCQkgICAgIShJ OTE1X1JFQUQoRENDMikgJiBEQ0MyX01PRElGSUVEX0VOSEFOQ0VEX0RJU0FCTEUpKSB7Ci0JCQlz d2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKLQkJCXN3aXp6bGVfeSA9IEk5 MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOwotCQl9Ci0KLQkJaWYgKGRjYyA9PSAweGZmZmZmZmZm KSB7Ci0JCQlEUk1fRVJST1IoIkNvdWxkbid0IHJlYWQgZnJvbSBNQ0hCQVIuICAiCi0JCQkJICAi RGlzYWJsaW5nIHRpbGluZy5cbiIpOwotCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxF X1VOS05PV047Ci0JCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKLQkJ fQotCX0gZWxzZSB7Ci0JCS8qIFRoZSA5NjUsIEczMywgYW5kIG5ld2VyLCBoYXZlIGEgdmVyeSBm bGV4aWJsZSBtZW1vcnkKLQkJICogY29uZmlndXJhdGlvbi4gIEl0IHdpbGwgZW5hYmxlIGR1YWwt Y2hhbm5lbCBtb2RlCi0JCSAqIChpbnRlcmxlYXZpbmcpIG9uIGFzIG11Y2ggbWVtb3J5IGFzIGl0 IGNhbiwgYW5kIHRoZSBHUFUKLQkJICogd2lsbCBhZGRpdGlvbmFsbHkgc29tZXRpbWVzIGVuYWJs ZSBkaWZmZXJlbnQgYml0IDYKLQkJICogc3dpenpsaW5nIGZvciB0aWxlZCBvYmplY3RzIGZyb20g dGhlIENQVS4KLQkJICoKLQkJICogSGVyZSdzIHdoYXQgSSBmb3VuZCBvbiB0aGUgRzk2NToKLQkJ ICogICAgc2xvdCBmaWxsICAgICAgICAgbWVtb3J5IHNpemUgIHN3aXp6bGluZwotCQkgKiAwQSAg IDBCICAgMUEgICAxQiAgICAxLWNoICAgMi1jaAotCQkgKiA1MTIgIDAgICAgMCAgICAwICAgICA1 MTIgICAgMCAgICAgTwotCQkgKiA1MTIgIDAgICAgNTEyICAwICAgICAxNiAgICAgMTAwOCAgWAot CQkgKiA1MTIgIDAgICAgMCAgICA1MTIgICAxNiAgICAgMTAwOCAgWAotCQkgKiAwICAgIDUxMiAg MCAgICA1MTIgICAxNiAgICAgMTAwOCAgWAotCQkgKiAxMDI0IDEwMjQgMTAyNCAwICAgICAyMDQ4 ICAgMTAyNCAgTwotCQkgKgotCQkgKiBXZSBjb3VsZCBwcm9iYWJseSBkZXRlY3QgdGhpcyBiYXNl ZCBvbiBlaXRoZXIgdGhlIERSQgotCQkgKiBtYXRjaGluZywgd2hpY2ggd2FzIHRoZSBjYXNlIGZv ciB0aGUgc3dpenpsaW5nIHJlcXVpcmVkIGluCi0JCSAqIHRoZSB0YWJsZSBhYm92ZSwgb3IgZnJv bSB0aGUgMS1jaCB2YWx1ZSBiZWluZyBsZXNzIHRoYW4KLQkJICogdGhlIG1pbmltdW0gc2l6ZSBv ZiBhIHJhbmsuCi0JCSAqCi0JCSAqIFJlcG9ydHMgaW5kaWNhdGUgdGhhdCB0aGUgc3dpenpsaW5n IGFjdHVhbGx5Ci0JCSAqIHZhcmllcyBkZXBlbmRpbmcgdXBvbiBwYWdlIHBsYWNlbWVudCBpbnNp ZGUgdGhlCi0JCSAqIGNoYW5uZWxzLCBpLmUuIHdlIHNlZSBzd2l6emxlZCBwYWdlcyB3aGVyZSB0 aGUKLQkJICogYmFua3Mgb2YgbWVtb3J5IGFyZSBwYWlyZWQgYW5kIHVuc3dpenpsZWQgb24gdGhl Ci0JCSAqIHVuZXZlbiBwb3J0aW9uLCBzbyBsZWF2ZSB0aGF0IGFzIHVua25vd24uCi0JCSAqLwot CQlpZiAoSTkxNV9SRUFEMTYoQzBEUkIzKSA9PSBJOTE1X1JFQUQxNihDMURSQjMpKSB7Ci0JCQlz d2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKLQkJCXN3aXp6bGVfeSA9IEk5MTVf QklUXzZfU1dJWlpMRV85OwotCQl9Ci0JfQotCi0JaWYgKHN3aXp6bGVfeCA9PSBJOTE1X0JJVF82 X1NXSVpaTEVfVU5LTk9XTiB8fAotCSAgICBzd2l6emxlX3kgPT0gSTkxNV9CSVRfNl9TV0laWkxF X1VOS05PV04pIHsKLQkJLyogVXNlcnNwYWNlIGxpa2VzIHRvIGV4cGxvZGUgaWYgaXQgc2VlcyB1 bmtub3duIHN3aXp6bGluZywKLQkJICogc28gbGllLiBXZSB3aWxsIGZpbmlzaCB0aGUgbGllIHdo ZW4gcmVwb3J0aW5nIHRocm91Z2gKLQkJICogdGhlIGdldC10aWxpbmctaW9jdGwgYnkgcmVwb3J0 aW5nIHRoZSBwaHlzaWNhbCBzd2l6emxlCi0JCSAqIG1vZGUgYXMgdW5rbm93biBpbnN0ZWFkLgot CQkgKgotCQkgKiBBcyB3ZSBkb24ndCBzdHJpY3RseSBrbm93IHdoYXQgdGhlIHN3aXp6bGluZyBp cywgaXQgbWF5IGJlCi0JCSAqIGJpdDE3IGRlcGVuZGVudCwgYW5kIHNvIHdlIG5lZWQgdG8gYWxz byBwcmV2ZW50IHRoZSBwYWdlcwotCQkgKiBmcm9tIGJlaW5nIG1vdmVkLgotCQkgKi8KLQkJZGV2 X3ByaXYtPnF1aXJrcyB8PSBRVUlSS19QSU5fU1dJWlpMRURfUEFHRVM7Ci0JCXN3aXp6bGVfeCA9 IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOwotCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpa TEVfTk9ORTsKLQl9Ci0KLQlkZXZfcHJpdi0+bW0uYml0XzZfc3dpenpsZV94ID0gc3dpenpsZV94 OwotCWRldl9wcml2LT5tbS5iaXRfNl9zd2l6emxlX3kgPSBzd2l6emxlX3k7Ci19Ci0KLS8qCi0g KiBTd2FwIGV2ZXJ5IDY0IGJ5dGVzIG9mIHRoaXMgcGFnZSBhcm91bmQsIHRvIGFjY291bnQgZm9y IGl0IGhhdmluZyBhIG5ldwotICogYml0IDE3IG9mIGl0cyBwaHlzaWNhbCBhZGRyZXNzIGFuZCB0 aGVyZWZvcmUgYmVpbmcgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkKLSAqIGJ5IHRoZSBHUFUuCi0g Ki8KLXN0YXRpYyB2b2lkCi1pOTE1X2dlbV9zd2l6emxlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2Up Ci17Ci0JY2hhciB0ZW1wWzY0XTsKLQljaGFyICp2YWRkcjsKLQlpbnQgaTsKLQotCXZhZGRyID0g a21hcChwYWdlKTsKLQotCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkU7IGkgKz0gMTI4KSB7Ci0J CW1lbWNweSh0ZW1wLCAmdmFkZHJbaV0sIDY0KTsKLQkJbWVtY3B5KCZ2YWRkcltpXSwgJnZhZGRy W2kgKyA2NF0sIDY0KTsKLQkJbWVtY3B5KCZ2YWRkcltpICsgNjRdLCB0ZW1wLCA2NCk7Ci0JfQot Ci0Ja3VubWFwKHBhZ2UpOwotfQotCi0vKioKLSAqIGk5MTVfZ2VtX29iamVjdF9kb19iaXRfMTdf c3dpenpsZSAtIGZpeHVwIGJpdCAxNyBzd2l6emxpbmcKLSAqIEBvYmo6IGk5MTUgR0VNIGJ1ZmZl ciBvYmplY3QKLSAqIEBwYWdlczogdGhlIHNjYXR0ZXJnYXRoZXIgbGlzdCBvZiBwaHlzaWNhbCBw YWdlcwotICoKLSAqIFRoaXMgZnVuY3Rpb24gZml4ZXMgdXAgdGhlIHN3aXp6bGluZyBpbiBjYXNl IGFueSBwYWdlIGZyYW1lIG51bWJlciBmb3IgdGhpcwotICogb2JqZWN0IGhhcyBjaGFuZ2VkIGlu IGJpdCAxNyBzaW5jZSB0aGF0IHN0YXRlIGhhcyBiZWVuIHNhdmVkIHdpdGgKLSAqIGk5MTVfZ2Vt X29iamVjdF9zYXZlX2JpdF8xN19zd2l6emxlKCkuCi0gKgotICogVGhpcyBpcyBjYWxsZWQgd2hl biBwaW5uaW5nIGJhY2tpbmcgc3RvcmFnZSBhZ2Fpbiwgc2luY2UgdGhlIGtlcm5lbCBpcyBmcmVl Ci0gKiB0byBtb3ZlIHVucGlubmVkIGJhY2tpbmcgc3RvcmFnZSBhcm91bmQgKGVpdGhlciBieSBk aXJlY3RseSBtb3ZpbmcgcGFnZXMgb3IKLSAqIGJ5IHN3YXBwaW5nIHRoZW0gb3V0IGFuZCBiYWNr IGluIGFnYWluKS4KLSAqLwotdm9pZAotaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxl KHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCi0JCQkJICBzdHJ1Y3Qgc2dfdGFibGUg KnBhZ2VzKQotewotCXN0cnVjdCBzZ3RfaXRlciBzZ3RfaXRlcjsKLQlzdHJ1Y3QgcGFnZSAqcGFn ZTsKLQlpbnQgaTsKLQotCWlmIChvYmotPmJpdF8xNyA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlp ID0gMDsKLQlmb3JfZWFjaF9zZ3RfcGFnZShwYWdlLCBzZ3RfaXRlciwgcGFnZXMpIHsKLQkJY2hh ciBuZXdfYml0XzE3ID0gcGFnZV90b19waHlzKHBhZ2UpID4+IDE3OwotCQlpZiAoKG5ld19iaXRf MTcgJiAweDEpICE9ICh0ZXN0X2JpdChpLCBvYmotPmJpdF8xNykgIT0gMCkpIHsKLQkJCWk5MTVf Z2VtX3N3aXp6bGVfcGFnZShwYWdlKTsKLQkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCQl9Ci0J CWkrKzsKLQl9Ci19Ci0KLS8qKgotICogaTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6 bGUgLSBzYXZlIGJpdCAxNyBzd2l6emxpbmcKLSAqIEBvYmo6IGk5MTUgR0VNIGJ1ZmZlciBvYmpl Y3QKLSAqIEBwYWdlczogdGhlIHNjYXR0ZXJnYXRoZXIgbGlzdCBvZiBwaHlzaWNhbCBwYWdlcwot ICoKLSAqIFRoaXMgZnVuY3Rpb24gc2F2ZXMgdGhlIGJpdCAxNyBvZiBlYWNoIHBhZ2UgZnJhbWUg bnVtYmVyIHNvIHRoYXQgc3dpenpsaW5nCi0gKiBjYW4gYmUgZml4ZWQgdXAgbGF0ZXIgb24gd2l0 aCBpOTE1X2dlbV9vYmplY3RfZG9fYml0XzE3X3N3aXp6bGUoKS4gVGhpcyBtdXN0Ci0gKiBiZSBj YWxsZWQgYmVmb3JlIHRoZSBiYWNraW5nIHN0b3JhZ2UgY2FuIGJlIHVucGlubmVkLgotICovCi12 b2lkCi1pOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqLAotCQkJCSAgICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQotewotCWNv bnN0IHVuc2lnbmVkIGludCBwYWdlX2NvdW50ID0gb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElG VDsKLQlzdHJ1Y3Qgc2d0X2l0ZXIgc2d0X2l0ZXI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50 IGk7Ci0KLQlpZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkgewotCQlvYmotPmJpdF8xNyA9IGtjYWxs b2MoQklUU19UT19MT05HUyhwYWdlX2NvdW50KSwKLQkJCQkgICAgICBzaXplb2YobG9uZyksIEdG UF9LRVJORUwpOwotCQlpZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkgewotCQkJRFJNX0VSUk9SKCJG YWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBiaXQgMTcgIgotCQkJCSAgInJlY29yZFxuIik7 Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlpID0gMDsKLQotCWZvcl9lYWNoX3NndF9wYWdlKHBh Z2UsIHNndF9pdGVyLCBwYWdlcykgewotCQlpZiAocGFnZV90b19waHlzKHBhZ2UpICYgKDEgPDwg MTcpKQotCQkJX19zZXRfYml0KGksIG9iai0+Yml0XzE3KTsKLQkJZWxzZQotCQkJX19jbGVhcl9i aXQoaSwgb2JqLT5iaXRfMTcpOwotCQlpKys7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p OTE1X2dlbV9mZW5jZV9yZWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5j ZDU5ZGJjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1f ZmVuY2VfcmVnLmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAwOC0y MDE1IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNv ZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBw YXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJP VklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgor ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9S IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9U SEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JU IE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhF IFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9p OTE1X2RybS5oPgorI2luY2x1ZGUgImk5MTVfZHJ2LmgiCisKKy8qKgorICogRE9DOiBmZW5jZSBy ZWdpc3RlciBoYW5kbGluZworICoKKyAqIEltcG9ydGFudCB0byBhdm9pZCBjb25mdXNpb25zOiAi ZmVuY2VzIiBpbiB0aGUgaTkxNSBkcml2ZXIgYXJlIG5vdCBleGVjdXRpb24KKyAqIGZlbmNlcyB1 c2VkIHRvIHRyYWNrIGNvbW1hbmQgY29tcGxldGlvbiBidXQgaGFyZHdhcmUgZGV0aWxlciBvYmpl Y3RzIHdoaWNoCisgKiB3cmFwIGEgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGdsb2JhbCBHVFQuIEVhY2gg cGxhdGZvcm0gaGFzIG9ubHkgYSBmYWlybHkgbGltaXRlZAorICogc2V0IG9mIHRoZXNlIG9iamVj dHMuCisgKgorICogRmVuY2VzIGFyZSB1c2VkIHRvIGRldGlsZSBHVFQgbWVtb3J5IG1hcHBpbmdz LiBUaGV5J3JlIGFsc28gY29ubmVjdGVkIHRvIHRoZQorICogaGFyZHdhcmUgZnJvbnRidWZmZXIg cmVuZGVyIHRyYWNraW5nIGFuZCBoZW5jZSBpbnRlcmFjdCB3aXRoIGZyb250YnVmZmVyCisgKiBj b21wcmVzc2lvbi4gRnVydGhlcm1vcmUgb24gb2xkZXIgcGxhdGZvcm1zIGZlbmNlcyBhcmUgcmVx dWlyZWQgZm9yIHRpbGVkCisgKiBvYmplY3RzIHVzZWQgYnkgdGhlIGRpc3BsYXkgZW5naW5lLiBU aGV5IGNhbiBhbHNvIGJlIHVzZWQgYnkgdGhlIHJlbmRlcgorICogZW5naW5lIC0gdGhleSdyZSBy ZXF1aXJlZCBmb3IgYmxpdHRlciBjb21tYW5kcyBhbmQgYXJlIG9wdGlvbmFsIGZvciByZW5kZXIK KyAqIGNvbW1hbmRzLiBCdXQgb24gZ2VuNCsgYm90aCBkaXNwbGF5ICh3aXRoIHRoZSBleGNlcHRp b24gb2YgZmJjKSBhbmQgcmVuZGVyaW5nCisgKiBoYXZlIHRoZWlyIG93biB0aWxpbmcgc3RhdGUg Yml0cyBhbmQgZG9uJ3QgbmVlZCBmZW5jZXMuCisgKgorICogQWxzbyBub3RlIHRoYXQgZmVuY2Vz IG9ubHkgc3VwcG9ydCBYIGFuZCBZIHRpbGluZyBhbmQgaGVuY2UgY2FuJ3QgYmUgdXNlZCBmb3IK KyAqIHRoZSBmYW5jaWVyIG5ldyB0aWxpbmcgZm9ybWF0cyBsaWtlIFcsIFlzIGFuZCBZZi4KKyAq CisgKiBGaW5hbGx5IG5vdGUgdGhhdCBiZWNhdXNlIGZlbmNlcyBhcmUgc3VjaCBhIHJlc3RyaWN0 ZWQgcmVzb3VyY2UgdGhleSdyZQorICogZHluYW1pY2FsbHkgYXNzb2NpYXRlZCB3aXRoIG9iamVj dHMuIEZ1cnRoZXJtb3JlIGZlbmNlIHN0YXRlIGlzIGNvbW1pdHRlZCB0bworICogdGhlIGhhcmR3 YXJlIGxhemlseSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBzdGFsbHMgb24gZ2VuMi8zLiBUaGVyZWZv cmUgY29kZSBtdXN0CisgKiBleHBsaWNpdGx5IGNhbGwgaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5j ZSgpIHRvIHN5bmNocm9uaXplIGZlbmNpbmcgc3RhdHVzCisgKiBmb3IgY3B1IGFjY2Vzcy4gQWxz byBub3RlIHRoYXQgc29tZSBjb2RlIHdhbnRzIGFuIHVuZmVuY2VkIHZpZXcsIGZvciB0aG9zZQor ICogY2FzZXMgdGhlIGZlbmNlIGNhbiBiZSByZW1vdmVkIGZvcmNlZnVsbHkgd2l0aCBpOTE1X2dl bV9vYmplY3RfcHV0X2ZlbmNlKCkuCisgKgorICogSW50ZXJuYWxseSB0aGVzZSBmdW5jdGlvbnMg d2lsbCBzeW5jaHJvbml6ZSB3aXRoIHVzZXJzcGFjZSBhY2Nlc3MgYnkgcmVtb3ZpbmcKKyAqIENQ VSBwdGVzIGludG8gR1RUIG1tYXBzIChub3QgdGhlIEdUVCBwdGVzIHRoZW1zZWx2ZXMpIGFzIG5l ZWRlZC4KKyAqLworCisjZGVmaW5lIHBpcGVsaW5lZCAwCisKK3N0YXRpYyB2b2lkIGk5NjVfd3Jp dGVfZmVuY2VfcmVnKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZlbmNlLAorCQkJCSBzdHJ1 Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlpOTE1X3JlZ190IGZlbmNlX3JlZ19sbywgZmVuY2VfcmVn X2hpOworCWludCBmZW5jZV9waXRjaF9zaGlmdDsKKwl1NjQgdmFsOworCisJaWYgKElOVEVMX0lO Rk8oZmVuY2UtPmk5MTUpLT5nZW4gPj0gNikgeworCQlmZW5jZV9yZWdfbG8gPSBGRU5DRV9SRUdf R0VONl9MTyhmZW5jZS0+aWQpOworCQlmZW5jZV9yZWdfaGkgPSBGRU5DRV9SRUdfR0VONl9ISShm ZW5jZS0+aWQpOworCQlmZW5jZV9waXRjaF9zaGlmdCA9IEdFTjZfRkVOQ0VfUElUQ0hfU0hJRlQ7 CisKKwl9IGVsc2UgeworCQlmZW5jZV9yZWdfbG8gPSBGRU5DRV9SRUdfOTY1X0xPKGZlbmNlLT5p ZCk7CisJCWZlbmNlX3JlZ19oaSA9IEZFTkNFX1JFR185NjVfSEkoZmVuY2UtPmlkKTsKKwkJZmVu Y2VfcGl0Y2hfc2hpZnQgPSBJOTY1X0ZFTkNFX1BJVENIX1NISUZUOworCX0KKworCXZhbCA9IDA7 CisJaWYgKHZtYSkgeworCQl1bnNpZ25lZCBpbnQgdGlsaW5nID0gaTkxNV9nZW1fb2JqZWN0X2dl dF90aWxpbmcodm1hLT5vYmopOworCQlib29sIGlzX3lfdGlsZWQgPSB0aWxpbmcgPT0gSTkxNV9U SUxJTkdfWTsKKwkJdW5zaWduZWQgaW50IHN0cmlkZSA9IGk5MTVfZ2VtX29iamVjdF9nZXRfc3Ry aWRlKHZtYS0+b2JqKTsKKwkJdTMyIHJvd19zaXplID0gc3RyaWRlICogKGlzX3lfdGlsZWQgPyAz MiA6IDgpOworCQl1MzIgc2l6ZSA9IHJvdW5kZG93bigodTMyKXZtYS0+bm9kZS5zaXplLCByb3df c2l6ZSk7CisKKwkJdmFsID0gKCh2bWEtPm5vZGUuc3RhcnQgKyBzaXplIC0gNDA5NikgJiAweGZm ZmZmMDAwKSA8PCAzMjsKKwkJdmFsIHw9IHZtYS0+bm9kZS5zdGFydCAmIDB4ZmZmZmYwMDA7CisJ CXZhbCB8PSAodTY0KSgoc3RyaWRlIC8gMTI4KSAtIDEpIDw8IGZlbmNlX3BpdGNoX3NoaWZ0Owor CQlpZiAoaXNfeV90aWxlZCkKKwkJCXZhbCB8PSBCSVQoSTk2NV9GRU5DRV9USUxJTkdfWV9TSElG VCk7CisJCXZhbCB8PSBJOTY1X0ZFTkNFX1JFR19WQUxJRDsKKwl9CisKKwlpZiAoIXBpcGVsaW5l ZCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+aTkxNTsK KworCQkvKiBUbyB3L2EgaW5jb2hlcmVuY3kgd2l0aCBub24tYXRvbWljIDY0LWJpdCByZWdpc3Rl ciB1cGRhdGVzLAorCQkgKiB3ZSBzcGxpdCB0aGUgNjQtYml0IHVwZGF0ZSBpbnRvIHR3byAzMi1i aXQgd3JpdGVzLiBJbiBvcmRlcgorCQkgKiBmb3IgYSBwYXJ0aWFsIGZlbmNlIG5vdCB0byBiZSBl dmFsdWF0ZWQgYmV0d2VlbiB3cml0ZXMsIHdlCisJCSAqIHByZWNlZGUgdGhlIHVwZGF0ZSB3aXRo IHdyaXRlIHRvIHR1cm4gb2ZmIHRoZSBmZW5jZSByZWdpc3RlciwKKwkJICogYW5kIG9ubHkgZW5h YmxlIHRoZSBmZW5jZSBhcyB0aGUgbGFzdCBzdGVwLgorCQkgKgorCQkgKiBGb3IgZXh0cmEgbGV2 ZWxzIG9mIHBhcmFub2lhLCB3ZSBtYWtlIHN1cmUgZWFjaCBzdGVwIGxhbmRzCisJCSAqIGJlZm9y ZSBhcHBseWluZyB0aGUgbmV4dCBzdGVwLgorCQkgKi8KKwkJSTkxNV9XUklURShmZW5jZV9yZWdf bG8sIDApOworCQlQT1NUSU5HX1JFQUQoZmVuY2VfcmVnX2xvKTsKKworCQlJOTE1X1dSSVRFKGZl bmNlX3JlZ19oaSwgdXBwZXJfMzJfYml0cyh2YWwpKTsKKwkJSTkxNV9XUklURShmZW5jZV9yZWdf bG8sIGxvd2VyXzMyX2JpdHModmFsKSk7CisJCVBPU1RJTkdfUkVBRChmZW5jZV9yZWdfbG8pOwor CX0KK30KKworc3RhdGljIHZvaWQgaTkxNV93cml0ZV9mZW5jZV9yZWcoc3RydWN0IGRybV9pOTE1 X2ZlbmNlX3JlZyAqZmVuY2UsCisJCQkJIHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXUzMiB2 YWw7CisKKwl2YWwgPSAwOworCWlmICh2bWEpIHsKKwkJdW5zaWduZWQgaW50IHRpbGluZyA9IGk5 MTVfZ2VtX29iamVjdF9nZXRfdGlsaW5nKHZtYS0+b2JqKTsKKwkJYm9vbCBpc195X3RpbGVkID0g dGlsaW5nID09IEk5MTVfVElMSU5HX1k7CisJCXVuc2lnbmVkIGludCBzdHJpZGUgPSBpOTE1X2dl bV9vYmplY3RfZ2V0X3N0cmlkZSh2bWEtPm9iaik7CisJCWludCBwaXRjaF92YWw7CisJCWludCB0 aWxlX3dpZHRoOworCisJCVdBUk4oKHZtYS0+bm9kZS5zdGFydCAmIH5JOTE1X0ZFTkNFX1NUQVJU X01BU0spIHx8CisJCSAgICAgIWlzX3Bvd2VyX29mXzIodm1hLT5ub2RlLnNpemUpIHx8CisJCSAg ICAgKHZtYS0+bm9kZS5zdGFydCAmICh2bWEtPm5vZGUuc2l6ZSAtIDEpKSwKKwkJICAgICAib2Jq ZWN0IDB4JTA4bGx4IFtmZW5jZWFibGU/ICVkXSBub3QgMU0gb3IgcG90LXNpemUgKDB4JTA4bGx4 KSBhbGlnbmVkXG4iLAorCQkgICAgIHZtYS0+bm9kZS5zdGFydCwKKwkJICAgICBpOTE1X3ZtYV9p c19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpLAorCQkgICAgIHZtYS0+bm9kZS5zaXplKTsKKworCQlp ZiAoaXNfeV90aWxlZCAmJiBIQVNfMTI4X0JZVEVfWV9USUxJTkcoZmVuY2UtPmk5MTUpKQorCQkJ dGlsZV93aWR0aCA9IDEyODsKKwkJZWxzZQorCQkJdGlsZV93aWR0aCA9IDUxMjsKKworCQkvKiBO b3RlOiBwaXRjaCBiZXR0ZXIgYmUgYSBwb3dlciBvZiB0d28gdGlsZSB3aWR0aHMgKi8KKwkJcGl0 Y2hfdmFsID0gc3RyaWRlIC8gdGlsZV93aWR0aDsKKwkJcGl0Y2hfdmFsID0gZmZzKHBpdGNoX3Zh bCkgLSAxOworCisJCXZhbCA9IHZtYS0+bm9kZS5zdGFydDsKKwkJaWYgKGlzX3lfdGlsZWQpCisJ CQl2YWwgfD0gQklUKEk4MzBfRkVOQ0VfVElMSU5HX1lfU0hJRlQpOworCQl2YWwgfD0gSTkxNV9G RU5DRV9TSVpFX0JJVFModm1hLT5ub2RlLnNpemUpOworCQl2YWwgfD0gcGl0Y2hfdmFsIDw8IEk4 MzBfRkVOQ0VfUElUQ0hfU0hJRlQ7CisJCXZhbCB8PSBJODMwX0ZFTkNFX1JFR19WQUxJRDsKKwl9 CisKKwlpZiAoIXBpcGVsaW5lZCkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYgPSBmZW5jZS0+aTkxNTsKKwkJaTkxNV9yZWdfdCByZWcgPSBGRU5DRV9SRUcoZmVuY2UtPmlk KTsKKworCQlJOTE1X1dSSVRFKHJlZywgdmFsKTsKKwkJUE9TVElOR19SRUFEKHJlZyk7CisJfQor fQorCitzdGF0aWMgdm9pZCBpODMwX3dyaXRlX2ZlbmNlX3JlZyhzdHJ1Y3QgZHJtX2k5MTVfZmVu Y2VfcmVnICpmZW5jZSwKKwkJCQkgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJdTMyIHZhbDsK KworCXZhbCA9IDA7CisJaWYgKHZtYSkgeworCQl1bnNpZ25lZCBpbnQgdGlsaW5nID0gaTkxNV9n ZW1fb2JqZWN0X2dldF90aWxpbmcodm1hLT5vYmopOworCQlib29sIGlzX3lfdGlsZWQgPSB0aWxp bmcgPT0gSTkxNV9USUxJTkdfWTsKKwkJdW5zaWduZWQgaW50IHN0cmlkZSA9IGk5MTVfZ2VtX29i amVjdF9nZXRfc3RyaWRlKHZtYS0+b2JqKTsKKwkJdTMyIHBpdGNoX3ZhbDsKKworCQlXQVJOKCh2 bWEtPm5vZGUuc3RhcnQgJiB+STgzMF9GRU5DRV9TVEFSVF9NQVNLKSB8fAorCQkgICAgICFpc19w b3dlcl9vZl8yKHZtYS0+bm9kZS5zaXplKSB8fAorCQkgICAgICh2bWEtPm5vZGUuc3RhcnQgJiAo dm1hLT5ub2RlLnNpemUgLSAxKSksCisJCSAgICAgIm9iamVjdCAweCUwOGxseCBub3QgNTEySyBv ciBwb3Qtc2l6ZSAweCUwOGxseCBhbGlnbmVkXG4iLAorCQkgICAgIHZtYS0+bm9kZS5zdGFydCwg dm1hLT5ub2RlLnNpemUpOworCisJCXBpdGNoX3ZhbCA9IHN0cmlkZSAvIDEyODsKKwkJcGl0Y2hf dmFsID0gZmZzKHBpdGNoX3ZhbCkgLSAxOworCisJCXZhbCA9IHZtYS0+bm9kZS5zdGFydDsKKwkJ aWYgKGlzX3lfdGlsZWQpCisJCQl2YWwgfD0gQklUKEk4MzBfRkVOQ0VfVElMSU5HX1lfU0hJRlQp OworCQl2YWwgfD0gSTgzMF9GRU5DRV9TSVpFX0JJVFModm1hLT5ub2RlLnNpemUpOworCQl2YWwg fD0gcGl0Y2hfdmFsIDw8IEk4MzBfRkVOQ0VfUElUQ0hfU0hJRlQ7CisJCXZhbCB8PSBJODMwX0ZF TkNFX1JFR19WQUxJRDsKKwl9CisKKwlpZiAoIXBpcGVsaW5lZCkgeworCQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBmZW5jZS0+aTkxNTsKKwkJaTkxNV9yZWdfdCByZWcgPSBG RU5DRV9SRUcoZmVuY2UtPmlkKTsKKworCQlJOTE1X1dSSVRFKHJlZywgdmFsKTsKKwkJUE9TVElO R19SRUFEKHJlZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmZW5jZV93cml0ZShzdHJ1Y3QgZHJt X2k5MTVfZmVuY2VfcmVnICpmZW5jZSwKKwkJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCS8q IFByZXZpb3VzIGFjY2VzcyB0aHJvdWdoIHRoZSBmZW5jZSByZWdpc3RlciBpcyBtYXJzaGFsbGVk IGJ5CisJICogdGhlIG1iKCkgaW5zaWRlIHRoZSBmYXVsdCBoYW5kbGVycyAoaTkxNV9nZW1fcmVs ZWFzZV9tbWFwcykKKwkgKiBhbmQgZXhwbGljaXRseSBtYW5hZ2VkIGZvciBpbnRlcm5hbCB1c2Vy cy4KKwkgKi8KKworCWlmIChJU19HRU4yKGZlbmNlLT5pOTE1KSkKKwkJaTgzMF93cml0ZV9mZW5j ZV9yZWcoZmVuY2UsIHZtYSk7CisJZWxzZSBpZiAoSVNfR0VOMyhmZW5jZS0+aTkxNSkpCisJCWk5 MTVfd3JpdGVfZmVuY2VfcmVnKGZlbmNlLCB2bWEpOworCWVsc2UKKwkJaTk2NV93cml0ZV9mZW5j ZV9yZWcoZmVuY2UsIHZtYSk7CisKKwkvKiBBY2Nlc3MgdGhyb3VnaCB0aGUgZmVuY2VkIHJlZ2lv biBhZnRlcndhcmRzIGlzCisJICogb3JkZXJlZCBieSB0aGUgcG9zdGluZyByZWFkcyB3aGlsc3Qg d3JpdGluZyB0aGUgcmVnaXN0ZXJzLgorCSAqLworCisJZmVuY2UtPmRpcnR5ID0gZmFsc2U7Cit9 CisKK3N0YXRpYyBpbnQgZmVuY2VfdXBkYXRlKHN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcgKmZl bmNlLAorCQkJc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJaW50IHJldDsKKworCWlmICh2bWEp IHsKKwkJaWYgKCFpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpKQorCQkJcmV0dXJu IC1FSU5WQUw7CisKKwkJaWYgKFdBUk4oIWk5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHZtYS0+ b2JqKSB8fAorCQkJICFpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyh2bWEtPm9iaiksCisJCQkg ImJvZ3VzIGZlbmNlIHNldHVwIHdpdGggc3RyaWRlOiAweCV4LCB0aWxpbmcgbW9kZTogJWlcbiIs CisJCQkgaTkxNV9nZW1fb2JqZWN0X2dldF9zdHJpZGUodm1hLT5vYmopLAorCQkJIGk5MTVfZ2Vt X29iamVjdF9nZXRfdGlsaW5nKHZtYS0+b2JqKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQly ZXQgPSBpOTE1X2dlbV9hY3RpdmVfcmV0aXJlKCZ2bWEtPmxhc3RfZmVuY2UsCisJCQkJCSAgICAg JnZtYS0+b2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVy biByZXQ7CisJfQorCisJaWYgKGZlbmNlLT52bWEpIHsKKwkJcmV0ID0gaTkxNV9nZW1fYWN0aXZl X3JldGlyZSgmZmVuY2UtPnZtYS0+bGFzdF9mZW5jZSwKKwkJCQkgICAgICAmZmVuY2UtPnZtYS0+ b2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7 CisJfQorCisJaWYgKGZlbmNlLT52bWEgJiYgZmVuY2UtPnZtYSAhPSB2bWEpIHsKKwkJLyogRW5z dXJlIHRoYXQgYWxsIHVzZXJzcGFjZSBDUFUgYWNjZXNzIGlzIGNvbXBsZXRlZCBiZWZvcmUKKwkJ ICogc3RlYWxpbmcgdGhlIGZlbmNlLgorCQkgKi8KKwkJaTkxNV9nZW1fcmVsZWFzZV9tbWFwKGZl bmNlLT52bWEtPm9iaik7CisKKwkJZmVuY2UtPnZtYS0+ZmVuY2UgPSBOVUxMOworCQlmZW5jZS0+ dm1hID0gTlVMTDsKKworCQlsaXN0X21vdmUoJmZlbmNlLT5saW5rLCAmZmVuY2UtPmk5MTUtPm1t LmZlbmNlX2xpc3QpOworCX0KKworCWZlbmNlX3dyaXRlKGZlbmNlLCB2bWEpOworCisJaWYgKHZt YSkgeworCQlpZiAoZmVuY2UtPnZtYSAhPSB2bWEpIHsKKwkJCXZtYS0+ZmVuY2UgPSBmZW5jZTsK KwkJCWZlbmNlLT52bWEgPSB2bWE7CisJCX0KKworCQlsaXN0X21vdmVfdGFpbCgmZmVuY2UtPmxp bmssICZmZW5jZS0+aTkxNS0+bW0uZmVuY2VfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK Ky8qKgorICogaTkxNV92bWFfcHV0X2ZlbmNlIC0gZm9yY2UtcmVtb3ZlIGZlbmNlIGZvciBhIFZN QQorICogQHZtYTogdm1hIHRvIG1hcCBsaW5lYXJseSAobm90IHRocm91Z2ggYSBmZW5jZSByZWcp CisgKgorICogVGhpcyBmdW5jdGlvbiBmb3JjZS1yZW1vdmVzIGFueSBmZW5jZSBmcm9tIHRoZSBn aXZlbiBvYmplY3QsIHdoaWNoIGlzIHVzZWZ1bAorICogaWYgdGhlIGtlcm5lbCB3YW50cyB0byBk byB1bnRpbGVkIEdUVCBhY2Nlc3MuCisgKgorICogUmV0dXJuczoKKyAqCisgKiAwIG9uIHN1Y2Nl c3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50CitpOTE1X3ZtYV9w dXRfZmVuY2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJc3RydWN0IGRybV9pOTE1X2ZlbmNl X3JlZyAqZmVuY2UgPSB2bWEtPmZlbmNlOworCisJYXNzZXJ0X3JwbV93YWtlbG9ja19oZWxkKHRv X2k5MTUodm1hLT52bS0+ZGV2KSk7CisKKwlpZiAoIWZlbmNlKQorCQlyZXR1cm4gMDsKKworCWlm IChmZW5jZS0+cGluX2NvdW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIGZlbmNlX3Vw ZGF0ZShmZW5jZSwgTlVMTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVn ICpmZW5jZV9maW5kKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpmZW5jZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZmVu Y2UsICZkZXZfcHJpdi0+bW0uZmVuY2VfbGlzdCwgbGluaykgeworCQlpZiAoZmVuY2UtPnBpbl9j b3VudCkKKwkJCWNvbnRpbnVlOworCisJCXJldHVybiBmZW5jZTsKKwl9CisKKwkvKiBXYWl0IGZv ciBjb21wbGV0aW9uIG9mIHBlbmRpbmcgZmxpcHMgd2hpY2ggY29uc3VtZSBmZW5jZXMgKi8KKwlp ZiAoaW50ZWxfaGFzX3BlbmRpbmdfZmJfdW5waW4oJmRldl9wcml2LT5kcm0pKQorCQlyZXR1cm4g RVJSX1BUUigtRUFHQUlOKTsKKworCXJldHVybiBFUlJfUFRSKC1FREVBRExLKTsKK30KKworLyoq CisgKiBpOTE1X3ZtYV9nZXRfZmVuY2UgLSBzZXQgdXAgZmVuY2luZyBmb3IgYSB2bWEKKyAqIEB2 bWE6IHZtYSB0byBtYXAgdGhyb3VnaCBhIGZlbmNlIHJlZworICoKKyAqIFdoZW4gbWFwcGluZyBv YmplY3RzIHRocm91Z2ggdGhlIEdUVCwgdXNlcnNwYWNlIHdhbnRzIHRvIGJlIGFibGUgdG8gd3Jp dGUKKyAqIHRvIHRoZW0gd2l0aG91dCBoYXZpbmcgdG8gd29ycnkgYWJvdXQgc3dpenpsaW5nIGlm IHRoZSBvYmplY3QgaXMgdGlsZWQuCisgKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIHRoZSBmZW5jZSBy ZWdzIGxvb2tpbmcgZm9yIGEgZnJlZSBvbmUgZm9yIEBvYmosCisgKiBzdGVhbGluZyBvbmUgaWYg aXQgY2FuJ3QgZmluZCBhbnkuCisgKgorICogSXQgdGhlbiBzZXRzIHVwIHRoZSByZWcgYmFzZWQg b24gdGhlIG9iamVjdCdzIHByb3BlcnRpZXM6IGFkZHJlc3MsIHBpdGNoCisgKiBhbmQgdGlsaW5n IGZvcm1hdC4KKyAqCisgKiBGb3IgYW4gdW50aWxlZCBzdXJmYWNlLCB0aGlzIHJlbW92ZXMgYW55 IGV4aXN0aW5nIGZlbmNlLgorICoKKyAqIFJldHVybnM6CisgKgorICogMCBvbiBzdWNjZXNzLCBu ZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludAoraTkxNV92bWFfZ2V0X2Zl bmNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9yZWcg KmZlbmNlOworCXN0cnVjdCBpOTE1X3ZtYSAqc2V0ID0gaTkxNV9nZW1fb2JqZWN0X2lzX3RpbGVk KHZtYS0+b2JqKSA/IHZtYSA6IE5VTEw7CisKKwkvKiBOb3RlIHRoYXQgd2UgcmV2b2tlIGZlbmNl cyBvbiBydW50aW1lIHN1c3BlbmQuIFRoZXJlZm9yZSB0aGUgdXNlcgorCSAqIG11c3Qga2VlcCB0 aGUgZGV2aWNlIGF3YWtlIHdoaWxzdCB1c2luZyB0aGUgZmVuY2UuCisJICovCisJYXNzZXJ0X3Jw bV93YWtlbG9ja19oZWxkKHRvX2k5MTUodm1hLT52bS0+ZGV2KSk7CisKKwkvKiBKdXN0IHVwZGF0 ZSBvdXIgcGxhY2UgaW4gdGhlIExSVSBpZiBvdXIgZmVuY2UgaXMgZ2V0dGluZyByZXVzZWQuICov CisJaWYgKHZtYS0+ZmVuY2UpIHsKKwkJZmVuY2UgPSB2bWEtPmZlbmNlOworCQlpZiAoIWZlbmNl LT5kaXJ0eSkgeworCQkJbGlzdF9tb3ZlX3RhaWwoJmZlbmNlLT5saW5rLAorCQkJCSAgICAgICAm ZmVuY2UtPmk5MTUtPm1tLmZlbmNlX2xpc3QpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IGVsc2Ug aWYgKHNldCkgeworCQlmZW5jZSA9IGZlbmNlX2ZpbmQodG9faTkxNSh2bWEtPnZtLT5kZXYpKTsK KwkJaWYgKElTX0VSUihmZW5jZSkpCisJCQlyZXR1cm4gUFRSX0VSUihmZW5jZSk7CisJfSBlbHNl CisJCXJldHVybiAwOworCisJcmV0dXJuIGZlbmNlX3VwZGF0ZShmZW5jZSwgc2V0KTsKK30KKwor LyoqCisgKiBpOTE1X2dlbV9yZXN0b3JlX2ZlbmNlcyAtIHJlc3RvcmUgZmVuY2Ugc3RhdGUKKyAq IEBkZXY6IERSTSBkZXZpY2UKKyAqCisgKiBSZXN0b3JlIHRoZSBodyBmZW5jZSBzdGF0ZSB0byBt YXRjaCB0aGUgc29mdHdhcmUgdHJhY2tpbmcgYWdhaW4sIHRvIGJlIGNhbGxlZAorICogYWZ0ZXIg YSBncHUgcmVzZXQgYW5kIG9uIHJlc3VtZS4gTm90ZSB0aGF0IG9uIHJ1bnRpbWUgc3VzcGVuZCB3 ZSBvbmx5IGNhbmNlbAorICogdGhlIGZlbmNlcywgdG8gYmUgcmVhY3F1aXJlZCBieSB0aGUgdXNl ciBsYXRlci4KKyAqLwordm9pZCBpOTE1X2dlbV9yZXN0b3JlX2ZlbmNlcyhzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5 MTUoZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZfcHJpdi0+bnVtX2ZlbmNl X3JlZ3M7IGkrKykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZmVuY2VfcmVnICpyZWcgPSAmZGV2X3By aXYtPmZlbmNlX3JlZ3NbaV07CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hID0gcmVnLT52bWE7CisK KwkJLyoKKwkJICogQ29tbWl0IGRlbGF5ZWQgdGlsaW5nIGNoYW5nZXMgaWYgd2UgaGF2ZSBhbiBv YmplY3Qgc3RpbGwKKwkJICogYXR0YWNoZWQgdG8gdGhlIGZlbmNlLCBvdGhlcndpc2UganVzdCBj bGVhciB0aGUgZmVuY2UuCisJCSAqLworCQlpZiAodm1hICYmICFpOTE1X2dlbV9vYmplY3RfaXNf dGlsZWQodm1hLT5vYmopKSB7CisJCQlHRU1fQlVHX09OKCFyZWctPmRpcnR5KTsKKwkJCUdFTV9C VUdfT04oIWxpc3RfZW1wdHkoJnZtYS0+b2JqLT51c2VyZmF1bHRfbGluaykpOworCisJCQlsaXN0 X21vdmUoJnJlZy0+bGluaywgJmRldl9wcml2LT5tbS5mZW5jZV9saXN0KTsKKwkJCXZtYS0+ZmVu Y2UgPSBOVUxMOworCQkJdm1hID0gTlVMTDsKKwkJfQorCisJCWZlbmNlX3dyaXRlKHJlZywgdm1h KTsKKwkJcmVnLT52bWEgPSB2bWE7CisJfQorfQorCisvKioKKyAqIERPQzogdGlsaW5nIHN3aXp6 bGluZyBkZXRhaWxzCisgKgorICogVGhlIGlkZWEgYmVoaW5kIHRpbGluZyBpcyB0byBpbmNyZWFz ZSBjYWNoZSBoaXQgcmF0ZXMgYnkgcmVhcnJhbmdpbmcKKyAqIHBpeGVsIGRhdGEgc28gdGhhdCBh IGdyb3VwIG9mIHBpeGVsIGFjY2Vzc2VzIGFyZSBpbiB0aGUgc2FtZSBjYWNoZWxpbmUuCisgKiBQ ZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmcm9tIGRvaW5nIHRoaXMgb24gdGhlIGJhY2svZGVwdGgg YnVmZmVyIGFyZSBvbgorICogdGhlIG9yZGVyIG9mIDMwJS4KKyAqCisgKiBJbnRlbCBhcmNoaXRl Y3R1cmVzIG1ha2UgdGhpcyBzb21ld2hhdCBtb3JlIGNvbXBsaWNhdGVkLCB0aG91Z2gsIGJ5Cisg KiBhZGp1c3RtZW50cyBtYWRlIHRvIGFkZHJlc3Npbmcgb2YgZGF0YSB3aGVuIHRoZSBtZW1vcnkg aXMgaW4gaW50ZXJsZWF2ZWQKKyAqIG1vZGUgKG1hdGNoZWQgcGFpcnMgb2YgRElNTVMpIHRvIGlt cHJvdmUgbWVtb3J5IGJhbmR3aWR0aC4KKyAqIEZvciBpbnRlcmxlYXZlZCBtZW1vcnksIHRoZSBD UFUgc2VuZHMgZXZlcnkgc2VxdWVudGlhbCA2NCBieXRlcworICogdG8gYW4gYWx0ZXJuYXRlIG1l bW9yeSBjaGFubmVsIHNvIGl0IGNhbiBnZXQgdGhlIGJhbmR3aWR0aCBmcm9tIGJvdGguCisgKgor ICogVGhlIEdQVSBhbHNvIHJlYXJyYW5nZXMgaXRzIGFjY2Vzc2VzIGZvciBpbmNyZWFzZWQgYmFu ZHdpZHRoIHRvIGludGVybGVhdmVkCisgKiBtZW1vcnksIGFuZCBpdCBtYXRjaGVzIHdoYXQgdGhl IENQVSBkb2VzIGZvciBub24tdGlsZWQuICBIb3dldmVyLCB3aGVuIHRpbGVkCisgKiBpdCBkb2Vz IGl0IGEgbGl0dGxlIGRpZmZlcmVudGx5LCBzaW5jZSBvbmUgd2Fsa3MgYWRkcmVzc2VzIG5vdCBq dXN0IGluIHRoZQorICogWCBkaXJlY3Rpb24gYnV0IGFsc28gWS4gIFNvLCBhbG9uZyB3aXRoIGFs dGVybmF0aW5nIGNoYW5uZWxzIHdoZW4gYml0CisgKiA2IG9mIHRoZSBhZGRyZXNzIGZsaXBzLCBp dCBhbHNvIGFsdGVybmF0ZXMgd2hlbiBvdGhlciBiaXRzIGZsaXAgLS0gIEJpdHMgOQorICogKGV2 ZXJ5IDUxMiBieXRlcywgYW4gWCB0aWxlIHNjYW5saW5lKSBhbmQgMTAgKGV2ZXJ5IHR3byBYIHRp bGUgc2NhbmxpbmVzKQorICogYXJlIGNvbW1vbiB0byBib3RoIHRoZSA5MTUgYW5kIDk2NS1jbGFz cyBoYXJkd2FyZS4KKyAqCisgKiBUaGUgQ1BVIGFsc28gc29tZXRpbWVzIFhPUnMgaW4gaGlnaGVy IGJpdHMgYXMgd2VsbCwgdG8gaW1wcm92ZQorICogYmFuZHdpZHRoIGRvaW5nIHN0cmlkZWQgYWNj ZXNzIGxpa2Ugd2UgZG8gc28gZnJlcXVlbnRseSBpbiBncmFwaGljcy4gIFRoaXMKKyAqIGlzIGNh bGxlZCAiQ2hhbm5lbCBYT1IgUmFuZG9taXphdGlvbiIgaW4gdGhlIE1DSCBkb2N1bWVudGF0aW9u LiAgVGhlIHJlc3VsdAorICogaXMgdGhhdCB0aGUgQ1BVIGlzIFhPUmluZyBpbiBlaXRoZXIgYml0 IDExIG9yIGJpdCAxNyB0byBiaXQgNiBvZiBpdHMgYWRkcmVzcworICogZGVjb2RlLgorICoKKyAq IEFsbCBvZiB0aGlzIGJpdCA2IFhPUmluZyBoYXMgYW4gZWZmZWN0IG9uIG91ciBtZW1vcnkgbWFu YWdlbWVudCwKKyAqIGFzIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIDNkIGRyaXZlciBj YW4gY29ycmVjdGx5IGFkZHJlc3Mgb2JqZWN0CisgKiBjb250ZW50cy4KKyAqCisgKiBJZiB3ZSBk b24ndCBoYXZlIGludGVybGVhdmVkIG1lbW9yeSwgYWxsIHRpbGluZyBpcyBzYWZlIGFuZCBubyBz d2l6emxpbmcgaXMKKyAqIHJlcXVpcmVkLgorICoKKyAqIFdoZW4gYml0IDE3IGlzIFhPUmVkIGlu LCB3ZSBzaW1wbHkgcmVmdXNlIHRvIHRpbGUgYXQgYWxsLiAgQml0CisgKiAxNyBpcyBub3QganVz dCBhIHBhZ2Ugb2Zmc2V0LCBzbyBhcyB3ZSBwYWdlIGFuIG9iamVjdCBvdXQgYW5kIGJhY2sgaW4s CisgKiBpbmRpdmlkdWFsIHBhZ2VzIGluIGl0IHdpbGwgaGF2ZSBkaWZmZXJlbnQgYml0IDE3IGFk ZHJlc3NlcywgcmVzdWx0aW5nIGluCisgKiBlYWNoIDY0IGJ5dGVzIGJlaW5nIHN3YXBwZWQgd2l0 aCBpdHMgbmVpZ2hib3IhCisgKgorICogT3RoZXJ3aXNlLCBpZiBpbnRlcmxlYXZlZCwgd2UgaGF2 ZSB0byB0ZWxsIHRoZSAzZCBkcml2ZXIgd2hhdCB0aGUgYWRkcmVzcworICogc3dpenpsaW5nIGl0 IG5lZWRzIHRvIGRvIGlzLCBzaW5jZSBpdCdzIHdyaXRpbmcgd2l0aCB0aGUgQ1BVIHRvIHRoZSBw YWdlcworICogKGJpdCA2IGFuZCBwb3RlbnRpYWxseSBiaXQgMTEgWE9SZWQgaW4pLCBhbmQgdGhl IEdQVSBpcyByZWFkaW5nIGZyb20gdGhlCisgKiBwYWdlcyAoYml0IDYsIDksIGFuZCAxMCBYT1Jl ZCBpbiksIHJlc3VsdGluZyBpbiBhIGN1bXVsYXRpdmUgYml0IHN3aXp6bGluZworICogcmVxdWly ZWQgYnkgdGhlIENQVSBvZiBYT1JpbmcgaW4gYml0IDYsIDksIDEwLCBhbmQgcG90ZW50aWFsbHkg MTEsIGluIG9yZGVyCisgKiB0byBtYXRjaCB3aGF0IHRoZSBHUFUgZXhwZWN0cy4KKyAqLworCisv KioKKyAqIGk5MTVfZ2VtX2RldGVjdF9iaXRfNl9zd2l6emxlIC0gZGV0ZWN0IGJpdCA2IHN3aXp6 bGluZyBwYXR0ZXJuCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKgorICogRGV0ZWN0cyBiaXQgNiBz d2l6emxpbmcgb2YgYWRkcmVzcyBsb29rdXAgYmV0d2VlbiBJR0QgYWNjZXNzIGFuZCBDUFUKKyAq IGFjY2VzcyB0aHJvdWdoIG1haW4gbWVtb3J5LgorICovCit2b2lkCitpOTE1X2dlbV9kZXRlY3Rf Yml0XzZfc3dpenpsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKKwl1aW50MzJfdCBzd2l6emxlX3gg PSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKKwl1aW50MzJfdCBzd2l6emxlX3kgPSBJOTE1 X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKKworCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpID49IDgg fHwgSVNfVkFMTEVZVklFVyhkZXZfcHJpdikpIHsKKwkJLyoKKwkJICogT24gQkRXKywgc3dpenps aW5nIGlzIG5vdCB1c2VkLiBXZSBsZWF2ZSB0aGUgQ1BVIG1lbW9yeQorCQkgKiBjb250cm9sbGVy IGluIGNoYXJnZSBvZiBvcHRpbWl6aW5nIG1lbW9yeSBhY2Nlc3NlcyB3aXRob3V0CisJCSAqIHRo ZSBleHRyYSBhZGRyZXNzIG1hbmlwdWxhdGlvbiBHUFUgc2lkZS4KKwkJICoKKwkJICogVkxWIGFu ZCBDSFYgZG9uJ3QgaGF2ZSBHUFUgc3dpenpsaW5nLgorCQkgKi8KKwkJc3dpenpsZV94ID0gSTkx NV9CSVRfNl9TV0laWkxFX05PTkU7CisJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9O T05FOworCX0gZWxzZSBpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0gNikgeworCQlpZiAoZGV2 X3ByaXYtPnByZXNlcnZlX2Jpb3Nfc3dpenpsZSkgeworCQkJaWYgKEk5MTVfUkVBRChESVNQX0FS Ql9DVEwpICYKKwkJCSAgICBESVNQX1RJTEVfU1VSRkFDRV9TV0laWkxJTkcpIHsKKwkJCQlzd2l6 emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xMDsKKwkJCQlzd2l6emxlX3kgPSBJOTE1X0JJ VF82X1NXSVpaTEVfOTsKKwkJCX0gZWxzZSB7CisJCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9T V0laWkxFX05PTkU7CisJCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJ CQl9CisJCX0gZWxzZSB7CisJCQl1aW50MzJfdCBkaW1tX2MwLCBkaW1tX2MxOworCQkJZGltbV9j MCA9IEk5MTVfUkVBRChNQURfRElNTV9DMCk7CisJCQlkaW1tX2MxID0gSTkxNV9SRUFEKE1BRF9E SU1NX0MxKTsKKwkJCWRpbW1fYzAgJj0gTUFEX0RJTU1fQV9TSVpFX01BU0sgfCBNQURfRElNTV9C X1NJWkVfTUFTSzsKKwkJCWRpbW1fYzEgJj0gTUFEX0RJTU1fQV9TSVpFX01BU0sgfCBNQURfRElN TV9CX1NJWkVfTUFTSzsKKwkJCS8qIEVuYWJsZSBzd2l6emxpbmcgd2hlbiB0aGUgY2hhbm5lbHMg YXJlIHBvcHVsYXRlZAorCQkJICogd2l0aCBpZGVudGljYWxseSBzaXplZCBkaW1tcy4gV2UgZG9u J3QgbmVlZCB0byBjaGVjaworCQkJICogdGhlIDNyZCBjaGFubmVsIGJlY2F1c2Ugbm8gY3B1IHdp dGggZ3B1IGF0dGFjaGVkCisJCQkgKiBzaGlwcyBpbiB0aGF0IGNvbmZpZ3VyYXRpb24uIEFsc28s IHN3aXp6bGluZyBvbmx5CisJCQkgKiBtYWtlcyBzZW5zZSBmb3IgMiBjaGFubmVscyBhbnl3YXku ICovCisJCQlpZiAoZGltbV9jMCA9PSBkaW1tX2MxKSB7CisJCQkJc3dpenpsZV94ID0gSTkxNV9C SVRfNl9TV0laWkxFXzlfMTA7CisJCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0laWkxFXzk7 CisJCQl9IGVsc2UgeworCQkJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOwor CQkJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOworCQkJfQorCQl9CisJfSBl bHNlIGlmIChJU19HRU41KGRldl9wcml2KSkgeworCQkvKiBPbiBJcm9ubGFrZSB3aGF0ZXZlciBE UkFNIGNvbmZpZywgR1BVIGFsd2F5cyBkbworCQkgKiBzYW1lIHN3aXp6bGluZyBzZXR1cC4KKwkJ ICovCisJCXN3aXp6bGVfeCA9IEk5MTVfQklUXzZfU1dJWlpMRV85XzEwOworCQlzd2l6emxlX3kg PSBJOTE1X0JJVF82X1NXSVpaTEVfOTsKKwl9IGVsc2UgaWYgKElTX0dFTjIoZGV2X3ByaXYpKSB7 CisJCS8qIEFzIGZhciBhcyB3ZSBrbm93LCB0aGUgODY1IGRvZXNuJ3QgaGF2ZSB0aGVzZSBiaXQg NgorCQkgKiBzd2l6emxpbmcgaXNzdWVzLgorCQkgKi8KKwkJc3dpenpsZV94ID0gSTkxNV9CSVRf Nl9TV0laWkxFX05PTkU7CisJCXN3aXp6bGVfeSA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOwor CX0gZWxzZSBpZiAoSVNfTU9CSUxFKGRldl9wcml2KSB8fCAoSVNfR0VOMyhkZXZfcHJpdikgJiYK KwkJICAgIUlTX0czMyhkZXZfcHJpdikpKSB7CisJCXVpbnQzMl90IGRjYzsKKworCQkvKiBPbiA5 eHggY2hpcHNldHMsIGNoYW5uZWwgaW50ZXJsZWF2ZSBieSB0aGUgQ1BVIGlzCisJCSAqIGRldGVy bWluZWQgYnkgRENDLiAgRm9yIHNpbmdsZS1jaGFubmVsLCBuZWl0aGVyIHRoZSBDUFUKKwkJICog bm9yIHRoZSBHUFUgZG8gc3dpenpsaW5nLiAgRm9yIGR1YWwgY2hhbm5lbCBpbnRlcmxlYXZlZCwK KwkJICogdGhlIEdQVSdzIGludGVybGVhdmUgaXMgYml0IDkgYW5kIDEwIGZvciBYIHRpbGVkLCBh bmQgYml0CisJCSAqIDkgZm9yIFkgdGlsZWQuICBUaGUgQ1BVJ3MgaW50ZXJsZWF2ZSBpcyBpbmRl cGVuZGVudCwgYW5kCisJCSAqIGNhbiBiZSBiYXNlZCBvbiBlaXRoZXIgYml0IDExIChoYXZlbid0 IHNlZW4gdGhpcyB5ZXQpIG9yCisJCSAqIGJpdCAxNyAoY29tbW9uKS4KKwkJICovCisJCWRjYyA9 IEk5MTVfUkVBRChEQ0MpOworCQlzd2l0Y2ggKGRjYyAmIERDQ19BRERSRVNTSU5HX01PREVfTUFT SykgeworCQljYXNlIERDQ19BRERSRVNTSU5HX01PREVfU0lOR0xFX0NIQU5ORUw6CisJCWNhc2Ug RENDX0FERFJFU1NJTkdfTU9ERV9EVUFMX0NIQU5ORUxfQVNZTU1FVFJJQzoKKwkJCXN3aXp6bGVf eCA9IEk5MTVfQklUXzZfU1dJWlpMRV9OT05FOworCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9T V0laWkxFX05PTkU7CisJCQlicmVhazsKKwkJY2FzZSBEQ0NfQUREUkVTU0lOR19NT0RFX0RVQUxf Q0hBTk5FTF9JTlRFUkxFQVZFRDoKKwkJCWlmIChkY2MgJiBEQ0NfQ0hBTk5FTF9YT1JfRElTQUJM RSkgeworCQkJCS8qIFRoaXMgaXMgdGhlIGJhc2Ugc3dpenpsaW5nIGJ5IHRoZSBHUFUgZm9yCisJ CQkJICogdGlsZWQgYnVmZmVycy4KKwkJCQkgKi8KKwkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82 X1NXSVpaTEVfOV8xMDsKKwkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOTsKKwkJ CX0gZWxzZSBpZiAoKGRjYyAmIERDQ19DSEFOTkVMX1hPUl9CSVRfMTcpID09IDApIHsKKwkJCQkv KiBCaXQgMTEgc3dpenpsaW5nIGJ5IHRoZSBDUFUgaW4gYWRkaXRpb24uICovCisJCQkJc3dpenps ZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTBfMTE7CisJCQkJc3dpenpsZV95ID0gSTkxNV9C SVRfNl9TV0laWkxFXzlfMTE7CisJCQl9IGVsc2UgeworCQkJCS8qIEJpdCAxNyBzd2l6emxpbmcg YnkgdGhlIENQVSBpbiBhZGRpdGlvbi4gKi8KKwkJCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NX SVpaTEVfOV8xMF8xNzsKKwkJCQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOV8xNzsK KwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJLyogY2hlY2sgZm9yIEwtc2hhcGVkIG1lbW9yeSBh a2EgbW9kaWZpZWQgZW5oYW5jZWQgYWRkcmVzc2luZyAqLworCQlpZiAoSVNfR0VONChkZXZfcHJp dikgJiYKKwkJICAgICEoSTkxNV9SRUFEKERDQzIpICYgRENDMl9NT0RJRklFRF9FTkhBTkNFRF9E SVNBQkxFKSkgeworCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV047CisJ CQlzd2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfVU5LTk9XTjsKKwkJfQorCisJCWlmIChk Y2MgPT0gMHhmZmZmZmZmZikgeworCQkJRFJNX0VSUk9SKCJDb3VsZG4ndCByZWFkIGZyb20gTUNI QkFSLiAgIgorCQkJCSAgIkRpc2FibGluZyB0aWxpbmcuXG4iKTsKKwkJCXN3aXp6bGVfeCA9IEk5 MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOOworCQkJc3dpenpsZV95ID0gSTkxNV9CSVRfNl9TV0la WkxFX1VOS05PV047CisJCX0KKwl9IGVsc2UgeworCQkvKiBUaGUgOTY1LCBHMzMsIGFuZCBuZXdl ciwgaGF2ZSBhIHZlcnkgZmxleGlibGUgbWVtb3J5CisJCSAqIGNvbmZpZ3VyYXRpb24uICBJdCB3 aWxsIGVuYWJsZSBkdWFsLWNoYW5uZWwgbW9kZQorCQkgKiAoaW50ZXJsZWF2aW5nKSBvbiBhcyBt dWNoIG1lbW9yeSBhcyBpdCBjYW4sIGFuZCB0aGUgR1BVCisJCSAqIHdpbGwgYWRkaXRpb25hbGx5 IHNvbWV0aW1lcyBlbmFibGUgZGlmZmVyZW50IGJpdCA2CisJCSAqIHN3aXp6bGluZyBmb3IgdGls ZWQgb2JqZWN0cyBmcm9tIHRoZSBDUFUuCisJCSAqCisJCSAqIEhlcmUncyB3aGF0IEkgZm91bmQg b24gdGhlIEc5NjU6CisJCSAqICAgIHNsb3QgZmlsbCAgICAgICAgIG1lbW9yeSBzaXplICBzd2l6 emxpbmcKKwkJICogMEEgICAwQiAgIDFBICAgMUIgICAgMS1jaCAgIDItY2gKKwkJICogNTEyICAw ICAgIDAgICAgMCAgICAgNTEyICAgIDAgICAgIE8KKwkJICogNTEyICAwICAgIDUxMiAgMCAgICAg MTYgICAgIDEwMDggIFgKKwkJICogNTEyICAwICAgIDAgICAgNTEyICAgMTYgICAgIDEwMDggIFgK KwkJICogMCAgICA1MTIgIDAgICAgNTEyICAgMTYgICAgIDEwMDggIFgKKwkJICogMTAyNCAxMDI0 IDEwMjQgMCAgICAgMjA0OCAgIDEwMjQgIE8KKwkJICoKKwkJICogV2UgY291bGQgcHJvYmFibHkg ZGV0ZWN0IHRoaXMgYmFzZWQgb24gZWl0aGVyIHRoZSBEUkIKKwkJICogbWF0Y2hpbmcsIHdoaWNo IHdhcyB0aGUgY2FzZSBmb3IgdGhlIHN3aXp6bGluZyByZXF1aXJlZCBpbgorCQkgKiB0aGUgdGFi bGUgYWJvdmUsIG9yIGZyb20gdGhlIDEtY2ggdmFsdWUgYmVpbmcgbGVzcyB0aGFuCisJCSAqIHRo ZSBtaW5pbXVtIHNpemUgb2YgYSByYW5rLgorCQkgKgorCQkgKiBSZXBvcnRzIGluZGljYXRlIHRo YXQgdGhlIHN3aXp6bGluZyBhY3R1YWxseQorCQkgKiB2YXJpZXMgZGVwZW5kaW5nIHVwb24gcGFn ZSBwbGFjZW1lbnQgaW5zaWRlIHRoZQorCQkgKiBjaGFubmVscywgaS5lLiB3ZSBzZWUgc3dpenps ZWQgcGFnZXMgd2hlcmUgdGhlCisJCSAqIGJhbmtzIG9mIG1lbW9yeSBhcmUgcGFpcmVkIGFuZCB1 bnN3aXp6bGVkIG9uIHRoZQorCQkgKiB1bmV2ZW4gcG9ydGlvbiwgc28gbGVhdmUgdGhhdCBhcyB1 bmtub3duLgorCQkgKi8KKwkJaWYgKEk5MTVfUkVBRDE2KEMwRFJCMykgPT0gSTkxNV9SRUFEMTYo QzFEUkIzKSkgeworCQkJc3dpenpsZV94ID0gSTkxNV9CSVRfNl9TV0laWkxFXzlfMTA7CisJCQlz d2l6emxlX3kgPSBJOTE1X0JJVF82X1NXSVpaTEVfOTsKKwkJfQorCX0KKworCWlmIChzd2l6emxl X3ggPT0gSTkxNV9CSVRfNl9TV0laWkxFX1VOS05PV04gfHwKKwkgICAgc3dpenpsZV95ID09IEk5 MTVfQklUXzZfU1dJWlpMRV9VTktOT1dOKSB7CisJCS8qIFVzZXJzcGFjZSBsaWtlcyB0byBleHBs b2RlIGlmIGl0IHNlZXMgdW5rbm93biBzd2l6emxpbmcsCisJCSAqIHNvIGxpZS4gV2Ugd2lsbCBm aW5pc2ggdGhlIGxpZSB3aGVuIHJlcG9ydGluZyB0aHJvdWdoCisJCSAqIHRoZSBnZXQtdGlsaW5n LWlvY3RsIGJ5IHJlcG9ydGluZyB0aGUgcGh5c2ljYWwgc3dpenpsZQorCQkgKiBtb2RlIGFzIHVu a25vd24gaW5zdGVhZC4KKwkJICoKKwkJICogQXMgd2UgZG9uJ3Qgc3RyaWN0bHkga25vdyB3aGF0 IHRoZSBzd2l6emxpbmcgaXMsIGl0IG1heSBiZQorCQkgKiBiaXQxNyBkZXBlbmRlbnQsIGFuZCBz byB3ZSBuZWVkIHRvIGFsc28gcHJldmVudCB0aGUgcGFnZXMKKwkJICogZnJvbSBiZWluZyBtb3Zl ZC4KKwkJICovCisJCWRldl9wcml2LT5xdWlya3MgfD0gUVVJUktfUElOX1NXSVpaTEVEX1BBR0VT OworCQlzd2l6emxlX3ggPSBJOTE1X0JJVF82X1NXSVpaTEVfTk9ORTsKKwkJc3dpenpsZV95ID0g STkxNV9CSVRfNl9TV0laWkxFX05PTkU7CisJfQorCisJZGV2X3ByaXYtPm1tLmJpdF82X3N3aXp6 bGVfeCA9IHN3aXp6bGVfeDsKKwlkZXZfcHJpdi0+bW0uYml0XzZfc3dpenpsZV95ID0gc3dpenps ZV95OworfQorCisvKgorICogU3dhcCBldmVyeSA2NCBieXRlcyBvZiB0aGlzIHBhZ2UgYXJvdW5k LCB0byBhY2NvdW50IGZvciBpdCBoYXZpbmcgYSBuZXcKKyAqIGJpdCAxNyBvZiBpdHMgcGh5c2lj YWwgYWRkcmVzcyBhbmQgdGhlcmVmb3JlIGJlaW5nIGludGVycHJldGVkIGRpZmZlcmVudGx5Cisg KiBieSB0aGUgR1BVLgorICovCitzdGF0aWMgdm9pZAoraTkxNV9nZW1fc3dpenpsZV9wYWdlKHN0 cnVjdCBwYWdlICpwYWdlKQoreworCWNoYXIgdGVtcFs2NF07CisJY2hhciAqdmFkZHI7CisJaW50 IGk7CisKKwl2YWRkciA9IGttYXAocGFnZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEFHRV9TSVpF OyBpICs9IDEyOCkgeworCQltZW1jcHkodGVtcCwgJnZhZGRyW2ldLCA2NCk7CisJCW1lbWNweSgm dmFkZHJbaV0sICZ2YWRkcltpICsgNjRdLCA2NCk7CisJCW1lbWNweSgmdmFkZHJbaSArIDY0XSwg dGVtcCwgNjQpOworCX0KKworCWt1bm1hcChwYWdlKTsKK30KKworLyoqCisgKiBpOTE1X2dlbV9v YmplY3RfZG9fYml0XzE3X3N3aXp6bGUgLSBmaXh1cCBiaXQgMTcgc3dpenpsaW5nCisgKiBAb2Jq OiBpOTE1IEdFTSBidWZmZXIgb2JqZWN0CisgKiBAcGFnZXM6IHRoZSBzY2F0dGVyZ2F0aGVyIGxp c3Qgb2YgcGh5c2ljYWwgcGFnZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpeGVzIHVwIHRoZSBz d2l6emxpbmcgaW4gY2FzZSBhbnkgcGFnZSBmcmFtZSBudW1iZXIgZm9yIHRoaXMKKyAqIG9iamVj dCBoYXMgY2hhbmdlZCBpbiBiaXQgMTcgc2luY2UgdGhhdCBzdGF0ZSBoYXMgYmVlbiBzYXZlZCB3 aXRoCisgKiBpOTE1X2dlbV9vYmplY3Rfc2F2ZV9iaXRfMTdfc3dpenpsZSgpLgorICoKKyAqIFRo aXMgaXMgY2FsbGVkIHdoZW4gcGlubmluZyBiYWNraW5nIHN0b3JhZ2UgYWdhaW4sIHNpbmNlIHRo ZSBrZXJuZWwgaXMgZnJlZQorICogdG8gbW92ZSB1bnBpbm5lZCBiYWNraW5nIHN0b3JhZ2UgYXJv dW5kIChlaXRoZXIgYnkgZGlyZWN0bHkgbW92aW5nIHBhZ2VzIG9yCisgKiBieSBzd2FwcGluZyB0 aGVtIG91dCBhbmQgYmFjayBpbiBhZ2FpbikuCisgKi8KK3ZvaWQKK2k5MTVfZ2VtX29iamVjdF9k b19iaXRfMTdfc3dpenpsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSAg c3RydWN0IHNnX3RhYmxlICpwYWdlcykKK3sKKwlzdHJ1Y3Qgc2d0X2l0ZXIgc2d0X2l0ZXI7CisJ c3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisKKwlpZiAob2JqLT5iaXRfMTcgPT0gTlVMTCkK KwkJcmV0dXJuOworCisJaSA9IDA7CisJZm9yX2VhY2hfc2d0X3BhZ2UocGFnZSwgc2d0X2l0ZXIs IHBhZ2VzKSB7CisJCWNoYXIgbmV3X2JpdF8xNyA9IHBhZ2VfdG9fcGh5cyhwYWdlKSA+PiAxNzsK KwkJaWYgKChuZXdfYml0XzE3ICYgMHgxKSAhPSAodGVzdF9iaXQoaSwgb2JqLT5iaXRfMTcpICE9 IDApKSB7CisJCQlpOTE1X2dlbV9zd2l6emxlX3BhZ2UocGFnZSk7CisJCQlzZXRfcGFnZV9kaXJ0 eShwYWdlKTsKKwkJfQorCQlpKys7CisJfQorfQorCisvKioKKyAqIGk5MTVfZ2VtX29iamVjdF9z YXZlX2JpdF8xN19zd2l6emxlIC0gc2F2ZSBiaXQgMTcgc3dpenpsaW5nCisgKiBAb2JqOiBpOTE1 IEdFTSBidWZmZXIgb2JqZWN0CisgKiBAcGFnZXM6IHRoZSBzY2F0dGVyZ2F0aGVyIGxpc3Qgb2Yg cGh5c2ljYWwgcGFnZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNhdmVzIHRoZSBiaXQgMTcgb2Yg ZWFjaCBwYWdlIGZyYW1lIG51bWJlciBzbyB0aGF0IHN3aXp6bGluZworICogY2FuIGJlIGZpeGVk IHVwIGxhdGVyIG9uIHdpdGggaTkxNV9nZW1fb2JqZWN0X2RvX2JpdF8xN19zd2l6emxlKCkuIFRo aXMgbXVzdAorICogYmUgY2FsbGVkIGJlZm9yZSB0aGUgYmFja2luZyBzdG9yYWdlIGNhbiBiZSB1 bnBpbm5lZC4KKyAqLwordm9pZAoraTkxNV9nZW1fb2JqZWN0X3NhdmVfYml0XzE3X3N3aXp6bGUo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgICAgc3RydWN0IHNnX3RhYmxl ICpwYWdlcykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgcGFnZV9jb3VudCA9IG9iai0+YmFzZS5z aXplID4+IFBBR0VfU0hJRlQ7CisJc3RydWN0IHNndF9pdGVyIHNndF9pdGVyOworCXN0cnVjdCBw YWdlICpwYWdlOworCWludCBpOworCisJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpIHsKKwkJb2Jq LT5iaXRfMTcgPSBrY2FsbG9jKEJJVFNfVE9fTE9OR1MocGFnZV9jb3VudCksCisJCQkJICAgICAg c2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG9iai0+Yml0XzE3ID09IE5VTEwpIHsK KwkJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgYml0IDE3ICIKKwkJ CQkgICJyZWNvcmRcbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJaSA9IDA7CisKKwlmb3Jf ZWFjaF9zZ3RfcGFnZShwYWdlLCBzZ3RfaXRlciwgcGFnZXMpIHsKKwkJaWYgKHBhZ2VfdG9fcGh5 cyhwYWdlKSAmICgxIDw8IDE3KSkKKwkJCV9fc2V0X2JpdChpLCBvYmotPmJpdF8xNyk7CisJCWVs c2UKKwkJCV9fY2xlYXJfYml0KGksIG9iai0+Yml0XzE3KTsKKwkJaSsrOworCX0KK30KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5oIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZmVuY2VfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uMjJjNGEyZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZ2VtX2ZlbmNlX3JlZy5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5 cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVy ZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisg KiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxl cyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCBy ZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0 byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0 IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywg c3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUg bmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1 YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRX QVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVY UFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdB UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUg QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN QUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MK KyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0k5MTVfRkVOQ0VfUkVH X0hfXworI2RlZmluZSBfX0k5MTVfRkVOQ0VfUkVHX0hfXworCisjaW5jbHVkZSA8bGludXgvbGlz dC5oPgorCitzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZTsKK3N0cnVjdCBpOTE1X3ZtYTsKKworc3Ry dWN0IGRybV9pOTE1X2ZlbmNlX3JlZyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1OworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCWludCBw aW5fY291bnQ7CisJaW50IGlkOworCS8qKgorCSAqIFdoZXRoZXIgdGhlIHRpbGluZyBwYXJhbWV0 ZXJzIGZvciB0aGUgY3VycmVudGx5CisJICogYXNzb2NpYXRlZCBmZW5jZSByZWdpc3RlciBoYXZl IGNoYW5nZWQuIE5vdGUgdGhhdAorCSAqIGZvciB0aGUgcHVycG9zZXMgb2YgdHJhY2tpbmcgdGls aW5nIGNoYW5nZXMgd2UgYWxzbworCSAqIHRyZWF0IHRoZSB1bmZlbmNlZCByZWdpc3RlciwgdGhl IHJlZ2lzdGVyIHNsb3QgdGhhdAorCSAqIHRoZSBvYmplY3Qgb2NjdXBpZXMgd2hpbHN0IGl0IGV4 ZWN1dGVzIGEgZmVuY2VkCisJICogY29tbWFuZCAoc3VjaCBhcyBCTFQgb24gZ2VuMi8zKSwgYXMg YSAiZmVuY2UiLgorCSAqLworCWJvb2wgZGlydHk7Cit9OworCisjZW5kaWYKKwpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbV9ndHQuYwppbmRleCBhNWZhZmEzLi5mNjBlNWE3IDEwMDY0NAotLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2dlbV9ndHQuYwpAQCAtOTYsMTMgKzk2LDYgQEAKICAqCiAgKi8KIAotc3RhdGlj IGlubGluZSBzdHJ1Y3QgaTkxNV9nZ3R0ICoKLWk5MTVfdm1fdG9fZ2d0dChzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlHRU1fQlVHX09OKCFpOTE1X2lzX2dndHQodm0pKTsKLQly ZXR1cm4gY29udGFpbmVyX29mKHZtLCBzdHJ1Y3QgaTkxNV9nZ3R0LCBiYXNlKTsKLX0KLQogc3Rh dGljIGludAogaTkxNV9nZXRfZ2d0dF92bWFfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpOwog CkBAIC0zMzQ4LDE3NiArMzM0MSw2IEBAIHZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFwcGlu Z3Moc3RydWN0IGRybV9kZXZpY2UgKmRldikKIAlpOTE1X2dndHRfZmx1c2goZGV2X3ByaXYpOwog fQogCi1zdGF0aWMgdm9pZAotaTkxNV92bWFfcmV0aXJlKHN0cnVjdCBpOTE1X2dlbV9hY3RpdmUg KmFjdGl2ZSwKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpycSkKLXsKLQljb25zdCB1 bnNpZ25lZCBpbnQgaWR4ID0gcnEtPmVuZ2luZS0+aWQ7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWEg PQotCQljb250YWluZXJfb2YoYWN0aXZlLCBzdHJ1Y3QgaTkxNV92bWEsIGxhc3RfcmVhZFtpZHhd KTsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7Ci0KLQlHRU1f QlVHX09OKCFpOTE1X3ZtYV9oYXNfYWN0aXZlX2VuZ2luZSh2bWEsIGlkeCkpOwotCi0JaTkxNV92 bWFfY2xlYXJfYWN0aXZlKHZtYSwgaWR4KTsKLQlpZiAoaTkxNV92bWFfaXNfYWN0aXZlKHZtYSkp Ci0JCXJldHVybjsKLQotCWxpc3RfbW92ZV90YWlsKCZ2bWEtPnZtX2xpbmssICZ2bWEtPnZtLT5p bmFjdGl2ZV9saXN0KTsKLQlpZiAodW5saWtlbHkoaTkxNV92bWFfaXNfY2xvc2VkKHZtYSkgJiYg IWk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKSkKLQkJV0FSTl9PTihpOTE1X3ZtYV91bmJpbmQodm1h KSk7Ci0KLQlHRU1fQlVHX09OKCFpOTE1X2dlbV9vYmplY3RfaXNfYWN0aXZlKG9iaikpOwotCWlm ICgtLW9iai0+YWN0aXZlX2NvdW50KQotCQlyZXR1cm47Ci0KLQkvKiBCdW1wIG91ciBwbGFjZSBv biB0aGUgYm91bmQgbGlzdCB0byBrZWVwIGl0IHJvdWdobHkgaW4gTFJVIG9yZGVyCi0JICogc28g dGhhdCB3ZSBkb24ndCBzdGVhbCBmcm9tIHJlY2VudGx5IHVzZWQgYnV0IGluYWN0aXZlIG9iamVj dHMKLQkgKiAodW5sZXNzIHdlIGFyZSBmb3JjZWQgdG8gb2ZjISkKLQkgKi8KLQlpZiAob2JqLT5i aW5kX2NvdW50KQotCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGluaywgJnJxLT5pOTE1 LT5tbS5ib3VuZF9saXN0KTsKLQotCW9iai0+bW0uZGlydHkgPSB0cnVlOyAvKiBiZSBwYXJhbm9p ZCAgKi8KLQotCWlmIChpOTE1X2dlbV9vYmplY3RfaGFzX2FjdGl2ZV9yZWZlcmVuY2Uob2JqKSkg ewotCQlpOTE1X2dlbV9vYmplY3RfY2xlYXJfYWN0aXZlX3JlZmVyZW5jZShvYmopOwotCQlpOTE1 X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JfQotfQotCi1zdGF0aWMgdm9pZAotaTkxNV9nZ3R0X3Jl dGlyZV9fd3JpdGUoc3RydWN0IGk5MTVfZ2VtX2FjdGl2ZSAqYWN0aXZlLAotCQkJc3RydWN0IGRy bV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0KQotewotCXN0cnVjdCBpOTE1X3ZtYSAqdm1hID0K LQkJY29udGFpbmVyX29mKGFjdGl2ZSwgc3RydWN0IGk5MTVfdm1hLCBsYXN0X3dyaXRlKTsKLQot CWludGVsX2ZiX29ial9mbHVzaCh2bWEtPm9iaiwgdHJ1ZSwgT1JJR0lOX0NTKTsKLX0KLQotdm9p ZCBpOTE1X3ZtYV9kZXN0cm95KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04o dm1hLT5ub2RlLmFsbG9jYXRlZCk7Ci0JR0VNX0JVR19PTihpOTE1X3ZtYV9pc19hY3RpdmUodm1h KSk7Ci0JR0VNX0JVR19PTighaTkxNV92bWFfaXNfY2xvc2VkKHZtYSkpOwotCUdFTV9CVUdfT04o dm1hLT5mZW5jZSk7Ci0KLQlsaXN0X2RlbCgmdm1hLT52bV9saW5rKTsKLQlpZiAoIWk5MTVfdm1h X2lzX2dndHQodm1hKSkKLQkJaTkxNV9wcGd0dF9wdXQoaTkxNV92bV90b19wcGd0dCh2bWEtPnZt KSk7Ci0KLQlrbWVtX2NhY2hlX2ZyZWUodG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYpLT52bWFz LCB2bWEpOwotfQotCi12b2lkIGk5MTVfdm1hX2Nsb3NlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQot ewotCUdFTV9CVUdfT04oaTkxNV92bWFfaXNfY2xvc2VkKHZtYSkpOwotCXZtYS0+ZmxhZ3MgfD0g STkxNV9WTUFfQ0xPU0VEOwotCi0JbGlzdF9kZWwoJnZtYS0+b2JqX2xpbmspOwotCXJiX2VyYXNl KCZ2bWEtPm9ial9ub2RlLCAmdm1hLT5vYmotPnZtYV90cmVlKTsKLQotCWlmICghaTkxNV92bWFf aXNfYWN0aXZlKHZtYSkgJiYgIWk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEpKQotCQlXQVJOX09OKGk5 MTVfdm1hX3VuYmluZCh2bWEpKTsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIHZtYV9jb21wYXJl KHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJICAgICAgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtLAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldykKLXsK LQlHRU1fQlVHX09OKHZpZXcgJiYgIWk5MTVfaXNfZ2d0dCh2bSkpOwotCi0JaWYgKHZtYS0+dm0g IT0gdm0pCi0JCXJldHVybiB2bWEtPnZtIC0gdm07Ci0KLQlpZiAoIXZpZXcpCi0JCXJldHVybiB2 bWEtPmdndHRfdmlldy50eXBlOwotCi0JaWYgKHZtYS0+Z2d0dF92aWV3LnR5cGUgIT0gdmlldy0+ dHlwZSkKLQkJcmV0dXJuIHZtYS0+Z2d0dF92aWV3LnR5cGUgLSB2aWV3LT50eXBlOwotCi0JcmV0 dXJuIG1lbWNtcCgmdm1hLT5nZ3R0X3ZpZXcucGFyYW1zLAotCQkgICAgICAmdmlldy0+cGFyYW1z LAotCQkgICAgICBzaXplb2Yodmlldy0+cGFyYW1zKSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTkx NV92bWEgKgotX19pOTE1X3ZtYV9jcmVhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiwKLQkJICBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJICBjb25zdCBzdHJ1Y3Qg aTkxNV9nZ3R0X3ZpZXcgKnZpZXcpCi17Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0Jc3RydWN0 IHJiX25vZGUgKnJiLCAqKnA7Ci0JaW50IGk7Ci0KLQlHRU1fQlVHX09OKHZtLT5jbG9zZWQpOwot Ci0Jdm1hID0ga21lbV9jYWNoZV96YWxsb2ModG9faTkxNShvYmotPmJhc2UuZGV2KS0+dm1hcywg R0ZQX0tFUk5FTCk7Ci0JaWYgKHZtYSA9PSBOVUxMKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVN KTsKLQotCUlOSVRfTElTVF9IRUFEKCZ2bWEtPmV4ZWNfbGlzdCk7Ci0JZm9yIChpID0gMDsgaSA8 IEFSUkFZX1NJWkUodm1hLT5sYXN0X3JlYWQpOyBpKyspCi0JCWluaXRfcmVxdWVzdF9hY3RpdmUo JnZtYS0+bGFzdF9yZWFkW2ldLCBpOTE1X3ZtYV9yZXRpcmUpOwotCWluaXRfcmVxdWVzdF9hY3Rp dmUoJnZtYS0+bGFzdF93cml0ZSwKLQkJCSAgICBpOTE1X2lzX2dndHQodm0pID8gaTkxNV9nZ3R0 X3JldGlyZV9fd3JpdGUgOiBOVUxMKTsKLQlpbml0X3JlcXVlc3RfYWN0aXZlKCZ2bWEtPmxhc3Rf ZmVuY2UsIE5VTEwpOwotCWxpc3RfYWRkKCZ2bWEtPnZtX2xpbmssICZ2bS0+dW5ib3VuZF9saXN0 KTsKLQl2bWEtPnZtID0gdm07Ci0Jdm1hLT5vYmogPSBvYmo7Ci0Jdm1hLT5zaXplID0gb2JqLT5i YXNlLnNpemU7Ci0KLQlpZiAodmlldykgewotCQl2bWEtPmdndHRfdmlldyA9ICp2aWV3OwotCQlp ZiAodmlldy0+dHlwZSA9PSBJOTE1X0dHVFRfVklFV19QQVJUSUFMKSB7Ci0JCQl2bWEtPnNpemUg PSB2aWV3LT5wYXJhbXMucGFydGlhbC5zaXplOwotCQkJdm1hLT5zaXplIDw8PSBQQUdFX1NISUZU OwotCQl9IGVsc2UgaWYgKHZpZXctPnR5cGUgPT0gSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRCkgewot CQkJdm1hLT5zaXplID0KLQkJCQlpbnRlbF9yb3RhdGlvbl9pbmZvX3NpemUoJnZpZXctPnBhcmFt cy5yb3RhdGVkKTsKLQkJCXZtYS0+c2l6ZSA8PD0gUEFHRV9TSElGVDsKLQkJfQotCX0KLQotCWlm IChpOTE1X2lzX2dndHQodm0pKSB7Ci0JCXZtYS0+ZmxhZ3MgfD0gSTkxNV9WTUFfR0dUVDsKLQkJ bGlzdF9hZGQoJnZtYS0+b2JqX2xpbmssICZvYmotPnZtYV9saXN0KTsKLQl9IGVsc2UgewotCQlp OTE1X3BwZ3R0X2dldChpOTE1X3ZtX3RvX3BwZ3R0KHZtKSk7Ci0JCWxpc3RfYWRkX3RhaWwoJnZt YS0+b2JqX2xpbmssICZvYmotPnZtYV9saXN0KTsKLQl9Ci0KLQlyYiA9IE5VTEw7Ci0JcCA9ICZv YmotPnZtYV90cmVlLnJiX25vZGU7Ci0Jd2hpbGUgKCpwKSB7Ci0JCXN0cnVjdCBpOTE1X3ZtYSAq cG9zOwotCi0JCXJiID0gKnA7Ci0JCXBvcyA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgaTkxNV92bWEs IG9ial9ub2RlKTsKLQkJaWYgKHZtYV9jb21wYXJlKHBvcywgdm0sIHZpZXcpIDwgMCkKLQkJCXAg PSAmcmItPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlwID0gJnJiLT5yYl9sZWZ0OwotCX0KLQlyYl9s aW5rX25vZGUoJnZtYS0+b2JqX25vZGUsIHJiLCBwKTsKLQlyYl9pbnNlcnRfY29sb3IoJnZtYS0+ b2JqX25vZGUsICZvYmotPnZtYV90cmVlKTsKLQotCXJldHVybiB2bWE7Ci19Ci0KLXN0cnVjdCBp OTE1X3ZtYSAqCi1pOTE1X3ZtYV9jcmVhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiwKLQkJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCWNvbnN0IHN0cnVjdCBpOTE1 X2dndHRfdmlldyAqdmlldykKLXsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZvYmotPmJhc2UuZGV2 LT5zdHJ1Y3RfbXV0ZXgpOwotCUdFTV9CVUdfT04odmlldyAmJiAhaTkxNV9pc19nZ3R0KHZtKSk7 Ci0JR0VNX0JVR19PTihpOTE1X2dlbV9vYmpfdG9fdm1hKG9iaiwgdm0sIHZpZXcpKTsKLQotCXJl dHVybiBfX2k5MTVfdm1hX2NyZWF0ZShvYmosIHZtLCB2aWV3KTsKLX0KLQogc3RydWN0IGk5MTVf dm1hICoKIGk5MTVfZ2VtX29ial90b192bWEoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i aiwKIAkJICAgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLApAQCAtMzUzMCw3ICszMzUz LDcgQEAgaTkxNV9nZW1fb2JqX3RvX3ZtYShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAogCQlzdHJ1Y3QgaTkxNV92bWEgKnZtYSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgaTkxNV92bWEs IG9ial9ub2RlKTsKIAkJbG9uZyBjbXA7CiAKLQkJY21wID0gdm1hX2NvbXBhcmUodm1hLCB2bSwg dmlldyk7CisJCWNtcCA9IGk5MTVfdm1hX2NvbXBhcmUodm1hLCB2bSwgdmlldyk7CiAJCWlmIChj bXAgPT0gMCkKIAkJCXJldHVybiB2bWE7CiAKQEAgLTM1NTUsNyArMzM3OCw3IEBAIGk5MTVfZ2Vt X29ial9sb29rdXBfb3JfY3JlYXRlX3ZtYShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAogCiAJdm1hID0gaTkxNV9nZW1fb2JqX3RvX3ZtYShvYmosIHZtLCB2aWV3KTsKIAlpZiAoIXZt YSkgewotCQl2bWEgPSBfX2k5MTVfdm1hX2NyZWF0ZShvYmosIHZtLCB2aWV3KTsKKwkJdm1hID0g aTkxNV92bWFfY3JlYXRlKG9iaiwgdm0sIHZpZXcpOwogCQlHRU1fQlVHX09OKHZtYSAhPSBpOTE1 X2dlbV9vYmpfdG9fdm1hKG9iaiwgdm0sIHZpZXcpKTsKIAl9CiAKQEAgLTM3NDcsOTkgKzM1NzAs MyBAQCBpOTE1X2dldF9nZ3R0X3ZtYV9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKIAlyZXR1 cm4gcmV0OwogfQogCi0vKioKLSAqIGk5MTVfdm1hX2JpbmQgLSBTZXRzIHVwIFBURXMgZm9yIGFu IFZNQSBpbiBpdCdzIGNvcnJlc3BvbmRpbmcgYWRkcmVzcyBzcGFjZS4KLSAqIEB2bWE6IFZNQSB0 byBtYXAKLSAqIEBjYWNoZV9sZXZlbDogbWFwcGluZyBjYWNoZSBsZXZlbAotICogQGZsYWdzOiBm bGFncyBsaWtlIGdsb2JhbCBvciBsb2NhbCBtYXBwaW5nCi0gKgotICogRE1BIGFkZHJlc3NlcyBh cmUgdGFrZW4gZnJvbSB0aGUgc2NhdHRlci1nYXRoZXIgdGFibGUgb2YgdGhpcyBvYmplY3QgKG9y IG9mCi0gKiB0aGlzIFZNQSBpbiBjYXNlIG9mIG5vbi1kZWZhdWx0IEdHVFQgdmlld3MpIGFuZCBQ VEUgZW50cmllcyBzZXQgdXAuCi0gKiBOb3RlIHRoYXQgRE1BIGFkZHJlc3NlcyBhcmUgYWxzbyB0 aGUgb25seSBwYXJ0IG9mIHRoZSBTRyB0YWJsZSB3ZSBjYXJlIGFib3V0LgotICovCi1pbnQgaTkx NV92bWFfYmluZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNh Y2hlX2xldmVsLAotCQkgIHUzMiBmbGFncykKLXsKLQl1MzIgYmluZF9mbGFnczsKLQl1MzIgdm1h X2ZsYWdzOwotCWludCByZXQ7Ci0KLQlpZiAoV0FSTl9PTihmbGFncyA9PSAwKSkKLQkJcmV0dXJu IC1FSU5WQUw7Ci0KLQliaW5kX2ZsYWdzID0gMDsKLQlpZiAoZmxhZ3MgJiBQSU5fR0xPQkFMKQot CQliaW5kX2ZsYWdzIHw9IEk5MTVfVk1BX0dMT0JBTF9CSU5EOwotCWlmIChmbGFncyAmIFBJTl9V U0VSKQotCQliaW5kX2ZsYWdzIHw9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7Ci0KLQl2bWFfZmxhZ3Mg PSB2bWEtPmZsYWdzICYgKEk5MTVfVk1BX0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFfTE9DQUxfQklO RCk7Ci0JaWYgKGZsYWdzICYgUElOX1VQREFURSkKLQkJYmluZF9mbGFncyB8PSB2bWFfZmxhZ3M7 Ci0JZWxzZQotCQliaW5kX2ZsYWdzICY9IH52bWFfZmxhZ3M7Ci0JaWYgKGJpbmRfZmxhZ3MgPT0g MCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodm1hX2ZsYWdzID09IDAgJiYgdm1hLT52bS0+YWxsb2Nh dGVfdmFfcmFuZ2UpIHsKLQkJdHJhY2VfaTkxNV92YV9hbGxvYyh2bWEpOwotCQlyZXQgPSB2bWEt PnZtLT5hbGxvY2F0ZV92YV9yYW5nZSh2bWEtPnZtLAotCQkJCQkJIHZtYS0+bm9kZS5zdGFydCwK LQkJCQkJCSB2bWEtPm5vZGUuc2l6ZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0K LQotCXJldCA9IHZtYS0+dm0tPmJpbmRfdm1hKHZtYSwgY2FjaGVfbGV2ZWwsIGJpbmRfZmxhZ3Mp OwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl2bWEtPmZsYWdzIHw9IGJpbmRfZmxhZ3M7 Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgX19pb21lbSAqaTkxNV92bWFfcGluX2lvbWFwKHN0cnVj dCBpOTE1X3ZtYSAqdm1hKQotewotCXZvaWQgX19pb21lbSAqcHRyOwotCi0JLyogQWNjZXNzIHRo cm91Z2ggdGhlIEdUVCByZXF1aXJlcyB0aGUgZGV2aWNlIHRvIGJlIGF3YWtlLiAqLwotCWFzc2Vy dF9ycG1fd2FrZWxvY2tfaGVsZCh0b19pOTE1KHZtYS0+dm0tPmRldikpOwotCi0JbG9ja2RlcF9h c3NlcnRfaGVsZCgmdm1hLT52bS0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpOwotCWlmIChXQVJOX09OKCFp OTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZSh2bWEpKSkKLQkJcmV0dXJuIElPX0VSUl9QVFIo LUVOT0RFVik7Ci0KLQlHRU1fQlVHX09OKCFpOTE1X3ZtYV9pc19nZ3R0KHZtYSkpOwotCUdFTV9C VUdfT04oKHZtYS0+ZmxhZ3MgJiBJOTE1X1ZNQV9HTE9CQUxfQklORCkgPT0gMCk7Ci0KLQlwdHIg PSB2bWEtPmlvbWFwOwotCWlmIChwdHIgPT0gTlVMTCkgewotCQlwdHIgPSBpb19tYXBwaW5nX21h cF93YygmaTkxNV92bV90b19nZ3R0KHZtYS0+dm0pLT5tYXBwYWJsZSwKLQkJCQkJdm1hLT5ub2Rl LnN0YXJ0LAotCQkJCQl2bWEtPm5vZGUuc2l6ZSk7Ci0JCWlmIChwdHIgPT0gTlVMTCkKLQkJCXJl dHVybiBJT19FUlJfUFRSKC1FTk9NRU0pOwotCi0JCXZtYS0+aW9tYXAgPSBwdHI7Ci0JfQotCi0J X19pOTE1X3ZtYV9waW4odm1hKTsKLQlyZXR1cm4gcHRyOwotfQotCi12b2lkIGk5MTVfdm1hX3Vu cGluX2FuZF9yZWxlYXNlKHN0cnVjdCBpOTE1X3ZtYSAqKnBfdm1hKQotewotCXN0cnVjdCBpOTE1 X3ZtYSAqdm1hOwotCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0KLQl2bWEgPSBm ZXRjaF9hbmRfemVybyhwX3ZtYSk7Ci0JaWYgKCF2bWEpCi0JCXJldHVybjsKLQotCW9iaiA9IHZt YS0+b2JqOwotCi0JaTkxNV92bWFfdW5waW4odm1hKTsKLQlpOTE1X3ZtYV9jbG9zZSh2bWEpOwot Ci0JX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV91bmxlc3NfYWN0aXZlKG9iaik7Ci19CmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaCBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oCmluZGV4IGMyM2VmOWQuLjU3YjU4NDkgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtX2d0dC5oCkBAIC0zNSw3ICszNSw5IEBACiAjZGVmaW5lIF9fSTkx NV9HRU1fR1RUX0hfXwogCiAjaW5jbHVkZSA8bGludXgvaW8tbWFwcGluZy5oPgorI2luY2x1ZGUg PGxpbnV4L21tLmg+CiAKKyNpbmNsdWRlICJpOTE1X2dlbV90aW1lbGluZS5oIgogI2luY2x1ZGUg Imk5MTVfZ2VtX3JlcXVlc3QuaCIKIAogI2RlZmluZSBJOTE1X0ZFTkNFX1JFR19OT05FIC0xCkBA IC0xMzgsNiArMTQwLDggQEAgdHlwZWRlZiB1aW50NjRfdCBnZW44X3BwZ3R0X3BtbDRlX3Q7CiAj ZGVmaW5lIEdFTjhfUFBBVF9FTExDX09WRVJSSURFCQkoMDw8MikKICNkZWZpbmUgR0VOOF9QUEFU KGksIHgpCQkJKCh1aW50NjRfdCkgKHgpIDw8ICgoaSkgKiA4KSkKIAorc3RydWN0IHNnX3RhYmxl OworCiBlbnVtIGk5MTVfZ2d0dF92aWV3X3R5cGUgewogCUk5MTVfR0dUVF9WSUVXX05PUk1BTCA9 IDAsCiAJSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRCwKQEAgLTE2OCwxMzUgKzE3Miw3IEBAIGV4dGVy biBjb25zdCBzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgaTkxNV9nZ3R0X3ZpZXdfcm90YXRlZDsKIAog ZW51bSBpOTE1X2NhY2hlX2xldmVsOwogCi0vKioKLSAqIEEgVk1BIHJlcHJlc2VudHMgYSBHRU0g Qk8gdGhhdCBpcyBib3VuZCBpbnRvIGFuIGFkZHJlc3Mgc3BhY2UuIFRoZXJlZm9yZSwgYQotICog Vk1BJ3MgcHJlc2VuY2UgY2Fubm90IGJlIGd1YXJhbnRlZWQgYmVmb3JlIGJpbmRpbmcsIG9yIGFm dGVyIHVuYmluZGluZyB0aGUKLSAqIG9iamVjdCBpbnRvL2Zyb20gdGhlIGFkZHJlc3Mgc3BhY2Uu Ci0gKgotICogVG8gbWFrZSB0aGluZ3MgYXMgc2ltcGxlIGFzIHBvc3NpYmxlIChpZS4gbm8gcmVm Y291bnRpbmcpLCBhIFZNQSdzIGxpZmV0aW1lCi0gKiB3aWxsIGFsd2F5cyBiZSA8PSBhbiBvYmpl Y3RzIGxpZmV0aW1lLiBTbyBvYmplY3QgcmVmY291bnRpbmcgc2hvdWxkIGNvdmVyIHVzLgotICov Ci1zdHJ1Y3QgaTkxNV92bWEgewotCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOwotCXN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7Ci0Jc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm07 Ci0Jc3RydWN0IGRybV9pOTE1X2ZlbmNlX3JlZyAqZmVuY2U7Ci0Jc3RydWN0IHNnX3RhYmxlICpw YWdlczsKLQl2b2lkIF9faW9tZW0gKmlvbWFwOwotCXU2NCBzaXplOwotCXU2NCBkaXNwbGF5X2Fs aWdubWVudDsKLQotCXVuc2lnbmVkIGludCBmbGFnczsKLQkvKioKLQkgKiBIb3cgbWFueSB1c2Vy cyBoYXZlIHBpbm5lZCB0aGlzIG9iamVjdCBpbiBHVFQgc3BhY2UuIFRoZSBmb2xsb3dpbmcKLQkg KiB1c2VycyBjYW4gZWFjaCBob2xkIGF0IG1vc3Qgb25lIHJlZmVyZW5jZTogcHdyaXRlL3ByZWFk LCBleGVjYnVmZmVyCi0JICogKG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkIG11bHRpcGxlIHRpbWVz IGZvciB0aGUgc2FtZSBiYXRjaGJ1ZmZlciksCi0JICogYW5kIHRoZSBmcmFtZWJ1ZmZlciBjb2Rl LiBXaGVuIHN3aXRjaGluZy9wYWdlZmxpcHBpbmcsIHRoZQotCSAqIGZyYW1lYnVmZmVyIGNvZGUg aGFzIGF0IG1vc3QgdHdvIGJ1ZmZlcnMgcGlubmVkIHBlciBjcnRjLgotCSAqCi0JICogSW4gdGhl IHdvcnN0IGNhc2UgdGhpcyBpcyAxICsgMSArIDEgKyAyKjIgPSA3LiBUaGF0IHdvdWxkIGZpdCBp bnRvIDMKLQkgKiBiaXRzIHdpdGggYWJzb2x1dGVseSBubyBoZWFkcm9vbS4gU28gdXNlIDQgYml0 cy4KLQkgKi8KLSNkZWZpbmUgSTkxNV9WTUFfUElOX01BU0sgMHhmCi0jZGVmaW5lIEk5MTVfVk1B X1BJTl9PVkVSRkxPVwlCSVQoNSkKLQotCS8qKiBGbGFncyBhbmQgYWRkcmVzcyBzcGFjZSB0aGlz IFZNQSBpcyBib3VuZCB0byAqLwotI2RlZmluZSBJOTE1X1ZNQV9HTE9CQUxfQklORAlCSVQoNikK LSNkZWZpbmUgSTkxNV9WTUFfTE9DQUxfQklORAlCSVQoNykKLSNkZWZpbmUgSTkxNV9WTUFfQklO RF9NQVNLIChJOTE1X1ZNQV9HTE9CQUxfQklORCB8IEk5MTVfVk1BX0xPQ0FMX0JJTkQgfCBJOTE1 X1ZNQV9QSU5fT1ZFUkZMT1cpCi0KLSNkZWZpbmUgSTkxNV9WTUFfR0dUVAkJQklUKDgpCi0jZGVm aW5lIEk5MTVfVk1BX0NBTl9GRU5DRQlCSVQoOSkKLSNkZWZpbmUgSTkxNV9WTUFfQ0xPU0VECQlC SVQoMTApCi0KLQl1bnNpZ25lZCBpbnQgYWN0aXZlOwotCXN0cnVjdCBpOTE1X2dlbV9hY3RpdmUg bGFzdF9yZWFkW0k5MTVfTlVNX0VOR0lORVNdOwotCXN0cnVjdCBpOTE1X2dlbV9hY3RpdmUgbGFz dF93cml0ZTsKLQlzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlIGxhc3RfZmVuY2U7Ci0KLQkvKioKLQkg KiBTdXBwb3J0IGRpZmZlcmVudCBHR1RUIHZpZXdzIGludG8gdGhlIHNhbWUgb2JqZWN0LgotCSAq IFRoaXMgbWVhbnMgdGhlcmUgY2FuIGJlIG11bHRpcGxlIFZNQSBtYXBwaW5ncyBwZXIgb2JqZWN0 IGFuZCBwZXIgVk0uCi0JICogaTkxNV9nZ3R0X3ZpZXdfdHlwZSBpcyB1c2VkIHRvIGRpc3Rpbmd1 aXNoIGJldHdlZW4gdGhvc2UgZW50cmllcy4KLQkgKiBUaGUgZGVmYXVsdCBvbmUgb2YgemVybyAo STkxNV9HR1RUX1ZJRVdfTk9STUFMKSBpcyBkZWZhdWx0IGFuZCBhbHNvCi0JICogYXNzdW1lZCBp biBHRU0gZnVuY3Rpb25zIHdoaWNoIHRha2Ugbm8gZ2d0dCB2aWV3IHBhcmFtZXRlci4KLQkgKi8K LQlzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgZ2d0dF92aWV3OwotCi0JLyoqIFRoaXMgb2JqZWN0J3Mg cGxhY2Ugb24gdGhlIGFjdGl2ZS9pbmFjdGl2ZSBsaXN0cyAqLwotCXN0cnVjdCBsaXN0X2hlYWQg dm1fbGluazsKLQotCXN0cnVjdCBsaXN0X2hlYWQgb2JqX2xpbms7IC8qIExpbmsgaW4gdGhlIG9i amVjdCdzIFZNQSBsaXN0ICovCi0Jc3RydWN0IHJiX25vZGUgb2JqX25vZGU7Ci0KLQkvKiogVGhp cyB2bWEncyBwbGFjZSBpbiB0aGUgYmF0Y2hidWZmZXIgb3Igb24gdGhlIGV2aWN0aW9uIGxpc3Qg Ki8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGV4ZWNfbGlzdDsKLQotCS8qKgotCSAqIFVzZWQgZm9yIHBl cmZvcm1pbmcgcmVsb2NhdGlvbnMgZHVyaW5nIGV4ZWNidWZmZXIgaW5zZXJ0aW9uLgotCSAqLwot CXN0cnVjdCBobGlzdF9ub2RlIGV4ZWNfbm9kZTsKLQl1bnNpZ25lZCBsb25nIGV4ZWNfaGFuZGxl OwotCXN0cnVjdCBkcm1faTkxNV9nZW1fZXhlY19vYmplY3QyICpleGVjX2VudHJ5OwotfTsKLQot c3RydWN0IGk5MTVfdm1hICoKLWk5MTVfdm1hX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqLAotCQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJY29uc3Qgc3Ry dWN0IGk5MTVfZ2d0dF92aWV3ICp2aWV3KTsKLXZvaWQgaTkxNV92bWFfdW5waW5fYW5kX3JlbGVh c2Uoc3RydWN0IGk5MTVfdm1hICoqcF92bWEpOwotCi1zdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92 bWFfaXNfZ2d0dChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlyZXR1cm4gdm1hLT5m bGFncyAmIEk5MTVfVk1BX0dHVFQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9p c19tYXBfYW5kX2ZlbmNlYWJsZShjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlyZXR1 cm4gdm1hLT5mbGFncyAmIEk5MTVfVk1BX0NBTl9GRU5DRTsKLX0KLQotc3RhdGljIGlubGluZSBi b29sIGk5MTVfdm1hX2lzX2Nsb3NlZChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQly ZXR1cm4gdm1hLT5mbGFncyAmIEk5MTVfVk1BX0NMT1NFRDsKLX0KLQotc3RhdGljIGlubGluZSB1 bnNpZ25lZCBpbnQgaTkxNV92bWFfZ2V0X2FjdGl2ZShjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZt YSkKLXsKLQlyZXR1cm4gdm1hLT5hY3RpdmU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpOTE1 X3ZtYV9pc19hY3RpdmUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JcmV0dXJuIGk5 MTVfdm1hX2dldF9hY3RpdmUodm1hKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGk5MTVfdm1h X3NldF9hY3RpdmUoc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJICAgICAgIHVuc2lnbmVkIGlu dCBlbmdpbmUpCi17Ci0Jdm1hLT5hY3RpdmUgfD0gQklUKGVuZ2luZSk7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgdm9pZCBpOTE1X3ZtYV9jbGVhcl9hY3RpdmUoc3RydWN0IGk5MTVfdm1hICp2bWEsCi0J CQkJCSB1bnNpZ25lZCBpbnQgZW5naW5lKQotewotCXZtYS0+YWN0aXZlICY9IH5CSVQoZW5naW5l KTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2hhc19hY3RpdmVfZW5naW5lKGNv bnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgZW5naW5l KQotewotCXJldHVybiB2bWEtPmFjdGl2ZSAmIEJJVChlbmdpbmUpOwotfQotCi1zdGF0aWMgaW5s aW5lIHUzMiBpOTE1X2dndHRfb2Zmc2V0KGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewot CUdFTV9CVUdfT04oIWk5MTVfdm1hX2lzX2dndHQodm1hKSk7Ci0JR0VNX0JVR19PTighdm1hLT5u b2RlLmFsbG9jYXRlZCk7Ci0JR0VNX0JVR19PTih1cHBlcl8zMl9iaXRzKHZtYS0+bm9kZS5zdGFy dCkpOwotCUdFTV9CVUdfT04odXBwZXJfMzJfYml0cyh2bWEtPm5vZGUuc3RhcnQgKyB2bWEtPm5v ZGUuc2l6ZSAtIDEpKTsKLQlyZXR1cm4gbG93ZXJfMzJfYml0cyh2bWEtPm5vZGUuc3RhcnQpOwot fQorc3RydWN0IGk5MTVfdm1hOwogCiBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSB7CiAJc3RydWN0IHBh Z2UgKnBhZ2U7CkBAIC02MDYsNiArNDgyLDEzIEBAIGk5MTVfcGFnZV9kaXJfZG1hX2FkZHIoY29u c3Qgc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0LCBjb25zdCB1bnNpZ25lZCBuKQogCQlweF9k bWEocHBndHQtPmJhc2Uuc2NyYXRjaF9wZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGk5 MTVfZ2d0dCAqCitpOTE1X3ZtX3RvX2dndHQoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0p Cit7CisJR0VNX0JVR19PTighaTkxNV9pc19nZ3R0KHZtKSk7CisJcmV0dXJuIGNvbnRhaW5lcl9v Zih2bSwgc3RydWN0IGk5MTVfZ2d0dCwgYmFzZSk7Cit9CisKIGludCBpOTE1X2dndHRfcHJvYmVf aHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIGludCBpOTE1X2dndHRfaW5p dF9odyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogaW50IGk5MTVfZ2d0dF9l bmFibGVfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKQEAgLTY1Myw4OCAr NTM2LDQgQEAgdm9pZCBpOTE1X2dlbV9ndHRfZmluaXNoX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmosCiAjZGVmaW5lIFBJTl9PRkZTRVRfRklYRUQJQklUKDExKQogI2RlZmlu ZSBQSU5fT0ZGU0VUX01BU0sJCSh+NDA5NSkKIAotaW50IF9faTkxNV92bWFfZG9fcGluKHN0cnVj dCBpOTE1X3ZtYSAqdm1hLAotCQkgICAgICB1NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwgdTY0IGZs YWdzKTsKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjawotaTkxNV92bWFfcGluKHN0cnVj dCBpOTE1X3ZtYSAqdm1hLCB1NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwgdTY0IGZsYWdzKQotewot CUJVSUxEX0JVR19PTihQSU5fTUJaICE9IEk5MTVfVk1BX1BJTl9PVkVSRkxPVyk7Ci0JQlVJTERf QlVHX09OKFBJTl9HTE9CQUwgIT0gSTkxNV9WTUFfR0xPQkFMX0JJTkQpOwotCUJVSUxEX0JVR19P TihQSU5fVVNFUiAhPSBJOTE1X1ZNQV9MT0NBTF9CSU5EKTsKLQotCS8qIFBpbiBlYXJseSB0byBw cmV2ZW50IHRoZSBzaHJpbmtlci9ldmljdGlvbiBsb2dpYyBmcm9tIGRlc3Ryb3lpbmcKLQkgKiBv dXIgdm1hIGFzIHdlIGluc2VydCBhbmQgYmluZC4KLQkgKi8KLQlpZiAobGlrZWx5KCgoKyt2bWEt PmZsYWdzIF4gZmxhZ3MpICYgSTkxNV9WTUFfQklORF9NQVNLKSA9PSAwKSkKLQkJcmV0dXJuIDA7 Ci0KLQlyZXR1cm4gX19pOTE1X3ZtYV9kb19waW4odm1hLCBzaXplLCBhbGlnbm1lbnQsIGZsYWdz KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaTkxNV92bWFfcGluX2NvdW50KGNvbnN0IHN0cnVj dCBpOTE1X3ZtYSAqdm1hKQotewotCXJldHVybiB2bWEtPmZsYWdzICYgSTkxNV9WTUFfUElOX01B U0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9pc19waW5uZWQoY29uc3Qgc3Ry dWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JcmV0dXJuIGk5MTVfdm1hX3Bpbl9jb3VudCh2bWEpOwot fQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pOTE1X3ZtYV9waW4oc3RydWN0IGk5MTVfdm1hICp2 bWEpCi17Ci0Jdm1hLT5mbGFncysrOwotCUdFTV9CVUdfT04odm1hLT5mbGFncyAmIEk5MTVfVk1B X1BJTl9PVkVSRkxPVyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2k5MTVfdm1hX3VucGlu KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04oIWk5MTVfdm1hX2lzX3Bpbm5l ZCh2bWEpKTsKLQl2bWEtPmZsYWdzLS07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3Zt YV91bnBpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlHRU1fQlVHX09OKCFkcm1fbW1fbm9k ZV9hbGxvY2F0ZWQoJnZtYS0+bm9kZSkpOwotCV9faTkxNV92bWFfdW5waW4odm1hKTsKLX0KLQot LyoqCi0gKiBpOTE1X3ZtYV9waW5faW9tYXAgLSBjYWxscyBpb3JlbWFwX3djIHRvIG1hcCB0aGUg R0dUVCBWTUEgdmlhIHRoZSBhcGVydHVyZQotICogQHZtYTogVk1BIHRvIGlvbWFwCi0gKgotICog VGhlIHBhc3NlZCBpbiBWTUEgaGFzIHRvIGJlIHBpbm5lZCBpbiB0aGUgZ2xvYmFsIEdUVCBtYXBw YWJsZSByZWdpb24uCi0gKiBBbiBleHRyYSBwaW5uaW5nIG9mIHRoZSBWTUEgaXMgYWNxdWlyZWQg Zm9yIHRoZSByZXR1cm4gaW9tYXBwaW5nLAotICogdGhlIGNhbGxlciBtdXN0IGNhbGwgaTkxNV92 bWFfdW5waW5faW9tYXAgdG8gcmVsaW5xdWlzaCB0aGUgcGlubmluZwotICogYWZ0ZXIgdGhlIGlv bWFwcGluZyBpcyBubyBsb25nZXIgcmVxdWlyZWQuCi0gKgotICogQ2FsbGVycyBtdXN0IGhvbGQg dGhlIHN0cnVjdF9tdXRleC4KLSAqCi0gKiBSZXR1cm5zIGEgdmFsaWQgaW9tYXBwZWQgcG9pbnRl ciBvciBFUlJfUFRSLgotICovCi12b2lkIF9faW9tZW0gKmk5MTVfdm1hX3Bpbl9pb21hcChzdHJ1 Y3QgaTkxNV92bWEgKnZtYSk7Ci0jZGVmaW5lIElPX0VSUl9QVFIoeCkgKCh2b2lkIF9faW9tZW0g KilFUlJfUFRSKHgpKQotCi0vKioKLSAqIGk5MTVfdm1hX3VucGluX2lvbWFwIC0gdW5waW5zIHRo ZSBtYXBwaW5nIHJldHVybmVkIGZyb20gaTkxNV92bWFfaW9tYXAKLSAqIEB2bWE6IFZNQSB0byB1 bnBpbgotICoKLSAqIFVucGlucyB0aGUgcHJldmlvdXNseSBpb21hcHBlZCBWTUEgZnJvbSBpOTE1 X3ZtYV9waW5faW9tYXAoKS4KLSAqCi0gKiBDYWxsZXJzIG11c3QgaG9sZCB0aGUgc3RydWN0X211 dGV4LiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgdmFsaWQgdG8gYmUKLSAqIGNhbGxlZCBvbiBhIFZN QSBwcmV2aW91c2x5IGlvbWFwcGVkIGJ5IHRoZSBjYWxsZXIgd2l0aCBpOTE1X3ZtYV9waW5faW9t YXAoKS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGk5MTVfdm1hX3VucGluX2lvbWFwKHN0cnVj dCBpOTE1X3ZtYSAqdm1hKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRldi0+ c3RydWN0X211dGV4KTsKLQlHRU1fQlVHX09OKHZtYS0+aW9tYXAgPT0gTlVMTCk7Ci0JaTkxNV92 bWFfdW5waW4odm1hKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqaTkxNV92bWFf Zmlyc3RfcGFnZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlHRU1fQlVHX09OKCF2bWEtPnBh Z2VzKTsKLQlyZXR1cm4gc2dfcGFnZSh2bWEtPnBhZ2VzLT5zZ2wpOwotfQotCiAjZW5kaWYKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMC4uMDE0ZjgwMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtX29iamVjdC5oCkBAIC0wLDAgKzEsMzM3IEBACisvKgorICogQ29weXJpZ2h0 IMKpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAor ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQK KyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJ UyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNT IE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJ TiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYgX19JOTE1X0dFTV9PQkpFQ1RfSF9f CisjZGVmaW5lIF9fSTkxNV9HRU1fT0JKRUNUX0hfXworCisjaW5jbHVkZSA8bGludXgvcmVzZXJ2 YXRpb24uaD4KKworI2luY2x1ZGUgPGRybS9kcm1fdm1hX21hbmFnZXIuaD4KKyNpbmNsdWRlIDxk cm0vZHJtX2dlbS5oPgorI2luY2x1ZGUgPGRybS9kcm1QLmg+CisKKyNpbmNsdWRlIDxkcm0vaTkx NV9kcm0uaD4KKworc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIHsKKwl1bnNpZ25lZCBp bnQgZmxhZ3M7CisjZGVmaW5lIEk5MTVfR0VNX09CSkVDVF9IQVNfU1RSVUNUX1BBR0UgMHgxCisj ZGVmaW5lIEk5MTVfR0VNX09CSkVDVF9JU19TSFJJTktBQkxFICAgMHgyCisKKwkvKiBJbnRlcmZh Y2UgYmV0d2VlbiB0aGUgR0VNIG9iamVjdCBhbmQgaXRzIGJhY2tpbmcgc3RvcmFnZS4KKwkgKiBn ZXRfcGFnZXMoKSBpcyBjYWxsZWQgb25jZSBwcmlvciB0byB0aGUgdXNlIG9mIHRoZSBhc3NvY2lh dGVkIHNldAorCSAqIG9mIHBhZ2VzIGJlZm9yZSB0byBiaW5kaW5nIHRoZW0gaW50byB0aGUgR1RU LCBhbmQgcHV0X3BhZ2VzKCkgaXMKKwkgKiBjYWxsZWQgYWZ0ZXIgd2Ugbm8gbG9uZ2VyIG5lZWQg dGhlbS4gQXMgd2UgZXhwZWN0IHRoZXJlIHRvIGJlCisJICogYXNzb2NpYXRlZCBjb3N0IHdpdGgg bWlncmF0aW5nIHBhZ2VzIGJldHdlZW4gdGhlIGJhY2tpbmcgc3RvcmFnZQorCSAqIGFuZCBtYWtp bmcgdGhlbSBhdmFpbGFibGUgZm9yIHRoZSBHUFUgKGUuZy4gY2xmbHVzaCksIHdlIG1heSBob2xk CisJICogb250byB0aGUgcGFnZXMgYWZ0ZXIgdGhleSBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQg YnkgdGhlIEdQVQorCSAqIGluIGNhc2UgdGhleSBtYXkgYmUgdXNlZCBhZ2FpbiBzaG9ydGx5IChm b3IgZXhhbXBsZSBtaWdyYXRpbmcgdGhlCisJICogcGFnZXMgdG8gYSBkaWZmZXJlbnQgbWVtb3J5 IGRvbWFpbiB3aXRoaW4gdGhlIEdUVCkuIHB1dF9wYWdlcygpCisJICogd2lsbCB0aGVyZWZvcmUg bW9zdCBsaWtlbHkgYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpdHNlbGYgaXMKKwkgKiBiZWlu ZyByZWxlYXNlZCBvciB1bmRlciBtZW1vcnkgcHJlc3N1cmUgKHdoZXJlIHdlIGF0dGVtcHQgdG8K KwkgKiByZWFwIHBhZ2VzIGZvciB0aGUgc2hyaW5rZXIpLgorCSAqLworCXN0cnVjdCBzZ190YWJs ZSAqKCpnZXRfcGFnZXMpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICopOworCXZvaWQgKCpw dXRfcGFnZXMpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICosIHN0cnVjdCBzZ190YWJsZSAq KTsKKworCWludCAoKmRtYWJ1Zl9leHBvcnQpKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICop OworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqKTsKK307CisK K3N0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0IHsKKwlzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgYmFz ZTsKKworCWNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyAqb3BzOworCisJLyoq IExpc3Qgb2YgVk1BcyBiYWNrZWQgYnkgdGhpcyBvYmplY3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFk IHZtYV9saXN0OworCXN0cnVjdCByYl9yb290IHZtYV90cmVlOworCisJLyoqIFN0b2xlbiBtZW1v cnkgZm9yIHRoaXMgb2JqZWN0LCBpbnN0ZWFkIG9mIGJlaW5nIGJhY2tlZCBieSBzaG1lbS4gKi8K KwlzdHJ1Y3QgZHJtX21tX25vZGUgKnN0b2xlbjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGdsb2JhbF9s aW5rOworCXVuaW9uIHsKKwkJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwkJc3RydWN0IGxsaXN0X25v ZGUgZnJlZWQ7CisJfTsKKworCS8qKgorCSAqIFdoZXRoZXIgdGhlIG9iamVjdCBpcyBjdXJyZW50 bHkgaW4gdGhlIEdHVFQgbW1hcC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHVzZXJmYXVsdF9s aW5rOworCisJLyoqIFVzZWQgaW4gZXhlY2J1ZiB0byB0ZW1wb3JhcmlseSBob2xkIGEgcmVmICov CisJc3RydWN0IGxpc3RfaGVhZCBvYmpfZXhlY19saW5rOworCisJc3RydWN0IGxpc3RfaGVhZCBi YXRjaF9wb29sX2xpbms7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoqCisJICogSGF2 ZSB3ZSB0YWtlbiBhIHJlZmVyZW5jZSBmb3IgdGhlIG9iamVjdCBmb3IgaW5jb21wbGV0ZSBHUFUK KwkgKiBhY3Rpdml0eT8KKwkgKi8KKyNkZWZpbmUgSTkxNV9CT19BQ1RJVkVfUkVGIDAKKworCS8q CisJICogSXMgdGhlIG9iamVjdCB0byBiZSBtYXBwZWQgYXMgcmVhZC1vbmx5IHRvIHRoZSBHUFUK KwkgKiBPbmx5IGhvbm91cmVkIGlmIGhhcmR3YXJlIGhhcyByZWxldmFudCBwdGUgYml0CisJICov CisJdW5zaWduZWQgbG9uZyBndF9ybzoxOworCXVuc2lnbmVkIGludCBjYWNoZV9sZXZlbDozOwor CXVuc2lnbmVkIGludCBjYWNoZV9kaXJ0eToxOworCisJYXRvbWljX3QgZnJvbnRidWZmZXJfYml0 czsKKwl1bnNpZ25lZCBpbnQgZnJvbnRidWZmZXJfZ2d0dF9vcmlnaW47IC8qIHdyaXRlIG9uY2Ug Ki8KKworCS8qKiBDdXJyZW50IHRpbGluZyBzdHJpZGUgZm9yIHRoZSBvYmplY3QsIGlmIGl0J3Mg dGlsZWQuICovCisJdW5zaWduZWQgaW50IHRpbGluZ19hbmRfc3RyaWRlOworI2RlZmluZSBGRU5D RV9NSU5JTVVNX1NUUklERSAxMjggLyogU2VlIGk5MTVfdGlsaW5nX29rKCkgKi8KKyNkZWZpbmUg VElMSU5HX01BU0sgKEZFTkNFX01JTklNVU1fU1RSSURFLTEpCisjZGVmaW5lIFNUUklERV9NQVNL ICh+VElMSU5HX01BU0spCisKKwkvKiogQ291bnQgb2YgVk1BIGFjdHVhbGx5IGJvdW5kIGJ5IHRo aXMgb2JqZWN0ICovCisJdW5zaWduZWQgaW50IGJpbmRfY291bnQ7CisJdW5zaWduZWQgaW50IGFj dGl2ZV9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcGluX2Rpc3BsYXk7CisKKwlzdHJ1Y3QgeworCQlz dHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgdGhlIHBhZ2VzIGFuZCB0aGVpciB1c2UgKi8K KwkJYXRvbWljX3QgcGFnZXNfcGluX2NvdW50OworCisJCXN0cnVjdCBzZ190YWJsZSAqcGFnZXM7 CisJCXZvaWQgKm1hcHBpbmc7CisKKwkJc3RydWN0IGk5MTVfZ2VtX29iamVjdF9wYWdlX2l0ZXIg eworCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19wb3M7CisJCQl1bnNpZ25lZCBpbnQgc2dfaWR4 OyAvKiBpbiBwYWdlcywgYnV0IDMyYml0IGVlayEgKi8KKworCQkJc3RydWN0IHJhZGl4X3RyZWVf cm9vdCByYWRpeDsKKwkJCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90ZWN0cyB0aGlzIGNhY2hl ICovCisJCX0gZ2V0X3BhZ2U7CisKKwkJLyoqCisJCSAqIEFkdmljZTogYXJlIHRoZSBiYWNraW5n IHBhZ2VzIHB1cmdlYWJsZT8KKwkJICovCisJCXVuc2lnbmVkIGludCBtYWR2OjI7CisKKwkJLyoq CisJCSAqIFRoaXMgaXMgc2V0IGlmIHRoZSBvYmplY3QgaGFzIGJlZW4gd3JpdHRlbiB0byBzaW5j ZSB0aGUKKwkJICogcGFnZXMgd2VyZSBsYXN0IGFjcXVpcmVkLgorCQkgKi8KKwkJYm9vbCBkaXJ0 eToxOworCisJCS8qKgorCQkgKiBUaGlzIGlzIHNldCBpZiB0aGUgb2JqZWN0IGhhcyBiZWVuIHBp bm5lZCBkdWUgdG8gdW5rbm93bgorCQkgKiBzd2l6emxpbmcuCisJCSAqLworCQlib29sIHF1aXJr ZWQ6MTsKKwl9IG1tOworCisJLyoqIEJyZWFkY3J1bWIgb2YgbGFzdCByZW5kZXJpbmcgdG8gdGhl IGJ1ZmZlci4KKwkgKiBUaGVyZSBjYW4gb25seSBiZSBvbmUgd3JpdGVyLCBidXQgd2UgYWxsb3cg Zm9yIG11bHRpcGxlIHJlYWRlcnMuCisJICogSWYgdGhlcmUgaXMgYSB3cml0ZXIgdGhhdCBuZWNl c3NhcmlseSBpbXBsaWVzIHRoYXQgYWxsIG90aGVyCisJICogcmVhZCByZXF1ZXN0cyBhcmUgY29t cGxldGUgLSBidXQgd2UgbWF5IG9ubHkgYmUgbGF6aWx5IGNsZWFyaW5nCisJICogdGhlIHJlYWQg cmVxdWVzdHMuIEEgcmVhZCByZXF1ZXN0IGlzIG5hdHVyYWxseSB0aGUgbW9zdCByZWNlbnQKKwkg KiByZXF1ZXN0IG9uIGEgcmluZywgc28gd2UgbWF5IGhhdmUgdHdvIGRpZmZlcmVudCB3cml0ZSBh bmQgcmVhZAorCSAqIHJlcXVlc3RzIG9uIG9uZSByaW5nIHdoZXJlIHRoZSB3cml0ZSByZXF1ZXN0 IGlzIG9sZGVyIHRoYW4gdGhlCisJICogcmVhZCByZXF1ZXN0LiBUaGlzIGFsbG93cyBmb3IgdGhl IENQVSB0byByZWFkIGZyb20gYW4gYWN0aXZlCisJICogYnVmZmVyIGJ5IG9ubHkgd2FpdGluZyBm b3IgdGhlIHdyaXRlIHRvIGNvbXBsZXRlLgorCSAqLworCXN0cnVjdCByZXNlcnZhdGlvbl9vYmpl Y3QgKnJlc3Y7CisKKwkvKiogUmVmZXJlbmNlcyBmcm9tIGZyYW1lYnVmZmVycywgbG9ja3Mgb3V0 IHRpbGluZyBjaGFuZ2VzLiAqLworCXVuc2lnbmVkIGxvbmcgZnJhbWVidWZmZXJfcmVmZXJlbmNl czsKKworCS8qKiBSZWNvcmQgb2YgYWRkcmVzcyBiaXQgMTcgb2YgZWFjaCBwYWdlIGF0IGxhc3Qg dW5iaW5kLiAqLworCXVuc2lnbmVkIGxvbmcgKmJpdF8xNzsKKworCXN0cnVjdCBpOTE1X2dlbV91 c2VycHRyIHsKKwkJdWludHB0cl90IHB0cjsKKwkJdW5zaWduZWQgcmVhZF9vbmx5IDoxOworCisJ CXN0cnVjdCBpOTE1X21tX3N0cnVjdCAqbW07CisJCXN0cnVjdCBpOTE1X21tdV9vYmplY3QgKm1t dV9vYmplY3Q7CisJCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yazsKKwl9IHVzZXJwdHI7CisKKwkv KiogZm9yIHBoeXMgYWxsb2NhdGVkIG9iamVjdHMgKi8KKwlzdHJ1Y3QgZHJtX2RtYV9oYW5kbGUg KnBoeXNfaGFuZGxlOworCisJc3RydWN0IHJlc2VydmF0aW9uX29iamVjdCBfX2J1aWx0aW5fcmVz djsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgordG9f aW50ZWxfYm8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpnZW0pCit7CisJLyogQXNzZXJ0IHRoYXQg dG9faW50ZWxfYm8oTlVMTCkgPT0gTlVMTCAqLworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwgYmFzZSkpOworCisJcmV0dXJuIGNvbnRhaW5lcl9vZihn ZW0sIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LCBiYXNlKTsKK30KKworLyoqCisgKiBpOTE1 X2dlbV9vYmplY3RfbG9va3VwX3JjdSAtIGxvb2sgdXAgYSB0ZW1wb3JhcnkgR0VNIG9iamVjdCBm cm9tIGl0cyBoYW5kbGUKKyAqIEBmaWxwOiBEUk0gZmlsZSBwcml2YXRlIGRhdGUKKyAqIEBoYW5k bGU6IHVzZXJzcGFjZSBoYW5kbGUKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqIEEgcG9pbnRlciB0 byB0aGUgb2JqZWN0IG5hbWVkIGJ5IHRoZSBoYW5kbGUgaWYgc3VjaCBleGlzdHMgb24gQGZpbHAs IE5VTEwKKyAqIG90aGVyd2lzZS4gVGhpcyBvYmplY3QgaXMgb25seSB2YWxpZCB3aGlsc3QgdW5k ZXIgdGhlIFJDVSByZWFkIGxvY2ssIGFuZAorICogbm90ZSBjYXJlZnVsbHkgdGhlIG9iamVjdCBt YXkgYmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgZGVzdHJveWVkLgorICovCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICoKK2k5MTVfZ2VtX29iamVjdF9sb29rdXBf cmN1KHN0cnVjdCBkcm1fZmlsZSAqZmlsZSwgdTMyIGhhbmRsZSkKK3sKKyNpZmRlZiBDT05GSUdf TE9DS0RFUAorCVdBUk5fT04oZGVidWdfbG9ja3MgJiYgIWxvY2tfaXNfaGVsZCgmcmN1X2xvY2tf bWFwKSk7CisjZW5kaWYKKwlyZXR1cm4gaWRyX2ZpbmQoJmZpbGUtPm9iamVjdF9pZHIsIGhhbmRs ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgoraTkx NV9nZW1fb2JqZWN0X2xvb2t1cChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsIHUzMiBoYW5kbGUpCit7 CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCXJjdV9yZWFkX2xvY2soKTsK KwlvYmogPSBpOTE1X2dlbV9vYmplY3RfbG9va3VwX3JjdShmaWxlLCBoYW5kbGUpOworCWlmIChv YmogJiYgIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZvYmotPmJhc2UucmVmY291bnQpKQorCQlvYmog PSBOVUxMOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIG9iajsKK30KKworX19kZXBy ZWNhdGVkCitleHRlcm4gc3RydWN0IGRybV9nZW1fb2JqZWN0ICoKK2RybV9nZW1fb2JqZWN0X2xv b2t1cChzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGUsIHUzMiBoYW5kbGUpOworCitfX2F0dHJpYnV0ZV9f KChub25udWxsKSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgor aTkxNV9nZW1fb2JqZWN0X2dldChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQorewor CWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKKwlyZXR1cm4gb2JqOworfQor CitfX2RlcHJlY2F0ZWQKK2V4dGVybiB2b2lkIGRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZShzdHJ1 Y3QgZHJtX2dlbV9vYmplY3QgKik7CisKK19fYXR0cmlidXRlX18oKG5vbm51bGwpKQorc3RhdGlj IGlubGluZSB2b2lkCitpOTE1X2dlbV9vYmplY3RfcHV0KHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmopCit7CisJX19kcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsK K30KKworX19kZXByZWNhdGVkCitleHRlcm4gdm9pZCBkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5j ZShzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKik7CisKK19fZGVwcmVjYXRlZAorZXh0ZXJuIHZvaWQg ZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoc3RydWN0IGRybV9nZW1fb2JqZWN0 ICopOworCitzdGF0aWMgaW5saW5lIGJvb2wKK2k5MTVfZ2VtX29iamVjdF9pc19kZWFkKGNvbnN0 IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIGF0b21pY19yZWFk KCZvYmotPmJhc2UucmVmY291bnQucmVmY291bnQpID09IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUg Ym9vbAoraTkxNV9nZW1fb2JqZWN0X2hhc19zdHJ1Y3RfcGFnZShjb25zdCBzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXJldHVybiBvYmotPm9wcy0+ZmxhZ3MgJiBJOTE1X0dF TV9PQkpFQ1RfSEFTX1NUUlVDVF9QQUdFOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2k5MTVf Z2VtX29iamVjdF9pc19zaHJpbmthYmxlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCit7CisJcmV0dXJuIG9iai0+b3BzLT5mbGFncyAmIEk5MTVfR0VNX09CSkVDVF9JU19T SFJJTktBQkxFOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2k5MTVfZ2VtX29iamVjdF9pc19h Y3RpdmUoY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlyZXR1cm4g b2JqLT5hY3RpdmVfY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraTkxNV9nZW1fb2Jq ZWN0X2hhc19hY3RpdmVfcmVmZXJlbmNlKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCit7CisJcmV0dXJuIHRlc3RfYml0KEk5MTVfQk9fQUNUSVZFX1JFRiwgJm9iai0+Zmxh Z3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2k5MTVfZ2VtX29iamVjdF9zZXRfYWN0aXZl X3JlZmVyZW5jZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCWxvY2tkZXBf YXNzZXJ0X2hlbGQoJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7CisJX19zZXRfYml0KEk5 MTVfQk9fQUNUSVZFX1JFRiwgJm9iai0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQK K2k5MTVfZ2VtX29iamVjdF9jbGVhcl9hY3RpdmVfcmVmZXJlbmNlKHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmopCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmb2JqLT5iYXNlLmRldi0+ c3RydWN0X211dGV4KTsKKwlfX2NsZWFyX2JpdChJOTE1X0JPX0FDVElWRV9SRUYsICZvYmotPmZs YWdzKTsKK30KKwordm9pZCBfX2k5MTVfZ2VtX29iamVjdF9yZWxlYXNlX3VubGVzc19hY3RpdmUo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWdu ZWQgaW50CitpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQoreworCXJldHVybiBvYmotPnRpbGluZ19hbmRfc3RyaWRlICYgVElMSU5HX01B U0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraTkxNV9nZW1fb2JqZWN0X2lzX3RpbGVkKHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIGk5MTVfZ2VtX29iamVj dF9nZXRfdGlsaW5nKG9iaikgIT0gSTkxNV9USUxJTkdfTk9ORTsKK30KKworc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQKK2k5MTVfZ2VtX29iamVjdF9nZXRfc3RyaWRlKHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmopCit7CisJcmV0dXJuIG9iai0+dGlsaW5nX2FuZF9zdHJpZGUgJiBT VFJJREVfTUFTSzsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICoK K2k5MTVfZ2VtX29iamVjdF9sYXN0X3dyaXRlX2VuZ2luZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqKQoreworCXN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSA9IE5VTEw7CisJ c3RydWN0IGRtYV9mZW5jZSAqZmVuY2U7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZmVuY2UgPSBy ZXNlcnZhdGlvbl9vYmplY3RfZ2V0X2V4Y2xfcmN1KG9iai0+cmVzdik7CisJcmN1X3JlYWRfdW5s b2NrKCk7CisKKwlpZiAoZmVuY2UgJiYgZG1hX2ZlbmNlX2lzX2k5MTUoZmVuY2UpICYmICFkbWFf ZmVuY2VfaXNfc2lnbmFsZWQoZmVuY2UpKQorCQllbmdpbmUgPSB0b19yZXF1ZXN0KGZlbmNlKS0+ ZW5naW5lOworCWRtYV9mZW5jZV9wdXQoZmVuY2UpOworCisJcmV0dXJuIGVuZ2luZTsKK30KKwor I2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3JlcXVl c3QuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX3JlcXVlc3QuaAppbmRleCAwZjY5 ZmFkLi5hNTY1NTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9y ZXF1ZXN0LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fcmVxdWVzdC5oCkBA IC0zMCw2ICszMCw5IEBACiAjaW5jbHVkZSAiaTkxNV9nZW0uaCIKICNpbmNsdWRlICJpOTE1X3N3 X2ZlbmNlLmgiCiAKK3N0cnVjdCBkcm1fZmlsZTsKK3N0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 OworCiBzdHJ1Y3QgaW50ZWxfd2FpdCB7CiAJc3RydWN0IHJiX25vZGUgbm9kZTsKIAlzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnRzazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf dm1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjczOGZmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X3ZtYS5jCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICogQ29weXJpZ2h0 IMKpIDIwMTYgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAor ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQK KyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJ UyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNT IE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJ TiBUSEUgU09GVFdBUkUuCisgKgorICovCisgCisjaW5jbHVkZSAiaTkxNV92bWEuaCIKKworI2lu Y2x1ZGUgImk5MTVfZHJ2LmgiCisjaW5jbHVkZSAiaW50ZWxfcmluZ2J1ZmZlci5oIgorI2luY2x1 ZGUgImludGVsX2Zyb250YnVmZmVyLmgiCisKKyNpbmNsdWRlIDxkcm0vZHJtX2dlbS5oPgorCitz dGF0aWMgdm9pZAoraTkxNV92bWFfcmV0aXJlKHN0cnVjdCBpOTE1X2dlbV9hY3RpdmUgKmFjdGl2 ZSwKKwkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpycSkKK3sKKwljb25zdCB1bnNpZ25l ZCBpbnQgaWR4ID0gcnEtPmVuZ2luZS0+aWQ7CisJc3RydWN0IGk5MTVfdm1hICp2bWEgPQorCQlj b250YWluZXJfb2YoYWN0aXZlLCBzdHJ1Y3QgaTkxNV92bWEsIGxhc3RfcmVhZFtpZHhdKTsKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7CisKKwlHRU1fQlVHX09O KCFpOTE1X3ZtYV9oYXNfYWN0aXZlX2VuZ2luZSh2bWEsIGlkeCkpOworCisJaTkxNV92bWFfY2xl YXJfYWN0aXZlKHZtYSwgaWR4KTsKKwlpZiAoaTkxNV92bWFfaXNfYWN0aXZlKHZtYSkpCisJCXJl dHVybjsKKworCWxpc3RfbW92ZV90YWlsKCZ2bWEtPnZtX2xpbmssICZ2bWEtPnZtLT5pbmFjdGl2 ZV9saXN0KTsKKwlpZiAodW5saWtlbHkoaTkxNV92bWFfaXNfY2xvc2VkKHZtYSkgJiYgIWk5MTVf dm1hX2lzX3Bpbm5lZCh2bWEpKSkKKwkJV0FSTl9PTihpOTE1X3ZtYV91bmJpbmQodm1hKSk7CisK KwlHRU1fQlVHX09OKCFpOTE1X2dlbV9vYmplY3RfaXNfYWN0aXZlKG9iaikpOworCWlmICgtLW9i ai0+YWN0aXZlX2NvdW50KQorCQlyZXR1cm47CisKKwkvKiBCdW1wIG91ciBwbGFjZSBvbiB0aGUg Ym91bmQgbGlzdCB0byBrZWVwIGl0IHJvdWdobHkgaW4gTFJVIG9yZGVyCisJICogc28gdGhhdCB3 ZSBkb24ndCBzdGVhbCBmcm9tIHJlY2VudGx5IHVzZWQgYnV0IGluYWN0aXZlIG9iamVjdHMKKwkg KiAodW5sZXNzIHdlIGFyZSBmb3JjZWQgdG8gb2ZjISkKKwkgKi8KKwlpZiAob2JqLT5iaW5kX2Nv dW50KQorCQlsaXN0X21vdmVfdGFpbCgmb2JqLT5nbG9iYWxfbGluaywgJnJxLT5pOTE1LT5tbS5i b3VuZF9saXN0KTsKKworCW9iai0+bW0uZGlydHkgPSB0cnVlOyAvKiBiZSBwYXJhbm9pZCAgKi8K KworCWlmIChpOTE1X2dlbV9vYmplY3RfaGFzX2FjdGl2ZV9yZWZlcmVuY2Uob2JqKSkgeworCQlp OTE1X2dlbV9vYmplY3RfY2xlYXJfYWN0aXZlX3JlZmVyZW5jZShvYmopOworCQlpOTE1X2dlbV9v YmplY3RfcHV0KG9iaik7CisJfQorfQorCitzdGF0aWMgdm9pZAoraTkxNV9nZ3R0X3JldGlyZV9f d3JpdGUoc3RydWN0IGk5MTVfZ2VtX2FjdGl2ZSAqYWN0aXZlLAorCQkJc3RydWN0IGRybV9pOTE1 X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hID0KKwkJY29u dGFpbmVyX29mKGFjdGl2ZSwgc3RydWN0IGk5MTVfdm1hLCBsYXN0X3dyaXRlKTsKKworCWludGVs X2ZiX29ial9mbHVzaCh2bWEtPm9iaiwgdHJ1ZSwgT1JJR0lOX0NTKTsKK30KKworc3RhdGljIHN0 cnVjdCBpOTE1X3ZtYSAqCitfX2k5MTVfdm1hX2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqLAorCQkgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkgIGNvbnN0 IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldykKK3sKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsK KwlzdHJ1Y3QgcmJfbm9kZSAqcmIsICoqcDsKKwlpbnQgaTsKKworCUdFTV9CVUdfT04odm0tPmNs b3NlZCk7CisKKwl2bWEgPSBrbWVtX2NhY2hlX3phbGxvYyh0b19pOTE1KG9iai0+YmFzZS5kZXYp LT52bWFzLCBHRlBfS0VSTkVMKTsKKwlpZiAodm1hID09IE5VTEwpCisJCXJldHVybiBFUlJfUFRS KC1FTk9NRU0pOworCisJSU5JVF9MSVNUX0hFQUQoJnZtYS0+ZXhlY19saXN0KTsKKwlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRSh2bWEtPmxhc3RfcmVhZCk7IGkrKykKKwkJaW5pdF9yZXF1ZXN0 X2FjdGl2ZSgmdm1hLT5sYXN0X3JlYWRbaV0sIGk5MTVfdm1hX3JldGlyZSk7CisJaW5pdF9yZXF1 ZXN0X2FjdGl2ZSgmdm1hLT5sYXN0X3dyaXRlLAorCQkJICAgIGk5MTVfaXNfZ2d0dCh2bSkgPyBp OTE1X2dndHRfcmV0aXJlX193cml0ZSA6IE5VTEwpOworCWluaXRfcmVxdWVzdF9hY3RpdmUoJnZt YS0+bGFzdF9mZW5jZSwgTlVMTCk7CisJbGlzdF9hZGQoJnZtYS0+dm1fbGluaywgJnZtLT51bmJv dW5kX2xpc3QpOworCXZtYS0+dm0gPSB2bTsKKwl2bWEtPm9iaiA9IG9iajsKKwl2bWEtPnNpemUg PSBvYmotPmJhc2Uuc2l6ZTsKKworCWlmICh2aWV3KSB7CisJCXZtYS0+Z2d0dF92aWV3ID0gKnZp ZXc7CisJCWlmICh2aWV3LT50eXBlID09IEk5MTVfR0dUVF9WSUVXX1BBUlRJQUwpIHsKKwkJCXZt YS0+c2l6ZSA9IHZpZXctPnBhcmFtcy5wYXJ0aWFsLnNpemU7CisJCQl2bWEtPnNpemUgPDw9IFBB R0VfU0hJRlQ7CisJCX0gZWxzZSBpZiAodmlldy0+dHlwZSA9PSBJOTE1X0dHVFRfVklFV19ST1RB VEVEKSB7CisJCQl2bWEtPnNpemUgPQorCQkJCWludGVsX3JvdGF0aW9uX2luZm9fc2l6ZSgmdmll dy0+cGFyYW1zLnJvdGF0ZWQpOworCQkJdm1hLT5zaXplIDw8PSBQQUdFX1NISUZUOworCQl9CisJ fQorCisJaWYgKGk5MTVfaXNfZ2d0dCh2bSkpIHsKKwkJdm1hLT5mbGFncyB8PSBJOTE1X1ZNQV9H R1RUOworCQlsaXN0X2FkZCgmdm1hLT5vYmpfbGluaywgJm9iai0+dm1hX2xpc3QpOworCX0gZWxz ZSB7CisJCWk5MTVfcHBndHRfZ2V0KGk5MTVfdm1fdG9fcHBndHQodm0pKTsKKwkJbGlzdF9hZGRf dGFpbCgmdm1hLT5vYmpfbGluaywgJm9iai0+dm1hX2xpc3QpOworCX0KKworCXJiID0gTlVMTDsK KwlwID0gJm9iai0+dm1hX3RyZWUucmJfbm9kZTsKKwl3aGlsZSAoKnApIHsKKwkJc3RydWN0IGk5 MTVfdm1hICpwb3M7CisKKwkJcmIgPSAqcDsKKwkJcG9zID0gcmJfZW50cnkocmIsIHN0cnVjdCBp OTE1X3ZtYSwgb2JqX25vZGUpOworCQlpZiAoaTkxNV92bWFfY29tcGFyZShwb3MsIHZtLCB2aWV3 KSA8IDApCisJCQlwID0gJnJiLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcCA9ICZyYi0+cmJfbGVm dDsKKwl9CisJcmJfbGlua19ub2RlKCZ2bWEtPm9ial9ub2RlLCByYiwgcCk7CisJcmJfaW5zZXJ0 X2NvbG9yKCZ2bWEtPm9ial9ub2RlLCAmb2JqLT52bWFfdHJlZSk7CisKKwlyZXR1cm4gdm1hOwor fQorCitzdHJ1Y3QgaTkxNV92bWEgKgoraTkxNV92bWFfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmosCisJCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQljb25z dCBzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgKnZpZXcpCit7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgm b2JqLT5iYXNlLmRldi0+c3RydWN0X211dGV4KTsKKwlHRU1fQlVHX09OKHZpZXcgJiYgIWk5MTVf aXNfZ2d0dCh2bSkpOworCUdFTV9CVUdfT04oaTkxNV9nZW1fb2JqX3RvX3ZtYShvYmosIHZtLCB2 aWV3KSk7CisKKwlyZXR1cm4gX19pOTE1X3ZtYV9jcmVhdGUob2JqLCB2bSwgdmlldyk7Cit9CisK Ky8qKgorICogaTkxNV92bWFfYmluZCAtIFNldHMgdXAgUFRFcyBmb3IgYW4gVk1BIGluIGl0J3Mg Y29ycmVzcG9uZGluZyBhZGRyZXNzIHNwYWNlLgorICogQHZtYTogVk1BIHRvIG1hcAorICogQGNh Y2hlX2xldmVsOiBtYXBwaW5nIGNhY2hlIGxldmVsCisgKiBAZmxhZ3M6IGZsYWdzIGxpa2UgZ2xv YmFsIG9yIGxvY2FsIG1hcHBpbmcKKyAqCisgKiBETUEgYWRkcmVzc2VzIGFyZSB0YWtlbiBmcm9t IHRoZSBzY2F0dGVyLWdhdGhlciB0YWJsZSBvZiB0aGlzIG9iamVjdCAob3Igb2YKKyAqIHRoaXMg Vk1BIGluIGNhc2Ugb2Ygbm9uLWRlZmF1bHQgR0dUVCB2aWV3cykgYW5kIFBURSBlbnRyaWVzIHNl dCB1cC4KKyAqIE5vdGUgdGhhdCBETUEgYWRkcmVzc2VzIGFyZSBhbHNvIHRoZSBvbmx5IHBhcnQg b2YgdGhlIFNHIHRhYmxlIHdlIGNhcmUgYWJvdXQuCisgKi8KK2ludCBpOTE1X3ZtYV9iaW5kKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hLCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJ CSAgdTMyIGZsYWdzKQoreworCXUzMiBiaW5kX2ZsYWdzOworCXUzMiB2bWFfZmxhZ3M7CisJaW50 IHJldDsKKworCWlmIChXQVJOX09OKGZsYWdzID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor CWJpbmRfZmxhZ3MgPSAwOworCWlmIChmbGFncyAmIFBJTl9HTE9CQUwpCisJCWJpbmRfZmxhZ3Mg fD0gSTkxNV9WTUFfR0xPQkFMX0JJTkQ7CisJaWYgKGZsYWdzICYgUElOX1VTRVIpCisJCWJpbmRf ZmxhZ3MgfD0gSTkxNV9WTUFfTE9DQUxfQklORDsKKworCXZtYV9mbGFncyA9IHZtYS0+ZmxhZ3Mg JiAoSTkxNV9WTUFfR0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKTsKKwlpZiAoZmxh Z3MgJiBQSU5fVVBEQVRFKQorCQliaW5kX2ZsYWdzIHw9IHZtYV9mbGFnczsKKwllbHNlCisJCWJp bmRfZmxhZ3MgJj0gfnZtYV9mbGFnczsKKwlpZiAoYmluZF9mbGFncyA9PSAwKQorCQlyZXR1cm4g MDsKKworCWlmICh2bWFfZmxhZ3MgPT0gMCAmJiB2bWEtPnZtLT5hbGxvY2F0ZV92YV9yYW5nZSkg eworCQl0cmFjZV9pOTE1X3ZhX2FsbG9jKHZtYSk7CisJCXJldCA9IHZtYS0+dm0tPmFsbG9jYXRl X3ZhX3JhbmdlKHZtYS0+dm0sCisJCQkJCQkgdm1hLT5ub2RlLnN0YXJ0LAorCQkJCQkJIHZtYS0+ bm9kZS5zaXplKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gdm1h LT52bS0+YmluZF92bWEodm1hLCBjYWNoZV9sZXZlbCwgYmluZF9mbGFncyk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKworCXZtYS0+ZmxhZ3MgfD0gYmluZF9mbGFnczsKKwlyZXR1cm4gMDsK K30KKwordm9pZCBfX2lvbWVtICppOTE1X3ZtYV9waW5faW9tYXAoc3RydWN0IGk5MTVfdm1hICp2 bWEpCit7CisJdm9pZCBfX2lvbWVtICpwdHI7CisKKwkvKiBBY2Nlc3MgdGhyb3VnaCB0aGUgR1RU IHJlcXVpcmVzIHRoZSBkZXZpY2UgdG8gYmUgYXdha2UuICovCisJYXNzZXJ0X3JwbV93YWtlbG9j a19oZWxkKHRvX2k5MTUodm1hLT52bS0+ZGV2KSk7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ2 bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKFdBUk5fT04oIWk5MTVfdm1hX2lzX21h cF9hbmRfZmVuY2VhYmxlKHZtYSkpKQorCQlyZXR1cm4gSU9fRVJSX1BUUigtRU5PREVWKTsKKwor CUdFTV9CVUdfT04oIWk5MTVfdm1hX2lzX2dndHQodm1hKSk7CisJR0VNX0JVR19PTigodm1hLT5m bGFncyAmIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSA9PSAwKTsKKworCXB0ciA9IHZtYS0+aW9tYXA7 CisJaWYgKHB0ciA9PSBOVUxMKSB7CisJCXB0ciA9IGlvX21hcHBpbmdfbWFwX3djKCZpOTE1X3Zt X3RvX2dndHQodm1hLT52bSktPm1hcHBhYmxlLAorCQkJCQl2bWEtPm5vZGUuc3RhcnQsCisJCQkJ CXZtYS0+bm9kZS5zaXplKTsKKwkJaWYgKHB0ciA9PSBOVUxMKQorCQkJcmV0dXJuIElPX0VSUl9Q VFIoLUVOT01FTSk7CisKKwkJdm1hLT5pb21hcCA9IHB0cjsKKwl9CisKKwlfX2k5MTVfdm1hX3Bp bih2bWEpOworCXJldHVybiBwdHI7Cit9CisKK3ZvaWQgaTkxNV92bWFfdW5waW5fYW5kX3JlbGVh c2Uoc3RydWN0IGk5MTVfdm1hICoqcF92bWEpCit7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJ c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCXZtYSA9IGZldGNoX2FuZF96ZXJv KHBfdm1hKTsKKwlpZiAoIXZtYSkKKwkJcmV0dXJuOworCisJb2JqID0gdm1hLT5vYmo7CisKKwlp OTE1X3ZtYV91bnBpbih2bWEpOworCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisKKwlfX2k5MTVfZ2Vt X29iamVjdF9yZWxlYXNlX3VubGVzc19hY3RpdmUob2JqKTsKK30KKworYm9vbAoraTkxNV92bWFf bWlzcGxhY2VkKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCB1NjQgc2l6ZSwgdTY0IGFsaWdubWVudCwg dTY0IGZsYWdzKQoreworCWlmICghZHJtX21tX25vZGVfYWxsb2NhdGVkKCZ2bWEtPm5vZGUpKQor CQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodm1hLT5ub2RlLnNpemUgPCBzaXplKQorCQlyZXR1cm4g dHJ1ZTsKKworCWlmIChhbGlnbm1lbnQgJiYgdm1hLT5ub2RlLnN0YXJ0ICYgKGFsaWdubWVudCAt IDEpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChmbGFncyAmIFBJTl9NQVBQQUJMRSAmJiAhaTkx NV92bWFfaXNfbWFwX2FuZF9mZW5jZWFibGUodm1hKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAo ZmxhZ3MgJiBQSU5fT0ZGU0VUX0JJQVMgJiYKKwkgICAgdm1hLT5ub2RlLnN0YXJ0IDwgKGZsYWdz ICYgUElOX09GRlNFVF9NQVNLKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoZmxhZ3MgJiBQSU5f T0ZGU0VUX0ZJWEVEICYmCisJICAgIHZtYS0+bm9kZS5zdGFydCAhPSAoZmxhZ3MgJiBQSU5fT0ZG U0VUX01BU0spKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBf X2k5MTVfdm1hX3NldF9tYXBfYW5kX2ZlbmNlYWJsZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7CisJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsKKwlib29s IG1hcHBhYmxlLCBmZW5jZWFibGU7CisJdTMyIGZlbmNlX3NpemUsIGZlbmNlX2FsaWdubWVudDsK KworCWZlbmNlX3NpemUgPSBpOTE1X2dlbV9nZXRfZ2d0dF9zaXplKGRldl9wcml2LAorCQkJCQkg ICAgdm1hLT5zaXplLAorCQkJCQkgICAgaTkxNV9nZW1fb2JqZWN0X2dldF90aWxpbmcob2JqKSk7 CisJZmVuY2VfYWxpZ25tZW50ID0gaTkxNV9nZW1fZ2V0X2dndHRfYWxpZ25tZW50KGRldl9wcml2 LAorCQkJCQkJICAgICAgdm1hLT5zaXplLAorCQkJCQkJICAgICAgaTkxNV9nZW1fb2JqZWN0X2dl dF90aWxpbmcob2JqKSwKKwkJCQkJCSAgICAgIHRydWUpOworCisJZmVuY2VhYmxlID0gKHZtYS0+ bm9kZS5zaXplID09IGZlbmNlX3NpemUgJiYKKwkJICAgICAodm1hLT5ub2RlLnN0YXJ0ICYgKGZl bmNlX2FsaWdubWVudCAtIDEpKSA9PSAwKTsKKworCW1hcHBhYmxlID0gKHZtYS0+bm9kZS5zdGFy dCArIGZlbmNlX3NpemUgPD0KKwkJICAgIGRldl9wcml2LT5nZ3R0Lm1hcHBhYmxlX2VuZCk7CisK KwkvKgorCSAqIEV4cGxpY2l0bHkgZGlzYWJsZSBmb3Igcm90YXRlZCBWTUEgc2luY2UgdGhlIGRp c3BsYXkgZG9lcyBub3QKKwkgKiBuZWVkIHRoZSBmZW5jZSBhbmQgdGhlIFZNQSBpcyBub3QgYWNj ZXNzaWJsZSB0byBvdGhlciB1c2Vycy4KKwkgKi8KKwlpZiAobWFwcGFibGUgJiYgZmVuY2VhYmxl ICYmCisJICAgIHZtYS0+Z2d0dF92aWV3LnR5cGUgIT0gSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRCkK KwkJdm1hLT5mbGFncyB8PSBJOTE1X1ZNQV9DQU5fRkVOQ0U7CisJZWxzZQorCQl2bWEtPmZsYWdz ICY9IH5JOTE1X1ZNQV9DQU5fRkVOQ0U7Cit9CisKK2Jvb2wgaTkxNV9nZW1fdmFsaWRfZ3R0X3Nw YWNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBjYWNoZV9s ZXZlbCkKK3sKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmd0dF9zcGFjZSA9ICZ2bWEtPm5vZGU7CisJ c3RydWN0IGRybV9tbV9ub2RlICpvdGhlcjsKKworCS8qCisJICogT24gc29tZSBtYWNoaW5lcyB3 ZSBoYXZlIHRvIGJlIGNhcmVmdWwgd2hlbiBwdXR0aW5nIGRpZmZlcmluZyB0eXBlcworCSAqIG9m IHNub29wYWJsZSBtZW1vcnkgdG9nZXRoZXIgdG8gYXZvaWQgdGhlIHByZWZldGNoZXIgY3Jvc3Np bmcgbWVtb3J5CisJICogZG9tYWlucyBhbmQgZHlpbmcuIER1cmluZyB2bSBpbml0aWFsaXNhdGlv biwgd2UgZGVjaWRlIHdoZXRoZXIgb3Igbm90CisJICogdGhlc2UgY29uc3RyYWludHMgYXBwbHkg YW5kIHNldCB0aGUgZHJtX21tLmNvbG9yX2FkanVzdAorCSAqIGFwcHJvcHJpYXRlbHkuCisJICov CisJaWYgKHZtYS0+dm0tPm1tLmNvbG9yX2FkanVzdCA9PSBOVUxMKQorCQlyZXR1cm4gdHJ1ZTsK KworCWlmICghZHJtX21tX25vZGVfYWxsb2NhdGVkKGd0dF9zcGFjZSkpCisJCXJldHVybiB0cnVl OworCisJaWYgKGxpc3RfZW1wdHkoJmd0dF9zcGFjZS0+bm9kZV9saXN0KSkKKwkJcmV0dXJuIHRy dWU7CisKKwlvdGhlciA9IGxpc3RfZW50cnkoZ3R0X3NwYWNlLT5ub2RlX2xpc3QucHJldiwgc3Ry dWN0IGRybV9tbV9ub2RlLCBub2RlX2xpc3QpOworCWlmIChvdGhlci0+YWxsb2NhdGVkICYmICFv dGhlci0+aG9sZV9mb2xsb3dzICYmIG90aGVyLT5jb2xvciAhPSBjYWNoZV9sZXZlbCkKKwkJcmV0 dXJuIGZhbHNlOworCisJb3RoZXIgPSBsaXN0X2VudHJ5KGd0dF9zcGFjZS0+bm9kZV9saXN0Lm5l eHQsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbm9kZV9saXN0KTsKKwlpZiAob3RoZXItPmFsbG9jYXRl ZCAmJiAhZ3R0X3NwYWNlLT5ob2xlX2ZvbGxvd3MgJiYgb3RoZXItPmNvbG9yICE9IGNhY2hlX2xl dmVsKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBpOTE1 X3ZtYV9pbnNlcnQgLSBmaW5kcyBhIHNsb3QgZm9yIHRoZSB2bWEgaW4gaXRzIGFkZHJlc3Mgc3Bh Y2UKKyAqIEB2bWE6IHRoZSB2bWEKKyAqIEBzaXplOiByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcyAo Y2FuIGJlIGxhcmdlciB0aGFuIHRoZSBWTUEpCisgKiBAYWxpZ25tZW50OiByZXF1aXJlZCBhbGln bm1lbnQKKyAqIEBmbGFnczogbWFzayBvZiBQSU5fKiBmbGFncyB0byB1c2UKKyAqCisgKiBGaXJz dCB3ZSB0cnkgdG8gYWxsb2NhdGUgc29tZSBmcmVlIHNwYWNlIHRoYXQgbWVldHMgdGhlIHJlcXVp cmVtZW50cyBmb3IKKyAqIHRoZSBWTUEuIEZhaWxpaW5nIHRoYXQsIGlmIHRoZSBmbGFncyBwZXJt aXQsIGl0IHdpbGwgZXZpY3QgYW4gb2xkIFZNQSwKKyAqIHByZWZlcnJhYmx5IHRoZSBvbGRlc3Qg aWRsZSBlbnRyeSB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgVk1BLgorICoKKyAqIFJldHVybnM6 CisgKiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitz dGF0aWMgaW50CitpOTE1X3ZtYV9pbnNlcnQoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXpl LCB1NjQgYWxpZ25tZW50LCB1NjQgZmxhZ3MpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2ID0gdG9faTkxNSh2bWEtPnZtLT5kZXYpOworCXN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmogPSB2bWEtPm9iajsKKwl1NjQgc3RhcnQsIGVuZDsKKwlpbnQgcmV0OworCisJ R0VNX0JVR19PTih2bWEtPmZsYWdzICYgKEk5MTVfVk1BX0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFf TE9DQUxfQklORCkpOworCUdFTV9CVUdfT04oZHJtX21tX25vZGVfYWxsb2NhdGVkKCZ2bWEtPm5v ZGUpKTsKKworCXNpemUgPSBtYXgoc2l6ZSwgdm1hLT5zaXplKTsKKwlpZiAoZmxhZ3MgJiBQSU5f TUFQUEFCTEUpCisJCXNpemUgPSBpOTE1X2dlbV9nZXRfZ2d0dF9zaXplKGRldl9wcml2LCBzaXpl LAorCQkJCQkgICAgICBpOTE1X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopKTsKKworCWFsaWdu bWVudCA9IG1heChtYXgoYWxpZ25tZW50LCB2bWEtPmRpc3BsYXlfYWxpZ25tZW50KSwKKwkJCWk5 MTVfZ2VtX2dldF9nZ3R0X2FsaWdubWVudChkZXZfcHJpdiwgc2l6ZSwKKwkJCQkJCSAgICBpOTE1 X2dlbV9vYmplY3RfZ2V0X3RpbGluZyhvYmopLAorCQkJCQkJICAgIGZsYWdzICYgUElOX01BUFBB QkxFKSk7CisKKwlzdGFydCA9IGZsYWdzICYgUElOX09GRlNFVF9CSUFTID8gZmxhZ3MgJiBQSU5f T0ZGU0VUX01BU0sgOiAwOworCisJZW5kID0gdm1hLT52bS0+dG90YWw7CisJaWYgKGZsYWdzICYg UElOX01BUFBBQkxFKQorCQllbmQgPSBtaW5fdCh1NjQsIGVuZCwgZGV2X3ByaXYtPmdndHQubWFw cGFibGVfZW5kKTsKKwlpZiAoZmxhZ3MgJiBQSU5fWk9ORV80RykKKwkJZW5kID0gbWluX3QodTY0 LCBlbmQsICgxVUxMIDw8IDMyKSAtIFBBR0VfU0laRSk7CisKKwkvKiBJZiBiaW5kaW5nIHRoZSBv YmplY3QvR0dUVCB2aWV3IHJlcXVpcmVzIG1vcmUgc3BhY2UgdGhhbiB0aGUgZW50aXJlCisJICog YXBlcnR1cmUgaGFzLCByZWplY3QgaXQgZWFybHkgYmVmb3JlIGV2aWN0aW5nIGV2ZXJ5dGhpbmcg aW4gYSB2YWluCisJICogYXR0ZW1wdCB0byBmaW5kIHNwYWNlLgorCSAqLworCWlmIChzaXplID4g ZW5kKSB7CisJCURSTV9ERUJVRygiQXR0ZW1wdGluZyB0byBiaW5kIGFuIG9iamVjdCBsYXJnZXIg dGhhbiB0aGUgYXBlcnR1cmU6IHJlcXVlc3Q9JWxsdSBbb2JqZWN0PSV6ZF0gPiAlcyBhcGVydHVy ZT0lbGx1XG4iLAorCQkJICBzaXplLCBvYmotPmJhc2Uuc2l6ZSwKKwkJCSAgZmxhZ3MgJiBQSU5f TUFQUEFCTEUgPyAibWFwcGFibGUiIDogInRvdGFsIiwKKwkJCSAgZW5kKTsKKwkJcmV0dXJuIC1F MkJJRzsKKwl9CisKKwlyZXQgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJaWYg KHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChmbGFncyAmIFBJTl9PRkZTRVRfRklYRUQpIHsK KwkJdTY0IG9mZnNldCA9IGZsYWdzICYgUElOX09GRlNFVF9NQVNLOworCQlpZiAob2Zmc2V0ICYg KGFsaWdubWVudCAtIDEpIHx8IG9mZnNldCA+IGVuZCAtIHNpemUpIHsKKwkJCXJldCA9IC1FSU5W QUw7CisJCQlnb3RvIGVycl91bnBpbjsKKwkJfQorCisJCXZtYS0+bm9kZS5zdGFydCA9IG9mZnNl dDsKKwkJdm1hLT5ub2RlLnNpemUgPSBzaXplOworCQl2bWEtPm5vZGUuY29sb3IgPSBvYmotPmNh Y2hlX2xldmVsOworCQlyZXQgPSBkcm1fbW1fcmVzZXJ2ZV9ub2RlKCZ2bWEtPnZtLT5tbSwgJnZt YS0+bm9kZSk7CisJCWlmIChyZXQpIHsKKwkJCXJldCA9IGk5MTVfZ2VtX2V2aWN0X2Zvcl92bWEo dm1hKTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXQgPSBkcm1fbW1fcmVzZXJ2ZV9ub2RlKCZ2 bWEtPnZtLT5tbSwgJnZtYS0+bm9kZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZXJyX3VucGlu OworCQl9CisJfSBlbHNlIHsKKwkJdTMyIHNlYXJjaF9mbGFnLCBhbGxvY19mbGFnOworCisJCWlm IChmbGFncyAmIFBJTl9ISUdIKSB7CisJCQlzZWFyY2hfZmxhZyA9IERSTV9NTV9TRUFSQ0hfQkVM T1c7CisJCQlhbGxvY19mbGFnID0gRFJNX01NX0NSRUFURV9UT1A7CisJCX0gZWxzZSB7CisJCQlz ZWFyY2hfZmxhZyA9IERSTV9NTV9TRUFSQ0hfREVGQVVMVDsKKwkJCWFsbG9jX2ZsYWcgPSBEUk1f TU1fQ1JFQVRFX0RFRkFVTFQ7CisJCX0KKworCQkvKiBXZSBvbmx5IGFsbG9jYXRlIGluIFBBR0Vf U0laRS9HVFRfUEFHRV9TSVpFICg0MDk2KSBjaHVua3MsCisJCSAqIHNvIHdlIGtub3cgdGhhdCB3 ZSBhbHdheXMgaGF2ZSBhIG1pbmltdW0gYWxpZ25tZW50IG9mIDQwOTYuCisJCSAqIFRoZSBkcm1f bW0gcmFuZ2UgbWFuYWdlciBpcyBvcHRpbWlzZWQgdG8gcmV0dXJuIHJlc3VsdHMKKwkJICogd2l0 aCB6ZXJvIGFsaWdubWVudCwgc28gd2hlcmUgcG9zc2libGUgdXNlIHRoZSBvcHRpbWFsCisJCSAq IHBhdGguCisJCSAqLworCQlpZiAoYWxpZ25tZW50IDw9IDQwOTYpCisJCQlhbGlnbm1lbnQgPSAw OworCitzZWFyY2hfZnJlZToKKwkJcmV0ID0gZHJtX21tX2luc2VydF9ub2RlX2luX3JhbmdlX2dl bmVyaWMoJnZtYS0+dm0tPm1tLAorCQkJCQkJCSAgJnZtYS0+bm9kZSwKKwkJCQkJCQkgIHNpemUs IGFsaWdubWVudCwKKwkJCQkJCQkgIG9iai0+Y2FjaGVfbGV2ZWwsCisJCQkJCQkJICBzdGFydCwg ZW5kLAorCQkJCQkJCSAgc2VhcmNoX2ZsYWcsCisJCQkJCQkJICBhbGxvY19mbGFnKTsKKwkJaWYg KHJldCkgeworCQkJcmV0ID0gaTkxNV9nZW1fZXZpY3Rfc29tZXRoaW5nKHZtYS0+dm0sIHNpemUs IGFsaWdubWVudCwKKwkJCQkJCSAgICAgICBvYmotPmNhY2hlX2xldmVsLAorCQkJCQkJICAgICAg IHN0YXJ0LCBlbmQsCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJaWYgKHJldCA9PSAwKQorCQkJ CWdvdG8gc2VhcmNoX2ZyZWU7CisKKwkJCWdvdG8gZXJyX3VucGluOworCQl9CisKKwkJR0VNX0JV R19PTih2bWEtPm5vZGUuc3RhcnQgPCBzdGFydCk7CisJCUdFTV9CVUdfT04odm1hLT5ub2RlLnN0 YXJ0ICsgdm1hLT5ub2RlLnNpemUgPiBlbmQpOworCX0KKwlHRU1fQlVHX09OKCFpOTE1X2dlbV92 YWxpZF9ndHRfc3BhY2Uodm1hLCBvYmotPmNhY2hlX2xldmVsKSk7CisKKwlsaXN0X21vdmVfdGFp bCgmb2JqLT5nbG9iYWxfbGluaywgJmRldl9wcml2LT5tbS5ib3VuZF9saXN0KTsKKwlsaXN0X21v dmVfdGFpbCgmdm1hLT52bV9saW5rLCAmdm1hLT52bS0+aW5hY3RpdmVfbGlzdCk7CisJb2JqLT5i aW5kX2NvdW50Kys7CisJR0VNX0JVR19PTihhdG9taWNfcmVhZCgmb2JqLT5tbS5wYWdlc19waW5f Y291bnQpIDwgb2JqLT5iaW5kX2NvdW50KTsKKworCXJldHVybiAwOworCitlcnJfdW5waW46CisJ aTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJcmV0dXJuIHJldDsKK30KKworaW50 IF9faTkxNV92bWFfZG9fcGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkgICAgICB1NjQgc2l6 ZSwgdTY0IGFsaWdubWVudCwgdTY0IGZsYWdzKQoreworCXVuc2lnbmVkIGludCBib3VuZCA9IHZt YS0+ZmxhZ3M7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnZtYS0+dm0tPmRl di0+c3RydWN0X211dGV4KTsKKwlHRU1fQlVHX09OKChmbGFncyAmIChQSU5fR0xPQkFMIHwgUElO X1VTRVIpKSA9PSAwKTsKKwlHRU1fQlVHX09OKChmbGFncyAmIFBJTl9HTE9CQUwpICYmICFpOTE1 X3ZtYV9pc19nZ3R0KHZtYSkpOworCisJaWYgKFdBUk5fT04oYm91bmQgJiBJOTE1X1ZNQV9QSU5f T1ZFUkZMT1cpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJaWYgKChi b3VuZCAmIEk5MTVfVk1BX0JJTkRfTUFTSykgPT0gMCkgeworCQlyZXQgPSBpOTE1X3ZtYV9pbnNl cnQodm1hLCBzaXplLCBhbGlnbm1lbnQsIGZsYWdzKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJy OworCX0KKworCXJldCA9IGk5MTVfdm1hX2JpbmQodm1hLCB2bWEtPm9iai0+Y2FjaGVfbGV2ZWws IGZsYWdzKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycjsKKworCWlmICgoYm91bmQgXiB2bWEtPmZs YWdzKSAmIEk5MTVfVk1BX0dMT0JBTF9CSU5EKQorCQlfX2k5MTVfdm1hX3NldF9tYXBfYW5kX2Zl bmNlYWJsZSh2bWEpOworCisJR0VNX0JVR19PTihpOTE1X3ZtYV9taXNwbGFjZWQodm1hLCBzaXpl LCBhbGlnbm1lbnQsIGZsYWdzKSk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlfX2k5MTVfdm1hX3Vu cGluKHZtYSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBpOTE1X3ZtYV9kZXN0cm95KHN0cnVj dCBpOTE1X3ZtYSAqdm1hKQoreworCUdFTV9CVUdfT04odm1hLT5ub2RlLmFsbG9jYXRlZCk7CisJ R0VNX0JVR19PTihpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSk7CisJR0VNX0JVR19PTighaTkxNV92 bWFfaXNfY2xvc2VkKHZtYSkpOworCUdFTV9CVUdfT04odm1hLT5mZW5jZSk7CisKKwlsaXN0X2Rl bCgmdm1hLT52bV9saW5rKTsKKwlpZiAoIWk5MTVfdm1hX2lzX2dndHQodm1hKSkKKwkJaTkxNV9w cGd0dF9wdXQoaTkxNV92bV90b19wcGd0dCh2bWEtPnZtKSk7CisKKwlrbWVtX2NhY2hlX2ZyZWUo dG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYpLT52bWFzLCB2bWEpOworfQorCit2b2lkIGk5MTVf dm1hX2Nsb3NlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCUdFTV9CVUdfT04oaTkxNV92bWFf aXNfY2xvc2VkKHZtYSkpOworCXZtYS0+ZmxhZ3MgfD0gSTkxNV9WTUFfQ0xPU0VEOworCisJbGlz dF9kZWwoJnZtYS0+b2JqX2xpbmspOworCXJiX2VyYXNlKCZ2bWEtPm9ial9ub2RlLCAmdm1hLT5v YmotPnZtYV90cmVlKTsKKworCWlmICghaTkxNV92bWFfaXNfYWN0aXZlKHZtYSkgJiYgIWk5MTVf dm1hX2lzX3Bpbm5lZCh2bWEpKQorCQlXQVJOX09OKGk5MTVfdm1hX3VuYmluZCh2bWEpKTsKK30K Kworc3RhdGljIHZvaWQgX19pOTE1X3ZtYV9pb3VubWFwKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQor eworCUdFTV9CVUdfT04oaTkxNV92bWFfaXNfcGlubmVkKHZtYSkpOworCisJaWYgKHZtYS0+aW9t YXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaW9fbWFwcGluZ191bm1hcCh2bWEtPmlvbWFwKTsK Kwl2bWEtPmlvbWFwID0gTlVMTDsKK30KKworaW50IGk5MTVfdm1hX3VuYmluZChzdHJ1Y3QgaTkx NV92bWEgKnZtYSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5v Ymo7CisJdW5zaWduZWQgbG9uZyBhY3RpdmU7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJm9iai0+YmFzZS5kZXYtPnN0cnVjdF9tdXRleCk7CisKKwkvKiBGaXJzdCB3YWl0IHVw b24gYW55IGFjdGl2aXR5IGFzIHJldGlyaW5nIHRoZSByZXF1ZXN0IG1heQorCSAqIGhhdmUgc2lk ZS1lZmZlY3RzIHN1Y2ggYXMgdW5waW5uaW5nIG9yIGV2ZW4gdW5iaW5kaW5nIHRoaXMgdm1hLgor CSAqLworCWFjdGl2ZSA9IGk5MTVfdm1hX2dldF9hY3RpdmUodm1hKTsKKwlpZiAoYWN0aXZlKSB7 CisJCWludCBpZHg7CisKKwkJLyogV2hlbiBhIGNsb3NlZCBWTUEgaXMgcmV0aXJlZCwgaXQgaXMg dW5ib3VuZCAtIGVlay4KKwkJICogSW4gb3JkZXIgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJl Y3Vyc2l2ZWx5IGNsb3NlZCwKKwkJICogdGFrZSBhIHBpbiBvbiB0aGUgdm1hIHNvIHRoYXQgdGhl IHNlY29uZCB1bmJpbmQgaXMKKwkJICogYWJvcnRlZC4KKwkJICoKKwkJICogRXZlbiBtb3JlIHNj YXJ5IGlzIHRoYXQgdGhlIHJldGlyZSBjYWxsYmFjayBtYXkgZnJlZQorCQkgKiB0aGUgb2JqZWN0 IChsYXN0IGFjdGl2ZSB2bWEpLiBUbyBwcmV2ZW50IHRoZSBleHBsb3Npb24KKwkJICogd2UgZGVm ZXIgdGhlIGFjdHVhbCBvYmplY3QgZnJlZSB0byBhIHdvcmtlciB0aGF0IGNhbgorCQkgKiBvbmx5 IHByb2NlZWQgb25jZSBpdCBhY3F1aXJlcyB0aGUgc3RydWN0X211dGV4ICh3aGljaAorCQkgKiB3 ZSBjdXJyZW50bHkgaG9sZCwgdGhlcmVmb3JlIGl0IGNhbm5vdCBmcmVlIHRoaXMgb2JqZWN0CisJ CSAqIGJlZm9yZSB3ZSBhcmUgZmluaXNoZWQpLgorCQkgKi8KKwkJX19pOTE1X3ZtYV9waW4odm1h KTsKKworCQlmb3JfZWFjaF9hY3RpdmUoYWN0aXZlLCBpZHgpIHsKKwkJCXJldCA9IGk5MTVfZ2Vt X2FjdGl2ZV9yZXRpcmUoJnZtYS0+bGFzdF9yZWFkW2lkeF0sCisJCQkJCQkgICAmdm1hLT52bS0+ ZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJfQorCisJCV9f aTkxNV92bWFfdW5waW4odm1hKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJR0VN X0JVR19PTihpOTE1X3ZtYV9pc19hY3RpdmUodm1hKSk7CisJfQorCisJaWYgKGk5MTVfdm1hX2lz X3Bpbm5lZCh2bWEpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFkcm1fbW1fbm9kZV9hbGxv Y2F0ZWQoJnZtYS0+bm9kZSkpCisJCWdvdG8gZGVzdHJveTsKKworCUdFTV9CVUdfT04ob2JqLT5i aW5kX2NvdW50ID09IDApOworCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9oYXNfcGlubmVk X3BhZ2VzKG9iaikpOworCisJaWYgKGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHZtYSkp IHsKKwkJLyogcmVsZWFzZSB0aGUgZmVuY2UgcmVnIF9hZnRlcl8gZmx1c2hpbmcgKi8KKwkJcmV0 ID0gaTkxNV92bWFfcHV0X2ZlbmNlKHZtYSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0Owor CisJCS8qIEZvcmNlIGEgcGFnZWZhdWx0IGZvciBkb21haW4gdHJhY2tpbmcgb24gbmV4dCB1c2Vy IGFjY2VzcyAqLworCQlpOTE1X2dlbV9yZWxlYXNlX21tYXAob2JqKTsKKworCQlfX2k5MTVfdm1h X2lvdW5tYXAodm1hKTsKKwkJdm1hLT5mbGFncyAmPSB+STkxNV9WTUFfQ0FOX0ZFTkNFOworCX0K KworCWlmIChsaWtlbHkoIXZtYS0+dm0tPmNsb3NlZCkpIHsKKwkJdHJhY2VfaTkxNV92bWFfdW5i aW5kKHZtYSk7CisJCXZtYS0+dm0tPnVuYmluZF92bWEodm1hKTsKKwl9CisJdm1hLT5mbGFncyAm PSB+KEk5MTVfVk1BX0dMT0JBTF9CSU5EIHwgSTkxNV9WTUFfTE9DQUxfQklORCk7CisKKwlkcm1f bW1fcmVtb3ZlX25vZGUoJnZtYS0+bm9kZSk7CisJbGlzdF9tb3ZlX3RhaWwoJnZtYS0+dm1fbGlu aywgJnZtYS0+dm0tPnVuYm91bmRfbGlzdCk7CisKKwlpZiAodm1hLT5wYWdlcyAhPSBvYmotPm1t LnBhZ2VzKSB7CisJCUdFTV9CVUdfT04oIXZtYS0+cGFnZXMpOworCQlzZ19mcmVlX3RhYmxlKHZt YS0+cGFnZXMpOworCQlrZnJlZSh2bWEtPnBhZ2VzKTsKKwl9CisJdm1hLT5wYWdlcyA9IE5VTEw7 CisKKwkvKiBTaW5jZSB0aGUgdW5ib3VuZCBsaXN0IGlzIGdsb2JhbCwgb25seSBtb3ZlIHRvIHRo YXQgbGlzdCBpZgorCSAqIG5vIG1vcmUgVk1BcyBleGlzdC4gKi8KKwlpZiAoLS1vYmotPmJpbmRf Y291bnQgPT0gMCkKKwkJbGlzdF9tb3ZlX3RhaWwoJm9iai0+Z2xvYmFsX2xpbmssCisJCQkgICAg ICAgJnRvX2k5MTUob2JqLT5iYXNlLmRldiktPm1tLnVuYm91bmRfbGlzdCk7CisKKwkvKiBBbmQg ZmluYWxseSBub3cgdGhlIG9iamVjdCBpcyBjb21wbGV0ZWx5IGRlY291cGxlZCBmcm9tIHRoaXMg dm1hLAorCSAqIHdlIGNhbiBkcm9wIGl0cyBob2xkIG9uIHRoZSBiYWNraW5nIHN0b3JhZ2UgYW5k IGFsbG93IGl0IHRvIGJlCisJICogcmVhcGVkIGJ5IHRoZSBzaHJpbmtlci4KKwkgKi8KKwlpOTE1 X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKworZGVzdHJveToKKwlpZiAodW5saWtlbHko aTkxNV92bWFfaXNfY2xvc2VkKHZtYSkpKQorCQlpOTE1X3ZtYV9kZXN0cm95KHZtYSk7CisKKwly ZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEu aCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uZDM1OGIzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfdm1hLmgKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkg MjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50 ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9m IHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJT b2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlv biwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNv cHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBh bmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMg dG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0 byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBu b3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICog cGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFs IHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBS T1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IK KyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMg T0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug QU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBP UiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBP VEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9S VCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9O IFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRI RSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0k5MTVfVk1BX0hfXworI2RlZmluZSBf X0k5MTVfVk1BX0hfXworCisjaW5jbHVkZSA8bGludXgvaW8tbWFwcGluZy5oPgorCisjaW5jbHVk ZSA8ZHJtL2RybV9tbS5oPgorCisjaW5jbHVkZSAiaTkxNV9nZW1fZ3R0LmgiCisjaW5jbHVkZSAi aTkxNV9nZW1fZmVuY2VfcmVnLmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0LmgiCisjaW5j bHVkZSAiaTkxNV9nZW1fcmVxdWVzdC5oIgorCisKK2VudW0gaTkxNV9jYWNoZV9sZXZlbDsKKwor LyoqCisgKiBBIFZNQSByZXByZXNlbnRzIGEgR0VNIEJPIHRoYXQgaXMgYm91bmQgaW50byBhbiBh ZGRyZXNzIHNwYWNlLiBUaGVyZWZvcmUsIGEKKyAqIFZNQSdzIHByZXNlbmNlIGNhbm5vdCBiZSBn dWFyYW50ZWVkIGJlZm9yZSBiaW5kaW5nLCBvciBhZnRlciB1bmJpbmRpbmcgdGhlCisgKiBvYmpl Y3QgaW50by9mcm9tIHRoZSBhZGRyZXNzIHNwYWNlLgorICoKKyAqIFRvIG1ha2UgdGhpbmdzIGFz IHNpbXBsZSBhcyBwb3NzaWJsZSAoaWUuIG5vIHJlZmNvdW50aW5nKSwgYSBWTUEncyBsaWZldGlt ZQorICogd2lsbCBhbHdheXMgYmUgPD0gYW4gb2JqZWN0cyBsaWZldGltZS4gU28gb2JqZWN0IHJl ZmNvdW50aW5nIHNob3VsZCBjb3ZlciB1cy4KKyAqLworc3RydWN0IGk5MTVfdm1hIHsKKwlzdHJ1 Y3QgZHJtX21tX25vZGUgbm9kZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwor CXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtOworCXN0cnVjdCBkcm1faTkxNV9mZW5jZV9y ZWcgKmZlbmNlOworCXN0cnVjdCBzZ190YWJsZSAqcGFnZXM7CisJdm9pZCBfX2lvbWVtICppb21h cDsKKwl1NjQgc2l6ZTsKKwl1NjQgZGlzcGxheV9hbGlnbm1lbnQ7CisKKwl1bnNpZ25lZCBpbnQg ZmxhZ3M7CisJLyoqCisJICogSG93IG1hbnkgdXNlcnMgaGF2ZSBwaW5uZWQgdGhpcyBvYmplY3Qg aW4gR1RUIHNwYWNlLiBUaGUgZm9sbG93aW5nCisJICogdXNlcnMgY2FuIGVhY2ggaG9sZCBhdCBt b3N0IG9uZSByZWZlcmVuY2U6IHB3cml0ZS9wcmVhZCwgZXhlY2J1ZmZlcgorCSAqIChvYmplY3Rz IGFyZSBub3QgYWxsb3dlZCBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgYmF0Y2hidWZmZXIp LAorCSAqIGFuZCB0aGUgZnJhbWVidWZmZXIgY29kZS4gV2hlbiBzd2l0Y2hpbmcvcGFnZWZsaXBw aW5nLCB0aGUKKwkgKiBmcmFtZWJ1ZmZlciBjb2RlIGhhcyBhdCBtb3N0IHR3byBidWZmZXJzIHBp bm5lZCBwZXIgY3J0Yy4KKwkgKgorCSAqIEluIHRoZSB3b3JzdCBjYXNlIHRoaXMgaXMgMSArIDEg KyAxICsgMioyID0gNy4gVGhhdCB3b3VsZCBmaXQgaW50byAzCisJICogYml0cyB3aXRoIGFic29s dXRlbHkgbm8gaGVhZHJvb20uIFNvIHVzZSA0IGJpdHMuCisJICovCisjZGVmaW5lIEk5MTVfVk1B X1BJTl9NQVNLIDB4ZgorI2RlZmluZSBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cJQklUKDUpCisKKwkv KiogRmxhZ3MgYW5kIGFkZHJlc3Mgc3BhY2UgdGhpcyBWTUEgaXMgYm91bmQgdG8gKi8KKyNkZWZp bmUgSTkxNV9WTUFfR0xPQkFMX0JJTkQJQklUKDYpCisjZGVmaW5lIEk5MTVfVk1BX0xPQ0FMX0JJ TkQJQklUKDcpCisjZGVmaW5lIEk5MTVfVk1BX0JJTkRfTUFTSyAoSTkxNV9WTUFfR0xPQkFMX0JJ TkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EIHwgSTkxNV9WTUFfUElOX09WRVJGTE9XKQorCisjZGVm aW5lIEk5MTVfVk1BX0dHVFQJCUJJVCg4KQorI2RlZmluZSBJOTE1X1ZNQV9DQU5fRkVOQ0UJQklU KDkpCisjZGVmaW5lIEk5MTVfVk1BX0NMT1NFRAkJQklUKDEwKQorCisJdW5zaWduZWQgaW50IGFj dGl2ZTsKKwlzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlIGxhc3RfcmVhZFtJOTE1X05VTV9FTkdJTkVT XTsKKwlzdHJ1Y3QgaTkxNV9nZW1fYWN0aXZlIGxhc3Rfd3JpdGU7CisJc3RydWN0IGk5MTVfZ2Vt X2FjdGl2ZSBsYXN0X2ZlbmNlOworCisJLyoqCisJICogU3VwcG9ydCBkaWZmZXJlbnQgR0dUVCB2 aWV3cyBpbnRvIHRoZSBzYW1lIG9iamVjdC4KKwkgKiBUaGlzIG1lYW5zIHRoZXJlIGNhbiBiZSBt dWx0aXBsZSBWTUEgbWFwcGluZ3MgcGVyIG9iamVjdCBhbmQgcGVyIFZNLgorCSAqIGk5MTVfZ2d0 dF92aWV3X3R5cGUgaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRob3NlIGVudHJpZXMu CisJICogVGhlIGRlZmF1bHQgb25lIG9mIHplcm8gKEk5MTVfR0dUVF9WSUVXX05PUk1BTCkgaXMg ZGVmYXVsdCBhbmQgYWxzbworCSAqIGFzc3VtZWQgaW4gR0VNIGZ1bmN0aW9ucyB3aGljaCB0YWtl IG5vIGdndHQgdmlldyBwYXJhbWV0ZXIuCisJICovCisJc3RydWN0IGk5MTVfZ2d0dF92aWV3IGdn dHRfdmlldzsKKworCS8qKiBUaGlzIG9iamVjdCdzIHBsYWNlIG9uIHRoZSBhY3RpdmUvaW5hY3Rp dmUgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHZtX2xpbms7CisKKwlzdHJ1Y3QgbGlzdF9o ZWFkIG9ial9saW5rOyAvKiBMaW5rIGluIHRoZSBvYmplY3QncyBWTUEgbGlzdCAqLworCXN0cnVj dCByYl9ub2RlIG9ial9ub2RlOworCisJLyoqIFRoaXMgdm1hJ3MgcGxhY2UgaW4gdGhlIGJhdGNo YnVmZmVyIG9yIG9uIHRoZSBldmljdGlvbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBleGVj X2xpc3Q7CisKKwkvKioKKwkgKiBVc2VkIGZvciBwZXJmb3JtaW5nIHJlbG9jYXRpb25zIGR1cmlu ZyBleGVjYnVmZmVyIGluc2VydGlvbi4KKwkgKi8KKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBleGVjX25v ZGU7CisJdW5zaWduZWQgbG9uZyBleGVjX2hhbmRsZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX2V4 ZWNfb2JqZWN0MiAqZXhlY19lbnRyeTsKK307CisKK3N0cnVjdCBpOTE1X3ZtYSAqCitpOTE1X3Zt YV9jcmVhdGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJc3RydWN0IGk5MTVf YWRkcmVzc19zcGFjZSAqdm0sCisJCWNvbnN0IHN0cnVjdCBpOTE1X2dndHRfdmlldyAqdmlldyk7 CisKK3N0YXRpYyBpbmxpbmUgbG9uZworaTkxNV92bWFfY29tcGFyZShzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKKwkJIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkgY29uc3Qgc3RydWN0 IGk5MTVfZ2d0dF92aWV3ICp2aWV3KQoreworCUdFTV9CVUdfT04odmlldyAmJiAhaTkxNV92bWFf aXNfZ2d0dCh2bWEpKTsKKworCWlmICh2bWEtPnZtICE9IHZtKQorCQlyZXR1cm4gdm1hLT52bSAt IHZtOworCisJaWYgKCF2aWV3KQorCQlyZXR1cm4gdm1hLT5nZ3R0X3ZpZXcudHlwZTsKKworCWlm ICh2bWEtPmdndHRfdmlldy50eXBlICE9IHZpZXctPnR5cGUpCisJCXJldHVybiB2bWEtPmdndHRf dmlldy50eXBlIC0gdmlldy0+dHlwZTsKKworCXJldHVybiBtZW1jbXAoJnZtYS0+Z2d0dF92aWV3 LnBhcmFtcywKKwkJICAgICAgJnZpZXctPnBhcmFtcywKKwkJICAgICAgc2l6ZW9mKHZpZXctPnBh cmFtcykpOworfQorCit2b2lkIGk5MTVfdm1hX3VucGluX2FuZF9yZWxlYXNlKHN0cnVjdCBpOTE1 X3ZtYSAqKnBfdm1hKTsKKworc3RhdGljIGlubGluZSBib29sIGk5MTVfdm1hX2lzX2dndHQoY29u c3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZtYS0+ZmxhZ3MgJiBJOTE1X1ZN QV9HR1RUOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5j ZWFibGUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZtYS0+ZmxhZ3Mg JiBJOTE1X1ZNQV9DQU5fRkVOQ0U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9p c19jbG9zZWQoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJuIHZtYS0+Zmxh Z3MgJiBJOTE1X1ZNQV9DTE9TRUQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGk5 MTVfdm1hX2dldF9hY3RpdmUoY29uc3Qgc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJcmV0dXJu IHZtYS0+YWN0aXZlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92bWFfaXNfYWN0aXZl KGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiBpOTE1X3ZtYV9nZXRfYWN0 aXZlKHZtYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1X3ZtYV9zZXRfYWN0aXZlKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZW5naW5lKQorewor CXZtYS0+YWN0aXZlIHw9IEJJVChlbmdpbmUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaTkx NV92bWFfY2xlYXJfYWN0aXZlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJCQkgdW5zaWduZWQg aW50IGVuZ2luZSkKK3sKKwl2bWEtPmFjdGl2ZSAmPSB+QklUKGVuZ2luZSk7Cit9CisKK3N0YXRp YyBpbmxpbmUgYm9vbCBpOTE1X3ZtYV9oYXNfYWN0aXZlX2VuZ2luZShjb25zdCBzdHJ1Y3QgaTkx NV92bWEgKnZtYSwKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IGVuZ2luZSkKK3sKKwlyZXR1cm4g dm1hLT5hY3RpdmUgJiBCSVQoZW5naW5lKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaTkxNV9n Z3R0X29mZnNldChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlHRU1fQlVHX09OKCFp OTE1X3ZtYV9pc19nZ3R0KHZtYSkpOworCUdFTV9CVUdfT04oIXZtYS0+bm9kZS5hbGxvY2F0ZWQp OworCUdFTV9CVUdfT04odXBwZXJfMzJfYml0cyh2bWEtPm5vZGUuc3RhcnQpKTsKKwlHRU1fQlVH X09OKHVwcGVyXzMyX2JpdHModm1hLT5ub2RlLnN0YXJ0ICsgdm1hLT5ub2RlLnNpemUgLSAxKSk7 CisJcmV0dXJuIGxvd2VyXzMyX2JpdHModm1hLT5ub2RlLnN0YXJ0KTsKK30KKworc3RhdGljIGlu bGluZSBzdHJ1Y3QgaTkxNV92bWEgKmk5MTVfdm1hX2dldChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkK K3sKKwlpOTE1X2dlbV9vYmplY3RfZ2V0KHZtYS0+b2JqKTsKKwlyZXR1cm4gdm1hOworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgaTkxNV92bWFfcHV0KHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQorewor CWk5MTVfZ2VtX29iamVjdF9wdXQodm1hLT5vYmopOworfQorCitpbnQgaTkxNV92bWFfYmluZChz dHJ1Y3QgaTkxNV92bWEgKnZtYSwgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAor CQkgIHUzMiBmbGFncyk7Citib29sIGk5MTVfZ2VtX3ZhbGlkX2d0dF9zcGFjZShzdHJ1Y3QgaTkx NV92bWEgKnZtYSwgdW5zaWduZWQgbG9uZyBjYWNoZV9sZXZlbCk7Citib29sCitpOTE1X3ZtYV9t aXNwbGFjZWQoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBzaXplLCB1NjQgYWxpZ25tZW50LCB1 NjQgZmxhZ3MpOwordm9pZCBfX2k5MTVfdm1hX3NldF9tYXBfYW5kX2ZlbmNlYWJsZShzdHJ1Y3Qg aTkxNV92bWEgKnZtYSk7CitpbnQgX19tdXN0X2NoZWNrIGk5MTVfdm1hX3VuYmluZChzdHJ1Y3Qg aTkxNV92bWEgKnZtYSk7Cit2b2lkIGk5MTVfdm1hX2Nsb3NlKHN0cnVjdCBpOTE1X3ZtYSAqdm1h KTsKK3ZvaWQgaTkxNV92bWFfZGVzdHJveShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7CisKK2ludCBf X2k5MTVfdm1hX2RvX3BpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJICAgICAgdTY0IHNpemUs IHU2NCBhbGlnbm1lbnQsIHU2NCBmbGFncyk7CitzdGF0aWMgaW5saW5lIGludCBfX211c3RfY2hl Y2sKK2k5MTVfdm1hX3BpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgdTY0IHNpemUsIHU2NCBhbGln bm1lbnQsIHU2NCBmbGFncykKK3sKKwlCVUlMRF9CVUdfT04oUElOX01CWiAhPSBJOTE1X1ZNQV9Q SU5fT1ZFUkZMT1cpOworCUJVSUxEX0JVR19PTihQSU5fR0xPQkFMICE9IEk5MTVfVk1BX0dMT0JB TF9CSU5EKTsKKwlCVUlMRF9CVUdfT04oUElOX1VTRVIgIT0gSTkxNV9WTUFfTE9DQUxfQklORCk7 CisKKwkvKiBQaW4gZWFybHkgdG8gcHJldmVudCB0aGUgc2hyaW5rZXIvZXZpY3Rpb24gbG9naWMg ZnJvbSBkZXN0cm95aW5nCisJICogb3VyIHZtYSBhcyB3ZSBpbnNlcnQgYW5kIGJpbmQuCisJICov CisJaWYgKGxpa2VseSgoKCsrdm1hLT5mbGFncyBeIGZsYWdzKSAmIEk5MTVfVk1BX0JJTkRfTUFT SykgPT0gMCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIF9faTkxNV92bWFfZG9fcGluKHZtYSwg c2l6ZSwgYWxpZ25tZW50LCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGk5MTVfdm1h X3Bpbl9jb3VudChjb25zdCBzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlyZXR1cm4gdm1hLT5m bGFncyAmIEk5MTVfVk1BX1BJTl9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaTkxNV92 bWFfaXNfcGlubmVkKGNvbnN0IHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXJldHVybiBpOTE1 X3ZtYV9waW5fY291bnQodm1hKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faTkxNV92bWFf cGluKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXZtYS0+ZmxhZ3MrKzsKKwlHRU1fQlVHX09O KHZtYS0+ZmxhZ3MgJiBJOTE1X1ZNQV9QSU5fT1ZFUkZMT1cpOworfQorCitzdGF0aWMgaW5saW5l IHZvaWQgX19pOTE1X3ZtYV91bnBpbihzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlHRU1fQlVH X09OKCFpOTE1X3ZtYV9pc19waW5uZWQodm1hKSk7CisJdm1hLT5mbGFncy0tOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgaTkxNV92bWFfdW5waW4oc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJ R0VNX0JVR19PTighZHJtX21tX25vZGVfYWxsb2NhdGVkKCZ2bWEtPm5vZGUpKTsKKwlfX2k5MTVf dm1hX3VucGluKHZtYSk7Cit9CisKKy8qKgorICogaTkxNV92bWFfcGluX2lvbWFwIC0gY2FsbHMg aW9yZW1hcF93YyB0byBtYXAgdGhlIEdHVFQgVk1BIHZpYSB0aGUgYXBlcnR1cmUKKyAqIEB2bWE6 IFZNQSB0byBpb21hcAorICoKKyAqIFRoZSBwYXNzZWQgaW4gVk1BIGhhcyB0byBiZSBwaW5uZWQg aW4gdGhlIGdsb2JhbCBHVFQgbWFwcGFibGUgcmVnaW9uLgorICogQW4gZXh0cmEgcGlubmluZyBv ZiB0aGUgVk1BIGlzIGFjcXVpcmVkIGZvciB0aGUgcmV0dXJuIGlvbWFwcGluZywKKyAqIHRoZSBj YWxsZXIgbXVzdCBjYWxsIGk5MTVfdm1hX3VucGluX2lvbWFwIHRvIHJlbGlucXVpc2ggdGhlIHBp bm5pbmcKKyAqIGFmdGVyIHRoZSBpb21hcHBpbmcgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLgorICoK KyAqIENhbGxlcnMgbXVzdCBob2xkIHRoZSBzdHJ1Y3RfbXV0ZXguCisgKgorICogUmV0dXJucyBh IHZhbGlkIGlvbWFwcGVkIHBvaW50ZXIgb3IgRVJSX1BUUi4KKyAqLwordm9pZCBfX2lvbWVtICpp OTE1X3ZtYV9waW5faW9tYXAoc3RydWN0IGk5MTVfdm1hICp2bWEpOworI2RlZmluZSBJT19FUlJf UFRSKHgpICgodm9pZCBfX2lvbWVtICopRVJSX1BUUih4KSkKKworLyoqCisgKiBpOTE1X3ZtYV91 bnBpbl9pb21hcCAtIHVucGlucyB0aGUgbWFwcGluZyByZXR1cm5lZCBmcm9tIGk5MTVfdm1hX2lv bWFwCisgKiBAdm1hOiBWTUEgdG8gdW5waW4KKyAqCisgKiBVbnBpbnMgdGhlIHByZXZpb3VzbHkg aW9tYXBwZWQgVk1BIGZyb20gaTkxNV92bWFfcGluX2lvbWFwKCkuCisgKgorICogQ2FsbGVycyBt dXN0IGhvbGQgdGhlIHN0cnVjdF9tdXRleC4gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IHZhbGlkIHRv IGJlCisgKiBjYWxsZWQgb24gYSBWTUEgcHJldmlvdXNseSBpb21hcHBlZCBieSB0aGUgY2FsbGVy IHdpdGggaTkxNV92bWFfcGluX2lvbWFwKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpOTE1 X3ZtYV91bnBpbl9pb21hcChzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlsb2NrZGVwX2Fzc2Vy dF9oZWxkKCZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJR0VNX0JVR19PTih2bWEtPmlv bWFwID09IE5VTEwpOworCWk5MTVfdm1hX3VucGluKHZtYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUg c3RydWN0IHBhZ2UgKmk5MTVfdm1hX2ZpcnN0X3BhZ2Uoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7 CisJR0VNX0JVR19PTighdm1hLT5wYWdlcyk7CisJcmV0dXJuIHNnX3BhZ2Uodm1hLT5wYWdlcy0+ c2dsKTsKK30KKworLyoqCisgKiBpOTE1X3ZtYV9waW5fZmVuY2UgLSBwaW4gZmVuY2luZyBzdGF0 ZQorICogQHZtYTogdm1hIHRvIHBpbiBmZW5jaW5nIGZvcgorICoKKyAqIFRoaXMgcGlucyB0aGUg ZmVuY2luZyBzdGF0ZSAod2hldGhlciB0aWxlZCBvciB1bnRpbGVkKSB0byBtYWtlIHN1cmUgdGhl CisgKiB2bWEgKGFuZCBpdHMgb2JqZWN0KSBpcyByZWFkeSB0byBiZSB1c2VkIGFzIGEgc2Nhbm91 dCB0YXJnZXQuIEZlbmNpbmcKKyAqIHN0YXR1cyBtdXN0IGJlIHN5bmNocm9uaXplIGZpcnN0IGJ5 IGNhbGxpbmcgaTkxNV92bWFfZ2V0X2ZlbmNlKCk6CisgKgorICogVGhlIHJlc3VsdGluZyBmZW5j ZSBwaW4gcmVmZXJlbmNlIG11c3QgYmUgcmVsZWFzZWQgYWdhaW4gd2l0aAorICogaTkxNV92bWFf dW5waW5fZmVuY2UoKS4KKyAqCisgKiBSZXR1cm5zOgorICoKKyAqIFRydWUgaWYgdGhlIHZtYSBo YXMgYSBmZW5jZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wKK2k5 MTVfdm1hX3Bpbl9mZW5jZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKK3sKKwlsb2NrZGVwX2Fzc2Vy dF9oZWxkKCZ2bWEtPnZtLT5kZXYtPnN0cnVjdF9tdXRleCk7CisJaWYgKHZtYS0+ZmVuY2UpIHsK KwkJdm1hLT5mZW5jZS0+cGluX2NvdW50Kys7CisJCXJldHVybiB0cnVlOworCX0gZWxzZQorCQly ZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogaTkxNV92bWFfdW5waW5fZmVuY2UgLSB1bnBpbiBm ZW5jaW5nIHN0YXRlCisgKiBAdm1hOiB2bWEgdG8gdW5waW4gZmVuY2luZyBmb3IKKyAqCisgKiBU aGlzIHJlbGVhc2VzIHRoZSBmZW5jZSBwaW4gcmVmZXJlbmNlIGFjcXVpcmVkIHRocm91Z2gKKyAq IGk5MTVfdm1hX3Bpbl9mZW5jZS4gSXQgd2lsbCBoYW5kbGUgYm90aCBvYmplY3RzIHdpdGggYW5k IHdpdGhvdXQgYW4KKyAqIGF0dGFjaGVkIGZlbmNlIGNvcnJlY3RseSwgY2FsbGVycyBkbyBub3Qg bmVlZCB0byBkaXN0aW5ndWlzaCB0aGlzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2k5MTVf dm1hX3VucGluX2ZlbmNlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWxvY2tkZXBfYXNzZXJ0 X2hlbGQoJnZtYS0+dm0tPmRldi0+c3RydWN0X211dGV4KTsKKwlpZiAodm1hLT5mZW5jZSkgewor CQlHRU1fQlVHX09OKHZtYS0+ZmVuY2UtPnBpbl9jb3VudCA8PSAwKTsKKwkJdm1hLT5mZW5jZS0+ cGluX2NvdW50LS07CisJfQorfQorCisjZW5kaWYKKwotLSAKMi43LjQKCl9fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QK SW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=