From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07E0BC33C8C for ; Tue, 7 Jan 2020 13:40:48 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 2B3BD20656 for ; Tue, 7 Jan 2020 13:40:46 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2B3BD20656 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=chris-wilson.co.uk Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 69B0089A4F; Tue, 7 Jan 2020 13:40:45 +0000 (UTC) Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id 797E489AA2 for ; Tue, 7 Jan 2020 13:40:42 +0000 (UTC) X-Default-Received-SPF: pass (skip=forwardok (res=PASS)) x-ip-name=78.156.65.138; Received: from haswell.alporthouse.com (unverified [78.156.65.138]) by fireflyinternet.com (Firefly Internet (M1)) with ESMTP id 19796181-1500050 for multiple; Tue, 07 Jan 2020 13:40:11 +0000 From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Tue, 7 Jan 2020 13:40:09 +0000 Message-Id: <20200107134009.3255354-1-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.25.0.rc1 In-Reply-To: <20200106234703.645168-1-matthew.auld@intel.com> References: <20200106234703.645168-1-matthew.auld@intel.com> MIME-Version: 1.0 Subject: [Intel-gfx] [PATCH] drm/i915/gtt: split up i915_gem_gtt X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Matthew Auld Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" RnJvbTogTWF0dGhldyBBdWxkIDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgoKQXR0ZW1wdCB0byBz cGxpdCBpOTE1X2dlbV9ndHQuW2NoXSBpbnRvIG1vcmUgbWFuYWdlYWJsZSBjaHVua3MuCgpTdWdn ZXN0ZWQtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgpTaWduZWQt b2ZmLWJ5OiBNYXR0aGV3IEF1bGQgPG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+CkNjOiBDaHJpcyBX aWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5jby51az4KUmV2aWV3ZWQtYnk6IENocmlzIFdpbHNv biA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgotLS0KQSBmZXcgYml0cyB3ZSBjYW4gcG9saXNo LCBidXQgYmVzdCB0byBsYW5kIHRoZSBiaWcgbW92ZSBmaXJzdC4KLS0tCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9NYWtlZmlsZSAgICAgICAgICAgICAgICAgfCAgICA1ICsKIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmMgICB8ICAgIDUgKy0KIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2dlbS9pOTE1X2dlbV9jb250ZXh0LmggICB8ICAgIDEgLQogZHJpdmVycy9ncHUvZHJt L2k5MTUvZ2VtL2k5MTVfZ2VtX29iamVjdC5oICAgIHwgICAgMSArCiAuLi4vZ3B1L2RybS9pOTE1 L2dlbS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jICAgfCAgICAyICstCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC9nZW42X3BwZ3R0LmMgICAgICAgICAgfCAgNDgyICsrKwogZHJpdmVycy9ncHUvZHJt L2k5MTUvZ3QvZ2VuNl9wcGd0dC5oICAgICAgICAgIHwgICA3NiArCiBkcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC9nZW44X3BwZ3R0LmMgICAgICAgICAgfCAgNzIyICsrKysKIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2d0L2dlbjhfcHBndHQuaCAgICAgICAgICB8ICAgMTMgKwogZHJpdmVycy9ncHUvZHJt L2k5MTUvZ3QvaW50ZWxfZ2d0dC5jICAgICAgICAgIHwgMTQ5NSArKysrKysrCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9ndC5jICAgICAgICAgICAgfCAgICAyICstCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9pbnRlbF9ndHQuYyAgICAgICAgICAgfCAgNTk1ICsrKwogZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ3R0LmggICAgICAgICAgIHwgIDU4MSArKysKIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2d0L2ludGVsX3BwZ3R0LmMgICAgICAgICB8ICAyMTggKwogLi4uL2dwdS9k cm0vaTkxNS9ndC9pbnRlbF9yaW5nX3N1Ym1pc3Npb24uYyAgIHwgICAgMSArCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndC9zZWxmdGVzdF9oYW5nY2hlY2suYyAgfCAgICAyICstCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9ndnQvc2NoZWR1bGVyLmMgICAgICAgICAgfCAgICAyICstCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuYyAgICAgICAgICAgfCAzNjI0ICstLS0tLS0tLS0tLS0t LS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaCAgICAgICAgICAgfCAgNjMw ICstLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaCAgICAgICAgICAgICAgIHwgIDE0 MCArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWFfdHlwZXMuaCAgICAgICAgIHwgIDI5 NCArKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX2d0dC5jIHwgICA3 OCArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL21vY2tfZ3R0LmMgICAgIHwgICAg OSArLQogMjMgZmlsZXMgY2hhbmdlZCwgNDU3NCBpbnNlcnRpb25zKCspLCA0NDA0IGRlbGV0aW9u cygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjZfcHBn dHQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjZfcHBn dHQuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjhfcHBn dHQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjhfcHBn dHQuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2dn dHQuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0 dC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ3R0 LmgKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9wcGd0 dC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWFfdHlw ZXMuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKaW5kZXggMGIxZDhkMzZhNTBhLi5iOGM1Zjg5MzRkYmQg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L01ha2VmaWxlCkBAIC03NCw2ICs3NCw4IEBAIGd0LXkgKz0gXAogCWd0L2Rl YnVnZnNfZW5naW5lcy5vIFwKIAlndC9kZWJ1Z2ZzX2d0Lm8gXAogCWd0L2RlYnVnZnNfZ3RfcG0u byBcCisJZ3QvZ2VuNl9wcGd0dC5vIFwKKwlndC9nZW44X3BwZ3R0Lm8gXAogCWd0L2ludGVsX2Jy ZWFkY3J1bWJzLm8gXAogCWd0L2ludGVsX2NvbnRleHQubyBcCiAJZ3QvaW50ZWxfZW5naW5lX2Nz Lm8gXApAQCAtODEsMTQgKzgzLDE3IEBAIGd0LXkgKz0gXAogCWd0L2ludGVsX2VuZ2luZV9wbS5v IFwKIAlndC9pbnRlbF9lbmdpbmVfcG9vbC5vIFwKIAlndC9pbnRlbF9lbmdpbmVfdXNlci5vIFwK KwlndC9pbnRlbF9nZ3R0Lm8gXAogCWd0L2ludGVsX2d0Lm8gXAogCWd0L2ludGVsX2d0X2lycS5v IFwKIAlndC9pbnRlbF9ndF9wbS5vIFwKIAlndC9pbnRlbF9ndF9wbV9pcnEubyBcCiAJZ3QvaW50 ZWxfZ3RfcmVxdWVzdHMubyBcCisJZ3QvaW50ZWxfZ3R0Lm8gXAogCWd0L2ludGVsX2xsYy5vIFwK IAlndC9pbnRlbF9scmMubyBcCiAJZ3QvaW50ZWxfbW9jcy5vIFwKKwlndC9pbnRlbF9wcGd0dC5v IFwKIAlndC9pbnRlbF9yYzYubyBcCiAJZ3QvaW50ZWxfcmVuZGVyc3RhdGUubyBcCiAJZ3QvaW50 ZWxfcmVzZXQubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9n ZW1fY29udGV4dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQu YwppbmRleCBmNzQ2YmI1M2YxOGUuLjg4ZjYyNTNmNTQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5jCkBAIC02OSw2ICs2OSw3IEBACiAKICNpbmNsdWRl IDxkcm0vaTkxNV9kcm0uaD4KIAorI2luY2x1ZGUgImd0L2dlbjZfcHBndHQuaCIKICNpbmNsdWRl ICJndC9pbnRlbF9jb250ZXh0LmgiCiAjaW5jbHVkZSAiZ3QvaW50ZWxfZW5naW5lX2hlYXJ0YmVh dC5oIgogI2luY2x1ZGUgImd0L2ludGVsX2VuZ2luZV9wbS5oIgpAQCAtNzA1LDcgKzcwNiw3IEBA IGk5MTVfZ2VtX2NyZWF0ZV9jb250ZXh0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LCB1 bnNpZ25lZCBpbnQgZmxhZ3MpCiAJaWYgKEhBU19GVUxMX1BQR1RUKGk5MTUpKSB7CiAJCXN0cnVj dCBpOTE1X3BwZ3R0ICpwcGd0dDsKIAotCQlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGk5MTUp OworCQlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKCZpOTE1LT5ndCk7CiAJCWlmIChJU19FUlIo cHBndHQpKSB7CiAJCQlEUk1fREVCVUdfRFJJVkVSKCJQUEdUVCBzZXR1cCBmYWlsZWQgKCVsZClc biIsCiAJCQkJCSBQVFJfRVJSKHBwZ3R0KSk7CkBAIC04NjEsNyArODYyLDcgQEAgaW50IGk5MTVf Z2VtX3ZtX2NyZWF0ZV9pb2N0bChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAog CWlmIChhcmdzLT5mbGFncykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcGd0dCA9IGk5MTVfcHBn dHRfY3JlYXRlKGk5MTUpOworCXBwZ3R0ID0gaTkxNV9wcGd0dF9jcmVhdGUoJmk5MTUtPmd0KTsK IAlpZiAoSVNfRVJSKHBwZ3R0KSkKIAkJcmV0dXJuIFBUUl9FUlIocHBndHQpOwogCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29udGV4dC5oIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVfZ2VtX2NvbnRleHQuaAppbmRleCAxNGYzY2MxYjc1ODMu LjNhZTYxYTM1NWQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL2k5MTVf Z2VtX2NvbnRleHQuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fY29u dGV4dC5oCkBAIC0xMyw3ICsxMyw2IEBACiAKICNpbmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1 ZGUgImk5MTVfZ2VtLmgiCi0jaW5jbHVkZSAiaTkxNV9nZW1fZ3R0LmgiCiAjaW5jbHVkZSAiaTkx NV9zY2hlZHVsZXIuaCIKICNpbmNsdWRlICJpbnRlbF9kZXZpY2VfaW5mby5oIgogCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmggYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0LmgKaW5kZXggODU4ZjhiZjQ5YTA0Li5k YjcwYTMzMDZlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2dlbS9pOTE1X2dl bV9vYmplY3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9nZW0vaTkxNV9nZW1fb2JqZWN0 LmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlICJkaXNwbGF5L2ludGVsX2Zyb250YnVmZmVy LmgiCiAjaW5jbHVkZSAiaTkxNV9nZW1fb2JqZWN0X3R5cGVzLmgiCiAjaW5jbHVkZSAiaTkxNV9n ZW1fZ3R0LmgiCisjaW5jbHVkZSAiaTkxNV92bWFfdHlwZXMuaCIKIAogdm9pZCBpOTE1X2dlbV9p bml0X19vYmplY3RzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KTsKIApkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9nZW0vc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwppbmRleCAyNDlhNGQy NGQ2NzguLjkzMTEyNTBkN2Q2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2Vt L3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ2VtL3Nl bGZ0ZXN0cy9odWdlX3BhZ2VzLmMKQEAgLTE4NjUsNyArMTg2NSw3IEBAIGludCBpOTE1X2dlbV9o dWdlX3BhZ2VfbW9ja19zZWxmdGVzdHModm9pZCkKIAlta3dyaXRlX2RldmljZV9pbmZvKGRldl9w cml2KS0+cHBndHRfdHlwZSA9IElOVEVMX1BQR1RUX0ZVTEw7CiAJbWt3cml0ZV9kZXZpY2VfaW5m byhkZXZfcHJpdiktPnBwZ3R0X3NpemUgPSA0ODsKIAotCXBwZ3R0ID0gaTkxNV9wcGd0dF9jcmVh dGUoZGV2X3ByaXYpOworCXBwZ3R0ID0gaTkxNV9wcGd0dF9jcmVhdGUoJmRldl9wcml2LT5ndCk7 CiAJaWYgKElTX0VSUihwcGd0dCkpIHsKIAkJZXJyID0gUFRSX0VSUihwcGd0dCk7CiAJCWdvdG8g b3V0X3VubG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjZfcHBn dHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjZfcHBndHQuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmYxMGIyYzQxNTcxYwotLS0gL2Rldi9udWxsCisr KyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2dlbjZfcHBndHQuYwpAQCAtMCwwICsxLDQ4MiBA QAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAorLyoKKyAqIENvcHlyaWdodCDCqSAy MDIwIEludGVsIENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKwor I2luY2x1ZGUgImdlbjZfcHBndHQuaCIKKyNpbmNsdWRlICJpOTE1X3NjYXR0ZXJsaXN0LmgiCisj aW5jbHVkZSAiaTkxNV90cmFjZS5oIgorI2luY2x1ZGUgImk5MTVfdmdwdS5oIgorI2luY2x1ZGUg ImludGVsX2d0LmgiCisKKy8qIFdyaXRlIHBkZSAoaW5kZXgpIGZyb20gdGhlIHBhZ2UgZGlyZWN0 b3J5IEBwZCB0byB0aGUgcGFnZSB0YWJsZSBAcHQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW42 X3dyaXRlX3BkZShjb25zdCBzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQsCisJCQkJICBjb25zdCB1 bnNpZ25lZCBpbnQgcGRlLAorCQkJCSAgY29uc3Qgc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQp Cit7CisJLyogQ2FsbGVyIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGUgd3JpdGUgY29tcGxldGVzIGlm IG5lY2Vzc2FyeSAqLworCWlvd3JpdGUzMihHRU42X1BERV9BRERSX0VOQ09ERShweF9kbWEocHQp KSB8IEdFTjZfUERFX1ZBTElELAorCQkgIHBwZ3R0LT5wZF9hZGRyICsgcGRlKTsKK30KKwordm9p ZCBnZW43X3BwZ3R0X2VuYWJsZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQoreworCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5MTU7CisJc3RydWN0IGludGVsX3VuY29yZSAqdW5j b3JlID0gZ3QtPnVuY29yZTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7CisJZW51 bSBpbnRlbF9lbmdpbmVfaWQgaWQ7CisJdTMyIGVjb2NoazsKKworCWludGVsX3VuY29yZV9ybXco dW5jb3JlLCBHQUNfRUNPX0JJVFMsIDAsIEVDT0JJVFNfUFBHVFRfQ0FDSEU2NEIpOworCisJZWNv Y2hrID0gaW50ZWxfdW5jb3JlX3JlYWQodW5jb3JlLCBHQU1fRUNPQ0hLKTsKKwlpZiAoSVNfSEFT V0VMTChpOTE1KSkgeworCQllY29jaGsgfD0gRUNPQ0hLX1BQR1RUX1dCX0hTVzsKKwl9IGVsc2Ug eworCQllY29jaGsgfD0gRUNPQ0hLX1BQR1RUX0xMQ19JVkI7CisJCWVjb2NoayAmPSB+RUNPQ0hL X1BQR1RUX0dGRFRfSVZCOworCX0KKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHQU1fRUNP Q0hLLCBlY29jaGspOworCisJZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgZ3QsIGlkKSB7CisJCS8q IEdGWF9NT0RFIGlzIHBlci1yaW5nIG9uIGdlbjcrICovCisJCUVOR0lORV9XUklURShlbmdpbmUs CisJCQkgICAgIFJJTkdfTU9ERV9HRU43LAorCQkJICAgICBfTUFTS0VEX0JJVF9FTkFCTEUoR0ZY X1BQR1RUX0VOQUJMRSkpOworCX0KK30KKwordm9pZCBnZW42X3BwZ3R0X2VuYWJsZShzdHJ1Y3Qg aW50ZWxfZ3QgKmd0KQoreworCXN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSA9IGd0LT51bmNv cmU7CisKKwlpbnRlbF91bmNvcmVfcm13KHVuY29yZSwKKwkJCSBHQUNfRUNPX0JJVFMsCisJCQkg MCwKKwkJCSBFQ09CSVRTX1NOQl9CSVQgfCBFQ09CSVRTX1BQR1RUX0NBQ0hFNjRCKTsKKworCWlu dGVsX3VuY29yZV9ybXcodW5jb3JlLAorCQkJIEdBQl9DVEwsCisJCQkgMCwKKwkJCSBHQUJfQ1RM X0NPTlRfQUZURVJfUEFHRUZBVUxUKTsKKworCWludGVsX3VuY29yZV9ybXcodW5jb3JlLAorCQkJ IEdBTV9FQ09DSEssCisJCQkgMCwKKwkJCSBFQ09DSEtfU05CX0JJVCB8IEVDT0NIS19QUEdUVF9D QUNIRTY0Qik7CisKKwlpZiAoSEFTX1BQR1RUKHVuY29yZS0+aTkxNSkpIC8qIG1heSBiZSBkaXNh YmxlZCBmb3IgVlQtZCAqLworCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJCSAgIEdG WF9NT0RFLAorCQkJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRlhfUFBHVFRfRU5BQkxFKSk7Cit9 CisKKy8qIFBQR1RUIHN1cHBvcnQgZm9yIFNhbmR5YmRyaWdlL0dlbjYgYW5kIGxhdGVyICovCitz dGF0aWMgdm9pZCBnZW42X3BwZ3R0X2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtLAorCQkJCSAgIHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgZ2VuNl9w cGd0dCAqIGNvbnN0IHBwZ3R0ID0gdG9fZ2VuNl9wcGd0dChpOTE1X3ZtX3RvX3BwZ3R0KHZtKSk7 CisJY29uc3QgdW5zaWduZWQgaW50IGZpcnN0X2VudHJ5ID0gc3RhcnQgLyBJOTE1X0dUVF9QQUdF X1NJWkU7CisJY29uc3QgZ2VuNl9wdGVfdCBzY3JhdGNoX3B0ZSA9IHZtLT5zY3JhdGNoWzBdLmVu Y29kZTsKKwl1bnNpZ25lZCBpbnQgcGRlID0gZmlyc3RfZW50cnkgLyBHRU42X1BURVM7CisJdW5z aWduZWQgaW50IHB0ZSA9IGZpcnN0X2VudHJ5ICUgR0VONl9QVEVTOworCXVuc2lnbmVkIGludCBu dW1fZW50cmllcyA9IGxlbmd0aCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKworCXdoaWxlIChudW1f ZW50cmllcykgeworCQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICogY29uc3QgcHQgPQorCQkJaTkx NV9wdF9lbnRyeShwcGd0dC0+YmFzZS5wZCwgcGRlKyspOworCQljb25zdCB1bnNpZ25lZCBpbnQg Y291bnQgPSBtaW4obnVtX2VudHJpZXMsIEdFTjZfUFRFUyAtIHB0ZSk7CisJCWdlbjZfcHRlX3Qg KnZhZGRyOworCisJCUdFTV9CVUdfT04ocHhfYmFzZShwdCkgPT0gcHhfYmFzZSgmdm0tPnNjcmF0 Y2hbMV0pKTsKKworCQludW1fZW50cmllcyAtPSBjb3VudDsKKworCQlHRU1fQlVHX09OKGNvdW50 ID4gYXRvbWljX3JlYWQoJnB0LT51c2VkKSk7CisJCWlmICghYXRvbWljX3N1Yl9yZXR1cm4oY291 bnQsICZwdC0+dXNlZCkpCisJCQlwcGd0dC0+c2Nhbl9mb3JfdW51c2VkX3B0ID0gdHJ1ZTsKKwor CQkvKgorCQkgKiBOb3RlIHRoYXQgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCByZW1vdmluZyBQREUg b24gdGhlIGZseQorCQkgKiAodGhleSBhcmUgY2FjaGVkIGluc2lkZSB0aGUgY29udGV4dCB3aXRo IG5vIG1lYW5zIHRvCisJCSAqIGludmFsaWRhdGUgdGhlIGNhY2hlKSwgc28gd2UgY2FuIG9ubHkg cmVzZXQgdGhlIFBURQorCQkgKiBlbnRyaWVzIGJhY2sgdG8gc2NyYXRjaC4KKwkJICovCisKKwkJ dmFkZHIgPSBrbWFwX2F0b21pY19weChwdCk7CisJCW1lbXNldDMyKHZhZGRyICsgcHRlLCBzY3Jh dGNoX3B0ZSwgY291bnQpOworCQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKworCQlwdGUgPSAwOwor CX0KK30KKworc3RhdGljIHZvaWQgZ2VuNl9wcGd0dF9pbnNlcnRfZW50cmllcyhzdHJ1Y3QgaTkx NV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkgICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJ CQkgICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJCQkJICAgICAgdTMy IGZsYWdzKQoreworCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dCA9IGk5MTVfdm1fdG9fcHBndHQo dm0pOworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0dC0+cGQ7 CisJdW5zaWduZWQgaW50IGZpcnN0X2VudHJ5ID0gdm1hLT5ub2RlLnN0YXJ0IC8gSTkxNV9HVFRf UEFHRV9TSVpFOworCXVuc2lnbmVkIGludCBhY3RfcHQgPSBmaXJzdF9lbnRyeSAvIEdFTjZfUFRF UzsKKwl1bnNpZ25lZCBpbnQgYWN0X3B0ZSA9IGZpcnN0X2VudHJ5ICUgR0VONl9QVEVTOworCWNv bnN0IHUzMiBwdGVfZW5jb2RlID0gdm0tPnB0ZV9lbmNvZGUoMCwgY2FjaGVfbGV2ZWwsIGZsYWdz KTsKKwlzdHJ1Y3Qgc2d0X2RtYSBpdGVyID0gc2d0X2RtYSh2bWEpOworCWdlbjZfcHRlX3QgKnZh ZGRyOworCisJR0VNX0JVR19PTihwZC0+ZW50cnlbYWN0X3B0XSA9PSAmdm0tPnNjcmF0Y2hbMV0p OworCisJdmFkZHIgPSBrbWFwX2F0b21pY19weChpOTE1X3B0X2VudHJ5KHBkLCBhY3RfcHQpKTsK KwlkbyB7CisJCXZhZGRyW2FjdF9wdGVdID0gcHRlX2VuY29kZSB8IEdFTjZfUFRFX0FERFJfRU5D T0RFKGl0ZXIuZG1hKTsKKworCQlpdGVyLmRtYSArPSBJOTE1X0dUVF9QQUdFX1NJWkU7CisJCWlm IChpdGVyLmRtYSA9PSBpdGVyLm1heCkgeworCQkJaXRlci5zZyA9IF9fc2dfbmV4dChpdGVyLnNn KTsKKwkJCWlmICghaXRlci5zZykKKwkJCQlicmVhazsKKworCQkJaXRlci5kbWEgPSBzZ19kbWFf YWRkcmVzcyhpdGVyLnNnKTsKKwkJCWl0ZXIubWF4ID0gaXRlci5kbWEgKyBpdGVyLnNnLT5sZW5n dGg7CisJCX0KKworCQlpZiAoKythY3RfcHRlID09IEdFTjZfUFRFUykgeworCQkJa3VubWFwX2F0 b21pYyh2YWRkcik7CisJCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KGk5MTVfcHRfZW50cnkocGQs ICsrYWN0X3B0KSk7CisJCQlhY3RfcHRlID0gMDsKKwkJfQorCX0gd2hpbGUgKDEpOworCWt1bm1h cF9hdG9taWModmFkZHIpOworCisJdm1hLT5wYWdlX3NpemVzLmd0dCA9IEk5MTVfR1RUX1BBR0Vf U0laRTsKK30KKworc3RhdGljIHZvaWQgZ2VuNl9mbHVzaF9wZChzdHJ1Y3QgZ2VuNl9wcGd0dCAq cHBndHQsIHU2NCBzdGFydCwgdTY0IGVuZCkKK3sKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9y eSAqIGNvbnN0IHBkID0gcHBndHQtPmJhc2UucGQ7CisJc3RydWN0IGk5MTVfcGFnZV90YWJsZSAq cHQ7CisJdW5zaWduZWQgaW50IHBkZTsKKworCXN0YXJ0ID0gcm91bmRfZG93bihzdGFydCwgU1pf NjRLKTsKKwllbmQgPSByb3VuZF91cChlbmQsIFNaXzY0SykgLSBzdGFydDsKKworCW11dGV4X2xv Y2soJnBwZ3R0LT5mbHVzaCk7CisKKwlnZW42X2Zvcl9lYWNoX3BkZShwdCwgcGQsIHN0YXJ0LCBl bmQsIHBkZSkKKwkJZ2VuNl93cml0ZV9wZGUocHBndHQsIHBkZSwgcHQpOworCisJbWIoKTsKKwlp b3JlYWQzMihwcGd0dC0+cGRfYWRkciArIHBkZSAtIDEpOworCWdlbjZfZ2d0dF9pbnZhbGlkYXRl KHBwZ3R0LT5iYXNlLnZtLmd0LT5nZ3R0KTsKKwltYigpOworCisJbXV0ZXhfdW5sb2NrKCZwcGd0 dC0+Zmx1c2gpOworfQorCitzdGF0aWMgaW50IGdlbjZfYWxsb2NfdmFfcmFuZ2Uoc3RydWN0IGk5 MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkgICAgICAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQor eworCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dlbjZfcHBndHQoaTkxNV92bV90b19w cGd0dCh2bSkpOworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0 dC0+YmFzZS5wZDsKKwlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdCwgKmFsbG9jID0gTlVMTDsK KwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKKwl1NjQgZnJvbSA9IHN0YXJ0OworCXVuc2lnbmVk IGludCBwZGU7CisJaW50IHJldCA9IDA7CisKKwl3YWtlcmVmID0gaW50ZWxfcnVudGltZV9wbV9n ZXQoJnZtLT5pOTE1LT5ydW50aW1lX3BtKTsKKworCXNwaW5fbG9jaygmcGQtPmxvY2spOworCWdl bjZfZm9yX2VhY2hfcGRlKHB0LCBwZCwgc3RhcnQsIGxlbmd0aCwgcGRlKSB7CisJCWNvbnN0IHVu c2lnbmVkIGludCBjb3VudCA9IGdlbjZfcHRlX2NvdW50KHN0YXJ0LCBsZW5ndGgpOworCisJCWlm IChweF9iYXNlKHB0KSA9PSBweF9iYXNlKCZ2bS0+c2NyYXRjaFsxXSkpIHsKKwkJCXNwaW5fdW5s b2NrKCZwZC0+bG9jayk7CisKKwkJCXB0ID0gZmV0Y2hfYW5kX3plcm8oJmFsbG9jKTsKKwkJCWlm ICghcHQpCisJCQkJcHQgPSBhbGxvY19wdCh2bSk7CisJCQlpZiAoSVNfRVJSKHB0KSkgeworCQkJ CXJldCA9IFBUUl9FUlIocHQpOworCQkJCWdvdG8gdW53aW5kX291dDsKKwkJCX0KKworCQkJZmls bDMyX3B4KHB0LCB2bS0+c2NyYXRjaFswXS5lbmNvZGUpOworCisJCQlzcGluX2xvY2soJnBkLT5s b2NrKTsKKwkJCWlmIChwZC0+ZW50cnlbcGRlXSA9PSAmdm0tPnNjcmF0Y2hbMV0pIHsKKwkJCQlw ZC0+ZW50cnlbcGRlXSA9IHB0OworCQkJfSBlbHNlIHsKKwkJCQlhbGxvYyA9IHB0OworCQkJCXB0 ID0gcGQtPmVudHJ5W3BkZV07CisJCQl9CisJCX0KKworCQlhdG9taWNfYWRkKGNvdW50LCAmcHQt PnVzZWQpOworCX0KKwlzcGluX3VubG9jaygmcGQtPmxvY2spOworCisJaWYgKGk5MTVfdm1hX2lz X2JvdW5kKHBwZ3R0LT52bWEsIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSkKKwkJZ2VuNl9mbHVzaF9w ZChwcGd0dCwgZnJvbSwgc3RhcnQpOworCisJZ290byBvdXQ7CisKK3Vud2luZF9vdXQ6CisJZ2Vu Nl9wcGd0dF9jbGVhcl9yYW5nZSh2bSwgZnJvbSwgc3RhcnQgLSBmcm9tKTsKK291dDoKKwlpZiAo YWxsb2MpCisJCWZyZWVfcHgodm0sIGFsbG9jKTsKKwlpbnRlbF9ydW50aW1lX3BtX3B1dCgmdm0t Pmk5MTUtPnJ1bnRpbWVfcG0sIHdha2VyZWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bnQgZ2VuNl9wcGd0dF9pbml0X3NjcmF0Y2goc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0KQorewor CXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKiBjb25zdCB2bSA9ICZwcGd0dC0+YmFzZS52bTsK KwlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkID0gcHBndHQtPmJhc2UucGQ7 CisJaW50IHJldDsKKworCXJldCA9IHNldHVwX3NjcmF0Y2hfcGFnZSh2bSwgX19HRlBfSElHSE1F TSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZtLT5zY3JhdGNoWzBdLmVuY29kZSA9 CisJCXZtLT5wdGVfZW5jb2RlKHB4X2RtYSgmdm0tPnNjcmF0Y2hbMF0pLAorCQkJICAgICAgIEk5 MTVfQ0FDSEVfTk9ORSwgUFRFX1JFQURfT05MWSk7CisKKwlpZiAodW5saWtlbHkoc2V0dXBfcGFn ZV9kbWEodm0sIHB4X2Jhc2UoJnZtLT5zY3JhdGNoWzFdKSkpKSB7CisJCWNsZWFudXBfc2NyYXRj aF9wYWdlKHZtKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlsbDMyX3B4KCZ2bS0+c2Ny YXRjaFsxXSwgdm0tPnNjcmF0Y2hbMF0uZW5jb2RlKTsKKwltZW1zZXRfcChwZC0+ZW50cnksICZ2 bS0+c2NyYXRjaFsxXSwgSTkxNV9QREVTKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBnZW42X3BwZ3R0X2ZyZWVfcGQoc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0KQoreworCXN0cnVj dCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQgPSBwcGd0dC0+YmFzZS5wZDsKKwlzdHJ1 Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHNjcmF0Y2ggPQorCQlweF9iYXNlKCZwcGd0dC0+YmFz ZS52bS5zY3JhdGNoWzFdKTsKKwlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdDsKKwl1MzIgcGRl OworCisJZ2VuNl9mb3JfYWxsX3BkZXMocHQsIHBkLCBwZGUpCisJCWlmIChweF9iYXNlKHB0KSAh PSBzY3JhdGNoKQorCQkJZnJlZV9weCgmcHBndHQtPmJhc2Uudm0sIHB0KTsKK30KKworc3RhdGlj IHZvaWQgZ2VuNl9wcGd0dF9jbGVhbnVwKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQor eworCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dlbjZfcHBndHQoaTkxNV92bV90b19w cGd0dCh2bSkpOworCisJX19pOTE1X3ZtYV9wdXQocHBndHQtPnZtYSk7CisKKwlnZW42X3BwZ3R0 X2ZyZWVfcGQocHBndHQpOworCWZyZWVfc2NyYXRjaCh2bSk7CisKKwltdXRleF9kZXN0cm95KCZw cGd0dC0+Zmx1c2gpOworCW11dGV4X2Rlc3Ryb3koJnBwZ3R0LT5waW5fbXV0ZXgpOworCWtmcmVl KHBwZ3R0LT5iYXNlLnBkKTsKK30KKworc3RhdGljIGludCBwZF92bWFfc2V0X3BhZ2VzKHN0cnVj dCBpOTE1X3ZtYSAqdm1hKQoreworCXZtYS0+cGFnZXMgPSBFUlJfUFRSKC1FTk9ERVYpOworCXJl dHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZF92bWFfY2xlYXJfcGFnZXMoc3RydWN0IGk5MTVf dm1hICp2bWEpCit7CisJR0VNX0JVR19PTighdm1hLT5wYWdlcyk7CisKKwl2bWEtPnBhZ2VzID0g TlVMTDsKK30KKworc3RhdGljIGludCBwZF92bWFfYmluZChzdHJ1Y3QgaTkxNV92bWEgKnZtYSwK KwkJICAgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJICAgICAgIHUz MiB1bnVzZWQpCit7CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2 bWEtPnZtKTsKKwlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB2bWEtPnByaXZhdGU7CisJdTMy IGdndHRfb2Zmc2V0ID0gaTkxNV9nZ3R0X29mZnNldCh2bWEpIC8gSTkxNV9HVFRfUEFHRV9TSVpF OworCisJcHhfYmFzZShwcGd0dC0+YmFzZS5wZCktPmdndHRfb2Zmc2V0ID0gZ2d0dF9vZmZzZXQg KiBzaXplb2YoZ2VuNl9wdGVfdCk7CisJcHBndHQtPnBkX2FkZHIgPSAoZ2VuNl9wdGVfdCBfX2lv bWVtICopZ2d0dC0+Z3NtICsgZ2d0dF9vZmZzZXQ7CisKKwlnZW42X2ZsdXNoX3BkKHBwZ3R0LCAw LCBwcGd0dC0+YmFzZS52bS50b3RhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBk X3ZtYV91bmJpbmQoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJc3RydWN0IGdlbjZfcHBndHQg KnBwZ3R0ID0gdm1hLT5wcml2YXRlOworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29u c3QgcGQgPSBwcGd0dC0+YmFzZS5wZDsKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHNj cmF0Y2ggPQorCQlweF9iYXNlKCZwcGd0dC0+YmFzZS52bS5zY3JhdGNoWzFdKTsKKwlzdHJ1Y3Qg aTkxNV9wYWdlX3RhYmxlICpwdDsKKwl1bnNpZ25lZCBpbnQgcGRlOworCisJaWYgKCFwcGd0dC0+ c2Nhbl9mb3JfdW51c2VkX3B0KQorCQlyZXR1cm47CisKKwkvKiBGcmVlIGFsbCBubyBsb25nZXIg dXNlZCBwYWdlIHRhYmxlcyAqLworCWdlbjZfZm9yX2FsbF9wZGVzKHB0LCBwcGd0dC0+YmFzZS5w ZCwgcGRlKSB7CisJCWlmIChweF9iYXNlKHB0KSA9PSBzY3JhdGNoIHx8IGF0b21pY19yZWFkKCZw dC0+dXNlZCkpCisJCQljb250aW51ZTsKKworCQlmcmVlX3B4KCZwcGd0dC0+YmFzZS52bSwgcHQp OworCQlwZC0+ZW50cnlbcGRlXSA9IHNjcmF0Y2g7CisJfQorCisJcHBndHQtPnNjYW5fZm9yX3Vu dXNlZF9wdCA9IGZhbHNlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfdm1hX29wcyBw ZF92bWFfb3BzID0geworCS5zZXRfcGFnZXMgPSBwZF92bWFfc2V0X3BhZ2VzLAorCS5jbGVhcl9w YWdlcyA9IHBkX3ZtYV9jbGVhcl9wYWdlcywKKwkuYmluZF92bWEgPSBwZF92bWFfYmluZCwKKwku dW5iaW5kX3ZtYSA9IHBkX3ZtYV91bmJpbmQsCit9OworCitzdGF0aWMgc3RydWN0IGk5MTVfdm1h ICpwZF92bWFfY3JlYXRlKHN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCwgaW50IHNpemUpCit7CisJ c3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IHBwZ3R0LT5iYXNlLnZtLmd0LT5nZ3R0OworCXN0cnVj dCBpOTE1X3ZtYSAqdm1hOworCisJR0VNX0JVR19PTighSVNfQUxJR05FRChzaXplLCBJOTE1X0dU VF9QQUdFX1NJWkUpKTsKKwlHRU1fQlVHX09OKHNpemUgPiBnZ3R0LT52bS50b3RhbCk7CisKKwl2 bWEgPSBpOTE1X3ZtYV9hbGxvYygpOworCWlmICghdm1hKQorCQlyZXR1cm4gRVJSX1BUUigtRU5P TUVNKTsKKworCWk5MTVfYWN0aXZlX2luaXQoJnZtYS0+YWN0aXZlLCBOVUxMLCBOVUxMKTsKKwor CWtyZWZfaW5pdCgmdm1hLT5yZWYpOworCW11dGV4X2luaXQoJnZtYS0+cGFnZXNfbXV0ZXgpOwor CXZtYS0+dm0gPSBpOTE1X3ZtX2dldCgmZ2d0dC0+dm0pOworCXZtYS0+b3BzID0gJnBkX3ZtYV9v cHM7CisJdm1hLT5wcml2YXRlID0gcHBndHQ7CisKKwl2bWEtPnNpemUgPSBzaXplOworCXZtYS0+ ZmVuY2Vfc2l6ZSA9IHNpemU7CisJYXRvbWljX3NldCgmdm1hLT5mbGFncywgSTkxNV9WTUFfR0dU VCk7CisJdm1hLT5nZ3R0X3ZpZXcudHlwZSA9IEk5MTVfR0dUVF9WSUVXX1JPVEFURUQ7IC8qIHBy ZXZlbnQgZmVuY2luZyAqLworCisJSU5JVF9MSVNUX0hFQUQoJnZtYS0+b2JqX2xpbmspOworCUlO SVRfTElTVF9IRUFEKCZ2bWEtPmNsb3NlZF9saW5rKTsKKworCXJldHVybiB2bWE7Cit9CisKK2lu dCBnZW42X3BwZ3R0X3BpbihzdHJ1Y3QgaTkxNV9wcGd0dCAqYmFzZSkKK3sKKwlzdHJ1Y3QgZ2Vu Nl9wcGd0dCAqcHBndHQgPSB0b19nZW42X3BwZ3R0KGJhc2UpOworCWludCBlcnI7CisKKwlHRU1f QlVHX09OKCFhdG9taWNfcmVhZCgmcHBndHQtPmJhc2Uudm0ub3BlbikpOworCisJLyoKKwkgKiBX b3JrYXJvdW5kIHRoZSBsaW1pdGVkIG1heGltdW0gdm1hLT5waW5fY291bnQgYW5kIHRoZSBhbGlh c2luZ19wcGd0dAorCSAqIHdoaWNoIHdpbGwgYmUgcGlubmVkIGludG8gZXZlcnkgYWN0aXZlIGNv bnRleHQuCisJICogKFdoZW4gdm1hLT5waW5fY291bnQgYmVjb21lcyBhdG9taWMsIEkgZXhwZWN0 IHdlIHdpbGwgbmF0dXJhbGx5CisJICogbmVlZCBhIGxhcmdlciwgdW5wYWNrZWQsIHR5cGUgYW5k IGtpbGwgdGhpcyByZWR1bmRhbmN5LikKKwkgKi8KKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnBw Z3R0LT5waW5fY291bnQsIDEsIDApKQorCQlyZXR1cm4gMDsKKworCWlmIChtdXRleF9sb2NrX2lu dGVycnVwdGlibGUoJnBwZ3R0LT5waW5fbXV0ZXgpKQorCQlyZXR1cm4gLUVJTlRSOworCisJLyoK KwkgKiBQUEdUVCBQREVzIHJlc2lkZSBpbiB0aGUgR0dUVCBhbmQgY29uc2lzdHMgb2YgNTEyIGVu dHJpZXMuIFRoZQorCSAqIGFsbG9jYXRvciB3b3JrcyBpbiBhZGRyZXNzIHNwYWNlIHNpemVzLCBz byBpdCdzIG11bHRpcGxpZWQgYnkgcGFnZQorCSAqIHNpemUuIFdlIGFsbG9jYXRlIGF0IHRoZSB0 b3Agb2YgdGhlIEdUVCB0byBhdm9pZCBmcmFnbWVudGF0aW9uLgorCSAqLworCWVyciA9IDA7CisJ aWYgKCFhdG9taWNfcmVhZCgmcHBndHQtPnBpbl9jb3VudCkpCisJCWVyciA9IGk5MTVfZ2d0dF9w aW4ocHBndHQtPnZtYSwgR0VONl9QRF9BTElHTiwgUElOX0hJR0gpOworCWlmICghZXJyKQorCQlh dG9taWNfaW5jKCZwcGd0dC0+cGluX2NvdW50KTsKKwltdXRleF91bmxvY2soJnBwZ3R0LT5waW5f bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBnZW42X3BwZ3R0X3VucGluKHN0cnVj dCBpOTE1X3BwZ3R0ICpiYXNlKQoreworCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCA9IHRvX2dl bjZfcHBndHQoYmFzZSk7CisKKwlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmcHBndHQtPnBpbl9j b3VudCkpOworCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwcGd0dC0+cGluX2NvdW50KSkKKwkJ aTkxNV92bWFfdW5waW4ocHBndHQtPnZtYSk7Cit9CisKK3ZvaWQgZ2VuNl9wcGd0dF91bnBpbl9h bGwoc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpCit7CisJc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0 ID0gdG9fZ2VuNl9wcGd0dChiYXNlKTsKKworCWlmICghYXRvbWljX3JlYWQoJnBwZ3R0LT5waW5f Y291bnQpKQorCQlyZXR1cm47CisKKwlpOTE1X3ZtYV91bnBpbihwcGd0dC0+dm1hKTsKKwlhdG9t aWNfc2V0KCZwcGd0dC0+cGluX2NvdW50LCAwKTsKK30KKworc3RydWN0IGk5MTVfcHBndHQgKmdl bjZfcHBndHRfY3JlYXRlKHN0cnVjdCBpbnRlbF9ndCAqZ3QpCit7CisJc3RydWN0IGk5MTVfZ2d0 dCAqIGNvbnN0IGdndHQgPSBndC0+Z2d0dDsKKwlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQ7CisJ aW50IGVycjsKKworCXBwZ3R0ID0ga3phbGxvYyhzaXplb2YoKnBwZ3R0KSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCFwcGd0dCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltdXRleF9pbml0 KCZwcGd0dC0+Zmx1c2gpOworCW11dGV4X2luaXQoJnBwZ3R0LT5waW5fbXV0ZXgpOworCisJcHBn dHRfaW5pdCgmcHBndHQtPmJhc2UsIGd0KTsKKwlwcGd0dC0+YmFzZS52bS50b3AgPSAxOworCisJ cHBndHQtPmJhc2Uudm0uYmluZF9hc3luY19mbGFncyA9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7CisJ cHBndHQtPmJhc2Uudm0uYWxsb2NhdGVfdmFfcmFuZ2UgPSBnZW42X2FsbG9jX3ZhX3JhbmdlOwor CXBwZ3R0LT5iYXNlLnZtLmNsZWFyX3JhbmdlID0gZ2VuNl9wcGd0dF9jbGVhcl9yYW5nZTsKKwlw cGd0dC0+YmFzZS52bS5pbnNlcnRfZW50cmllcyA9IGdlbjZfcHBndHRfaW5zZXJ0X2VudHJpZXM7 CisJcHBndHQtPmJhc2Uudm0uY2xlYW51cCA9IGdlbjZfcHBndHRfY2xlYW51cDsKKworCXBwZ3R0 LT5iYXNlLnZtLnB0ZV9lbmNvZGUgPSBnZ3R0LT52bS5wdGVfZW5jb2RlOworCisJcHBndHQtPmJh c2UucGQgPSBfX2FsbG9jX3BkKHNpemVvZigqcHBndHQtPmJhc2UucGQpKTsKKwlpZiAoIXBwZ3R0 LT5iYXNlLnBkKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJ ZXJyID0gZ2VuNl9wcGd0dF9pbml0X3NjcmF0Y2gocHBndHQpOworCWlmIChlcnIpCisJCWdvdG8g ZXJyX3BkOworCisJcHBndHQtPnZtYSA9IHBkX3ZtYV9jcmVhdGUocHBndHQsIEdFTjZfUERfU0la RSk7CisJaWYgKElTX0VSUihwcGd0dC0+dm1hKSkgeworCQllcnIgPSBQVFJfRVJSKHBwZ3R0LT52 bWEpOworCQlnb3RvIGVycl9zY3JhdGNoOworCX0KKworCXJldHVybiAmcHBndHQtPmJhc2U7CisK K2Vycl9zY3JhdGNoOgorCWZyZWVfc2NyYXRjaCgmcHBndHQtPmJhc2Uudm0pOworZXJyX3BkOgor CWtmcmVlKHBwZ3R0LT5iYXNlLnBkKTsKK2Vycl9mcmVlOgorCW11dGV4X2Rlc3Ryb3koJnBwZ3R0 LT5waW5fbXV0ZXgpOworCWtmcmVlKHBwZ3R0KTsKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQpk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvZ2VuNl9wcGd0dC5oIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvZ2VuNl9wcGd0dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwMC4uNzJlNDgxODA2Yzk2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3QvZ2VuNl9wcGd0dC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBNSVQgKi8KKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBD b3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgX19HRU42X1BQR1RUX0hfXworI2RlZmluZSBfX0dF TjZfUFBHVFRfSF9fCisKKyNpbmNsdWRlICJpbnRlbF9ndHQuaCIKKworc3RydWN0IGdlbjZfcHBn dHQgeworCXN0cnVjdCBpOTE1X3BwZ3R0IGJhc2U7CisKKwlzdHJ1Y3QgbXV0ZXggZmx1c2g7CisJ c3RydWN0IGk5MTVfdm1hICp2bWE7CisJZ2VuNl9wdGVfdCBfX2lvbWVtICpwZF9hZGRyOworCisJ YXRvbWljX3QgcGluX2NvdW50OworCXN0cnVjdCBtdXRleCBwaW5fbXV0ZXg7CisKKwlib29sIHNj YW5fZm9yX3VudXNlZF9wdDsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdlbjZfcHRlX2luZGV4 KHUzMiBhZGRyKQoreworCXJldHVybiBpOTE1X3B0ZV9pbmRleChhZGRyLCBHRU42X1BERV9TSElG VCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdlbjZfcHRlX2NvdW50KHUzMiBhZGRyLCB1MzIg bGVuZ3RoKQoreworCXJldHVybiBpOTE1X3B0ZV9jb3VudChhZGRyLCBsZW5ndGgsIEdFTjZfUERF X1NISUZUKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2VuNl9wZGVfaW5kZXgodTMyIGFkZHIp Cit7CisJcmV0dXJuIGk5MTVfcGRlX2luZGV4KGFkZHIsIEdFTjZfUERFX1NISUZUKTsKK30KKwor I2RlZmluZSBfX3RvX2dlbjZfcHBndHQoYmFzZSkgY29udGFpbmVyX29mKGJhc2UsIHN0cnVjdCBn ZW42X3BwZ3R0LCBiYXNlKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBnZW42X3BwZ3R0ICp0b19n ZW42X3BwZ3R0KHN0cnVjdCBpOTE1X3BwZ3R0ICpiYXNlKQoreworCUJVSUxEX0JVR19PTihvZmZz ZXRvZihzdHJ1Y3QgZ2VuNl9wcGd0dCwgYmFzZSkpOworCXJldHVybiBfX3RvX2dlbjZfcHBndHQo YmFzZSk7Cit9CisKKy8qCisgKiBnZW42X2Zvcl9lYWNoX3BkZSgpIGl0ZXJhdGVzIG92ZXIgZXZl cnkgcGRlIGZyb20gc3RhcnQgdW50aWwgc3RhcnQrbGVuZ3RoLgorICogSWYgc3RhcnQgYW5kIHN0 YXJ0K2xlbmd0aCBhcmUgbm90IHBlcmZlY3RseSBkaXZpc2libGUsIHRoZSBtYWNybyB3aWxsIHJv dW5kCisgKiBkb3duIGFuZCB1cCBhcyBuZWVkZWQuIFN0YXJ0PTAgYW5kIGxlbmd0aD0yRyBlZmZl Y3RpdmVseSBpdGVyYXRlcyBvdmVyCisgKiBldmVyeSBQREUgaW4gdGhlIHN5c3RlbS4gVGhlIG1h Y3JvIG1vZGlmaWVzIEFMTCBpdHMgcGFyYW1ldGVycyBleGNlcHQgJ3BkJywKKyAqIHNvIGVhY2gg b2YgdGhlIG90aGVyIHBhcmFtZXRlcnMgc2hvdWxkIHByZWZlcmFibHkgYmUgYSBzaW1wbGUgdmFy aWFibGUsIG9yCisgKiBhdCBtb3N0IGFuIGx2YWx1ZSB3aXRoIG5vIHNpZGUtZWZmZWN0cyEKKyAq LworI2RlZmluZSBnZW42X2Zvcl9lYWNoX3BkZShwdCwgcGQsIHN0YXJ0LCBsZW5ndGgsIGl0ZXIp CQkJXAorCWZvciAoaXRlciA9IGdlbjZfcGRlX2luZGV4KHN0YXJ0KTsJCQkJXAorCSAgICAgbGVu Z3RoID4gMCAmJiBpdGVyIDwgSTkxNV9QREVTICYmCQkJCVwKKwkJICAgICAocHQgPSBpOTE1X3B0 X2VudHJ5KHBkLCBpdGVyKSwgdHJ1ZSk7CQlcCisJICAgICAoeyB1MzIgdGVtcCA9IEFMSUdOKHN0 YXJ0KzEsIDEgPDwgR0VONl9QREVfU0hJRlQpOwkJXAorCQkgICAgdGVtcCA9IG1pbih0ZW1wIC0g c3RhcnQsIGxlbmd0aCk7CQkJXAorCQkgICAgc3RhcnQgKz0gdGVtcCwgbGVuZ3RoIC09IHRlbXA7 IH0pLCArK2l0ZXIpCisKKyNkZWZpbmUgZ2VuNl9mb3JfYWxsX3BkZXMocHQsIHBkLCBpdGVyKQkJ CQkJXAorCWZvciAoaXRlciA9IDA7CQkJCQkJCVwKKwkgICAgIGl0ZXIgPCBJOTE1X1BERVMgJiYJ CQkJCVwKKwkJICAgICAocHQgPSBpOTE1X3B0X2VudHJ5KHBkLCBpdGVyKSwgdHJ1ZSk7CQlcCisJ ICAgICArK2l0ZXIpCisKK2ludCBnZW42X3BwZ3R0X3BpbihzdHJ1Y3QgaTkxNV9wcGd0dCAqYmFz ZSk7Cit2b2lkIGdlbjZfcHBndHRfdW5waW4oc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpOwordm9p ZCBnZW42X3BwZ3R0X3VucGluX2FsbChzdHJ1Y3QgaTkxNV9wcGd0dCAqYmFzZSk7Cit2b2lkIGdl bjZfcHBndHRfZW5hYmxlKHN0cnVjdCBpbnRlbF9ndCAqZ3QpOwordm9pZCBnZW43X3BwZ3R0X2Vu YWJsZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KTsKK3N0cnVjdCBpOTE1X3BwZ3R0ICpnZW42X3BwZ3R0 X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW44X3BwZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n dC9nZW44X3BwZ3R0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4w NjgxOTIxZTNlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9n ZW44X3BwZ3R0LmMKQEAgLTAsMCArMSw3MjIgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBNSVQKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisK KyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisKKyNpbmNsdWRlICJnZW44X3BwZ3R0LmgiCisjaW5j bHVkZSAiaTkxNV9zY2F0dGVybGlzdC5oIgorI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNpbmNs dWRlICJpOTE1X3ZncHUuaCIKKyNpbmNsdWRlICJpbnRlbF9ndC5oIgorI2luY2x1ZGUgImludGVs X2d0dC5oIgorCitzdGF0aWMgdTY0IGdlbjhfcGRlX2VuY29kZShjb25zdCBkbWFfYWRkcl90IGFk ZHIsCisJCQkgICBjb25zdCBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwpCit7CisJdTY0IHBk ZSA9IGFkZHIgfCBfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlc7CisKKwlpZiAobGV2ZWwgIT0gSTkx NV9DQUNIRV9OT05FKQorCQlwZGUgfD0gUFBBVF9DQUNIRURfUERFOworCWVsc2UKKwkJcGRlIHw9 IFBQQVRfVU5DQUNIRUQ7CisKKwlyZXR1cm4gcGRlOworfQorCitzdGF0aWMgdm9pZCBnZW44X3Bw Z3R0X25vdGlmeV92Z3Qoc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0LCBib29sIGNyZWF0ZSkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBwZ3R0LT52bS5pOTE1OworCXN0cnVj dCBpbnRlbF91bmNvcmUgKnVuY29yZSA9IHBwZ3R0LT52bS5ndC0+dW5jb3JlOworCWVudW0gdmd0 X2cydl90eXBlIG1zZzsKKwlpbnQgaTsKKworCWlmIChjcmVhdGUpCisJCWF0b21pY19pbmMocHhf dXNlZChwcGd0dC0+cGQpKTsgLyogbmV2ZXIgcmVtb3ZlICovCisJZWxzZQorCQlhdG9taWNfZGVj KHB4X3VzZWQocHBndHQtPnBkKSk7CisKKwltdXRleF9sb2NrKCZpOTE1LT52Z3B1LmxvY2spOwor CisJaWYgKGk5MTVfdm1faXNfNGx2bCgmcHBndHQtPnZtKSkgeworCQljb25zdCB1NjQgZGFkZHIg PSBweF9kbWEocHBndHQtPnBkKTsKKworCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJ CSAgIHZndGlmX3JlZyhwZHBbMF0ubG8pLCBsb3dlcl8zMl9iaXRzKGRhZGRyKSk7CisJCWludGVs X3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkJICAgdmd0aWZfcmVnKHBkcFswXS5oaSksIHVwcGVy XzMyX2JpdHMoZGFkZHIpKTsKKworCQltc2cgPSBjcmVhdGUgPworCQkJVkdUX0cyVl9QUEdUVF9M NF9QQUdFX1RBQkxFX0NSRUFURSA6CisJCQlWR1RfRzJWX1BQR1RUX0w0X1BBR0VfVEFCTEVfREVT VFJPWTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgR0VOOF8zTFZMX1BEUEVTOyBpKysp IHsKKwkJCWNvbnN0IHU2NCBkYWRkciA9IGk5MTVfcGFnZV9kaXJfZG1hX2FkZHIocHBndHQsIGkp OworCisJCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJCQkgICB2Z3RpZl9yZWcocGRw W2ldLmxvKSwKKwkJCQkJICAgbG93ZXJfMzJfYml0cyhkYWRkcikpOworCQkJaW50ZWxfdW5jb3Jl X3dyaXRlKHVuY29yZSwKKwkJCQkJICAgdmd0aWZfcmVnKHBkcFtpXS5oaSksCisJCQkJCSAgIHVw cGVyXzMyX2JpdHMoZGFkZHIpKTsKKwkJfQorCisJCW1zZyA9IGNyZWF0ZSA/CisJCQlWR1RfRzJW X1BQR1RUX0wzX1BBR0VfVEFCTEVfQ1JFQVRFIDoKKwkJCVZHVF9HMlZfUFBHVFRfTDNfUEFHRV9U QUJMRV9ERVNUUk9ZOworCX0KKworCS8qIGcydl9ub3RpZnkgYXRvbWljYWxseSAodmlhIGh2IHRy YXApIGNvbnN1bWVzIHRoZSBtZXNzYWdlIHBhY2tldC4gKi8KKwlpbnRlbF91bmNvcmVfd3JpdGUo dW5jb3JlLCB2Z3RpZl9yZWcoZzJ2X25vdGlmeSksIG1zZyk7CisKKwltdXRleF91bmxvY2soJmk5 MTUtPnZncHUubG9jayk7Cit9CisKKy8qIEluZGV4IHNoaWZ0cyBpbnRvIHRoZSBwYWdldGFibGUg YXJlIG9mZnNldCBieSBHRU44X1BURV9TSElGVCBbMTJdICovCisjZGVmaW5lIEdFTjhfUEFHRV9T SVpFIChTWl80SykgLyogcGFnZSBhbmQgcGFnZS1kaXJlY3Rvcnkgc2l6ZXMgYXJlIHRoZSBzYW1l ICovCisjZGVmaW5lIEdFTjhfUFRFX1NISUZUIChpbG9nMihHRU44X1BBR0VfU0laRSkpCisjZGVm aW5lIEdFTjhfUERFUyAoR0VOOF9QQUdFX1NJWkUgLyBzaXplb2YodTY0KSkKKyNkZWZpbmUgZ2Vu OF9wZF9zaGlmdChsdmwpICgobHZsKSAqIGlsb2cyKEdFTjhfUERFUykpCisjZGVmaW5lIGdlbjhf cGRfaW5kZXgoaSwgbHZsKSBpOTE1X3BkZV9pbmRleCgoaSksIGdlbjhfcGRfc2hpZnQobHZsKSkK KyNkZWZpbmUgX19nZW44X3B0ZV9zaGlmdChsdmwpIChHRU44X1BURV9TSElGVCArIGdlbjhfcGRf c2hpZnQobHZsKSkKKyNkZWZpbmUgX19nZW44X3B0ZV9pbmRleChhLCBsdmwpIGk5MTVfcGRlX2lu ZGV4KChhKSwgX19nZW44X3B0ZV9zaGlmdChsdmwpKQorCisjZGVmaW5lIGFzX3BkKHgpIGNvbnRh aW5lcl9vZigoeCksIHR5cGVvZihzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSksIHB0KQorCitz dGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAorZ2VuOF9wZF9yYW5nZSh1NjQgc3RhcnQsIHU2NCBl bmQsIGludCBsdmwsIHVuc2lnbmVkIGludCAqaWR4KQoreworCWNvbnN0IGludCBzaGlmdCA9IGdl bjhfcGRfc2hpZnQobHZsKTsKKwljb25zdCB1NjQgbWFzayA9IH4wdWxsIDw8IGdlbjhfcGRfc2hp ZnQobHZsICsgMSk7CisKKwlHRU1fQlVHX09OKHN0YXJ0ID49IGVuZCk7CisJZW5kICs9IH5tYXNr ID4+IGdlbjhfcGRfc2hpZnQoMSk7CisKKwkqaWR4ID0gaTkxNV9wZGVfaW5kZXgoc3RhcnQsIHNo aWZ0KTsKKwlpZiAoKHN0YXJ0IF4gZW5kKSAmIG1hc2spCisJCXJldHVybiBHRU44X1BERVMgLSAq aWR4OworCWVsc2UKKwkJcmV0dXJuIGk5MTVfcGRlX2luZGV4KGVuZCwgc2hpZnQpIC0gKmlkeDsK K30KKworc3RhdGljIGlubGluZSBib29sIGdlbjhfcGRfY29udGFpbnModTY0IHN0YXJ0LCB1NjQg ZW5kLCBpbnQgbHZsKQoreworCWNvbnN0IHU2NCBtYXNrID0gfjB1bGwgPDwgZ2VuOF9wZF9zaGlm dChsdmwgKyAxKTsKKworCUdFTV9CVUdfT04oc3RhcnQgPj0gZW5kKTsKKwlyZXR1cm4gKHN0YXJ0 IF4gZW5kKSAmIG1hc2sgJiYgKHN0YXJ0ICYgfm1hc2spID09IDA7Cit9CisKK3N0YXRpYyBpbmxp bmUgdW5zaWduZWQgaW50IGdlbjhfcHRfY291bnQodTY0IHN0YXJ0LCB1NjQgZW5kKQoreworCUdF TV9CVUdfT04oc3RhcnQgPj0gZW5kKTsKKwlpZiAoKHN0YXJ0IF4gZW5kKSA+PiBnZW44X3BkX3No aWZ0KDEpKQorCQlyZXR1cm4gR0VOOF9QREVTIC0gKHN0YXJ0ICYgKEdFTjhfUERFUyAtIDEpKTsK KwllbHNlCisJCXJldHVybiBlbmQgLSBzdGFydDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25l ZCBpbnQKK2dlbjhfcGRfdG9wX2NvdW50KGNvbnN0IHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtKQoreworCXVuc2lnbmVkIGludCBzaGlmdCA9IF9fZ2VuOF9wdGVfc2hpZnQodm0tPnRvcCk7 CisJcmV0dXJuICh2bS0+dG90YWwgKyAoMXVsbCA8PCBzaGlmdCkgLSAxKSA+PiBzaGlmdDsKK30K Kworc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqCitnZW44X3BkcF9m b3JfcGFnZV9pbmRleChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICogY29uc3Qgdm0sIGNvbnN0 IHU2NCBpZHgpCit7CisJc3RydWN0IGk5MTVfcHBndHQgKiBjb25zdCBwcGd0dCA9IGk5MTVfdm1f dG9fcHBndHQodm0pOworCisJaWYgKHZtLT50b3AgPT0gMikKKwkJcmV0dXJuIHBwZ3R0LT5wZDsK KwllbHNlCisJCXJldHVybiBpOTE1X3BkX2VudHJ5KHBwZ3R0LT5wZCwgZ2VuOF9wZF9pbmRleChp ZHgsIHZtLT50b3ApKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVj dG9yeSAqCitnZW44X3BkcF9mb3JfcGFnZV9hZGRyZXNzKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKiBjb25zdCB2bSwgY29uc3QgdTY0IGFkZHIpCit7CisJcmV0dXJuIGdlbjhfcGRwX2Zvcl9w YWdlX2luZGV4KHZtLCBhZGRyID4+IEdFTjhfUFRFX1NISUZUKTsKK30KKworc3RhdGljIHZvaWQg X19nZW44X3BwZ3R0X2NsZWFudXAoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJ IHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZCwKKwkJCQkgaW50IGNvdW50LCBpbnQgbHZs KQoreworCWlmIChsdmwpIHsKKwkJdm9pZCAqKnBkZSA9IHBkLT5lbnRyeTsKKworCQlkbyB7CisJ CQlpZiAoISpwZGUpCisJCQkJY29udGludWU7CisKKwkJCV9fZ2VuOF9wcGd0dF9jbGVhbnVwKHZt LCAqcGRlLCBHRU44X1BERVMsIGx2bCAtIDEpOworCQl9IHdoaWxlIChwZGUrKywgLS1jb3VudCk7 CisJfQorCisJZnJlZV9weCh2bSwgcGQpOworfQorCitzdGF0aWMgdm9pZCBnZW44X3BwZ3R0X2Ns ZWFudXAoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJc3RydWN0IGk5MTVfcHBn dHQgKnBwZ3R0ID0gaTkxNV92bV90b19wcGd0dCh2bSk7CisKKwlpZiAoaW50ZWxfdmdwdV9hY3Rp dmUodm0tPmk5MTUpKQorCQlnZW44X3BwZ3R0X25vdGlmeV92Z3QocHBndHQsIGZhbHNlKTsKKwor CV9fZ2VuOF9wcGd0dF9jbGVhbnVwKHZtLCBwcGd0dC0+cGQsIGdlbjhfcGRfdG9wX2NvdW50KHZt KSwgdm0tPnRvcCk7CisJZnJlZV9zY3JhdGNoKHZtKTsKK30KKworc3RhdGljIHU2NCBfX2dlbjhf cHBndHRfY2xlYXIoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqIGNvbnN0IHZtLAorCQkJICAg ICAgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKKwkJCSAgICAgIHU2NCBz dGFydCwgY29uc3QgdTY0IGVuZCwgaW50IGx2bCkKK3sKKwljb25zdCBzdHJ1Y3QgaTkxNV9wYWdl X3NjcmF0Y2ggKiBjb25zdCBzY3JhdGNoID0gJnZtLT5zY3JhdGNoW2x2bF07CisJdW5zaWduZWQg aW50IGlkeCwgbGVuOworCisJR0VNX0JVR19PTihlbmQgPiB2bS0+dG90YWwgPj4gR0VOOF9QVEVf U0hJRlQpOworCisJbGVuID0gZ2VuOF9wZF9yYW5nZShzdGFydCwgZW5kLCBsdmwtLSwgJmlkeCk7 CisJREJHKCIlcyglcCk6eyBsdmw6JWQsIHN0YXJ0OiVsbHgsIGVuZDolbGx4LCBpZHg6JWQsIGxl bjolZCwgdXNlZDolZCB9XG4iLAorCSAgICBfX2Z1bmNfXywgdm0sIGx2bCArIDEsIHN0YXJ0LCBl bmQsCisJICAgIGlkeCwgbGVuLCBhdG9taWNfcmVhZChweF91c2VkKHBkKSkpOworCUdFTV9CVUdf T04oIWxlbiB8fCBsZW4gPj0gYXRvbWljX3JlYWQocHhfdXNlZChwZCkpKTsKKworCWRvIHsKKwkJ c3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQgPSBwZC0+ZW50cnlbaWR4XTsKKworCQlpZiAoYXRv bWljX2ZldGNoX2luYygmcHQtPnVzZWQpID4+IGdlbjhfcGRfc2hpZnQoMSkgJiYKKwkJICAgIGdl bjhfcGRfY29udGFpbnMoc3RhcnQsIGVuZCwgbHZsKSkgeworCQkJREJHKCIlcyglcCk6eyBsdmw6 JWQsIGlkeDolZCwgc3RhcnQ6JWxseCwgZW5kOiVsbHggfSByZW1vdmluZyBwZFxuIiwKKwkJCSAg ICBfX2Z1bmNfXywgdm0sIGx2bCArIDEsIGlkeCwgc3RhcnQsIGVuZCk7CisJCQljbGVhcl9wZF9l bnRyeShwZCwgaWR4LCBzY3JhdGNoKTsKKwkJCV9fZ2VuOF9wcGd0dF9jbGVhbnVwKHZtLCBhc19w ZChwdCksIEk5MTVfUERFUywgbHZsKTsKKwkJCXN0YXJ0ICs9ICh1NjQpSTkxNV9QREVTIDw8IGdl bjhfcGRfc2hpZnQobHZsKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGx2bCkgeworCQkJ c3RhcnQgPSBfX2dlbjhfcHBndHRfY2xlYXIodm0sIGFzX3BkKHB0KSwKKwkJCQkJCSAgIHN0YXJ0 LCBlbmQsIGx2bCk7CisJCX0gZWxzZSB7CisJCQl1bnNpZ25lZCBpbnQgY291bnQ7CisJCQl1NjQg KnZhZGRyOworCisJCQljb3VudCA9IGdlbjhfcHRfY291bnQoc3RhcnQsIGVuZCk7CisJCQlEQkco IiVzKCVwKTp7IGx2bDolZCwgc3RhcnQ6JWxseCwgZW5kOiVsbHgsIGlkeDolZCwgbGVuOiVkLCB1 c2VkOiVkIH0gcmVtb3ZpbmcgcHRlXG4iLAorCQkJICAgIF9fZnVuY19fLCB2bSwgbHZsLCBzdGFy dCwgZW5kLAorCQkJICAgIGdlbjhfcGRfaW5kZXgoc3RhcnQsIDApLCBjb3VudCwKKwkJCSAgICBh dG9taWNfcmVhZCgmcHQtPnVzZWQpKTsKKwkJCUdFTV9CVUdfT04oIWNvdW50IHx8IGNvdW50ID49 IGF0b21pY19yZWFkKCZwdC0+dXNlZCkpOworCisJCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KHB0 KTsKKwkJCW1lbXNldDY0KHZhZGRyICsgZ2VuOF9wZF9pbmRleChzdGFydCwgMCksCisJCQkJIHZt LT5zY3JhdGNoWzBdLmVuY29kZSwKKwkJCQkgY291bnQpOworCQkJa3VubWFwX2F0b21pYyh2YWRk cik7CisKKwkJCWF0b21pY19zdWIoY291bnQsICZwdC0+dXNlZCk7CisJCQlzdGFydCArPSBjb3Vu dDsKKwkJfQorCisJCWlmIChyZWxlYXNlX3BkX2VudHJ5KHBkLCBpZHgsIHB0LCBzY3JhdGNoKSkK KwkJCWZyZWVfcHgodm0sIHB0KTsKKwl9IHdoaWxlIChpZHgrKywgLS1sZW4pOworCisJcmV0dXJu IHN0YXJ0OworfQorCitzdGF0aWMgdm9pZCBnZW44X3BwZ3R0X2NsZWFyKHN0cnVjdCBpOTE1X2Fk ZHJlc3Nfc3BhY2UgKnZtLAorCQkJICAgICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCit7CisJR0VN X0JVR19PTighSVNfQUxJR05FRChzdGFydCwgQklUX1VMTChHRU44X1BURV9TSElGVCkpKTsKKwlH RU1fQlVHX09OKCFJU19BTElHTkVEKGxlbmd0aCwgQklUX1VMTChHRU44X1BURV9TSElGVCkpKTsK KwlHRU1fQlVHX09OKHJhbmdlX292ZXJmbG93cyhzdGFydCwgbGVuZ3RoLCB2bS0+dG90YWwpKTsK KworCXN0YXJ0ID4+PSBHRU44X1BURV9TSElGVDsKKwlsZW5ndGggPj49IEdFTjhfUFRFX1NISUZU OworCUdFTV9CVUdfT04obGVuZ3RoID09IDApOworCisJX19nZW44X3BwZ3R0X2NsZWFyKHZtLCBp OTE1X3ZtX3RvX3BwZ3R0KHZtKS0+cGQsCisJCQkgICBzdGFydCwgc3RhcnQgKyBsZW5ndGgsIHZt LT50b3ApOworfQorCitzdGF0aWMgaW50IF9fZ2VuOF9wcGd0dF9hbGxvYyhzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICogY29uc3Qgdm0sCisJCQkgICAgICBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVj dG9yeSAqIGNvbnN0IHBkLAorCQkJICAgICAgdTY0ICogY29uc3Qgc3RhcnQsIGNvbnN0IHU2NCBl bmQsIGludCBsdmwpCit7CisJY29uc3Qgc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoICogY29uc3Qg c2NyYXRjaCA9ICZ2bS0+c2NyYXRjaFtsdmxdOworCXN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKmFs bG9jID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaWR4LCBsZW47CisJaW50IHJldCA9IDA7CisKKwlH RU1fQlVHX09OKGVuZCA+IHZtLT50b3RhbCA+PiBHRU44X1BURV9TSElGVCk7CisKKwlsZW4gPSBn ZW44X3BkX3JhbmdlKCpzdGFydCwgZW5kLCBsdmwtLSwgJmlkeCk7CisJREJHKCIlcyglcCk6eyBs dmw6JWQsIHN0YXJ0OiVsbHgsIGVuZDolbGx4LCBpZHg6JWQsIGxlbjolZCwgdXNlZDolZCB9XG4i LAorCSAgICBfX2Z1bmNfXywgdm0sIGx2bCArIDEsICpzdGFydCwgZW5kLAorCSAgICBpZHgsIGxl biwgYXRvbWljX3JlYWQocHhfdXNlZChwZCkpKTsKKwlHRU1fQlVHX09OKCFsZW4gfHwgKGlkeCAr IGxlbiAtIDEpID4+IGdlbjhfcGRfc2hpZnQoMSkpOworCisJc3Bpbl9sb2NrKCZwZC0+bG9jayk7 CisJR0VNX0JVR19PTighYXRvbWljX3JlYWQocHhfdXNlZChwZCkpKTsgLyogTXVzdCBiZSBwaW5u ZWQhICovCisJZG8geworCQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdCA9IHBkLT5lbnRyeVtp ZHhdOworCisJCWlmICghcHQpIHsKKwkJCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7CisKKwkJCURC RygiJXMoJXApOnsgbHZsOiVkLCBpZHg6JWQgfSBhbGxvY2F0aW5nIG5ldyB0cmVlXG4iLAorCQkJ ICAgIF9fZnVuY19fLCB2bSwgbHZsICsgMSwgaWR4KTsKKworCQkJcHQgPSBmZXRjaF9hbmRfemVy bygmYWxsb2MpOworCQkJaWYgKGx2bCkgeworCQkJCWlmICghcHQpIHsKKwkJCQkJcHQgPSAmYWxs b2NfcGQodm0pLT5wdDsKKwkJCQkJaWYgKElTX0VSUihwdCkpIHsKKwkJCQkJCXJldCA9IFBUUl9F UlIocHQpOworCQkJCQkJZ290byBvdXQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlmaWxsX3B4KHB0 LCB2bS0+c2NyYXRjaFtsdmxdLmVuY29kZSk7CisJCQl9IGVsc2UgeworCQkJCWlmICghcHQpIHsK KwkJCQkJcHQgPSBhbGxvY19wdCh2bSk7CisJCQkJCWlmIChJU19FUlIocHQpKSB7CisJCQkJCQly ZXQgPSBQVFJfRVJSKHB0KTsKKwkJCQkJCWdvdG8gb3V0OworCQkJCQl9CisJCQkJfQorCisJCQkJ aWYgKGludGVsX3ZncHVfYWN0aXZlKHZtLT5pOTE1KSB8fAorCQkJCSAgICBnZW44X3B0X2NvdW50 KCpzdGFydCwgZW5kKSA8IEk5MTVfUERFUykKKwkJCQkJZmlsbF9weChwdCwgdm0tPnNjcmF0Y2hb bHZsXS5lbmNvZGUpOworCQkJfQorCisJCQlzcGluX2xvY2soJnBkLT5sb2NrKTsKKwkJCWlmIChs aWtlbHkoIXBkLT5lbnRyeVtpZHhdKSkKKwkJCQlzZXRfcGRfZW50cnkocGQsIGlkeCwgcHQpOwor CQkJZWxzZQorCQkJCWFsbG9jID0gcHQsIHB0ID0gcGQtPmVudHJ5W2lkeF07CisJCX0KKworCQlp ZiAobHZsKSB7CisJCQlhdG9taWNfaW5jKCZwdC0+dXNlZCk7CisJCQlzcGluX3VubG9jaygmcGQt PmxvY2spOworCisJCQlyZXQgPSBfX2dlbjhfcHBndHRfYWxsb2Modm0sIGFzX3BkKHB0KSwKKwkJ CQkJCSBzdGFydCwgZW5kLCBsdmwpOworCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQlpZiAo cmVsZWFzZV9wZF9lbnRyeShwZCwgaWR4LCBwdCwgc2NyYXRjaCkpCisJCQkJCWZyZWVfcHgodm0s IHB0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJc3Bpbl9sb2NrKCZwZC0+bG9jayk7CisJ CQlhdG9taWNfZGVjKCZwdC0+dXNlZCk7CisJCQlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmcHQt PnVzZWQpKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGludCBjb3VudCA9IGdlbjhfcHRfY291 bnQoKnN0YXJ0LCBlbmQpOworCisJCQlEQkcoIiVzKCVwKTp7IGx2bDolZCwgc3RhcnQ6JWxseCwg ZW5kOiVsbHgsIGlkeDolZCwgbGVuOiVkLCB1c2VkOiVkIH0gaW5zZXJ0aW5nIHB0ZVxuIiwKKwkJ CSAgICBfX2Z1bmNfXywgdm0sIGx2bCwgKnN0YXJ0LCBlbmQsCisJCQkgICAgZ2VuOF9wZF9pbmRl eCgqc3RhcnQsIDApLCBjb3VudCwKKwkJCSAgICBhdG9taWNfcmVhZCgmcHQtPnVzZWQpKTsKKwor CQkJYXRvbWljX2FkZChjb3VudCwgJnB0LT51c2VkKTsKKwkJCS8qIEFsbCBvdGhlciBwZGVzIG1h eSBiZSBzaW11bHRhbmVvdXNseSByZW1vdmVkICovCisJCQlHRU1fQlVHX09OKGF0b21pY19yZWFk KCZwdC0+dXNlZCkgPiBOQUxMT0MgKiBJOTE1X1BERVMpOworCQkJKnN0YXJ0ICs9IGNvdW50Owor CQl9CisJfSB3aGlsZSAoaWR4KyssIC0tbGVuKTsKKwlzcGluX3VubG9jaygmcGQtPmxvY2spOwor b3V0OgorCWlmIChhbGxvYykKKwkJZnJlZV9weCh2bSwgYWxsb2MpOworCXJldHVybiByZXQ7Cit9 CisKK3N0YXRpYyBpbnQgZ2VuOF9wcGd0dF9hbGxvYyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwKKwkJCSAgICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCit7CisJdTY0IGZyb207CisJaW50 IGVycjsKKworCUdFTV9CVUdfT04oIUlTX0FMSUdORUQoc3RhcnQsIEJJVF9VTEwoR0VOOF9QVEVf U0hJRlQpKSk7CisJR0VNX0JVR19PTighSVNfQUxJR05FRChsZW5ndGgsIEJJVF9VTEwoR0VOOF9Q VEVfU0hJRlQpKSk7CisJR0VNX0JVR19PTihyYW5nZV9vdmVyZmxvd3Moc3RhcnQsIGxlbmd0aCwg dm0tPnRvdGFsKSk7CisKKwlzdGFydCA+Pj0gR0VOOF9QVEVfU0hJRlQ7CisJbGVuZ3RoID4+PSBH RU44X1BURV9TSElGVDsKKwlHRU1fQlVHX09OKGxlbmd0aCA9PSAwKTsKKwlmcm9tID0gc3RhcnQ7 CisKKwllcnIgPSBfX2dlbjhfcHBndHRfYWxsb2Modm0sIGk5MTVfdm1fdG9fcHBndHQodm0pLT5w ZCwKKwkJCQkgJnN0YXJ0LCBzdGFydCArIGxlbmd0aCwgdm0tPnRvcCk7CisJaWYgKHVubGlrZWx5 KGVyciAmJiBmcm9tICE9IHN0YXJ0KSkKKwkJX19nZW44X3BwZ3R0X2NsZWFyKHZtLCBpOTE1X3Zt X3RvX3BwZ3R0KHZtKS0+cGQsCisJCQkJICAgZnJvbSwgc3RhcnQsIHZtLT50b3ApOworCisJcmV0 dXJuIGVycjsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1NjQKK2dlbjhfcHBndHRfaW5z ZXJ0X3B0ZShzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQsCisJCSAgICAgIHN0cnVjdCBpOTE1X3Bh Z2VfZGlyZWN0b3J5ICpwZHAsCisJCSAgICAgIHN0cnVjdCBzZ3RfZG1hICppdGVyLAorCQkgICAg ICB1NjQgaWR4LAorCQkgICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJ CSAgICAgIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQ7CisJ Y29uc3QgZ2VuOF9wdGVfdCBwdGVfZW5jb2RlID0gZ2VuOF9wdGVfZW5jb2RlKDAsIGNhY2hlX2xl dmVsLCBmbGFncyk7CisJZ2VuOF9wdGVfdCAqdmFkZHI7CisKKwlwZCA9IGk5MTVfcGRfZW50cnko cGRwLCBnZW44X3BkX2luZGV4KGlkeCwgMikpOworCXZhZGRyID0ga21hcF9hdG9taWNfcHgoaTkx NV9wdF9lbnRyeShwZCwgZ2VuOF9wZF9pbmRleChpZHgsIDEpKSk7CisJZG8geworCQl2YWRkcltn ZW44X3BkX2luZGV4KGlkeCwgMCldID0gcHRlX2VuY29kZSB8IGl0ZXItPmRtYTsKKworCQlpdGVy LT5kbWEgKz0gSTkxNV9HVFRfUEFHRV9TSVpFOworCQlpZiAoaXRlci0+ZG1hID49IGl0ZXItPm1h eCkgeworCQkJaXRlci0+c2cgPSBfX3NnX25leHQoaXRlci0+c2cpOworCQkJaWYgKCFpdGVyLT5z ZykgeworCQkJCWlkeCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWl0ZXItPmRtYSA9IHNn X2RtYV9hZGRyZXNzKGl0ZXItPnNnKTsKKwkJCWl0ZXItPm1heCA9IGl0ZXItPmRtYSArIGl0ZXIt PnNnLT5sZW5ndGg7CisJCX0KKworCQlpZiAoZ2VuOF9wZF9pbmRleCgrK2lkeCwgMCkgPT0gMCkg eworCQkJaWYgKGdlbjhfcGRfaW5kZXgoaWR4LCAxKSA9PSAwKSB7CisJCQkJLyogTGltaXRlZCBi eSBzZyBsZW5ndGggZm9yIDNsdmwgKi8KKwkJCQlpZiAoZ2VuOF9wZF9pbmRleChpZHgsIDIpID09 IDApCisJCQkJCWJyZWFrOworCisJCQkJcGQgPSBwZHAtPmVudHJ5W2dlbjhfcGRfaW5kZXgoaWR4 LCAyKV07CisJCQl9CisKKwkJCWt1bm1hcF9hdG9taWModmFkZHIpOworCQkJdmFkZHIgPSBrbWFw X2F0b21pY19weChpOTE1X3B0X2VudHJ5KHBkLCBnZW44X3BkX2luZGV4KGlkeCwgMSkpKTsKKwkJ fQorCX0gd2hpbGUgKDEpOworCWt1bm1hcF9hdG9taWModmFkZHIpOworCisJcmV0dXJuIGlkeDsK K30KKworc3RhdGljIHZvaWQgZ2VuOF9wcGd0dF9pbnNlcnRfaHVnZShzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKKwkJCQkgICBzdHJ1Y3Qgc2d0X2RtYSAqaXRlciwKKwkJCQkgICBlbnVtIGk5MTVfY2Fj aGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJCQkJICAgdTMyIGZsYWdzKQoreworCWNvbnN0IGdlbjhf cHRlX3QgcHRlX2VuY29kZSA9IGdlbjhfcHRlX2VuY29kZSgwLCBjYWNoZV9sZXZlbCwgZmxhZ3Mp OworCXU2NCBzdGFydCA9IHZtYS0+bm9kZS5zdGFydDsKKwlkbWFfYWRkcl90IHJlbSA9IGl0ZXIt PnNnLT5sZW5ndGg7CisKKwlHRU1fQlVHX09OKCFpOTE1X3ZtX2lzXzRsdmwodm1hLT52bSkpOwor CisJZG8geworCQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkcCA9CisJCQln ZW44X3BkcF9mb3JfcGFnZV9hZGRyZXNzKHZtYS0+dm0sIHN0YXJ0KTsKKwkJc3RydWN0IGk5MTVf cGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCA9CisJCQlpOTE1X3BkX2VudHJ5KHBkcCwgX19nZW44 X3B0ZV9pbmRleChzdGFydCwgMikpOworCQlnZW44X3B0ZV90IGVuY29kZSA9IHB0ZV9lbmNvZGU7 CisJCXVuc2lnbmVkIGludCBtYXliZV82NEsgPSAtMTsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6 ZTsKKwkJZ2VuOF9wdGVfdCAqdmFkZHI7CisJCXUxNiBpbmRleDsKKworCQlpZiAodm1hLT5wYWdl X3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpFXzJNICYmCisJCSAgICBJU19BTElHTkVEKGl0 ZXItPmRtYSwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSAmJgorCQkgICAgcmVtID49IEk5MTVfR1RU X1BBR0VfU0laRV8yTSAmJgorCQkgICAgIV9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDApKSB7CisJ CQlpbmRleCA9IF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDEpOworCQkJZW5jb2RlIHw9IEdFTjhf UERFX1BTXzJNOworCQkJcGFnZV9zaXplID0gSTkxNV9HVFRfUEFHRV9TSVpFXzJNOworCisJCQl2 YWRkciA9IGttYXBfYXRvbWljX3B4KHBkKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCBpOTE1X3Bh Z2VfdGFibGUgKnB0ID0KKwkJCQlpOTE1X3B0X2VudHJ5KHBkLCBfX2dlbjhfcHRlX2luZGV4KHN0 YXJ0LCAxKSk7CisKKwkJCWluZGV4ID0gX19nZW44X3B0ZV9pbmRleChzdGFydCwgMCk7CisJCQlw YWdlX3NpemUgPSBJOTE1X0dUVF9QQUdFX1NJWkU7CisKKwkJCWlmICghaW5kZXggJiYKKwkJCSAg ICB2bWEtPnBhZ2Vfc2l6ZXMuc2cgJiBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLICYmCisJCQkgICAg SVNfQUxJR05FRChpdGVyLT5kbWEsIEk5MTVfR1RUX1BBR0VfU0laRV82NEspICYmCisJCQkgICAg KElTX0FMSUdORUQocmVtLCBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSB8fAorCQkJICAgICByZW0g Pj0gKEk5MTVfUERFUyAtIGluZGV4KSAqIEk5MTVfR1RUX1BBR0VfU0laRSkpCisJCQkJbWF5YmVf NjRLID0gX19nZW44X3B0ZV9pbmRleChzdGFydCwgMSk7CisKKwkJCXZhZGRyID0ga21hcF9hdG9t aWNfcHgocHQpOworCQl9CisKKwkJZG8geworCQkJR0VNX0JVR19PTihpdGVyLT5zZy0+bGVuZ3Ro IDwgcGFnZV9zaXplKTsKKwkJCXZhZGRyW2luZGV4KytdID0gZW5jb2RlIHwgaXRlci0+ZG1hOwor CisJCQlzdGFydCArPSBwYWdlX3NpemU7CisJCQlpdGVyLT5kbWEgKz0gcGFnZV9zaXplOworCQkJ cmVtIC09IHBhZ2Vfc2l6ZTsKKwkJCWlmIChpdGVyLT5kbWEgPj0gaXRlci0+bWF4KSB7CisJCQkJ aXRlci0+c2cgPSBfX3NnX25leHQoaXRlci0+c2cpOworCQkJCWlmICghaXRlci0+c2cpCisJCQkJ CWJyZWFrOworCisJCQkJcmVtID0gaXRlci0+c2ctPmxlbmd0aDsKKwkJCQlpdGVyLT5kbWEgPSBz Z19kbWFfYWRkcmVzcyhpdGVyLT5zZyk7CisJCQkJaXRlci0+bWF4ID0gaXRlci0+ZG1hICsgcmVt OworCisJCQkJaWYgKG1heWJlXzY0SyAhPSAtMSAmJiBpbmRleCA8IEk5MTVfUERFUyAmJgorCQkJ CSAgICAhKElTX0FMSUdORUQoaXRlci0+ZG1hLCBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSAmJgor CQkJCSAgICAgIChJU19BTElHTkVEKHJlbSwgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgfHwKKwkJ CQkgICAgICAgcmVtID49IChJOTE1X1BERVMgLSBpbmRleCkgKiBJOTE1X0dUVF9QQUdFX1NJWkUp KSkKKwkJCQkJbWF5YmVfNjRLID0gLTE7CisKKwkJCQlpZiAodW5saWtlbHkoIUlTX0FMSUdORUQo aXRlci0+ZG1hLCBwYWdlX3NpemUpKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKHJl bSA+PSBwYWdlX3NpemUgJiYgaW5kZXggPCBJOTE1X1BERVMpOworCisJCWt1bm1hcF9hdG9taWMo dmFkZHIpOworCisJCS8qCisJCSAqIElzIGl0IHNhZmUgdG8gbWFyayB0aGUgMk0gYmxvY2sgYXMg NjRLPyAtLSBFaXRoZXIgd2UgaGF2ZQorCQkgKiBmaWxsZWQgd2hvbGUgcGFnZS10YWJsZSB3aXRo IDY0SyBlbnRyaWVzLCBvciBmaWxsZWQgcGFydCBvZgorCQkgKiBpdCBhbmQgaGF2ZSByZWFjaGVk IHRoZSBlbmQgb2YgdGhlIHNnIHRhYmxlIGFuZCB3ZSBoYXZlCisJCSAqIGVub3VnaCBwYWRkaW5n LgorCQkgKi8KKwkJaWYgKG1heWJlXzY0SyAhPSAtMSAmJgorCQkgICAgKGluZGV4ID09IEk5MTVf UERFUyB8fAorCQkgICAgIChpOTE1X3ZtX2hhc19zY3JhdGNoXzY0Syh2bWEtPnZtKSAmJgorCQkg ICAgICAhaXRlci0+c2cgJiYgSVNfQUxJR05FRCh2bWEtPm5vZGUuc3RhcnQgKworCQkJCQkgICAg ICB2bWEtPm5vZGUuc2l6ZSwKKwkJCQkJICAgICAgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSkpKSB7 CisJCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KHBkKTsKKwkJCXZhZGRyW21heWJlXzY0S10gfD0g R0VOOF9QREVfSVBTXzY0SzsKKwkJCWt1bm1hcF9hdG9taWModmFkZHIpOworCQkJcGFnZV9zaXpl ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SzsKKworCQkJLyoKKwkJCSAqIFdlIHdyaXRlIGFsbCA0 SyBwYWdlIGVudHJpZXMsIGV2ZW4gd2hlbiB1c2luZyA2NEsKKwkJCSAqIHBhZ2VzLiBJbiBvcmRl ciB0byB2ZXJpZnkgdGhhdCB0aGUgSFcgaXNuJ3QgY2hlYXRpbmcKKwkJCSAqIGJ5IHVzaW5nIHRo ZSA0SyBQVEUgaW5zdGVhZCBvZiB0aGUgNjRLIFBURSwgd2Ugd2FudAorCQkJICogdG8gcmVtb3Zl IGFsbCB0aGUgc3VycGx1cyBlbnRyaWVzLiBJZiB0aGUgSFcgc2tpcHBlZAorCQkJICogdGhlIDY0 SyBQVEUsIGl0IHdpbGwgcmVhZC93cml0ZSBpbnRvIHRoZSBzY3JhdGNoIHBhZ2UKKwkJCSAqIGlu c3RlYWQgLSB3aGljaCB3ZSBkZXRlY3QgYXMgbWlzc2luZyByZXN1bHRzIGR1cmluZworCQkJICog c2VsZnRlc3RzLgorCQkJICovCisJCQlpZiAoSTkxNV9TRUxGVEVTVF9PTkxZKHZtYS0+dm0tPnNj cnViXzY0SykpIHsKKwkJCQl1MTYgaTsKKworCQkJCWVuY29kZSA9IHZtYS0+dm0tPnNjcmF0Y2hb MF0uZW5jb2RlOworCQkJCXZhZGRyID0ga21hcF9hdG9taWNfcHgoaTkxNV9wdF9lbnRyeShwZCwg bWF5YmVfNjRLKSk7CisKKwkJCQlmb3IgKGkgPSAxOyBpIDwgaW5kZXg7IGkgKz0gMTYpCisJCQkJ CW1lbXNldDY0KHZhZGRyICsgaSwgZW5jb2RlLCAxNSk7CisKKwkJCQlrdW5tYXBfYXRvbWljKHZh ZGRyKTsKKwkJCX0KKwkJfQorCisJCXZtYS0+cGFnZV9zaXplcy5ndHQgfD0gcGFnZV9zaXplOwor CX0gd2hpbGUgKGl0ZXItPnNnKTsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9wcGd0dF9pbnNlcnQo c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkgICAgICBzdHJ1Y3QgaTkxNV92bWEg KnZtYSwKKwkJCSAgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCSAg ICAgIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaTkxNV9wcGd0dCAqIGNvbnN0IHBwZ3R0ID0gaTkx NV92bV90b19wcGd0dCh2bSk7CisJc3RydWN0IHNndF9kbWEgaXRlciA9IHNndF9kbWEodm1hKTsK KworCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuc2cgPiBJOTE1X0dUVF9QQUdFX1NJWkUpIHsKKwkJZ2Vu OF9wcGd0dF9pbnNlcnRfaHVnZSh2bWEsICZpdGVyLCBjYWNoZV9sZXZlbCwgZmxhZ3MpOworCX0g ZWxzZSAgeworCQl1NjQgaWR4ID0gdm1hLT5ub2RlLnN0YXJ0ID4+IEdFTjhfUFRFX1NISUZUOwor CisJCWRvIHsKKwkJCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGRwID0KKwkJ CQlnZW44X3BkcF9mb3JfcGFnZV9pbmRleCh2bSwgaWR4KTsKKworCQkJaWR4ID0gZ2VuOF9wcGd0 dF9pbnNlcnRfcHRlKHBwZ3R0LCBwZHAsICZpdGVyLCBpZHgsCisJCQkJCQkgICAgY2FjaGVfbGV2 ZWwsIGZsYWdzKTsKKwkJfSB3aGlsZSAoaWR4KTsKKworCQl2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ID0g STkxNV9HVFRfUEFHRV9TSVpFOworCX0KK30KKworc3RhdGljIGludCBnZW44X2luaXRfc2NyYXRj aChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlpbnQgcmV0OworCWludCBpOwor CisJLyoKKwkgKiBJZiBldmVyeWJvZHkgYWdyZWVzIHRvIG5vdCB0byB3cml0ZSBpbnRvIHRoZSBz Y3JhdGNoIHBhZ2UsCisJICogd2UgY2FuIHJldXNlIGl0IGZvciBhbGwgdm0sIGtlZXBpbmcgY29u dGV4dHMgYW5kIHByb2Nlc3NlcyBzZXBhcmF0ZS4KKwkgKi8KKwlpZiAodm0tPmhhc19yZWFkX29u bHkgJiYgdm0tPmd0LT52bSAmJiAhaTkxNV9pc19nZ3R0KHZtLT5ndC0+dm0pKSB7CisJCXN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKmNsb25lID0gdm0tPmd0LT52bTsKKworCQlHRU1fQlVHX09O KCFjbG9uZS0+aGFzX3JlYWRfb25seSk7CisKKwkJdm0tPnNjcmF0Y2hfb3JkZXIgPSBjbG9uZS0+ c2NyYXRjaF9vcmRlcjsKKwkJbWVtY3B5KHZtLT5zY3JhdGNoLCBjbG9uZS0+c2NyYXRjaCwgc2l6 ZW9mKHZtLT5zY3JhdGNoKSk7CisJCXB4X2RtYSgmdm0tPnNjcmF0Y2hbMF0pID0gMDsgLyogbm8g eGZlciBvZiBvd25lcnNoaXAgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gc2V0dXBfc2Ny YXRjaF9wYWdlKHZtLCBfX0dGUF9ISUdITUVNKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJdm0tPnNjcmF0Y2hbMF0uZW5jb2RlID0KKwkJZ2VuOF9wdGVfZW5jb2RlKHB4X2RtYSgmdm0t PnNjcmF0Y2hbMF0pLAorCQkJCUk5MTVfQ0FDSEVfTExDLCB2bS0+aGFzX3JlYWRfb25seSk7CisK Kwlmb3IgKGkgPSAxOyBpIDw9IHZtLT50b3A7IGkrKykgeworCQlpZiAodW5saWtlbHkoc2V0dXBf cGFnZV9kbWEodm0sIHB4X2Jhc2UoJnZtLT5zY3JhdGNoW2ldKSkpKQorCQkJZ290byBmcmVlX3Nj cmF0Y2g7CisKKwkJZmlsbF9weCgmdm0tPnNjcmF0Y2hbaV0sIHZtLT5zY3JhdGNoW2kgLSAxXS5l bmNvZGUpOworCQl2bS0+c2NyYXRjaFtpXS5lbmNvZGUgPQorCQkJZ2VuOF9wZGVfZW5jb2RlKHB4 X2RtYSgmdm0tPnNjcmF0Y2hbaV0pLAorCQkJCQlJOTE1X0NBQ0hFX0xMQyk7CisJfQorCisJcmV0 dXJuIDA7CisKK2ZyZWVfc2NyYXRjaDoKKwlmcmVlX3NjcmF0Y2godm0pOworCXJldHVybiAtRU5P TUVNOworfQorCitzdGF0aWMgaW50IGdlbjhfcHJlYWxsb2NhdGVfdG9wX2xldmVsX3BkcChzdHJ1 Y3QgaTkxNV9wcGd0dCAqcHBndHQpCit7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0g PSAmcHBndHQtPnZtOworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZCA9IHBwZ3R0LT5w ZDsKKwl1bnNpZ25lZCBpbnQgaWR4OworCisJR0VNX0JVR19PTih2bS0+dG9wICE9IDIpOworCUdF TV9CVUdfT04oZ2VuOF9wZF90b3BfY291bnQodm0pICE9IEdFTjhfM0xWTF9QRFBFUyk7CisKKwlm b3IgKGlkeCA9IDA7IGlkeCA8IEdFTjhfM0xWTF9QRFBFUzsgaWR4KyspIHsKKwkJc3RydWN0IGk5 MTVfcGFnZV9kaXJlY3RvcnkgKnBkZTsKKworCQlwZGUgPSBhbGxvY19wZCh2bSk7CisJCWlmIChJ U19FUlIocGRlKSkKKwkJCXJldHVybiBQVFJfRVJSKHBkZSk7CisKKwkJZmlsbF9weChwZGUsIHZt LT5zY3JhdGNoWzFdLmVuY29kZSk7CisJCXNldF9wZF9lbnRyeShwZCwgaWR4LCBwZGUpOworCQlh dG9taWNfaW5jKHB4X3VzZWQocGRlKSk7IC8qIGtlZXAgcGlubmVkICovCisJfQorCXdtYigpOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqCitn ZW44X2FsbG9jX3RvcF9wZChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwljb25z dCB1bnNpZ25lZCBpbnQgY291bnQgPSBnZW44X3BkX3RvcF9jb3VudCh2bSk7CisJc3RydWN0IGk5 MTVfcGFnZV9kaXJlY3RvcnkgKnBkOworCisJR0VNX0JVR19PTihjb3VudCA+IEFSUkFZX1NJWkUo cGQtPmVudHJ5KSk7CisKKwlwZCA9IF9fYWxsb2NfcGQob2Zmc2V0b2YodHlwZW9mKCpwZCksIGVu dHJ5W2NvdW50XSkpOworCWlmICh1bmxpa2VseSghcGQpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5P TUVNKTsKKworCWlmICh1bmxpa2VseShzZXR1cF9wYWdlX2RtYSh2bSwgcHhfYmFzZShwZCkpKSkg eworCQlrZnJlZShwZCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCWZpbGxf cGFnZV9kbWEocHhfYmFzZShwZCksIHZtLT5zY3JhdGNoW3ZtLT50b3BdLmVuY29kZSwgY291bnQp OworCWF0b21pY19pbmMocHhfdXNlZChwZCkpOyAvKiBtYXJrIGFzIHBpbm5lZCAqLworCXJldHVy biBwZDsKK30KKworLyoKKyAqIEdFTjggbGVnYWN5IHBwZ3R0IHByb2dyYW1taW5nIGlzIGFjY29t cGxpc2hlZCB0aHJvdWdoIGEgbWF4IDQgUERQIHJlZ2lzdGVycworICogd2l0aCBhIG5ldCBlZmZl Y3QgcmVzZW1ibGluZyBhIDItbGV2ZWwgcGFnZSB0YWJsZSBpbiBub3JtYWwgeDg2IHRlcm1zLiBF YWNoCisgKiBQRFAgcmVwcmVzZW50cyAxR0Igb2YgbWVtb3J5IDQgKiA1MTIgKiA1MTIgKiA0MDk2 ID0gNEdCIGxlZ2FjeSAzMmIgYWRkcmVzcworICogc3BhY2UuCisgKgorICovCitzdHJ1Y3QgaTkx NV9wcGd0dCAqZ2VuOF9wcGd0dF9jcmVhdGUoc3RydWN0IGludGVsX2d0ICpndCkKK3sKKwlzdHJ1 Y3QgaTkxNV9wcGd0dCAqcHBndHQ7CisJaW50IGVycjsKKworCXBwZ3R0ID0ga3phbGxvYyhzaXpl b2YoKnBwZ3R0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcGd0dCkKKwkJcmV0dXJuIEVSUl9QVFIo LUVOT01FTSk7CisKKwlwcGd0dF9pbml0KHBwZ3R0LCBndCk7CisJcHBndHQtPnZtLnRvcCA9IGk5 MTVfdm1faXNfNGx2bCgmcHBndHQtPnZtKSA/IDMgOiAyOworCisJLyoKKwkgKiBGcm9tIGJkdywg dGhlcmUgaXMgaHcgc3VwcG9ydCBmb3IgcmVhZC1vbmx5IHBhZ2VzIGluIHRoZSBQUEdUVC4KKwkg KgorCSAqIEdlbjExIGhhcyBIU0RFUyM6MTgwNzEzNjE4NyB1bnJlc29sdmVkLiBEaXNhYmxlIHJv IHN1cHBvcnQKKwkgKiBmb3Igbm93LgorCSAqCisJICogR2VuMTIgaGFzIGluaGVyaXRlZCB0aGUg c2FtZSByZWFkLW9ubHkgZmF1bHQgaXNzdWUgZnJvbSBnZW4xMS4KKwkgKi8KKwlwcGd0dC0+dm0u aGFzX3JlYWRfb25seSA9ICFJU19HRU5fUkFOR0UoZ3QtPmk5MTUsIDExLCAxMik7CisKKwkvKiBU aGVyZSBhcmUgb25seSBmZXcgZXhjZXB0aW9ucyBmb3IgZ2VuID49Ni4gY2h2IGFuZCBieHQuCisJ ICogQW5kIHdlIGFyZSBub3Qgc3VyZSBhYm91dCB0aGUgbGF0dGVyIHNvIHBsYXkgc2FmZSBmb3Ig bm93LgorCSAqLworCWlmIChJU19DSEVSUllWSUVXKGd0LT5pOTE1KSB8fCBJU19CUk9YVE9OKGd0 LT5pOTE1KSkKKwkJcHBndHQtPnZtLnB0X2ttYXBfd2MgPSB0cnVlOworCisJZXJyID0gZ2VuOF9p bml0X3NjcmF0Y2goJnBwZ3R0LT52bSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfZnJlZTsKKwor CXBwZ3R0LT5wZCA9IGdlbjhfYWxsb2NfdG9wX3BkKCZwcGd0dC0+dm0pOworCWlmIChJU19FUlIo cHBndHQtPnBkKSkgeworCQllcnIgPSBQVFJfRVJSKHBwZ3R0LT5wZCk7CisJCWdvdG8gZXJyX2Zy ZWVfc2NyYXRjaDsKKwl9CisKKwlpZiAoIWk5MTVfdm1faXNfNGx2bCgmcHBndHQtPnZtKSkgewor CQllcnIgPSBnZW44X3ByZWFsbG9jYXRlX3RvcF9sZXZlbF9wZHAocHBndHQpOworCQlpZiAoZXJy KQorCQkJZ290byBlcnJfZnJlZV9wZDsKKwl9CisKKwlwcGd0dC0+dm0uYmluZF9hc3luY19mbGFn cyA9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7CisJcHBndHQtPnZtLmluc2VydF9lbnRyaWVzID0gZ2Vu OF9wcGd0dF9pbnNlcnQ7CisJcHBndHQtPnZtLmFsbG9jYXRlX3ZhX3JhbmdlID0gZ2VuOF9wcGd0 dF9hbGxvYzsKKwlwcGd0dC0+dm0uY2xlYXJfcmFuZ2UgPSBnZW44X3BwZ3R0X2NsZWFyOworCisJ aWYgKGludGVsX3ZncHVfYWN0aXZlKGd0LT5pOTE1KSkKKwkJZ2VuOF9wcGd0dF9ub3RpZnlfdmd0 KHBwZ3R0LCB0cnVlKTsKKworCXBwZ3R0LT52bS5jbGVhbnVwID0gZ2VuOF9wcGd0dF9jbGVhbnVw OworCisJcmV0dXJuIHBwZ3R0OworCitlcnJfZnJlZV9wZDoKKwlfX2dlbjhfcHBndHRfY2xlYW51 cCgmcHBndHQtPnZtLCBwcGd0dC0+cGQsCisJCQkgICAgIGdlbjhfcGRfdG9wX2NvdW50KCZwcGd0 dC0+dm0pLCBwcGd0dC0+dm0udG9wKTsKK2Vycl9mcmVlX3NjcmF0Y2g6CisJZnJlZV9zY3JhdGNo KCZwcGd0dC0+dm0pOworZXJyX2ZyZWU6CisJa2ZyZWUocHBndHQpOworCXJldHVybiBFUlJfUFRS KGVycik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW44X3BwZ3R0 LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW44X3BwZ3R0LmgKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi43NmEwOGI5YzFmNWMKLS0tIC9kZXYvbnVsbAorKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9nZW44X3BwZ3R0LmgKQEAgLTAsMCArMSwxMyBAQAor LyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCAqLworLyoKKyAqIENvcHlyaWdodCDCqSAy MDIwIEludGVsIENvcnBvcmF0aW9uCisgKi8KKworI2lmbmRlZiBfX0dFTjhfUFBHVFRfSF9fCisj ZGVmaW5lIF9fR0VOOF9QUEdUVF9IX18KKworc3RydWN0IGludGVsX2d0OworCitzdHJ1Y3QgaTkx NV9wcGd0dCAqZ2VuOF9wcGd0dF9jcmVhdGUoc3RydWN0IGludGVsX2d0ICpndCk7CisKKyNlbmRp ZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ2d0dC5jIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ2d0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uYmZkZDZjMjg4ODE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ2d0dC5jCkBAIC0wLDAgKzEsMTQ5NSBAQAorLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDIwIEludGVs IENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgorCisj aW5jbHVkZSA8YXNtL3NldF9tZW1vcnkuaD4KKworI2luY2x1ZGUgImludGVsX2d0LmgiCisjaW5j bHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpOTE1X3NjYXR0ZXJsaXN0LmgiCisjaW5jbHVk ZSAiaTkxNV92Z3B1LmgiCisKKyNpbmNsdWRlICJpbnRlbF9ndHQuaCIKKworc3RhdGljIGludAor aTkxNV9nZXRfZ2d0dF92bWFfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpOworCitzdGF0aWMg dm9pZCBpOTE1X2dndHRfY29sb3JfYWRqdXN0KGNvbnN0IHN0cnVjdCBkcm1fbW1fbm9kZSAqbm9k ZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGNvbG9yLAorCQkJCSAgIHU2NCAqc3RhcnQsCisJCQkJ ICAgdTY0ICplbmQpCit7CisJaWYgKGk5MTVfbm9kZV9jb2xvcl9kaWZmZXJzKG5vZGUsIGNvbG9y KSkKKwkJKnN0YXJ0ICs9IEk5MTVfR1RUX1BBR0VfU0laRTsKKworCS8qIEFsc28gbGVhdmUgYSBz cGFjZSBiZXR3ZWVuIHRoZSB1bmFsbG9jYXRlZCByZXNlcnZlZCBub2RlIGFmdGVyIHRoZQorCSAq IEdUVCBhbmQgYW55IG9iamVjdHMgd2l0aGluIHRoZSBHVFQsIGkuZS4gd2UgdXNlIHRoZSBjb2xv ciBhZGp1c3RtZW50CisJICogdG8gaW5zZXJ0IGEgZ3VhcmQgcGFnZSB0byBwcmV2ZW50IHByZWZl dGNoZXMgY3Jvc3Npbmcgb3ZlciB0aGUKKwkgKiBHVFQgYm91bmRhcnkuCisJICovCisJbm9kZSA9 IGxpc3RfbmV4dF9lbnRyeShub2RlLCBub2RlX2xpc3QpOworCWlmIChub2RlLT5jb2xvciAhPSBj b2xvcikKKwkJKmVuZCAtPSBJOTE1X0dUVF9QQUdFX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgZ2d0 dF9pbml0X2h3KHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCit7CisJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmk5MTUgPSBnZ3R0LT52bS5pOTE1OworCisJaTkxNV9hZGRyZXNzX3NwYWNlX2luaXQo JmdndHQtPnZtLCBWTV9DTEFTU19HR1RUKTsKKworCWdndHQtPnZtLmlzX2dndHQgPSB0cnVlOwor CisJLyogT25seSBWTFYgc3VwcG9ydHMgcmVhZC1vbmx5IEdHVFQgbWFwcGluZ3MgKi8KKwlnZ3R0 LT52bS5oYXNfcmVhZF9vbmx5ID0gSVNfVkFMTEVZVklFVyhpOTE1KTsKKworCWlmICghSEFTX0xM QyhpOTE1KSAmJiAhSEFTX1BQR1RUKGk5MTUpKQorCQlnZ3R0LT52bS5tbS5jb2xvcl9hZGp1c3Qg PSBpOTE1X2dndHRfY29sb3JfYWRqdXN0OworCisJaWYgKGdndHQtPm1hcHBhYmxlX2VuZCkgewor CQlpZiAoIWlvX21hcHBpbmdfaW5pdF93YygmZ2d0dC0+aW9tYXAsCisJCQkJCWdndHQtPmdtYWRy LnN0YXJ0LAorCQkJCQlnZ3R0LT5tYXBwYWJsZV9lbmQpKSB7CisJCQlnZ3R0LT52bS5jbGVhbnVw KCZnZ3R0LT52bSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWdndHQtPm10cnIgPSBhcmNo X3BoeXNfd2NfYWRkKGdndHQtPmdtYWRyLnN0YXJ0LAorCQkJCQkgICAgICBnZ3R0LT5tYXBwYWJs ZV9lbmQpOworCX0KKworCWk5MTVfZ2d0dF9pbml0X2ZlbmNlcyhnZ3R0KTsKKworCXJldHVybiAw OworfQorCisvKioKKyAqIGk5MTVfZ2d0dF9pbml0X2h3IC0gSW5pdGlhbGl6ZSBHR1RUIGhhcmR3 YXJlCisgKiBAaTkxNTogaTkxNSBkZXZpY2UKKyAqLworaW50IGk5MTVfZ2d0dF9pbml0X2h3KHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCWludCByZXQ7CisKKwlzdGFzaF9pbml0 KCZpOTE1LT5tbS53Y19zdGFzaCk7CisKKwkvKiBOb3RlIHRoYXQgd2UgdXNlIHBhZ2UgY29sb3Vy aW5nIHRvIGVuZm9yY2UgYSBndWFyZCBwYWdlIGF0IHRoZQorCSAqIGVuZCBvZiB0aGUgYWRkcmVz cyBzcGFjZS4gVGhpcyBpcyByZXF1aXJlZCBhcyB0aGUgQ1MgbWF5IHByZWZldGNoCisJICogYmV5 b25kIHRoZSBlbmQgb2YgdGhlIGJhdGNoIGJ1ZmZlciwgYWNyb3NzIHRoZSBwYWdlIGJvdW5kYXJ5 LAorCSAqIGFuZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgR1RUIGlmIHdlIGRvIG5vdCBwcm92aWRl IGEgZ3VhcmQuCisJICovCisJcmV0ID0gZ2d0dF9pbml0X2h3KCZpOTE1LT5nZ3R0KTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIENlcnRhaW4gR2VuNSBj aGlwc2V0cyByZXF1aXJlIHJlcXVpcmUgaWRsaW5nIHRoZSBHUFUgYmVmb3JlCisgKiB1bm1hcHBp bmcgYW55dGhpbmcgZnJvbSB0aGUgR1RUIHdoZW4gVlQtZCBpcyBlbmFibGVkLgorICovCitzdGF0 aWMgYm9vbCBuZWVkc19pZGxlX21hcHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7 CisJLyogUXVlcnkgaW50ZWxfaW9tbXUgdG8gc2VlIGlmIHdlIG5lZWQgdGhlIHdvcmthcm91bmQu IFByZXN1bWFibHkgdGhhdAorCSAqIHdhcyBsb2FkZWQgZmlyc3QuCisJICovCisJcmV0dXJuIElT X0dFTihpOTE1LCA1KSAmJiBJU19NT0JJTEUoaTkxNSkgJiYgaW50ZWxfdnRkX2FjdGl2ZSgpOwor fQorCitzdGF0aWMgdm9pZCBnZ3R0X3N1c3BlbmRfbWFwcGluZ3Moc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQtPnZtLmk5MTU7 CisKKwkvKiBEb24ndCBib3RoZXIgbWVzc2luZyB3aXRoIGZhdWx0cyBwcmUgR0VONiBhcyB3ZSBo YXZlIGxpdHRsZQorCSAqIGRvY3VtZW50YXRpb24gc3VwcG9ydGluZyB0aGF0IGl0J3MgYSBnb29k IGlkZWEuCisJICovCisJaWYgKElOVEVMX0dFTihpOTE1KSA8IDYpCisJCXJldHVybjsKKworCWlu dGVsX2d0X2NoZWNrX2FuZF9jbGVhcl9mYXVsdHMoZ2d0dC0+dm0uZ3QpOworCisJZ2d0dC0+dm0u Y2xlYXJfcmFuZ2UoJmdndHQtPnZtLCAwLCBnZ3R0LT52bS50b3RhbCk7CisKKwlnZ3R0LT5pbnZh bGlkYXRlKGdndHQpOworfQorCit2b2lkIGk5MTVfZ2VtX3N1c3BlbmRfZ3R0X21hcHBpbmdzKHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQoreworCWdndHRfc3VzcGVuZF9tYXBwaW5ncygm aTkxNS0+Z2d0dCk7Cit9CisKK3ZvaWQgZ2VuNl9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVf Z2d0dCAqZ2d0dCkKK3sKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUgPSBnZ3R0LT52bS5n dC0+dW5jb3JlOworCisJc3Bpbl9sb2NrX2lycSgmdW5jb3JlLT5sb2NrKTsKKwlpbnRlbF91bmNv cmVfd3JpdGVfZncodW5jb3JlLCBHRlhfRkxTSF9DTlRMX0dFTjYsIEdGWF9GTFNIX0NOVExfRU4p OworCWludGVsX3VuY29yZV9yZWFkX2Z3KHVuY29yZSwgR0ZYX0ZMU0hfQ05UTF9HRU42KTsKKwlz cGluX3VubG9ja19pcnEoJnVuY29yZS0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGdlbjhfZ2d0 dF9pbnZhbGlkYXRlKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCit7CisJc3RydWN0IGludGVsX3Vu Y29yZSAqdW5jb3JlID0gZ2d0dC0+dm0uZ3QtPnVuY29yZTsKKworCS8qCisJICogTm90ZSB0aGF0 IGFzIGFuIHVuY2FjaGVkIG1taW8gd3JpdGUsIHRoaXMgd2lsbCBmbHVzaCB0aGUKKwkgKiBXQ0Ig b2YgdGhlIHdyaXRlcyBpbnRvIHRoZSBHR1RUIGJlZm9yZSBpdCB0cmlnZ2VycyB0aGUgaW52YWxp ZGF0ZS4KKwkgKi8KKwlpbnRlbF91bmNvcmVfd3JpdGVfZncodW5jb3JlLCBHRlhfRkxTSF9DTlRM X0dFTjYsIEdGWF9GTFNIX0NOVExfRU4pOworfQorCitzdGF0aWMgdm9pZCBndWNfZ2d0dF9pbnZh bGlkYXRlKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCit7CisJc3RydWN0IGludGVsX3VuY29yZSAq dW5jb3JlID0gZ2d0dC0+dm0uZ3QtPnVuY29yZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGdndHQtPnZtLmk5MTU7CisKKwlnZW44X2dndHRfaW52YWxpZGF0ZShnZ3R0KTsKKwor CWlmIChJTlRFTF9HRU4oaTkxNSkgPj0gMTIpCisJCWludGVsX3VuY29yZV93cml0ZV9mdyh1bmNv cmUsIEdFTjEyX0dVQ19UTEJfSU5WX0NSLAorCQkJCSAgICAgIEdFTjEyX0dVQ19UTEJfSU5WX0NS X0lOVkFMSURBVEUpOworCWVsc2UKKwkJaW50ZWxfdW5jb3JlX3dyaXRlX2Z3KHVuY29yZSwgR0VO OF9HVENSLCBHRU44X0dUQ1JfSU5WQUxJREFURSk7Cit9CisKK3N0YXRpYyB2b2lkIGdtY2hfZ2d0 dF9pbnZhbGlkYXRlKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCit7CisJaW50ZWxfZ3R0X2NoaXBz ZXRfZmx1c2goKTsKK30KKworc3RhdGljIHZvaWQgZ2VuOF9zZXRfcHRlKHZvaWQgX19pb21lbSAq YWRkciwgZ2VuOF9wdGVfdCBwdGUpCit7CisJd3JpdGVxKHB0ZSwgYWRkcik7Cit9CisKK3N0YXRp YyB2b2lkIGdlbjhfZ2d0dF9pbnNlcnRfcGFnZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2 bSwKKwkJCQkgIGRtYV9hZGRyX3QgYWRkciwKKwkJCQkgIHU2NCBvZmZzZXQsCisJCQkJICBlbnVt IGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkJICB1MzIgdW51c2VkKQoreworCXN0cnVjdCBp OTE1X2dndHQgKmdndHQgPSBpOTE1X3ZtX3RvX2dndHQodm0pOworCWdlbjhfcHRlX3QgX19pb21l bSAqcHRlID0KKwkJKGdlbjhfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIG9mZnNldCAvIEk5 MTVfR1RUX1BBR0VfU0laRTsKKworCWdlbjhfc2V0X3B0ZShwdGUsIGdlbjhfcHRlX2VuY29kZShh ZGRyLCBsZXZlbCwgMCkpOworCisJZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKK30KKworc3RhdGlj IHZvaWQgZ2VuOF9nZ3R0X2luc2VydF9lbnRyaWVzKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtLAorCQkJCSAgICAgc3RydWN0IGk5MTVfdm1hICp2bWEsCisJCQkJICAgICBlbnVtIGk5MTVf Y2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkJICAgICB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGk5MTVf Z2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2bSk7CisJc3RydWN0IHNndF9pdGVyIHNndF9p dGVyOworCWdlbjhfcHRlX3QgX19pb21lbSAqZ3R0X2VudHJpZXM7CisJY29uc3QgZ2VuOF9wdGVf dCBwdGVfZW5jb2RlID0gZ2VuOF9wdGVfZW5jb2RlKDAsIGxldmVsLCAwKTsKKwlkbWFfYWRkcl90 IGFkZHI7CisKKwkvKgorCSAqIE5vdGUgdGhhdCB3ZSBpZ25vcmUgUFRFX1JFQURfT05MWSBoZXJl LiBUaGUgY2FsbGVyIG11c3QgYmUgY2FyZWZ1bAorCSAqIG5vdCB0byBhbGxvdyB0aGUgdXNlciB0 byBvdmVycmlkZSBhY2Nlc3MgdG8gYSByZWFkIG9ubHkgcGFnZS4KKwkgKi8KKworCWd0dF9lbnRy aWVzID0gKGdlbjhfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbTsKKwlndHRfZW50cmllcyArPSB2 bWEtPm5vZGUuc3RhcnQgLyBJOTE1X0dUVF9QQUdFX1NJWkU7CisJZm9yX2VhY2hfc2d0X2RhZGRy KGFkZHIsIHNndF9pdGVyLCB2bWEtPnBhZ2VzKQorCQlnZW44X3NldF9wdGUoZ3R0X2VudHJpZXMr KywgcHRlX2VuY29kZSB8IGFkZHIpOworCisJLyoKKwkgKiBXZSB3YW50IHRvIGZsdXNoIHRoZSBU TEJzIG9ubHkgYWZ0ZXIgd2UncmUgY2VydGFpbiBhbGwgdGhlIFBURQorCSAqIHVwZGF0ZXMgaGF2 ZSBmaW5pc2hlZC4KKwkgKi8KKwlnZ3R0LT5pbnZhbGlkYXRlKGdndHQpOworfQorCitzdGF0aWMg dm9pZCBnZW42X2dndHRfaW5zZXJ0X3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0s CisJCQkJICBkbWFfYWRkcl90IGFkZHIsCisJCQkJICB1NjQgb2Zmc2V0LAorCQkJCSAgZW51bSBp OTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkJCSAgdTMyIGZsYWdzKQoreworCXN0cnVjdCBpOTE1 X2dndHQgKmdndHQgPSBpOTE1X3ZtX3RvX2dndHQodm0pOworCWdlbjZfcHRlX3QgX19pb21lbSAq cHRlID0KKwkJKGdlbjZfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIG9mZnNldCAvIEk5MTVf R1RUX1BBR0VfU0laRTsKKworCWlvd3JpdGUzMih2bS0+cHRlX2VuY29kZShhZGRyLCBsZXZlbCwg ZmxhZ3MpLCBwdGUpOworCisJZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKK30KKworLyoKKyAqIEJp bmRzIGFuIG9iamVjdCBpbnRvIHRoZSBnbG9iYWwgZ3R0IHdpdGggdGhlIHNwZWNpZmllZCBjYWNo ZSBsZXZlbC4KKyAqIFRoZSBvYmplY3Qgd2lsbCBiZSBhY2Nlc3NpYmxlIHRvIHRoZSBHUFUgdmlh IGNvbW1hbmRzIHdob3NlIG9wZXJhbmRzCisgKiByZWZlcmVuY2Ugb2Zmc2V0cyB3aXRoaW4gdGhl IGdsb2JhbCBHVFQgYXMgd2VsbCBhcyBhY2Nlc3NpYmxlIGJ5IHRoZSBHUFUKKyAqIHRocm91Z2gg dGhlIEdNQURSIG1hcHBlZCBCQVIgKGk5MTUtPm1tLmd0dC0+Z3R0KS4KKyAqLworc3RhdGljIHZv aWQgZ2VuNl9nZ3R0X2luc2VydF9lbnRyaWVzKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZt LAorCQkJCSAgICAgc3RydWN0IGk5MTVfdm1hICp2bWEsCisJCQkJICAgICBlbnVtIGk5MTVfY2Fj aGVfbGV2ZWwgbGV2ZWwsCisJCQkJICAgICB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2bSk7CisJZ2VuNl9wdGVfdCBfX2lvbWVtICplbnRy aWVzID0gKGdlbjZfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbTsKKwl1bnNpZ25lZCBpbnQgaSA9 IHZtYS0+bm9kZS5zdGFydCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKwlzdHJ1Y3Qgc2d0X2l0ZXIg aXRlcjsKKwlkbWFfYWRkcl90IGFkZHI7CisJZm9yX2VhY2hfc2d0X2RhZGRyKGFkZHIsIGl0ZXIs IHZtYS0+cGFnZXMpCisJCWlvd3JpdGUzMih2bS0+cHRlX2VuY29kZShhZGRyLCBsZXZlbCwgZmxh Z3MpLCAmZW50cmllc1tpKytdKTsKKworCS8qCisJICogV2Ugd2FudCB0byBmbHVzaCB0aGUgVExC cyBvbmx5IGFmdGVyIHdlJ3JlIGNlcnRhaW4gYWxsIHRoZSBQVEUKKwkgKiB1cGRhdGVzIGhhdmUg ZmluaXNoZWQuCisJICovCisJZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKK30KKworc3RhdGljIHZv aWQgbm9wX2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJICAg IHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKK3sKK30KKworc3RhdGljIHZvaWQgZ2VuOF9nZ3R0X2Ns ZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJCSAgdTY0IHN0YXJ0 LCB1NjQgbGVuZ3RoKQoreworCXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSBpOTE1X3ZtX3RvX2dn dHQodm0pOworCXVuc2lnbmVkIGZpcnN0X2VudHJ5ID0gc3RhcnQgLyBJOTE1X0dUVF9QQUdFX1NJ WkU7CisJdW5zaWduZWQgbnVtX2VudHJpZXMgPSBsZW5ndGggLyBJOTE1X0dUVF9QQUdFX1NJWkU7 CisJY29uc3QgZ2VuOF9wdGVfdCBzY3JhdGNoX3B0ZSA9IHZtLT5zY3JhdGNoWzBdLmVuY29kZTsK KwlnZW44X3B0ZV90IF9faW9tZW0gKmd0dF9iYXNlID0KKwkJKGdlbjhfcHRlX3QgX19pb21lbSAq KWdndHQtPmdzbSArIGZpcnN0X2VudHJ5OworCWNvbnN0IGludCBtYXhfZW50cmllcyA9IGdndHRf dG90YWxfZW50cmllcyhnZ3R0KSAtIGZpcnN0X2VudHJ5OworCWludCBpOworCisJaWYgKFdBUk4o bnVtX2VudHJpZXMgPiBtYXhfZW50cmllcywKKwkJICJGaXJzdCBlbnRyeSA9ICVkOyBOdW0gZW50 cmllcyA9ICVkIChtYXg9JWQpXG4iLAorCQkgZmlyc3RfZW50cnksIG51bV9lbnRyaWVzLCBtYXhf ZW50cmllcykpCisJCW51bV9lbnRyaWVzID0gbWF4X2VudHJpZXM7CisKKwlmb3IgKGkgPSAwOyBp IDwgbnVtX2VudHJpZXM7IGkrKykKKwkJZ2VuOF9zZXRfcHRlKCZndHRfYmFzZVtpXSwgc2NyYXRj aF9wdGUpOworfQorCitzdGF0aWMgdm9pZCBieHRfdnRkX2dndHRfd2Eoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0pCit7CisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlIGludGVybmFsIEdBTSBm aWZvIGhhcyBiZWVuIGNsZWFyZWQgb2YgYWxsIEdUVAorCSAqIHdyaXRlcyBiZWZvcmUgZXhpdGlu ZyBzdG9wX21hY2hpbmUoKS4gVGhpcyBndWFyYW50ZWVzIHRoYXQKKwkgKiBhbnkgYXBlcnR1cmUg YWNjZXNzZXMgd2FpdGluZyB0byBzdGFydCBpbiBhbm90aGVyIHByb2Nlc3MKKwkgKiBjYW5ub3Qg YmFjayB1cCBiZWhpbmQgdGhlIEdUVCB3cml0ZXMgY2F1c2luZyBhIGhhbmcuCisJICogVGhlIHJl Z2lzdGVyIGNhbiBiZSBhbnkgYXJiaXRyYXJ5IEdBTSByZWdpc3Rlci4KKwkgKi8KKwlpbnRlbF91 bmNvcmVfcG9zdGluZ19yZWFkX2Z3KHZtLT5ndC0+dW5jb3JlLCBHRlhfRkxTSF9DTlRMX0dFTjYp OworfQorCitzdHJ1Y3QgaW5zZXJ0X3BhZ2UgeworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtOworCWRtYV9hZGRyX3QgYWRkcjsKKwl1NjQgb2Zmc2V0OworCWVudW0gaTkxNV9jYWNoZV9s ZXZlbCBsZXZlbDsKK307CisKK3N0YXRpYyBpbnQgYnh0X3Z0ZF9nZ3R0X2luc2VydF9wYWdlX19j Yih2b2lkICpfYXJnKQoreworCXN0cnVjdCBpbnNlcnRfcGFnZSAqYXJnID0gX2FyZzsKKworCWdl bjhfZ2d0dF9pbnNlcnRfcGFnZShhcmctPnZtLCBhcmctPmFkZHIsIGFyZy0+b2Zmc2V0LCBhcmct PmxldmVsLCAwKTsKKwlieHRfdnRkX2dndHRfd2EoYXJnLT52bSk7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIHZvaWQgYnh0X3Z0ZF9nZ3R0X2luc2VydF9wYWdlX19CS0woc3RydWN0IGk5MTVf YWRkcmVzc19zcGFjZSAqdm0sCisJCQkJCSAgZG1hX2FkZHJfdCBhZGRyLAorCQkJCQkgIHU2NCBv ZmZzZXQsCisJCQkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkJCQkgIHUzMiB1 bnVzZWQpCit7CisJc3RydWN0IGluc2VydF9wYWdlIGFyZyA9IHsgdm0sIGFkZHIsIG9mZnNldCwg bGV2ZWwgfTsKKworCXN0b3BfbWFjaGluZShieHRfdnRkX2dndHRfaW5zZXJ0X3BhZ2VfX2NiLCAm YXJnLCBOVUxMKTsKK30KKworc3RydWN0IGluc2VydF9lbnRyaWVzIHsKKwlzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwllbnVtIGk5MTVfY2Fj aGVfbGV2ZWwgbGV2ZWw7CisJdTMyIGZsYWdzOworfTsKKworc3RhdGljIGludCBieHRfdnRkX2dn dHRfaW5zZXJ0X2VudHJpZXNfX2NiKHZvaWQgKl9hcmcpCit7CisJc3RydWN0IGluc2VydF9lbnRy aWVzICphcmcgPSBfYXJnOworCisJZ2VuOF9nZ3R0X2luc2VydF9lbnRyaWVzKGFyZy0+dm0sIGFy Zy0+dm1hLCBhcmctPmxldmVsLCBhcmctPmZsYWdzKTsKKwlieHRfdnRkX2dndHRfd2EoYXJnLT52 bSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnh0X3Z0ZF9nZ3R0X2luc2VydF9l bnRyaWVzX19CS0woc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJCSAgICAgc3Ry dWN0IGk5MTVfdm1hICp2bWEsCisJCQkJCSAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVs LAorCQkJCQkgICAgIHUzMiBmbGFncykKK3sKKwlzdHJ1Y3QgaW5zZXJ0X2VudHJpZXMgYXJnID0g eyB2bSwgdm1hLCBsZXZlbCwgZmxhZ3MgfTsKKworCXN0b3BfbWFjaGluZShieHRfdnRkX2dndHRf aW5zZXJ0X2VudHJpZXNfX2NiLCAmYXJnLCBOVUxMKTsKK30KKworc3RydWN0IGNsZWFyX3Jhbmdl IHsKKwlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bTsKKwl1NjQgc3RhcnQ7CisJdTY0IGxl bmd0aDsKK307CisKK3N0YXRpYyBpbnQgYnh0X3Z0ZF9nZ3R0X2NsZWFyX3JhbmdlX19jYih2b2lk ICpfYXJnKQoreworCXN0cnVjdCBjbGVhcl9yYW5nZSAqYXJnID0gX2FyZzsKKworCWdlbjhfZ2d0 dF9jbGVhcl9yYW5nZShhcmctPnZtLCBhcmctPnN0YXJ0LCBhcmctPmxlbmd0aCk7CisJYnh0X3Z0 ZF9nZ3R0X3dhKGFyZy0+dm0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ4dF92 dGRfZ2d0dF9jbGVhcl9yYW5nZV9fQktMKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAor CQkJCQkgIHU2NCBzdGFydCwKKwkJCQkJICB1NjQgbGVuZ3RoKQoreworCXN0cnVjdCBjbGVhcl9y YW5nZSBhcmcgPSB7IHZtLCBzdGFydCwgbGVuZ3RoIH07CisKKwlzdG9wX21hY2hpbmUoYnh0X3Z0 ZF9nZ3R0X2NsZWFyX3JhbmdlX19jYiwgJmFyZywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGdl bjZfZ2d0dF9jbGVhcl9yYW5nZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkg IHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKK3sKKwlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gaTkx NV92bV90b19nZ3R0KHZtKTsKKwl1bnNpZ25lZCBmaXJzdF9lbnRyeSA9IHN0YXJ0IC8gSTkxNV9H VFRfUEFHRV9TSVpFOworCXVuc2lnbmVkIG51bV9lbnRyaWVzID0gbGVuZ3RoIC8gSTkxNV9HVFRf UEFHRV9TSVpFOworCWdlbjZfcHRlX3Qgc2NyYXRjaF9wdGUsIF9faW9tZW0gKmd0dF9iYXNlID0K KwkJKGdlbjZfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIGZpcnN0X2VudHJ5OworCWNvbnN0 IGludCBtYXhfZW50cmllcyA9IGdndHRfdG90YWxfZW50cmllcyhnZ3R0KSAtIGZpcnN0X2VudHJ5 OworCWludCBpOworCisJaWYgKFdBUk4obnVtX2VudHJpZXMgPiBtYXhfZW50cmllcywKKwkJICJG aXJzdCBlbnRyeSA9ICVkOyBOdW0gZW50cmllcyA9ICVkIChtYXg9JWQpXG4iLAorCQkgZmlyc3Rf ZW50cnksIG51bV9lbnRyaWVzLCBtYXhfZW50cmllcykpCisJCW51bV9lbnRyaWVzID0gbWF4X2Vu dHJpZXM7CisKKwlzY3JhdGNoX3B0ZSA9IHZtLT5zY3JhdGNoWzBdLmVuY29kZTsKKwlmb3IgKGkg PSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykKKwkJaW93cml0ZTMyKHNjcmF0Y2hfcHRlLCAmZ3R0 X2Jhc2VbaV0pOworfQorCitzdGF0aWMgdm9pZCBpOTE1X2dndHRfaW5zZXJ0X3BhZ2Uoc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkJICBkbWFfYWRkcl90IGFkZHIsCisJCQkJICB1 NjQgb2Zmc2V0LAorCQkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAorCQkJ CSAgdTMyIHVudXNlZCkKK3sKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAoY2FjaGVfbGV2ZWwgPT0g STkxNV9DQUNIRV9OT05FKSA/CisJCUFHUF9VU0VSX01FTU9SWSA6IEFHUF9VU0VSX0NBQ0hFRF9N RU1PUlk7CisKKwlpbnRlbF9ndHRfaW5zZXJ0X3BhZ2UoYWRkciwgb2Zmc2V0ID4+IFBBR0VfU0hJ RlQsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaTkxNV9nZ3R0X2luc2VydF9lbnRyaWVzKHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJCSAgICAgc3RydWN0IGk5MTVfdm1hICp2 bWEsCisJCQkJICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJCQkJICAg ICB1MzIgdW51c2VkKQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IChjYWNoZV9sZXZlbCA9PSBJ OTE1X0NBQ0hFX05PTkUpID8KKwkJQUdQX1VTRVJfTUVNT1JZIDogQUdQX1VTRVJfQ0FDSEVEX01F TU9SWTsKKworCWludGVsX2d0dF9pbnNlcnRfc2dfZW50cmllcyh2bWEtPnBhZ2VzLCB2bWEtPm5v ZGUuc3RhcnQgPj4gUEFHRV9TSElGVCwKKwkJCQkgICAgZmxhZ3MpOworfQorCitzdGF0aWMgdm9p ZCBpOTE1X2dndHRfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJ CQkJICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCit7CisJaW50ZWxfZ3R0X2NsZWFyX3JhbmdlKHN0 YXJ0ID4+IFBBR0VfU0hJRlQsIGxlbmd0aCA+PiBQQUdFX1NISUZUKTsKK30KKworc3RhdGljIGlu dCBnZ3R0X2JpbmRfdm1hKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJIGVudW0gaTkxNV9jYWNo ZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCSB1MzIgZmxhZ3MpCit7CisJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUgPSB2bWEtPnZtLT5pOTE1OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmogPSB2bWEtPm9iajsKKwlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKKwl1MzIgcHRl X2ZsYWdzOworCisJLyogQXBwbGljYWJsZSB0byBWTFYgKGdlbjgrIGRvIG5vdCBzdXBwb3J0IFJP IGluIHRoZSBHR1RUKSAqLworCXB0ZV9mbGFncyA9IDA7CisJaWYgKGk5MTVfZ2VtX29iamVjdF9p c19yZWFkb25seShvYmopKQorCQlwdGVfZmxhZ3MgfD0gUFRFX1JFQURfT05MWTsKKworCXdpdGhf aW50ZWxfcnVudGltZV9wbSgmaTkxNS0+cnVudGltZV9wbSwgd2FrZXJlZikKKwkJdm1hLT52bS0+ aW5zZXJ0X2VudHJpZXModm1hLT52bSwgdm1hLCBjYWNoZV9sZXZlbCwgcHRlX2ZsYWdzKTsKKwor CXZtYS0+cGFnZV9zaXplcy5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkU7CisKKwkvKgorCSAqIFdp dGhvdXQgYWxpYXNpbmcgUFBHVFQgdGhlcmUncyBubyBkaWZmZXJlbmNlIGJldHdlZW4KKwkgKiBH TE9CQUwvTE9DQUxfQklORCwgaXQncyBhbGwgdGhlIHNhbWUgcHRlcy4gSGVuY2UgdW5jb25kaXRp b25hbGx5CisJICogdXBncmFkZSB0byBib3RoIGJvdW5kIGlmIHdlIGJpbmQgZWl0aGVyIHRvIGF2 b2lkIGRvdWJsZS1iaW5kaW5nLgorCSAqLworCWF0b21pY19vcihJOTE1X1ZNQV9HTE9CQUxfQklO RCB8IEk5MTVfVk1BX0xPQ0FMX0JJTkQsICZ2bWEtPmZsYWdzKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgdm9pZCBnZ3R0X3VuYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB2bWEtPnZtLT5pOTE1OworCWludGVsX3dh a2VyZWZfdCB3YWtlcmVmOworCisJd2l0aF9pbnRlbF9ydW50aW1lX3BtKCZpOTE1LT5ydW50aW1l X3BtLCB3YWtlcmVmKQorCQl2bWEtPnZtLT5jbGVhcl9yYW5nZSh2bWEtPnZtLCB2bWEtPm5vZGUu c3RhcnQsIHZtYS0+c2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgZ2d0dF9yZXNlcnZlX2d1Y190b3Ao c3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwl1NjQgc2l6ZTsKKwlpbnQgcmV0OworCisJaWYg KCFVU0VTX0dVQyhnZ3R0LT52bS5pOTE1KSkKKwkJcmV0dXJuIDA7CisKKwlHRU1fQlVHX09OKGdn dHQtPnZtLnRvdGFsIDw9IEdVQ19HR1RUX1RPUCk7CisJc2l6ZSA9IGdndHQtPnZtLnRvdGFsIC0g R1VDX0dHVFRfVE9QOworCisJcmV0ID0gaTkxNV9nZW1fZ3R0X3Jlc2VydmUoJmdndHQtPnZtLCAm Z2d0dC0+dWNfZncsIHNpemUsCisJCQkJICAgR1VDX0dHVFRfVE9QLCBJOTE1X0NPTE9SX1VORVZJ Q1RBQkxFLAorCQkJCSAgIFBJTl9OT0VWSUNUKTsKKwlpZiAocmV0KQorCQlEUk1fREVCVUdfRFJJ VkVSKCJGYWlsZWQgdG8gcmVzZXJ2ZSB0b3Agb2YgR0dUVCBmb3IgR3VDXG4iKTsKKworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdndHRfcmVsZWFzZV9ndWNfdG9wKHN0cnVjdCBpOTE1 X2dndHQgKmdndHQpCit7CisJaWYgKGRybV9tbV9ub2RlX2FsbG9jYXRlZCgmZ2d0dC0+dWNfZncp KQorCQlkcm1fbW1fcmVtb3ZlX25vZGUoJmdndHQtPnVjX2Z3KTsKK30KKworc3RhdGljIHZvaWQg Y2xlYW51cF9pbml0X2dndHQoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwlnZ3R0X3JlbGVh c2VfZ3VjX3RvcChnZ3R0KTsKKwlpZiAoZHJtX21tX25vZGVfYWxsb2NhdGVkKCZnZ3R0LT5lcnJv cl9jYXB0dXJlKSkKKwkJZHJtX21tX3JlbW92ZV9ub2RlKCZnZ3R0LT5lcnJvcl9jYXB0dXJlKTsK K30KKworc3RhdGljIGludCBpbml0X2dndHQoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwkv KiBMZXQgR0VNIE1hbmFnZSBhbGwgb2YgdGhlIGFwZXJ0dXJlLgorCSAqCisJICogSG93ZXZlciwg bGVhdmUgb25lIHBhZ2UgYXQgdGhlIGVuZCBzdGlsbCBib3VuZCB0byB0aGUgc2NyYXRjaCBwYWdl LgorCSAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiBwbGFjZXMgd2hlcmUgdGhlIGhhcmR3YXJlIGFw cGFyZW50bHkgcHJlZmV0Y2hlcworCSAqIHBhc3QgdGhlIGVuZCBvZiB0aGUgb2JqZWN0LCBhbmQg d2UndmUgc2VlbiBtdWx0aXBsZSBoYW5ncyB3aXRoIHRoZQorCSAqIEdQVSBoZWFkIHBvaW50ZXIg c3R1Y2sgaW4gYSBiYXRjaGJ1ZmZlciBib3VuZCBhdCB0aGUgbGFzdCBwYWdlIG9mIHRoZQorCSAq IGFwZXJ0dXJlLiAgT25lIHBhZ2Ugc2hvdWxkIGJlIGVub3VnaCB0byBrZWVwIGFueSBwcmVmZXRj aGluZyBpbnNpZGUKKwkgKiBvZiB0aGUgYXBlcnR1cmUuCisJICovCisJdW5zaWduZWQgbG9uZyBo b2xlX3N0YXJ0LCBob2xlX2VuZDsKKwlzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OworCWludCBy ZXQ7CisKKwkvKgorCSAqIEd1QyByZXF1aXJlcyBhbGwgcmVzb3VyY2VzIHRoYXQgd2UncmUgc2hh cmluZyB3aXRoIGl0IHRvIGJlIHBsYWNlZCBpbgorCSAqIG5vbi1XT1BDTSBtZW1vcnkuIElmIEd1 QyBpcyBub3QgcHJlc2VudCBvciBub3QgaW4gdXNlIHdlIHN0aWxsIG5lZWQgYQorCSAqIHNtYWxs IGJpYXMgYXMgcmluZyB3cmFwYXJvdW5kIGF0IG9mZnNldCAwIHNvbWV0aW1lcyBoYW5ncy4gTm8g aWRlYQorCSAqIHdoeS4KKwkgKi8KKwlnZ3R0LT5waW5fYmlhcyA9IG1heF90KHUzMiwgSTkxNV9H VFRfUEFHRV9TSVpFLAorCQkJICAgICAgIGludGVsX3dvcGNtX2d1Y19zaXplKCZnZ3R0LT52bS5p OTE1LT53b3BjbSkpOworCisJcmV0ID0gaW50ZWxfdmd0X2JhbGxvb24oZ2d0dCk7CisJaWYgKHJl dCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChnZ3R0LT5tYXBwYWJsZV9lbmQpIHsKKwkJLyogUmVz ZXJ2ZSBhIG1hcHBhYmxlIHNsb3QgZm9yIG91ciBsb2NrbGVzcyBlcnJvciBjYXB0dXJlICovCisJ CXJldCA9IGRybV9tbV9pbnNlcnRfbm9kZV9pbl9yYW5nZSgmZ2d0dC0+dm0ubW0sICZnZ3R0LT5l cnJvcl9jYXB0dXJlLAorCQkJCQkJICBQQUdFX1NJWkUsIDAsIEk5MTVfQ09MT1JfVU5FVklDVEFC TEUsCisJCQkJCQkgIDAsIGdndHQtPm1hcHBhYmxlX2VuZCwKKwkJCQkJCSAgRFJNX01NX0lOU0VS VF9MT1cpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFRoZSB1 cHBlciBwb3J0aW9uIG9mIHRoZSBHdUMgYWRkcmVzcyBzcGFjZSBoYXMgYSBzaXplYWJsZSBob2xl CisJICogKHNldmVyYWwgTUIpIHRoYXQgaXMgaW5hY2Nlc3NpYmxlIGJ5IEd1Qy4gUmVzZXJ2ZSB0 aGlzIHJhbmdlIHdpdGhpbgorCSAqIEdHVFQgYXMgaXQgY2FuIGNvbWZvcnRhYmx5IGhvbGQgR3VD L0h1QyBmaXJtd2FyZSBpbWFnZXMuCisJICovCisJcmV0ID0gZ2d0dF9yZXNlcnZlX2d1Y190b3Ao Z2d0dCk7CisJaWYgKHJldCkKKwkJZ290byBlcnI7CisKKwkvKiBDbGVhciBhbnkgbm9uLXByZWFs bG9jYXRlZCBibG9ja3MgKi8KKwlkcm1fbW1fZm9yX2VhY2hfaG9sZShlbnRyeSwgJmdndHQtPnZt Lm1tLCBob2xlX3N0YXJ0LCBob2xlX2VuZCkgeworCQlEUk1fREVCVUdfS01TKCJjbGVhcmluZyB1 bnVzZWQgR1RUIHNwYWNlOiBbJWx4LCAlbHhdXG4iLAorCQkJICAgICAgaG9sZV9zdGFydCwgaG9s ZV9lbmQpOworCQlnZ3R0LT52bS5jbGVhcl9yYW5nZSgmZ2d0dC0+dm0sIGhvbGVfc3RhcnQsCisJ CQkJICAgICBob2xlX2VuZCAtIGhvbGVfc3RhcnQpOworCX0KKworCS8qIEFuZCBmaW5hbGx5IGNs ZWFyIHRoZSByZXNlcnZlZCBndWFyZCBwYWdlICovCisJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UoJmdn dHQtPnZtLCBnZ3R0LT52bS50b3RhbCAtIFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKKworCXJldHVy biAwOworCitlcnI6CisJY2xlYW51cF9pbml0X2dndHQoZ2d0dCk7CisJcmV0dXJuIHJldDsKK30K Kworc3RhdGljIGludCBhbGlhc2luZ19ndHRfYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEs CisJCQkJIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCQkgdTMyIGZsYWdz KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdm1hLT52bS0+aTkxNTsKKwl1 MzIgcHRlX2ZsYWdzOworCWludCByZXQ7CisKKwkvKiBDdXJyZW50bHkgYXBwbGljYWJsZSBvbmx5 IHRvIFZMViAqLworCXB0ZV9mbGFncyA9IDA7CisJaWYgKGk5MTVfZ2VtX29iamVjdF9pc19yZWFk b25seSh2bWEtPm9iaikpCisJCXB0ZV9mbGFncyB8PSBQVEVfUkVBRF9PTkxZOworCisJaWYgKGZs YWdzICYgSTkxNV9WTUFfTE9DQUxfQklORCkgeworCQlzdHJ1Y3QgaTkxNV9wcGd0dCAqYWxpYXMg PSBpOTE1X3ZtX3RvX2dndHQodm1hLT52bSktPmFsaWFzOworCisJCWlmIChmbGFncyAmIEk5MTVf Vk1BX0FMTE9DKSB7CisJCQlyZXQgPSBhbGlhcy0+dm0uYWxsb2NhdGVfdmFfcmFuZ2UoJmFsaWFz LT52bSwKKwkJCQkJCQkgIHZtYS0+bm9kZS5zdGFydCwKKwkJCQkJCQkgIHZtYS0+c2l6ZSk7CisJ CQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCXNldF9iaXQoSTkxNV9WTUFfQUxMT0Nf QklULCBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkpOworCQl9CisKKwkJR0VNX0JVR19PTighdGVzdF9i aXQoSTkxNV9WTUFfQUxMT0NfQklULAorCQkJCSAgICAgX19pOTE1X3ZtYV9mbGFncyh2bWEpKSk7 CisJCWFsaWFzLT52bS5pbnNlcnRfZW50cmllcygmYWxpYXMtPnZtLCB2bWEsCisJCQkJCSBjYWNo ZV9sZXZlbCwgcHRlX2ZsYWdzKTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBJOTE1X1ZNQV9HTE9CQUxf QklORCkgeworCQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKKworCQl3aXRoX2ludGVsX3J1bnRp bWVfcG0oJmk5MTUtPnJ1bnRpbWVfcG0sIHdha2VyZWYpIHsKKwkJCXZtYS0+dm0tPmluc2VydF9l bnRyaWVzKHZtYS0+dm0sIHZtYSwKKwkJCQkJCWNhY2hlX2xldmVsLCBwdGVfZmxhZ3MpOworCQl9 CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFsaWFzaW5nX2d0dF91bmJpbmRf dm1hKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpp OTE1ID0gdm1hLT52bS0+aTkxNTsKKworCWlmIChpOTE1X3ZtYV9pc19ib3VuZCh2bWEsIEk5MTVf Vk1BX0dMT0JBTF9CSU5EKSkgeworCQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSA9IHZt YS0+dm07CisJCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOworCisJCXdpdGhfaW50ZWxfcnVudGlt ZV9wbSgmaTkxNS0+cnVudGltZV9wbSwgd2FrZXJlZikKKwkJCXZtLT5jbGVhcl9yYW5nZSh2bSwg dm1hLT5ub2RlLnN0YXJ0LCB2bWEtPnNpemUpOworCX0KKworCWlmICh0ZXN0X2FuZF9jbGVhcl9i aXQoSTkxNV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkpKSB7CisJCXN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0KKwkJCSZpOTE1X3ZtX3RvX2dndHQodm1hLT52bSkt PmFsaWFzLT52bTsKKworCQl2bS0+Y2xlYXJfcmFuZ2Uodm0sIHZtYS0+bm9kZS5zdGFydCwgdm1h LT5zaXplKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9hbGlhc2luZ19wcGd0dChzdHJ1Y3Qg aTkxNV9nZ3R0ICpnZ3R0KQoreworCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsKKwlpbnQgZXJy OworCisJcHBndHQgPSBpOTE1X3BwZ3R0X2NyZWF0ZShnZ3R0LT52bS5ndCk7CisJaWYgKElTX0VS UihwcGd0dCkpCisJCXJldHVybiBQVFJfRVJSKHBwZ3R0KTsKKworCWlmIChHRU1fV0FSTl9PTihw cGd0dC0+dm0udG90YWwgPCBnZ3R0LT52bS50b3RhbCkpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJ Z290byBlcnJfcHBndHQ7CisJfQorCisJLyoKKwkgKiBOb3RlIHdlIG9ubHkgcHJlLWFsbG9jYXRl IGFzIGZhciBhcyB0aGUgZW5kIG9mIHRoZSBnbG9iYWwKKwkgKiBHVFQuIE9uIDQ4YiAvIDQtbGV2 ZWwgcGFnZS10YWJsZXMsIHRoZSBkaWZmZXJlbmNlIGlzIHZlcnksCisJICogdmVyeSBzaWduaWZp Y2FudCEgV2UgaGF2ZSB0byBwcmVhbGxvY2F0ZSBhcyBHVlQvdmdwdSBkb2VzCisJICogbm90IGxp a2UgdGhlIHBhZ2UgZGlyZWN0b3J5IGRpc2FwcGVhcmluZy4KKwkgKi8KKwllcnIgPSBwcGd0dC0+ dm0uYWxsb2NhdGVfdmFfcmFuZ2UoJnBwZ3R0LT52bSwgMCwgZ2d0dC0+dm0udG90YWwpOworCWlm IChlcnIpCisJCWdvdG8gZXJyX3BwZ3R0OworCisJZ2d0dC0+YWxpYXMgPSBwcGd0dDsKKwlnZ3R0 LT52bS5iaW5kX2FzeW5jX2ZsYWdzIHw9IHBwZ3R0LT52bS5iaW5kX2FzeW5jX2ZsYWdzOworCisJ R0VNX0JVR19PTihnZ3R0LT52bS52bWFfb3BzLmJpbmRfdm1hICE9IGdndHRfYmluZF92bWEpOwor CWdndHQtPnZtLnZtYV9vcHMuYmluZF92bWEgPSBhbGlhc2luZ19ndHRfYmluZF92bWE7CisKKwlH RU1fQlVHX09OKGdndHQtPnZtLnZtYV9vcHMudW5iaW5kX3ZtYSAhPSBnZ3R0X3VuYmluZF92bWEp OworCWdndHQtPnZtLnZtYV9vcHMudW5iaW5kX3ZtYSA9IGFsaWFzaW5nX2d0dF91bmJpbmRfdm1h OworCisJcmV0dXJuIDA7CisKK2Vycl9wcGd0dDoKKwlpOTE1X3ZtX3B1dCgmcHBndHQtPnZtKTsK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBmaW5pX2FsaWFzaW5nX3BwZ3R0KHN0cnVj dCBpOTE1X2dndHQgKmdndHQpCit7CisJc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0OworCisJcHBn dHQgPSBmZXRjaF9hbmRfemVybygmZ2d0dC0+YWxpYXMpOworCWlmICghcHBndHQpCisJCXJldHVy bjsKKworCWk5MTVfdm1fcHV0KCZwcGd0dC0+dm0pOworCisJZ2d0dC0+dm0udm1hX29wcy5iaW5k X3ZtYSAgID0gZ2d0dF9iaW5kX3ZtYTsKKwlnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgPSBn Z3R0X3VuYmluZF92bWE7Cit9CisKK2ludCBpOTE1X2luaXRfZ2d0dChzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW5pdF9nZ3R0KCZpOTE1LT5n Z3R0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKElOVEVMX1BQR1RUKGk5MTUp ID09IElOVEVMX1BQR1RUX0FMSUFTSU5HKSB7CisJCXJldCA9IGluaXRfYWxpYXNpbmdfcHBndHQo Jmk5MTUtPmdndHQpOworCQlpZiAocmV0KQorCQkJY2xlYW51cF9pbml0X2dndHQoJmk5MTUtPmdn dHQpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZ3R0X2NsZWFudXBfaHco c3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgKnZuOwor CisJYXRvbWljX3NldCgmZ2d0dC0+dm0ub3BlbiwgMCk7CisKKwlyY3VfYmFycmllcigpOyAvKiBm bHVzaCB0aGUgUkNVJ2VkX19pOTE1X3ZtX3JlbGVhc2UgKi8KKwlmbHVzaF93b3JrcXVldWUoZ2d0 dC0+dm0uaTkxNS0+d3EpOworCisJbXV0ZXhfbG9jaygmZ2d0dC0+dm0ubXV0ZXgpOworCisJbGlz dF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZtYSwgdm4sICZnZ3R0LT52bS5ib3VuZF9saXN0LCB2bV9s aW5rKQorCQlXQVJOX09OKF9faTkxNV92bWFfdW5iaW5kKHZtYSkpOworCisJaWYgKGRybV9tbV9u b2RlX2FsbG9jYXRlZCgmZ2d0dC0+ZXJyb3JfY2FwdHVyZSkpCisJCWRybV9tbV9yZW1vdmVfbm9k ZSgmZ2d0dC0+ZXJyb3JfY2FwdHVyZSk7CisKKwlnZ3R0X3JlbGVhc2VfZ3VjX3RvcChnZ3R0KTsK KwlpbnRlbF92Z3RfZGViYWxsb29uKGdndHQpOworCisJZ2d0dC0+dm0uY2xlYW51cCgmZ2d0dC0+ dm0pOworCisJbXV0ZXhfdW5sb2NrKCZnZ3R0LT52bS5tdXRleCk7CisJaTkxNV9hZGRyZXNzX3Nw YWNlX2ZpbmkoJmdndHQtPnZtKTsKKworCWFyY2hfcGh5c193Y19kZWwoZ2d0dC0+bXRycik7CisK KwlpZiAoZ2d0dC0+aW9tYXAuc2l6ZSkKKwkJaW9fbWFwcGluZ19maW5pKCZnZ3R0LT5pb21hcCk7 Cit9CisKKy8qKgorICogaTkxNV9nZ3R0X2RyaXZlcl9yZWxlYXNlIC0gQ2xlYW4gdXAgR0dUVCBo YXJkd2FyZSBpbml0aWFsaXphdGlvbgorICogQGk5MTU6IGk5MTUgZGV2aWNlCisgKi8KK3ZvaWQg aTkxNV9nZ3R0X2RyaXZlcl9yZWxlYXNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQor eworCXN0cnVjdCBwYWdldmVjICpwdmVjOworCisJZmluaV9hbGlhc2luZ19wcGd0dCgmaTkxNS0+ Z2d0dCk7CisKKwlnZ3R0X2NsZWFudXBfaHcoJmk5MTUtPmdndHQpOworCisJcHZlYyA9ICZpOTE1 LT5tbS53Y19zdGFzaC5wdmVjOworCWlmIChwdmVjLT5ucikgeworCQlzZXRfcGFnZXNfYXJyYXlf d2IocHZlYy0+cGFnZXMsIHB2ZWMtPm5yKTsKKwkJX19wYWdldmVjX3JlbGVhc2UocHZlYyk7CisJ fQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGdlbjZfZ2V0X3RvdGFsX2d0dF9zaXplKHUxNiBz bmJfZ21jaF9jdGwpCit7CisJc25iX2dtY2hfY3RsID4+PSBTTkJfR01DSF9HR01TX1NISUZUOwor CXNuYl9nbWNoX2N0bCAmPSBTTkJfR01DSF9HR01TX01BU0s7CisJcmV0dXJuIHNuYl9nbWNoX2N0 bCA8PCAyMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBnZW44X2dldF90b3RhbF9ndHRfc2l6 ZSh1MTYgYmR3X2dtY2hfY3RsKQoreworCWJkd19nbWNoX2N0bCA+Pj0gQkRXX0dNQ0hfR0dNU19T SElGVDsKKwliZHdfZ21jaF9jdGwgJj0gQkRXX0dNQ0hfR0dNU19NQVNLOworCWlmIChiZHdfZ21j aF9jdGwpCisJCWJkd19nbWNoX2N0bCA9IDEgPDwgYmR3X2dtY2hfY3RsOworCisjaWZkZWYgQ09O RklHX1g4Nl8zMgorCS8qIExpbWl0IDMyYiBwbGF0Zm9ybXMgdG8gYSAyR0IgR0dUVDogNCA8PCAy MCAvIHB0ZSBzaXplICogSTkxNV9HVFRfUEFHRV9TSVpFICovCisJaWYgKGJkd19nbWNoX2N0bCA+ IDQpCisJCWJkd19nbWNoX2N0bCA9IDQ7CisjZW5kaWYKKworCXJldHVybiBiZHdfZ21jaF9jdGwg PDwgMjA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY2h2X2dldF90b3RhbF9ndHRfc2l6ZSh1 MTYgZ21jaF9jdHJsKQoreworCWdtY2hfY3RybCA+Pj0gU05CX0dNQ0hfR0dNU19TSElGVDsKKwln bWNoX2N0cmwgJj0gU05CX0dNQ0hfR0dNU19NQVNLOworCisJaWYgKGdtY2hfY3RybCkKKwkJcmV0 dXJuIDEgPDwgKDIwICsgZ21jaF9jdHJsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGdndHRfcHJvYmVfY29tbW9uKHN0cnVjdCBpOTE1X2dndHQgKmdndHQsIHU2NCBzaXplKQorewor CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKKwlzdHJ1Y3Qg cGNpX2RldiAqcGRldiA9IGk5MTUtPmRybS5wZGV2OworCXBoeXNfYWRkcl90IHBoeXNfYWRkcjsK KwlpbnQgcmV0OworCisJLyogRm9yIE1vZGVybiBHRU5zIHRoZSBQVEVzIGFuZCByZWdpc3RlciBz cGFjZSBhcmUgc3BsaXQgaW4gdGhlIEJBUiAqLworCXBoeXNfYWRkciA9IHBjaV9yZXNvdXJjZV9z dGFydChwZGV2LCAwKSArIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgLyAyOworCisJLyoKKwkg KiBPbiBCWFQrL0NOTCsgd3JpdGVzIGxhcmdlciB0aGFuIDY0IGJpdCB0byB0aGUgR1RUIHBhZ2V0 YWJsZSByYW5nZQorCSAqIHdpbGwgYmUgZHJvcHBlZC4gRm9yIFdDIG1hcHBpbmdzIGluIGdlbmVy YWwgd2UgaGF2ZSA2NCBieXRlIGJ1cnN0CisJICogd3JpdGVzIHdoZW4gdGhlIFdDIGJ1ZmZlciBp cyBmbHVzaGVkLCBzbyB3ZSBjYW4ndCB1c2UgaXQsIGJ1dCBoYXZlIHRvCisJICogcmVzb3J0IHRv IGFuIHVuY2FjaGVkIG1hcHBpbmcuIFRoZSBXQyBpc3N1ZSBpcyBlYXNpbHkgY2F1Z2h0IGJ5IHRo ZQorCSAqIHJlYWRiYWNrIGNoZWNrIHdoZW4gd3JpdGluZyBHVFQgUFRFIGVudHJpZXMuCisJICov CisJaWYgKElTX0dFTjlfTFAoaTkxNSkgfHwgSU5URUxfR0VOKGk5MTUpID49IDEwKQorCQlnZ3R0 LT5nc20gPSBpb3JlbWFwX25vY2FjaGUocGh5c19hZGRyLCBzaXplKTsKKwllbHNlCisJCWdndHQt PmdzbSA9IGlvcmVtYXBfd2MocGh5c19hZGRyLCBzaXplKTsKKwlpZiAoIWdndHQtPmdzbSkgewor CQlEUk1fRVJST1IoIkZhaWxlZCB0byBtYXAgdGhlIGdndHQgcGFnZSB0YWJsZVxuIik7CisJCXJl dHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHNldHVwX3NjcmF0Y2hfcGFnZSgmZ2d0dC0+dm0s IEdGUF9ETUEzMik7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIlNjcmF0Y2ggc2V0dXAgZmFp bGVkXG4iKTsKKwkJLyogaW91bm1hcCB3aWxsIGFsc28gZ2V0IGNhbGxlZCBhdCByZW1vdmUsIGJ1 dCBtZWggKi8KKwkJaW91bm1hcChnZ3R0LT5nc20pOworCQlyZXR1cm4gcmV0OworCX0KKworCWdn dHQtPnZtLnNjcmF0Y2hbMF0uZW5jb2RlID0KKwkJZ2d0dC0+dm0ucHRlX2VuY29kZShweF9kbWEo JmdndHQtPnZtLnNjcmF0Y2hbMF0pLAorCQkJCSAgICBJOTE1X0NBQ0hFX05PTkUsIDApOworCisJ cmV0dXJuIDA7Cit9CisKK2ludCBnZ3R0X3NldF9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkK K3sKKwlpbnQgcmV0OworCisJR0VNX0JVR19PTih2bWEtPnBhZ2VzKTsKKworCXJldCA9IGk5MTVf Z2V0X2dndHRfdm1hX3BhZ2VzKHZtYSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXZt YS0+cGFnZV9zaXplcyA9IHZtYS0+b2JqLT5tbS5wYWdlX3NpemVzOworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyB2b2lkIGdlbjZfZ21jaF9yZW1vdmUoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFj ZSAqdm0pCit7CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2bSk7 CisKKwlpb3VubWFwKGdndHQtPmdzbSk7CisJY2xlYW51cF9zY3JhdGNoX3BhZ2Uodm0pOworfQor CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHBjaV9yZXNvdXJjZShzdHJ1Y3QgcGNpX2RldiAqcGRl diwgaW50IGJhcikKK3sKKwlyZXR1cm4gKHN0cnVjdCByZXNvdXJjZSlERUZJTkVfUkVTX01FTShw Y2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgYmFyKSwKKwkJCQkJICAgICAgIHBjaV9yZXNvdXJjZV9s ZW4ocGRldiwgYmFyKSk7Cit9CisKK3N0YXRpYyBpbnQgZ2VuOF9nbWNoX3Byb2JlKHN0cnVjdCBp OTE1X2dndHQgKmdndHQpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBnZ3R0 LT52bS5pOTE1OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gaTkxNS0+ZHJtLnBkZXY7CisJdW5z aWduZWQgaW50IHNpemU7CisJdTE2IHNuYl9nbWNoX2N0bDsKKwlpbnQgZXJyOworCisJLyogVE9E TzogV2UncmUgbm90IGF3YXJlIG9mIG1hcHBhYmxlIGNvbnN0cmFpbnRzIG9uIGdlbjggeWV0ICov CisJaWYgKCFJU19ER0ZYKGk5MTUpKSB7CisJCWdndHQtPmdtYWRyID0gcGNpX3Jlc291cmNlKHBk ZXYsIDIpOworCQlnZ3R0LT5tYXBwYWJsZV9lbmQgPSByZXNvdXJjZV9zaXplKCZnZ3R0LT5nbWFk cik7CisJfQorCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzkp KTsKKwlpZiAoIWVycikKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYs IERNQV9CSVRfTUFTSygzOSkpOworCWlmIChlcnIpCisJCURSTV9FUlJPUigiQ2FuJ3Qgc2V0IERN QSBtYXNrL2NvbnNpc3RlbnQgbWFzayAoJWQpXG4iLCBlcnIpOworCisJcGNpX3JlYWRfY29uZmln X3dvcmQocGRldiwgU05CX0dNQ0hfQ1RSTCwgJnNuYl9nbWNoX2N0bCk7CisJaWYgKElTX0NIRVJS WVZJRVcoaTkxNSkpCisJCXNpemUgPSBjaHZfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9nbWNoX2N0 bCk7CisJZWxzZQorCQlzaXplID0gZ2VuOF9nZXRfdG90YWxfZ3R0X3NpemUoc25iX2dtY2hfY3Rs KTsKKworCWdndHQtPnZtLnRvdGFsID0gKHNpemUgLyBzaXplb2YoZ2VuOF9wdGVfdCkpICogSTkx NV9HVFRfUEFHRV9TSVpFOworCWdndHQtPnZtLmNsZWFudXAgPSBnZW42X2dtY2hfcmVtb3ZlOwor CWdndHQtPnZtLmluc2VydF9wYWdlID0gZ2VuOF9nZ3R0X2luc2VydF9wYWdlOworCWdndHQtPnZt LmNsZWFyX3JhbmdlID0gbm9wX2NsZWFyX3JhbmdlOworCWlmIChpbnRlbF9zY2Fub3V0X25lZWRz X3Z0ZF93YShpOTE1KSkKKwkJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UgPSBnZW44X2dndHRfY2xlYXJf cmFuZ2U7CisKKwlnZ3R0LT52bS5pbnNlcnRfZW50cmllcyA9IGdlbjhfZ2d0dF9pbnNlcnRfZW50 cmllczsKKworCS8qIFNlcmlhbGl6ZSBHVFQgdXBkYXRlcyB3aXRoIGFwZXJ0dXJlIGFjY2VzcyBv biBCWFQgaWYgVlQtZCBpcyBvbi4gKi8KKwlpZiAoaW50ZWxfZ2d0dF91cGRhdGVfbmVlZHNfdnRk X3dhKGk5MTUpIHx8CisJICAgIElTX0NIRVJSWVZJRVcoaTkxNSkgLyogZmFpbHMgd2l0aCBjb25j dXJyZW50IHVzZS91cGRhdGUgKi8pIHsKKwkJZ2d0dC0+dm0uaW5zZXJ0X2VudHJpZXMgPSBieHRf dnRkX2dndHRfaW5zZXJ0X2VudHJpZXNfX0JLTDsKKwkJZ2d0dC0+dm0uaW5zZXJ0X3BhZ2UgICAg PSBieHRfdnRkX2dndHRfaW5zZXJ0X3BhZ2VfX0JLTDsKKwkJaWYgKGdndHQtPnZtLmNsZWFyX3Jh bmdlICE9IG5vcF9jbGVhcl9yYW5nZSkKKwkJCWdndHQtPnZtLmNsZWFyX3JhbmdlID0gYnh0X3Z0 ZF9nZ3R0X2NsZWFyX3JhbmdlX19CS0w7CisJfQorCisJZ2d0dC0+aW52YWxpZGF0ZSA9IGdlbjhf Z2d0dF9pbnZhbGlkYXRlOworCisJZ2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAgICA9IGdndHRf YmluZF92bWE7CisJZ2d0dC0+dm0udm1hX29wcy51bmJpbmRfdm1hICA9IGdndHRfdW5iaW5kX3Zt YTsKKwlnZ3R0LT52bS52bWFfb3BzLnNldF9wYWdlcyAgID0gZ2d0dF9zZXRfcGFnZXM7CisJZ2d0 dC0+dm0udm1hX29wcy5jbGVhcl9wYWdlcyA9IGNsZWFyX3BhZ2VzOworCisJZ2d0dC0+dm0ucHRl X2VuY29kZSA9IGdlbjhfcHRlX2VuY29kZTsKKworCXNldHVwX3ByaXZhdGVfcGF0KGdndHQtPnZt Lmd0LT51bmNvcmUpOworCisJcmV0dXJuIGdndHRfcHJvYmVfY29tbW9uKGdndHQsIHNpemUpOwor fQorCitzdGF0aWMgdTY0IHNuYl9wdGVfZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwKKwkJCSAgZW51 bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkJICB1MzIgZmxhZ3MpCit7CisJZ2VuNl9wdGVf dCBwdGUgPSBHRU42X1BURV9WQUxJRDsKKwlwdGUgfD0gR0VONl9QVEVfQUREUl9FTkNPREUoYWRk cik7CisKKwlzd2l0Y2ggKGxldmVsKSB7CisJY2FzZSBJOTE1X0NBQ0hFX0wzX0xMQzoKKwljYXNl IEk5MTVfQ0FDSEVfTExDOgorCQlwdGUgfD0gR0VONl9QVEVfQ0FDSEVfTExDOworCQlicmVhazsK KwljYXNlIEk5MTVfQ0FDSEVfTk9ORToKKwkJcHRlIHw9IEdFTjZfUFRFX1VOQ0FDSEVEOworCQli cmVhazsKKwlkZWZhdWx0OgorCQlNSVNTSU5HX0NBU0UobGV2ZWwpOworCX0KKworCXJldHVybiBw dGU7Cit9CisKK3N0YXRpYyB1NjQgaXZiX3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAorCQkJ ICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkgIHUzMiBmbGFncykKK3sKKwlnZW42 X3B0ZV90IHB0ZSA9IEdFTjZfUFRFX1ZBTElEOworCXB0ZSB8PSBHRU42X1BURV9BRERSX0VOQ09E RShhZGRyKTsKKworCXN3aXRjaCAobGV2ZWwpIHsKKwljYXNlIEk5MTVfQ0FDSEVfTDNfTExDOgor CQlwdGUgfD0gR0VON19QVEVfQ0FDSEVfTDNfTExDOworCQlicmVhazsKKwljYXNlIEk5MTVfQ0FD SEVfTExDOgorCQlwdGUgfD0gR0VONl9QVEVfQ0FDSEVfTExDOworCQlicmVhazsKKwljYXNlIEk5 MTVfQ0FDSEVfTk9ORToKKwkJcHRlIHw9IEdFTjZfUFRFX1VOQ0FDSEVEOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlNSVNTSU5HX0NBU0UobGV2ZWwpOworCX0KKworCXJldHVybiBwdGU7Cit9CisK K3N0YXRpYyB1NjQgYnl0X3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAorCQkJICBlbnVtIGk5 MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJCQkgIHUzMiBmbGFncykKK3sKKwlnZW42X3B0ZV90IHB0 ZSA9IEdFTjZfUFRFX1ZBTElEOworCXB0ZSB8PSBHRU42X1BURV9BRERSX0VOQ09ERShhZGRyKTsK KworCWlmICghKGZsYWdzICYgUFRFX1JFQURfT05MWSkpCisJCXB0ZSB8PSBCWVRfUFRFX1dSSVRF QUJMRTsKKworCWlmIChsZXZlbCAhPSBJOTE1X0NBQ0hFX05PTkUpCisJCXB0ZSB8PSBCWVRfUFRF X1NOT09QRURfQllfQ1BVX0NBQ0hFUzsKKworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyB1NjQg aHN3X3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAorCQkJICBlbnVtIGk5MTVfY2FjaGVfbGV2 ZWwgbGV2ZWwsCisJCQkgIHUzMiBmbGFncykKK3sKKwlnZW42X3B0ZV90IHB0ZSA9IEdFTjZfUFRF X1ZBTElEOworCXB0ZSB8PSBIU1dfUFRFX0FERFJfRU5DT0RFKGFkZHIpOworCisJaWYgKGxldmVs ICE9IEk5MTVfQ0FDSEVfTk9ORSkKKwkJcHRlIHw9IEhTV19XQl9MTENfQUdFMzsKKworCXJldHVy biBwdGU7Cit9CisKK3N0YXRpYyB1NjQgaXJpc19wdGVfZW5jb2RlKGRtYV9hZGRyX3QgYWRkciwK KwkJCSAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKKwkJCSAgIHUzMiBmbGFncykKK3sK KwlnZW42X3B0ZV90IHB0ZSA9IEdFTjZfUFRFX1ZBTElEOworCXB0ZSB8PSBIU1dfUFRFX0FERFJf RU5DT0RFKGFkZHIpOworCisJc3dpdGNoIChsZXZlbCkgeworCWNhc2UgSTkxNV9DQUNIRV9OT05F OgorCQlicmVhazsKKwljYXNlIEk5MTVfQ0FDSEVfV1Q6CisJCXB0ZSB8PSBIU1dfV1RfRUxMQ19M TENfQUdFMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHRlIHw9IEhTV19XQl9FTExDX0xMQ19B R0UzOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW50IGdlbjZf Z21jaF9wcm9iZShzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGk5 MTUtPmRybS5wZGV2OworCXVuc2lnbmVkIGludCBzaXplOworCXUxNiBzbmJfZ21jaF9jdGw7CisJ aW50IGVycjsKKworCWdndHQtPmdtYWRyID0gcGNpX3Jlc291cmNlKHBkZXYsIDIpOworCWdndHQt Pm1hcHBhYmxlX2VuZCA9IHJlc291cmNlX3NpemUoJmdndHQtPmdtYWRyKTsKKworCS8qIDY0LzUx Mk1CIGlzIHRoZSBjdXJyZW50IG1pbi9tYXggd2UgYWN0dWFsbHkga25vdyBvZiwgYnV0IHRoaXMg aXMganVzdAorCSAqIGEgY29hcnNlIHNhbml0eSBjaGVjay4KKwkgKi8KKwlpZiAoZ2d0dC0+bWFw cGFibGVfZW5kIDwgKDY0PDwyMCkgfHwgZ2d0dC0+bWFwcGFibGVfZW5kID4gKDUxMjw8MjApKSB7 CisJCURSTV9FUlJPUigiVW5rbm93biBHTUFEUiBzaXplICglcGEpXG4iLCAmZ2d0dC0+bWFwcGFi bGVfZW5kKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwllcnIgPSBwY2lfc2V0X2RtYV9tYXNr KHBkZXYsIERNQV9CSVRfTUFTSyg0MCkpOworCWlmICghZXJyKQorCQllcnIgPSBwY2lfc2V0X2Nv bnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDQwKSk7CisJaWYgKGVycikKKwkJ RFJNX0VSUk9SKCJDYW4ndCBzZXQgRE1BIG1hc2svY29uc2lzdGVudCBtYXNrICglZClcbiIsIGVy cik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgU05CX0dNQ0hfQ1RSTCwgJnNuYl9nbWNo X2N0bCk7CisKKwlzaXplID0gZ2VuNl9nZXRfdG90YWxfZ3R0X3NpemUoc25iX2dtY2hfY3RsKTsK KwlnZ3R0LT52bS50b3RhbCA9IChzaXplIC8gc2l6ZW9mKGdlbjZfcHRlX3QpKSAqIEk5MTVfR1RU X1BBR0VfU0laRTsKKworCWdndHQtPnZtLmNsZWFyX3JhbmdlID0gbm9wX2NsZWFyX3JhbmdlOwor CWlmICghSEFTX0ZVTExfUFBHVFQoaTkxNSkgfHwgaW50ZWxfc2Nhbm91dF9uZWVkc192dGRfd2Eo aTkxNSkpCisJCWdndHQtPnZtLmNsZWFyX3JhbmdlID0gZ2VuNl9nZ3R0X2NsZWFyX3JhbmdlOwor CWdndHQtPnZtLmluc2VydF9wYWdlID0gZ2VuNl9nZ3R0X2luc2VydF9wYWdlOworCWdndHQtPnZt Lmluc2VydF9lbnRyaWVzID0gZ2VuNl9nZ3R0X2luc2VydF9lbnRyaWVzOworCWdndHQtPnZtLmNs ZWFudXAgPSBnZW42X2dtY2hfcmVtb3ZlOworCisJZ2d0dC0+aW52YWxpZGF0ZSA9IGdlbjZfZ2d0 dF9pbnZhbGlkYXRlOworCisJaWYgKEhBU19FRFJBTShpOTE1KSkKKwkJZ2d0dC0+dm0ucHRlX2Vu Y29kZSA9IGlyaXNfcHRlX2VuY29kZTsKKwllbHNlIGlmIChJU19IQVNXRUxMKGk5MTUpKQorCQln Z3R0LT52bS5wdGVfZW5jb2RlID0gaHN3X3B0ZV9lbmNvZGU7CisJZWxzZSBpZiAoSVNfVkFMTEVZ VklFVyhpOTE1KSkKKwkJZ2d0dC0+dm0ucHRlX2VuY29kZSA9IGJ5dF9wdGVfZW5jb2RlOworCWVs c2UgaWYgKElOVEVMX0dFTihpOTE1KSA+PSA3KQorCQlnZ3R0LT52bS5wdGVfZW5jb2RlID0gaXZi X3B0ZV9lbmNvZGU7CisJZWxzZQorCQlnZ3R0LT52bS5wdGVfZW5jb2RlID0gc25iX3B0ZV9lbmNv ZGU7CisKKwlnZ3R0LT52bS52bWFfb3BzLmJpbmRfdm1hICAgID0gZ2d0dF9iaW5kX3ZtYTsKKwln Z3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgID0gZ2d0dF91bmJpbmRfdm1hOworCWdndHQtPnZt LnZtYV9vcHMuc2V0X3BhZ2VzICAgPSBnZ3R0X3NldF9wYWdlczsKKwlnZ3R0LT52bS52bWFfb3Bz LmNsZWFyX3BhZ2VzID0gY2xlYXJfcGFnZXM7CisKKwlyZXR1cm4gZ2d0dF9wcm9iZV9jb21tb24o Z2d0dCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGk5MTVfZ21jaF9yZW1vdmUoc3RydWN0IGk5 MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJaW50ZWxfZ21jaF9yZW1vdmUoKTsKK30KKworc3Rh dGljIGludCBpOTE1X2dtY2hfcHJvYmUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQtPnZtLmk5MTU7CisJcGh5c19hZGRyX3Qg Z21hZHJfYmFzZTsKKwlpbnQgcmV0OworCisJcmV0ID0gaW50ZWxfZ21jaF9wcm9iZShpOTE1LT5i cmlkZ2VfZGV2LCBpOTE1LT5kcm0ucGRldiwgTlVMTCk7CisJaWYgKCFyZXQpIHsKKwkJRFJNX0VS Uk9SKCJmYWlsZWQgdG8gc2V0IHVwIGdtY2hcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlp bnRlbF9ndHRfZ2V0KCZnZ3R0LT52bS50b3RhbCwgJmdtYWRyX2Jhc2UsICZnZ3R0LT5tYXBwYWJs ZV9lbmQpOworCisJZ2d0dC0+Z21hZHIgPQorCQkoc3RydWN0IHJlc291cmNlKURFRklORV9SRVNf TUVNKGdtYWRyX2Jhc2UsIGdndHQtPm1hcHBhYmxlX2VuZCk7CisKKwlnZ3R0LT5kb19pZGxlX21h cHMgPSBuZWVkc19pZGxlX21hcHMoaTkxNSk7CisJZ2d0dC0+dm0uaW5zZXJ0X3BhZ2UgPSBpOTE1 X2dndHRfaW5zZXJ0X3BhZ2U7CisJZ2d0dC0+dm0uaW5zZXJ0X2VudHJpZXMgPSBpOTE1X2dndHRf aW5zZXJ0X2VudHJpZXM7CisJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UgPSBpOTE1X2dndHRfY2xlYXJf cmFuZ2U7CisJZ2d0dC0+dm0uY2xlYW51cCA9IGk5MTVfZ21jaF9yZW1vdmU7CisKKwlnZ3R0LT5p bnZhbGlkYXRlID0gZ21jaF9nZ3R0X2ludmFsaWRhdGU7CisKKwlnZ3R0LT52bS52bWFfb3BzLmJp bmRfdm1hICAgID0gZ2d0dF9iaW5kX3ZtYTsKKwlnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEg ID0gZ2d0dF91bmJpbmRfdm1hOworCWdndHQtPnZtLnZtYV9vcHMuc2V0X3BhZ2VzICAgPSBnZ3R0 X3NldF9wYWdlczsKKwlnZ3R0LT52bS52bWFfb3BzLmNsZWFyX3BhZ2VzID0gY2xlYXJfcGFnZXM7 CisKKwlpZiAodW5saWtlbHkoZ2d0dC0+ZG9faWRsZV9tYXBzKSkKKwkJZGV2X25vdGljZShpOTE1 LT5kcm0uZGV2LAorCQkJICAgIkFwcGx5aW5nIElyb25sYWtlIHF1aXJrcyBmb3IgaW50ZWxfaW9t bXVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2d0dF9wcm9iZV9odyhzdHJ1 Y3QgaTkxNV9nZ3R0ICpnZ3R0LCBzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQoreworCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5MTU7CisJaW50IHJldDsKKworCWdndHQtPnZtLmd0 ID0gZ3Q7CisJZ2d0dC0+dm0uaTkxNSA9IGk5MTU7CisJZ2d0dC0+dm0uZG1hID0gJmk5MTUtPmRy bS5wZGV2LT5kZXY7CisKKwlpZiAoSU5URUxfR0VOKGk5MTUpIDw9IDUpCisJCXJldCA9IGk5MTVf Z21jaF9wcm9iZShnZ3R0KTsKKwllbHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPCA4KQorCQlyZXQg PSBnZW42X2dtY2hfcHJvYmUoZ2d0dCk7CisJZWxzZQorCQlyZXQgPSBnZW44X2dtY2hfcHJvYmUo Z2d0dCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmICgoZ2d0dC0+dm0udG90YWwg LSAxKSA+PiAzMikgeworCQlEUk1fRVJST1IoIldlIG5ldmVyIGV4cGVjdGVkIGEgR2xvYmFsIEdU VCB3aXRoIG1vcmUgdGhhbiAzMmJpdHMiCisJCQkgICIgb2YgYWRkcmVzcyBzcGFjZSEgRm91bmQg JWxsZE0hXG4iLAorCQkJICBnZ3R0LT52bS50b3RhbCA+PiAyMCk7CisJCWdndHQtPnZtLnRvdGFs ID0gMVVMTCA8PCAzMjsKKwkJZ2d0dC0+bWFwcGFibGVfZW5kID0KKwkJCW1pbl90KHU2NCwgZ2d0 dC0+bWFwcGFibGVfZW5kLCBnZ3R0LT52bS50b3RhbCk7CisJfQorCisJaWYgKGdndHQtPm1hcHBh YmxlX2VuZCA+IGdndHQtPnZtLnRvdGFsKSB7CisJCURSTV9FUlJPUigibWFwcGFibGUgYXBlcnR1 cmUgZXh0ZW5kcyBwYXN0IGVuZCBvZiBHR1RULCIKKwkJCSAgIiBhcGVydHVyZT0lcGEsIHRvdGFs PSVsbHhcbiIsCisJCQkgICZnZ3R0LT5tYXBwYWJsZV9lbmQsIGdndHQtPnZtLnRvdGFsKTsKKwkJ Z2d0dC0+bWFwcGFibGVfZW5kID0gZ2d0dC0+dm0udG90YWw7CisJfQorCisJLyogR01BRFIgaXMg dGhlIFBDSSBtbWlvIGFwZXJ0dXJlIGludG8gdGhlIGdsb2JhbCBHVFQuICovCisJRFJNX0RFQlVH X0RSSVZFUigiR0dUVCBzaXplID0gJWxsdU1cbiIsIGdndHQtPnZtLnRvdGFsID4+IDIwKTsKKwlE Uk1fREVCVUdfRFJJVkVSKCJHTUFEUiBzaXplID0gJWxsdU1cbiIsICh1NjQpZ2d0dC0+bWFwcGFi bGVfZW5kID4+IDIwKTsKKwlEUk1fREVCVUdfRFJJVkVSKCJEU00gc2l6ZSA9ICVsbHVNXG4iLAor CQkJICh1NjQpcmVzb3VyY2Vfc2l6ZSgmaW50ZWxfZ3JhcGhpY3Nfc3RvbGVuX3JlcykgPj4gMjAp OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaTkxNV9nZ3R0X3Byb2JlX2h3IC0gUHJvYmUg R0dUVCBoYXJkd2FyZSBsb2NhdGlvbgorICogQGk5MTU6IGk5MTUgZGV2aWNlCisgKi8KK2ludCBp OTE1X2dndHRfcHJvYmVfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7CisJaW50 IHJldDsKKworCXJldCA9IGdndHRfcHJvYmVfaHcoJmk5MTUtPmdndHQsICZpOTE1LT5ndCk7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpbnRlbF92dGRfYWN0aXZlKCkpCisJCWRl dl9pbmZvKGk5MTUtPmRybS5kZXYsICJWVC1kIGFjdGl2ZSBmb3IgZ2Z4IGFjY2Vzc1xuIik7CisK KwlyZXR1cm4gMDsKK30KKworaW50IGk5MTVfZ2d0dF9lbmFibGVfaHcoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUpCit7CisJaWYgKElOVEVMX0dFTihpOTE1KSA8IDYgJiYgIWludGVsX2Vu YWJsZV9ndHQoKSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpOTE1 X2dndHRfZW5hYmxlX2d1YyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCUdFTV9CVUdfT04o Z2d0dC0+aW52YWxpZGF0ZSAhPSBnZW44X2dndHRfaW52YWxpZGF0ZSk7CisKKwlnZ3R0LT5pbnZh bGlkYXRlID0gZ3VjX2dndHRfaW52YWxpZGF0ZTsKKworCWdndHQtPmludmFsaWRhdGUoZ2d0dCk7 Cit9CisKK3ZvaWQgaTkxNV9nZ3R0X2Rpc2FibGVfZ3VjKHN0cnVjdCBpOTE1X2dndHQgKmdndHQp Cit7CisJLyogWFhYIFRlbXBvcmFyeSBwYXJkb24gZm9yIGVycm9yIHVubG9hZCAqLworCWlmIChn Z3R0LT5pbnZhbGlkYXRlID09IGdlbjhfZ2d0dF9pbnZhbGlkYXRlKQorCQlyZXR1cm47CisKKwkv KiBXZSBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgaTkxNV9nZ3R0X2VuYWJsZV9ndWMoKSAq LworCUdFTV9CVUdfT04oZ2d0dC0+aW52YWxpZGF0ZSAhPSBndWNfZ2d0dF9pbnZhbGlkYXRlKTsK KworCWdndHQtPmludmFsaWRhdGUgPSBnZW44X2dndHRfaW52YWxpZGF0ZTsKKworCWdndHQtPmlu dmFsaWRhdGUoZ2d0dCk7Cit9CisKK3N0YXRpYyB2b2lkIGdndHRfcmVzdG9yZV9tYXBwaW5ncyhz dHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQoreworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hLCAqdm47CisJ Ym9vbCBmbHVzaCA9IGZhbHNlOworCWludCBvcGVuOworCisJaW50ZWxfZ3RfY2hlY2tfYW5kX2Ns ZWFyX2ZhdWx0cyhnZ3R0LT52bS5ndCk7CisKKwltdXRleF9sb2NrKCZnZ3R0LT52bS5tdXRleCk7 CisKKwkvKiBGaXJzdCBmaWxsIG91ciBwb3J0aW9uIG9mIHRoZSBHVFQgd2l0aCBzY3JhdGNoIHBh Z2VzICovCisJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UoJmdndHQtPnZtLCAwLCBnZ3R0LT52bS50b3Rh bCk7CisKKwkvKiBTa2lwIHJld3JpdGluZyBQVEUgb24gVk1BIHVuYmluZC4gKi8KKwlvcGVuID0g YXRvbWljX3hjaGcoJmdndHQtPnZtLm9wZW4sIDApOworCisJLyogY2xmbHVzaCBvYmplY3RzIGJv dW5kIGludG8gdGhlIEdHVFQgYW5kIHJlYmluZCB0aGVtLiAqLworCWxpc3RfZm9yX2VhY2hfZW50 cnlfc2FmZSh2bWEsIHZuLCAmZ2d0dC0+dm0uYm91bmRfbGlzdCwgdm1fbGluaykgeworCQlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7CisKKwkJaWYgKCFpOTE1X3Zt YV9pc19ib3VuZCh2bWEsIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSkKKwkJCWNvbnRpbnVlOworCisJ CWlmICghX19pOTE1X3ZtYV91bmJpbmQodm1hKSkKKwkJCWNvbnRpbnVlOworCisJCWNsZWFyX2Jp dChJOTE1X1ZNQV9HTE9CQUxfQklORF9CSVQsIF9faTkxNV92bWFfZmxhZ3Modm1hKSk7CisJCVdB Uk5fT04oaTkxNV92bWFfYmluZCh2bWEsCisJCQkJICAgICAgb2JqID8gb2JqLT5jYWNoZV9sZXZl bCA6IDAsCisJCQkJICAgICAgUElOX0dMT0JBTCwgTlVMTCkpOworCQlpZiAob2JqKSB7IC8qIG9u bHkgdXNlZCBkdXJpbmcgcmVzdW1lID0+IGV4Y2x1c2l2ZSBhY2Nlc3MgKi8KKwkJCWZsdXNoIHw9 IGZldGNoX2FuZF96ZXJvKCZvYmotPndyaXRlX2RvbWFpbik7CisJCQlvYmotPnJlYWRfZG9tYWlu cyB8PSBJOTE1X0dFTV9ET01BSU5fR1RUOworCQl9CisJfQorCisJYXRvbWljX3NldCgmZ2d0dC0+ dm0ub3Blbiwgb3Blbik7CisJZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKKworCW11dGV4X3VubG9j aygmZ2d0dC0+dm0ubXV0ZXgpOworCisJaWYgKGZsdXNoKQorCQl3YmludmRfb25fYWxsX2NwdXMo KTsKK30KKwordm9pZCBpOTE1X2dlbV9yZXN0b3JlX2d0dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gJmk5MTUtPmdn dHQ7CisKKwlnZ3R0X3Jlc3RvcmVfbWFwcGluZ3MoZ2d0dCk7CisKKwlpZiAoSU5URUxfR0VOKGk5 MTUpID49IDgpCisJCXNldHVwX3ByaXZhdGVfcGF0KGdndHQtPnZtLmd0LT51bmNvcmUpOworfQor CitzdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICoKK3JvdGF0ZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAorCSAgICAgdW5zaWduZWQg aW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LAorCSAgICAgdW5zaWduZWQgaW50IHN0cmlk ZSwKKwkgICAgIHN0cnVjdCBzZ190YWJsZSAqc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7 CisJdW5zaWduZWQgaW50IGNvbHVtbiwgcm93OworCXVuc2lnbmVkIGludCBzcmNfaWR4OworCisJ Zm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsKKwkJc3JjX2lkeCA9 IHN0cmlkZSAqIChoZWlnaHQgLSAxKSArIGNvbHVtbiArIG9mZnNldDsKKwkJZm9yIChyb3cgPSAw OyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisJCQlzdC0+bmVudHMrKzsKKwkJCS8qIFdlIGRvbid0 IG5lZWQgdGhlIHBhZ2VzLCBidXQgbmVlZCB0byBpbml0aWFsaXplCisJCQkgKiB0aGUgZW50cmll cyBzbyB0aGUgc2cgbGlzdCBjYW4gYmUgaGFwcGlseSB0cmF2ZXJzZWQuCisJCQkgKiBUaGUgb25s eSB0aGluZyB3ZSBuZWVkIGFyZSBETUEgYWRkcmVzc2VzLgorCQkJICovCisJCQlzZ19zZXRfcGFn ZShzZywgTlVMTCwgSTkxNV9HVFRfUEFHRV9TSVpFLCAwKTsKKwkJCXNnX2RtYV9hZGRyZXNzKHNn KSA9CisJCQkJaTkxNV9nZW1fb2JqZWN0X2dldF9kbWFfYWRkcmVzcyhvYmosIHNyY19pZHgpOwor CQkJc2dfZG1hX2xlbihzZykgPSBJOTE1X0dUVF9QQUdFX1NJWkU7CisJCQlzZyA9IHNnX25leHQo c2cpOworCQkJc3JjX2lkeCAtPSBzdHJpZGU7CisJCX0KKwl9CisKKwlyZXR1cm4gc2c7Cit9CisK K3N0YXRpYyBub2lubGluZSBzdHJ1Y3Qgc2dfdGFibGUgKgoraW50ZWxfcm90YXRlX3BhZ2VzKHN0 cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvICpyb3RfaW5mbywKKwkJICAgc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iaikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGludGVsX3JvdGF0aW9u X2luZm9fc2l6ZShyb3RfaW5mbyk7CisJc3RydWN0IHNnX3RhYmxlICpzdDsKKwlzdHJ1Y3Qgc2Nh dHRlcmxpc3QgKnNnOworCWludCByZXQgPSAtRU5PTUVNOworCWludCBpOworCisJLyogQWxsb2Nh dGUgdGFyZ2V0IFNHIGxpc3QuICovCisJc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VS TkVMKTsKKwlpZiAoIXN0KQorCQlnb3RvIGVycl9zdF9hbGxvYzsKKworCXJldCA9IHNnX2FsbG9j X3RhYmxlKHN0LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9zZ19h bGxvYzsKKworCXN0LT5uZW50cyA9IDA7CisJc2cgPSBzdC0+c2dsOworCisJZm9yIChpID0gMCA7 IGkgPCBBUlJBWV9TSVpFKHJvdF9pbmZvLT5wbGFuZSk7IGkrKykgeworCQlzZyA9IHJvdGF0ZV9w YWdlcyhvYmosIHJvdF9pbmZvLT5wbGFuZVtpXS5vZmZzZXQsCisJCQkJICByb3RfaW5mby0+cGxh bmVbaV0ud2lkdGgsIHJvdF9pbmZvLT5wbGFuZVtpXS5oZWlnaHQsCisJCQkJICByb3RfaW5mby0+ cGxhbmVbaV0uc3RyaWRlLCBzdCwgc2cpOworCX0KKworCXJldHVybiBzdDsKKworZXJyX3NnX2Fs bG9jOgorCWtmcmVlKHN0KTsKK2Vycl9zdF9hbGxvYzoKKworCURSTV9ERUJVR19EUklWRVIoIkZh aWxlZCB0byBjcmVhdGUgcm90YXRlZCBtYXBwaW5nIGZvciBvYmplY3Qgc2l6ZSAlenUhICgldXgl dSB0aWxlcywgJXUgcGFnZXMpXG4iLAorCQkJIG9iai0+YmFzZS5zaXplLCByb3RfaW5mby0+cGxh bmVbMF0ud2lkdGgsIHJvdF9pbmZvLT5wbGFuZVswXS5oZWlnaHQsIHNpemUpOworCisJcmV0dXJu IEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIHN0cnVjdCBzY2F0dGVybGlzdCAqCityZW1hcF9w YWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1bnNpZ25lZCBpbnQgb2Zmc2V0 LAorCSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsCisJICAgIHVu c2lnbmVkIGludCBzdHJpZGUsCisJICAgIHN0cnVjdCBzZ190YWJsZSAqc3QsIHN0cnVjdCBzY2F0 dGVybGlzdCAqc2cpCit7CisJdW5zaWduZWQgaW50IHJvdzsKKworCWZvciAocm93ID0gMDsgcm93 IDwgaGVpZ2h0OyByb3crKykgeworCQl1bnNpZ25lZCBpbnQgbGVmdCA9IHdpZHRoICogSTkxNV9H VFRfUEFHRV9TSVpFOworCisJCXdoaWxlIChsZWZ0KSB7CisJCQlkbWFfYWRkcl90IGFkZHI7CisJ CQl1bnNpZ25lZCBpbnQgbGVuZ3RoOworCisJCQkvKiBXZSBkb24ndCBuZWVkIHRoZSBwYWdlcywg YnV0IG5lZWQgdG8gaW5pdGlhbGl6ZQorCQkJICogdGhlIGVudHJpZXMgc28gdGhlIHNnIGxpc3Qg Y2FuIGJlIGhhcHBpbHkgdHJhdmVyc2VkLgorCQkJICogVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCBh cmUgRE1BIGFkZHJlc3Nlcy4KKwkJCSAqLworCisJCQlhZGRyID0gaTkxNV9nZW1fb2JqZWN0X2dl dF9kbWFfYWRkcmVzc19sZW4ob2JqLCBvZmZzZXQsICZsZW5ndGgpOworCisJCQlsZW5ndGggPSBt aW4obGVmdCwgbGVuZ3RoKTsKKworCQkJc3QtPm5lbnRzKys7CisKKwkJCXNnX3NldF9wYWdlKHNn LCBOVUxMLCBsZW5ndGgsIDApOworCQkJc2dfZG1hX2FkZHJlc3Moc2cpID0gYWRkcjsKKwkJCXNn X2RtYV9sZW4oc2cpID0gbGVuZ3RoOworCQkJc2cgPSBzZ19uZXh0KHNnKTsKKworCQkJb2Zmc2V0 ICs9IGxlbmd0aCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKKwkJCWxlZnQgLT0gbGVuZ3RoOworCQl9 CisKKwkJb2Zmc2V0ICs9IHN0cmlkZSAtIHdpZHRoOworCX0KKworCXJldHVybiBzZzsKK30KKwor c3RhdGljIG5vaW5saW5lIHN0cnVjdCBzZ190YWJsZSAqCitpbnRlbF9yZW1hcF9wYWdlcyhzdHJ1 Y3QgaW50ZWxfcmVtYXBwZWRfaW5mbyAqcmVtX2luZm8sCisJCSAgc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaikKK3sKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGludGVsX3JlbWFwcGVkX2lu Zm9fc2l6ZShyZW1faW5mbyk7CisJc3RydWN0IHNnX3RhYmxlICpzdDsKKwlzdHJ1Y3Qgc2NhdHRl cmxpc3QgKnNnOworCWludCByZXQgPSAtRU5PTUVNOworCWludCBpOworCisJLyogQWxsb2NhdGUg dGFyZ2V0IFNHIGxpc3QuICovCisJc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVM KTsKKwlpZiAoIXN0KQorCQlnb3RvIGVycl9zdF9hbGxvYzsKKworCXJldCA9IHNnX2FsbG9jX3Rh YmxlKHN0LCBzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9zZ19hbGxv YzsKKworCXN0LT5uZW50cyA9IDA7CisJc2cgPSBzdC0+c2dsOworCisJZm9yIChpID0gMCA7IGkg PCBBUlJBWV9TSVpFKHJlbV9pbmZvLT5wbGFuZSk7IGkrKykgeworCQlzZyA9IHJlbWFwX3BhZ2Vz KG9iaiwgcmVtX2luZm8tPnBsYW5lW2ldLm9mZnNldCwKKwkJCQkgcmVtX2luZm8tPnBsYW5lW2ld LndpZHRoLCByZW1faW5mby0+cGxhbmVbaV0uaGVpZ2h0LAorCQkJCSByZW1faW5mby0+cGxhbmVb aV0uc3RyaWRlLCBzdCwgc2cpOworCX0KKworCWk5MTVfc2dfdHJpbShzdCk7CisKKwlyZXR1cm4g c3Q7CisKK2Vycl9zZ19hbGxvYzoKKwlrZnJlZShzdCk7CitlcnJfc3RfYWxsb2M6CisKKwlEUk1f REVCVUdfRFJJVkVSKCJGYWlsZWQgdG8gY3JlYXRlIHJlbWFwcGVkIG1hcHBpbmcgZm9yIG9iamVj dCBzaXplICV6dSEgKCV1eCV1IHRpbGVzLCAldSBwYWdlcylcbiIsCisJCQkgb2JqLT5iYXNlLnNp emUsIHJlbV9pbmZvLT5wbGFuZVswXS53aWR0aCwgcmVtX2luZm8tPnBsYW5lWzBdLmhlaWdodCwg c2l6ZSk7CisKKwlyZXR1cm4gRVJSX1BUUihyZXQpOworfQorCitzdGF0aWMgbm9pbmxpbmUgc3Ry dWN0IHNnX3RhYmxlICoKK2ludGVsX3BhcnRpYWxfcGFnZXMoY29uc3Qgc3RydWN0IGk5MTVfZ2d0 dF92aWV3ICp2aWV3LAorCQkgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sK KwlzdHJ1Y3Qgc2dfdGFibGUgKnN0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2csICppdGVyOwor CXVuc2lnbmVkIGludCBjb3VudCA9IHZpZXctPnBhcnRpYWwuc2l6ZTsKKwl1bnNpZ25lZCBpbnQg b2Zmc2V0OworCWludCByZXQgPSAtRU5PTUVNOworCisJc3QgPSBrbWFsbG9jKHNpemVvZigqc3Qp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0KQorCQlnb3RvIGVycl9zdF9hbGxvYzsKKworCXJldCA9 IHNnX2FsbG9jX3RhYmxlKHN0LCBjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCkKKwkJZ290 byBlcnJfc2dfYWxsb2M7CisKKwlpdGVyID0gaTkxNV9nZW1fb2JqZWN0X2dldF9zZyhvYmosIHZp ZXctPnBhcnRpYWwub2Zmc2V0LCAmb2Zmc2V0KTsKKwlHRU1fQlVHX09OKCFpdGVyKTsKKworCXNn ID0gc3QtPnNnbDsKKwlzdC0+bmVudHMgPSAwOworCWRvIHsKKwkJdW5zaWduZWQgaW50IGxlbjsK KworCQlsZW4gPSBtaW4oaXRlci0+bGVuZ3RoIC0gKG9mZnNldCA8PCBQQUdFX1NISUZUKSwKKwkJ CSAgY291bnQgPDwgUEFHRV9TSElGVCk7CisJCXNnX3NldF9wYWdlKHNnLCBOVUxMLCBsZW4sIDAp OworCQlzZ19kbWFfYWRkcmVzcyhzZykgPQorCQkJc2dfZG1hX2FkZHJlc3MoaXRlcikgKyAob2Zm c2V0IDw8IFBBR0VfU0hJRlQpOworCQlzZ19kbWFfbGVuKHNnKSA9IGxlbjsKKworCQlzdC0+bmVu dHMrKzsKKwkJY291bnQgLT0gbGVuID4+IFBBR0VfU0hJRlQ7CisJCWlmIChjb3VudCA9PSAwKSB7 CisJCQlzZ19tYXJrX2VuZChzZyk7CisJCQlpOTE1X3NnX3RyaW0oc3QpOyAvKiBEcm9wIGFueSB1 bnVzZWQgdGFpbCBlbnRyaWVzLiAqLworCisJCQlyZXR1cm4gc3Q7CisJCX0KKworCQlzZyA9IF9f c2dfbmV4dChzZyk7CisJCWl0ZXIgPSBfX3NnX25leHQoaXRlcik7CisJCW9mZnNldCA9IDA7CisJ fSB3aGlsZSAoMSk7CisKK2Vycl9zZ19hbGxvYzoKKwlrZnJlZShzdCk7CitlcnJfc3RfYWxsb2M6 CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKK30KKworc3RhdGljIGludAoraTkxNV9nZXRfZ2d0dF92 bWFfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJaW50IHJldDsKKworCS8qIFRoZSB2 bWEtPnBhZ2VzIGFyZSBvbmx5IHZhbGlkIHdpdGhpbiB0aGUgbGlmZXNwYW4gb2YgdGhlIGJvcnJv d2VkCisJICogb2JqLT5tbS5wYWdlcy4gV2hlbiB0aGUgb2JqLT5tbS5wYWdlcyBzZ190YWJsZSBp cyByZWdlbmVyYXRlZCwgc28KKwkgKiBtdXN0IGJlIHRoZSB2bWEtPnBhZ2VzLiBBIHNpbXBsZSBy dWxlIGlzIHRoYXQgdm1hLT5wYWdlcyBtdXN0IG9ubHkKKwkgKiBiZSBhY2Nlc3NlZCB3aGVuIHRo ZSBvYmotPm1tLnBhZ2VzIGFyZSBwaW5uZWQuCisJICovCisJR0VNX0JVR19PTighaTkxNV9nZW1f b2JqZWN0X2hhc19waW5uZWRfcGFnZXModm1hLT5vYmopKTsKKworCXN3aXRjaCAodm1hLT5nZ3R0 X3ZpZXcudHlwZSkgeworCWRlZmF1bHQ6CisJCUdFTV9CVUdfT04odm1hLT5nZ3R0X3ZpZXcudHlw ZSk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgSTkxNV9HR1RUX1ZJRVdfTk9STUFMOgor CQl2bWEtPnBhZ2VzID0gdm1hLT5vYmotPm1tLnBhZ2VzOworCQlyZXR1cm4gMDsKKworCWNhc2Ug STkxNV9HR1RUX1ZJRVdfUk9UQVRFRDoKKwkJdm1hLT5wYWdlcyA9CisJCQlpbnRlbF9yb3RhdGVf cGFnZXMoJnZtYS0+Z2d0dF92aWV3LnJvdGF0ZWQsIHZtYS0+b2JqKTsKKwkJYnJlYWs7CisKKwlj YXNlIEk5MTVfR0dUVF9WSUVXX1JFTUFQUEVEOgorCQl2bWEtPnBhZ2VzID0KKwkJCWludGVsX3Jl bWFwX3BhZ2VzKCZ2bWEtPmdndHRfdmlldy5yZW1hcHBlZCwgdm1hLT5vYmopOworCQlicmVhazsK KworCWNhc2UgSTkxNV9HR1RUX1ZJRVdfUEFSVElBTDoKKwkJdm1hLT5wYWdlcyA9IGludGVsX3Bh cnRpYWxfcGFnZXMoJnZtYS0+Z2d0dF92aWV3LCB2bWEtPm9iaik7CisJCWJyZWFrOworCX0KKwor CXJldCA9IDA7CisJaWYgKElTX0VSUih2bWEtPnBhZ2VzKSkgeworCQlyZXQgPSBQVFJfRVJSKHZt YS0+cGFnZXMpOworCQl2bWEtPnBhZ2VzID0gTlVMTDsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8g Z2V0IHBhZ2VzIGZvciBWTUEgdmlldyB0eXBlICV1ICglZCkhXG4iLAorCQkJICB2bWEtPmdndHRf dmlldy50eXBlLCByZXQpOworCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ3QuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2lu dGVsX2d0LmMKaW5kZXggOGExN2FiZmJiMTlmLi5kYTJiNmUyYWU2OTIgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvZ3QvaW50ZWxfZ3QuYwpAQCAtMzY2LDcgKzM2Niw3IEBAIHN0YXRpYyB2b2lkIGludGVsX2d0 X2Zpbmlfc2NyYXRjaChzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQogc3RhdGljIHN0cnVjdCBpOTE1X2Fk ZHJlc3Nfc3BhY2UgKmtlcm5lbF92bShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQogewogCWlmIChJTlRF TF9QUEdUVChndC0+aTkxNSkgPiBJTlRFTF9QUEdUVF9BTElBU0lORykKLQkJcmV0dXJuICZpOTE1 X3BwZ3R0X2NyZWF0ZShndC0+aTkxNSktPnZtOworCQlyZXR1cm4gJmk5MTVfcHBndHRfY3JlYXRl KGd0KS0+dm07CiAJZWxzZQogCQlyZXR1cm4gaTkxNV92bV9nZXQoJmd0LT5nZ3R0LT52bSk7CiB9 CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9ndHQuYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX2d0dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwMC4uYjlmZDdlNjViYzZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ3R0LmMKQEAgLTAsMCArMSw1OTUgQEAKKy8vIFNQRFgtTGlj ZW5zZS1JZGVudGlmaWVyOiBNSVQKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBDb3Jw b3JhdGlvbgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+IC8qIGZhdWx0LWluamVjdC5o IGlzIG5vdCBzdGFuZGFsb25lISAqLworCisjaW5jbHVkZSA8bGludXgvZmF1bHQtaW5qZWN0Lmg+ CisKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCisjaW5jbHVkZSAiaW50ZWxfZ3QuaCIKKyNpbmNs dWRlICJpbnRlbF9ndHQuaCIKKwordm9pZCBzdGFzaF9pbml0KHN0cnVjdCBwYWdlc3Rhc2ggKnN0 YXNoKQoreworCXBhZ2V2ZWNfaW5pdCgmc3Rhc2gtPnB2ZWMpOworCXNwaW5fbG9ja19pbml0KCZz dGFzaC0+bG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqc3Rhc2hfcG9wX3BhZ2Uoc3Ry dWN0IHBhZ2VzdGFzaCAqc3Rhc2gpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOworCisJ c3Bpbl9sb2NrKCZzdGFzaC0+bG9jayk7CisJaWYgKGxpa2VseShzdGFzaC0+cHZlYy5ucikpCisJ CXBhZ2UgPSBzdGFzaC0+cHZlYy5wYWdlc1stLXN0YXNoLT5wdmVjLm5yXTsKKwlzcGluX3VubG9j aygmc3Rhc2gtPmxvY2spOworCisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXNo X3B1c2hfcGFnZXZlYyhzdHJ1Y3QgcGFnZXN0YXNoICpzdGFzaCwgc3RydWN0IHBhZ2V2ZWMgKnB2 ZWMpCit7CisJdW5zaWduZWQgaW50IG5yOworCisJc3Bpbl9sb2NrX25lc3RlZCgmc3Rhc2gtPmxv Y2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCW5yID0gbWluX3QodHlwZW9mKG5yKSwgcHZl Yy0+bnIsIHBhZ2V2ZWNfc3BhY2UoJnN0YXNoLT5wdmVjKSk7CisJbWVtY3B5KHN0YXNoLT5wdmVj LnBhZ2VzICsgc3Rhc2gtPnB2ZWMubnIsCisJICAgICAgIHB2ZWMtPnBhZ2VzICsgcHZlYy0+bnIg LSBuciwKKwkgICAgICAgc2l6ZW9mKHB2ZWMtPnBhZ2VzWzBdKSAqIG5yKTsKKwlzdGFzaC0+cHZl Yy5uciArPSBucjsKKworCXNwaW5fdW5sb2NrKCZzdGFzaC0+bG9jayk7CisKKwlwdmVjLT5uciAt PSBucjsKK30KKworc3RhdGljIHN0cnVjdCBwYWdlICp2bV9hbGxvY19wYWdlKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHBhZ2V2ZWMgc3RhY2s7 CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoSTkxNV9TRUxGVEVTVF9PTkxZKHNob3VsZF9m YWlsKCZ2bS0+ZmF1bHRfYXR0ciwgMSkpKQorCQlpOTE1X2dlbV9zaHJpbmtfYWxsKHZtLT5pOTE1 KTsKKworCXBhZ2UgPSBzdGFzaF9wb3BfcGFnZSgmdm0tPmZyZWVfcGFnZXMpOworCWlmIChwYWdl KQorCQlyZXR1cm4gcGFnZTsKKworCWlmICghdm0tPnB0X2ttYXBfd2MpCisJCXJldHVybiBhbGxv Y19wYWdlKGdmcCk7CisKKwkvKiBMb29rIGluIG91ciBnbG9iYWwgc3Rhc2ggb2YgV0MgcGFnZXMu Li4gKi8KKwlwYWdlID0gc3Rhc2hfcG9wX3BhZ2UoJnZtLT5pOTE1LT5tbS53Y19zdGFzaCk7CisJ aWYgKHBhZ2UpCisJCXJldHVybiBwYWdlOworCisJLyoKKwkgKiBPdGhlcndpc2UgYmF0Y2ggYWxs b2NhdGUgcGFnZXMgdG8gYW1vcnRpemUgY29zdCBvZiBzZXRfcGFnZXNfd2MuCisJICoKKwkgKiBX ZSBoYXZlIHRvIGJlIGNhcmVmdWwgYXMgcGFnZSBhbGxvY2F0aW9uIG1heSB0cmlnZ2VyIHRoZSBz aHJpbmtlcgorCSAqICh2aWEgZGlyZWN0IHJlY2xhaW0pIHdoaWNoIHdpbGwgZmlsbCB1cCB0aGUg V0Mgc3Rhc2ggdW5kZXJuZWF0aCB1cy4KKwkgKiBTbyB3ZSBhZGQgb3VyIFdCIHBhZ2VzIGludG8g YSB0ZW1wb3JhcnkgcHZlYyBvbiB0aGUgc3RhY2sgYW5kIG1lcmdlCisJICogdGhlbSBpbnRvIHRo ZSBXQyBzdGFzaCBhZnRlciBhbGwgdGhlIGFsbG9jYXRpb25zIGFyZSBjb21wbGV0ZS4KKwkgKi8K KwlwYWdldmVjX2luaXQoJnN0YWNrKTsKKwlkbyB7CisJCXN0cnVjdCBwYWdlICpwYWdlOworCisJ CXBhZ2UgPSBhbGxvY19wYWdlKGdmcCk7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQlicmVh azsKKworCQlzdGFjay5wYWdlc1tzdGFjay5ucisrXSA9IHBhZ2U7CisJfSB3aGlsZSAocGFnZXZl Y19zcGFjZSgmc3RhY2spKTsKKworCWlmIChzdGFjay5uciAmJiAhc2V0X3BhZ2VzX2FycmF5X3dj KHN0YWNrLnBhZ2VzLCBzdGFjay5ucikpIHsKKwkJcGFnZSA9IHN0YWNrLnBhZ2VzWy0tc3RhY2su bnJdOworCisJCS8qIE1lcmdlIHNwYXJlIFdDIHBhZ2VzIHRvIHRoZSBnbG9iYWwgc3Rhc2ggKi8K KwkJaWYgKHN0YWNrLm5yKQorCQkJc3Rhc2hfcHVzaF9wYWdldmVjKCZ2bS0+aTkxNS0+bW0ud2Nf c3Rhc2gsICZzdGFjayk7CisKKwkJLyogUHVzaCBhbnkgc3VycGx1cyBXQyBwYWdlcyBvbnRvIHRo ZSBsb2NhbCBWTSBzdGFzaCAqLworCQlpZiAoc3RhY2subnIpCisJCQlzdGFzaF9wdXNoX3BhZ2V2 ZWMoJnZtLT5mcmVlX3BhZ2VzLCAmc3RhY2spOworCX0KKworCS8qIFJldHVybiB1bndhbnRlZCBs ZWZ0b3ZlcnMgKi8KKwlpZiAodW5saWtlbHkoc3RhY2subnIpKSB7CisJCVdBUk5fT05fT05DRShz ZXRfcGFnZXNfYXJyYXlfd2Ioc3RhY2sucGFnZXMsIHN0YWNrLm5yKSk7CisJCV9fcGFnZXZlY19y ZWxlYXNlKCZzdGFjayk7CisJfQorCisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIHZt X2ZyZWVfcGFnZXNfcmVsZWFzZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkg IGJvb2wgaW1tZWRpYXRlKQoreworCXN0cnVjdCBwYWdldmVjICpwdmVjID0gJnZtLT5mcmVlX3Bh Z2VzLnB2ZWM7CisJc3RydWN0IHBhZ2V2ZWMgc3RhY2s7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxk KCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKKwlHRU1fQlVHX09OKCFwYWdldmVjX2NvdW50KHB2ZWMp KTsKKworCWlmICh2bS0+cHRfa21hcF93YykgeworCQkvKgorCQkgKiBXaGVuIHdlIHVzZSBXQywg Zmlyc3QgZmlsbCB1cCB0aGUgZ2xvYmFsIHN0YXNoIGFuZCB0aGVuCisJCSAqIG9ubHkgaWYgZnVs bCBpbW1lZGlhdGVseSBmcmVlIHRoZSBvdmVyZmxvdy4KKwkJICovCisJCXN0YXNoX3B1c2hfcGFn ZXZlYygmdm0tPmk5MTUtPm1tLndjX3N0YXNoLCBwdmVjKTsKKworCQkvKgorCQkgKiBBcyB3ZSBo YXZlIG1hZGUgc29tZSByb29tIGluIHRoZSBWTSdzIGZyZWVfcGFnZXMsCisJCSAqIHdlIGNhbiB3 YWl0IGZvciBpdCB0byBmaWxsIGFnYWluLiBVbmxlc3Mgd2UgYXJlCisJCSAqIGluc2lkZSBpOTE1 X2FkZHJlc3Nfc3BhY2VfZmluaSgpIGFuZCBtdXN0CisJCSAqIGltbWVkaWF0ZWx5IHJlbGVhc2Ug dGhlIHBhZ2VzIQorCQkgKi8KKwkJaWYgKHB2ZWMtPm5yIDw9IChpbW1lZGlhdGUgPyAwIDogUEFH RVZFQ19TSVpFIC0gMSkpCisJCQlyZXR1cm47CisKKwkJLyoKKwkJICogV2UgaGF2ZSB0byBkcm9w IHRoZSBsb2NrIHRvIGFsbG93IG91cnNlbHZlcyB0byBzbGVlcCwKKwkJICogc28gdGFrZSBhIGNv cHkgb2YgdGhlIHB2ZWMgYW5kIGNsZWFyIHRoZSBzdGFzaCBmb3IKKwkJICogb3RoZXJzIHRvIHVz ZSBpdCBhcyB3ZSBzbGVlcC4KKwkJICovCisJCXN0YWNrID0gKnB2ZWM7CisJCXBhZ2V2ZWNfcmVp bml0KHB2ZWMpOworCQlzcGluX3VubG9jaygmdm0tPmZyZWVfcGFnZXMubG9jayk7CisKKwkJcHZl YyA9ICZzdGFjazsKKwkJc2V0X3BhZ2VzX2FycmF5X3diKHB2ZWMtPnBhZ2VzLCBwdmVjLT5ucik7 CisKKwkJc3Bpbl9sb2NrKCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKKwl9CisKKwlfX3BhZ2V2ZWNf cmVsZWFzZShwdmVjKTsKK30KKworc3RhdGljIHZvaWQgdm1fZnJlZV9wYWdlKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwkvKgorCSAqIE9uICFs bGMsIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBwYWdlcyBiYWNrIHRvIFdCLiBXZSBvbmx5IGRvIHNv CisJICogaW4gYnVsaywgc28gd2UgcmFyZWx5IG5lZWQgdG8gY2hhbmdlIHRoZSBwYWdlIGF0dHJp YnV0ZXMgaGVyZSwKKwkgKiBidXQgZG9pbmcgc28gcmVxdWlyZXMgYSBzdG9wX21hY2hpbmUoKSBm cm9tIGRlZXAgaW5zaWRlIGFyY2gveDg2L21tLgorCSAqIFRvIG1ha2UgZGV0ZWN0aW9uIG9mIHRo ZSBwb3NzaWJsZSBzbGVlcCBtb3JlIGxpa2VseSwgdXNlIGFuCisJICogdW5jb25kaXRpb25hbCBt aWdodF9zbGVlcCgpIGZvciBldmVyeWJvZHkuCisJICovCisJbWlnaHRfc2xlZXAoKTsKKwlzcGlu X2xvY2soJnZtLT5mcmVlX3BhZ2VzLmxvY2spOworCXdoaWxlICghcGFnZXZlY19zcGFjZSgmdm0t PmZyZWVfcGFnZXMucHZlYykpCisJCXZtX2ZyZWVfcGFnZXNfcmVsZWFzZSh2bSwgZmFsc2UpOwor CUdFTV9CVUdfT04ocGFnZXZlY19jb3VudCgmdm0tPmZyZWVfcGFnZXMucHZlYykgPj0gUEFHRVZF Q19TSVpFKTsKKwlwYWdldmVjX2FkZCgmdm0tPmZyZWVfcGFnZXMucHZlYywgcGFnZSk7CisJc3Bp bl91bmxvY2soJnZtLT5mcmVlX3BhZ2VzLmxvY2spOworfQorCit2b2lkIF9faTkxNV92bV9jbG9z ZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlzdHJ1Y3QgaTkxNV92bWEgKnZt YSwgKnZuOworCisJbXV0ZXhfbG9jaygmdm0tPm11dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUodm1hLCB2biwgJnZtLT5ib3VuZF9saXN0LCB2bV9saW5rKSB7CisJCXN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKKworCQkvKiBLZWVwIHRoZSBvYmogKGFu ZCBoZW5jZSB0aGUgdm1hKSBhbGl2ZSBhcyBfd2VfIGRlc3Ryb3kgaXQgKi8KKwkJaWYgKCFrcmVm X2dldF91bmxlc3NfemVybygmb2JqLT5iYXNlLnJlZmNvdW50KSkKKwkJCWNvbnRpbnVlOworCisJ CWF0b21pY19hbmQofkk5MTVfVk1BX1BJTl9NQVNLLCAmdm1hLT5mbGFncyk7CisJCVdBUk5fT04o X19pOTE1X3ZtYV91bmJpbmQodm1hKSk7CisJCV9faTkxNV92bWFfcHV0KHZtYSk7CisKKwkJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKwlHRU1fQlVHX09OKCFsaXN0X2VtcHR5KCZ2bS0+ Ym91bmRfbGlzdCkpOworCW11dGV4X3VubG9jaygmdm0tPm11dGV4KTsKK30KKwordm9pZCBpOTE1 X2FkZHJlc3Nfc3BhY2VfZmluaShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKK3sKKwlz cGluX2xvY2soJnZtLT5mcmVlX3BhZ2VzLmxvY2spOworCWlmIChwYWdldmVjX2NvdW50KCZ2bS0+ ZnJlZV9wYWdlcy5wdmVjKSkKKwkJdm1fZnJlZV9wYWdlc19yZWxlYXNlKHZtLCB0cnVlKTsKKwlH RU1fQlVHX09OKHBhZ2V2ZWNfY291bnQoJnZtLT5mcmVlX3BhZ2VzLnB2ZWMpKTsKKwlzcGluX3Vu bG9jaygmdm0tPmZyZWVfcGFnZXMubG9jayk7CisKKwlkcm1fbW1fdGFrZWRvd24oJnZtLT5tbSk7 CisKKwltdXRleF9kZXN0cm95KCZ2bS0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBfX2k5MTVf dm1fcmVsZWFzZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0gPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSwgcmN1LndvcmspOworCisJdm0tPmNsZWFudXAodm0pOworCWk5MTVfYWRkcmVzc19z cGFjZV9maW5pKHZtKTsKKworCWtmcmVlKHZtKTsKK30KKwordm9pZCBpOTE1X3ZtX3JlbGVhc2Uo c3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPQor CQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSwgcmVmKTsKKwor CUdFTV9CVUdfT04oaTkxNV9pc19nZ3R0KHZtKSk7CisJdHJhY2VfaTkxNV9wcGd0dF9yZWxlYXNl KHZtKTsKKworCXF1ZXVlX3JjdV93b3JrKHZtLT5pOTE1LT53cSwgJnZtLT5yY3UpOworfQorCit2 b2lkIGk5MTVfYWRkcmVzc19zcGFjZV9pbml0KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZt LCBpbnQgc3ViY2xhc3MpCit7CisJa3JlZl9pbml0KCZ2bS0+cmVmKTsKKwlJTklUX1JDVV9XT1JL KCZ2bS0+cmN1LCBfX2k5MTVfdm1fcmVsZWFzZSk7CisJYXRvbWljX3NldCgmdm0tPm9wZW4sIDEp OworCisJLyoKKwkgKiBUaGUgdm0tPm11dGV4IG11c3QgYmUgcmVjbGFpbSBzYWZlIChmb3IgdXNl IGluIHRoZSBzaHJpbmtlcikuCisJICogRG8gYSBkdW1teSBhY3F1aXJlIG5vdyB1bmRlciBmc19y ZWNsYWltIHNvIHRoYXQgYW55IGFsbG9jYXRpb24KKwkgKiBhdHRlbXB0IGhvbGRpbmcgdGhlIGxv Y2sgaXMgaW1tZWRpYXRlbHkgcmVwb3J0ZWQgYnkgbG9ja2RlcC4KKwkgKi8KKwltdXRleF9pbml0 KCZ2bS0+bXV0ZXgpOworCWxvY2tkZXBfc2V0X3N1YmNsYXNzKCZ2bS0+bXV0ZXgsIHN1YmNsYXNz KTsKKwlpOTE1X2dlbV9zaHJpbmtlcl90YWludHNfbXV0ZXgodm0tPmk5MTUsICZ2bS0+bXV0ZXgp OworCisJR0VNX0JVR19PTighdm0tPnRvdGFsKTsKKwlkcm1fbW1faW5pdCgmdm0tPm1tLCAwLCB2 bS0+dG90YWwpOworCXZtLT5tbS5oZWFkX25vZGUuY29sb3IgPSBJOTE1X0NPTE9SX1VORVZJQ1RB QkxFOworCisJc3Rhc2hfaW5pdCgmdm0tPmZyZWVfcGFnZXMpOworCisJSU5JVF9MSVNUX0hFQUQo JnZtLT5ib3VuZF9saXN0KTsKK30KKwordm9pZCBjbGVhcl9wYWdlcyhzdHJ1Y3QgaTkxNV92bWEg KnZtYSkKK3sKKwlHRU1fQlVHX09OKCF2bWEtPnBhZ2VzKTsKKworCWlmICh2bWEtPnBhZ2VzICE9 IHZtYS0+b2JqLT5tbS5wYWdlcykgeworCQlzZ19mcmVlX3RhYmxlKHZtYS0+cGFnZXMpOworCQlr ZnJlZSh2bWEtPnBhZ2VzKTsKKwl9CisJdm1hLT5wYWdlcyA9IE5VTEw7CisKKwltZW1zZXQoJnZt YS0+cGFnZV9zaXplcywgMCwgc2l6ZW9mKHZtYS0+cGFnZV9zaXplcykpOworfQorCitzdGF0aWMg aW50IF9fc2V0dXBfcGFnZV9kbWEoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCisJCQkg ICAgc3RydWN0IGk5MTVfcGFnZV9kbWEgKnAsCisJCQkgICAgZ2ZwX3QgZ2ZwKQoreworCXAtPnBh Z2UgPSB2bV9hbGxvY19wYWdlKHZtLCBnZnAgfCBJOTE1X0dGUF9BTExPV19GQUlMKTsKKwlpZiAo dW5saWtlbHkoIXAtPnBhZ2UpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAtPmRhZGRyID0gZG1h X21hcF9wYWdlX2F0dHJzKHZtLT5kbWEsCisJCQkJICAgICAgcC0+cGFnZSwgMCwgUEFHRV9TSVpF LAorCQkJCSAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCwKKwkJCQkgICAgICBETUFfQVRUUl9T S0lQX0NQVV9TWU5DIHwKKwkJCQkgICAgICBETUFfQVRUUl9OT19XQVJOKTsKKwlpZiAodW5saWtl bHkoZG1hX21hcHBpbmdfZXJyb3Iodm0tPmRtYSwgcC0+ZGFkZHIpKSkgeworCQl2bV9mcmVlX3Bh Z2Uodm0sIHAtPnBhZ2UpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30K KworaW50IHNldHVwX3BhZ2VfZG1hKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLCBzdHJ1 Y3QgaTkxNV9wYWdlX2RtYSAqcCkKK3sKKwlyZXR1cm4gX19zZXR1cF9wYWdlX2RtYSh2bSwgcCwg X19HRlBfSElHSE1FTSk7Cit9CisKK3ZvaWQgY2xlYW51cF9wYWdlX2RtYShzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSwgc3RydWN0IGk5MTVfcGFnZV9kbWEgKnApCit7CisJZG1hX3VubWFw X3BhZ2Uodm0tPmRtYSwgcC0+ZGFkZHIsIFBBR0VfU0laRSwgUENJX0RNQV9CSURJUkVDVElPTkFM KTsKKwl2bV9mcmVlX3BhZ2Uodm0sIHAtPnBhZ2UpOworfQorCit2b2lkCitmaWxsX3BhZ2VfZG1h KGNvbnN0IHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwLCBjb25zdCB1NjQgdmFsLCB1bnNpZ25lZCBp bnQgY291bnQpCit7CisJa3VubWFwX2F0b21pYyhtZW1zZXQ2NChrbWFwX2F0b21pYyhwLT5wYWdl KSwgdmFsLCBjb3VudCkpOworfQorCitpbnQgc2V0dXBfc2NyYXRjaF9wYWdlKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLCBnZnBfdCBnZnApCit7CisJdW5zaWduZWQgbG9uZyBzaXplOwor CisJLyoKKwkgKiBJbiBvcmRlciB0byB1dGlsaXplIDY0SyBwYWdlcyBmb3IgYW4gb2JqZWN0IHdp dGggYSBzaXplIDwgMk0sIHdlIHdpbGwKKwkgKiBuZWVkIHRvIHN1cHBvcnQgYSA2NEsgc2NyYXRj aCBwYWdlLCBnaXZlbiB0aGF0IGV2ZXJ5IDE2dGggZW50cnkgZm9yIGEKKwkgKiBwYWdlLXRhYmxl IG9wZXJhdGluZyBpbiA2NEsgbW9kZSBtdXN0IHBvaW50IHRvIGEgcHJvcGVybHkgYWxpZ25lZCA2 NEsKKwkgKiByZWdpb24sIGluY2x1ZGluZyBhbnkgUFRFcyB3aGljaCBoYXBwZW4gdG8gcG9pbnQg dG8gc2NyYXRjaC4KKwkgKgorCSAqIFRoaXMgaXMgb25seSByZWxldmFudCBmb3IgdGhlIDQ4YiBQ UEdUVCB3aGVyZSB3ZSBzdXBwb3J0CisJICogaHVnZS1ndHQtcGFnZXMsIHNlZSBhbHNvIGk5MTVf dm1hX2luc2VydCgpLiBIb3dldmVyLCBhcyB3ZSBzaGFyZSB0aGUKKwkgKiBzY3JhdGNoIChyZWFk LW9ubHkpIGJldHdlZW4gYWxsIHZtLCB3ZSBjcmVhdGUgb25lIDY0ayBzY3JhdGNoIHBhZ2UKKwkg KiBmb3IgYWxsLgorCSAqLworCXNpemUgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNEs7CisJaWYgKGk5 MTVfdm1faXNfNGx2bCh2bSkgJiYKKwkgICAgSEFTX1BBR0VfU0laRVModm0tPmk5MTUsIEk5MTVf R1RUX1BBR0VfU0laRV82NEspKSB7CisJCXNpemUgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLOwor CQlnZnAgfD0gX19HRlBfTk9XQVJOOworCX0KKwlnZnAgfD0gX19HRlBfWkVSTyB8IF9fR0ZQX1JF VFJZX01BWUZBSUw7CisKKwlkbyB7CisJCXVuc2lnbmVkIGludCBvcmRlciA9IGdldF9vcmRlcihz aXplKTsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisJCWRtYV9hZGRyX3QgYWRkcjsKKworCQlwYWdl ID0gYWxsb2NfcGFnZXMoZ2ZwLCBvcmRlcik7CisJCWlmICh1bmxpa2VseSghcGFnZSkpCisJCQln b3RvIHNraXA7CisKKwkJYWRkciA9IGRtYV9tYXBfcGFnZV9hdHRycyh2bS0+ZG1hLAorCQkJCQkg IHBhZ2UsIDAsIHNpemUsCisJCQkJCSAgUENJX0RNQV9CSURJUkVDVElPTkFMLAorCQkJCQkgIERN QV9BVFRSX1NLSVBfQ1BVX1NZTkMgfAorCQkJCQkgIERNQV9BVFRSX05PX1dBUk4pOworCQlpZiAo dW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3Iodm0tPmRtYSwgYWRkcikpKQorCQkJZ290byBmcmVl X3BhZ2U7CisKKwkJaWYgKHVubGlrZWx5KCFJU19BTElHTkVEKGFkZHIsIHNpemUpKSkKKwkJCWdv dG8gdW5tYXBfcGFnZTsKKworCQl2bS0+c2NyYXRjaFswXS5iYXNlLnBhZ2UgPSBwYWdlOworCQl2 bS0+c2NyYXRjaFswXS5iYXNlLmRhZGRyID0gYWRkcjsKKwkJdm0tPnNjcmF0Y2hfb3JkZXIgPSBv cmRlcjsKKwkJcmV0dXJuIDA7CisKK3VubWFwX3BhZ2U6CisJCWRtYV91bm1hcF9wYWdlKHZtLT5k bWEsIGFkZHIsIHNpemUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CitmcmVlX3BhZ2U6CisJCV9f ZnJlZV9wYWdlcyhwYWdlLCBvcmRlcik7Citza2lwOgorCQlpZiAoc2l6ZSA9PSBJOTE1X0dUVF9Q QUdFX1NJWkVfNEspCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlzaXplID0gSTkxNV9HVFRfUEFH RV9TSVpFXzRLOworCQlnZnAgJj0gfl9fR0ZQX05PV0FSTjsKKwl9IHdoaWxlICgxKTsKK30KKwor dm9pZCBjbGVhbnVwX3NjcmF0Y2hfcGFnZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkK K3sKKwlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCA9IHB4X2Jhc2UoJnZtLT5zY3JhdGNoWzBdKTsK Kwl1bnNpZ25lZCBpbnQgb3JkZXIgPSB2bS0+c2NyYXRjaF9vcmRlcjsKKworCWRtYV91bm1hcF9w YWdlKHZtLT5kbWEsIHAtPmRhZGRyLCBCSVQob3JkZXIpIDw8IFBBR0VfU0hJRlQsCisJCSAgICAg ICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCV9fZnJlZV9wYWdlcyhwLT5wYWdlLCBvcmRlcik7 Cit9CisKK3ZvaWQgZnJlZV9zY3JhdGNoKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQor eworCWludCBpOworCisJaWYgKCFweF9kbWEoJnZtLT5zY3JhdGNoWzBdKSkgLyogc2V0IHRvIDAg b24gY2xvbmVzICovCisJCXJldHVybjsKKworCWZvciAoaSA9IDE7IGkgPD0gdm0tPnRvcDsgaSsr KSB7CisJCWlmICghcHhfZG1hKCZ2bS0+c2NyYXRjaFtpXSkpCisJCQlicmVhazsKKwkJY2xlYW51 cF9wYWdlX2RtYSh2bSwgcHhfYmFzZSgmdm0tPnNjcmF0Y2hbaV0pKTsKKwl9CisKKwljbGVhbnVw X3NjcmF0Y2hfcGFnZSh2bSk7Cit9CisKK3ZvaWQgZ3R0X3dyaXRlX3dvcmthcm91bmRzKHN0cnVj dCBpbnRlbF9ndCAqZ3QpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBndC0+ aTkxNTsKKwlzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUgPSBndC0+dW5jb3JlOworCisJLyog VGhpcyBmdW5jdGlvbiBpcyBmb3IgZ3R0IHJlbGF0ZWQgd29ya2Fyb3VuZHMuIFRoaXMgZnVuY3Rp b24gaXMKKwkgKiBjYWxsZWQgb24gZHJpdmVyIGxvYWQgYW5kIGFmdGVyIGEgR1BVIHJlc2V0LCBz byB5b3UgY2FuIHBsYWNlCisJICogd29ya2Fyb3VuZHMgaGVyZSBldmVuIGlmIHRoZXkgZ2V0IG92 ZXJ3cml0dGVuIGJ5IEdQVSByZXNldC4KKwkgKi8KKwkvKiBXYUluY3JlYXNlRGVmYXVsdFRMQkVu dHJpZXM6Y2h2LGJkdyxza2wsYnh0LGtibCxnbGssY2ZsLGNubCxpY2wgKi8KKwlpZiAoSVNfQlJP QURXRUxMKGk5MTUpKQorCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJCSAgIEdFTjhf TDNfTFJBXzFfR1BHUFUsCisJCQkJICAgR0VOOF9MM19MUkFfMV9HUEdQVV9ERUZBVUxUX1ZBTFVF X0JEVyk7CisJZWxzZSBpZiAoSVNfQ0hFUlJZVklFVyhpOTE1KSkKKwkJaW50ZWxfdW5jb3JlX3dy aXRlKHVuY29yZSwKKwkJCQkgICBHRU44X0wzX0xSQV8xX0dQR1BVLAorCQkJCSAgIEdFTjhfTDNf TFJBXzFfR1BHUFVfREVGQVVMVF9WQUxVRV9DSFYpOworCWVsc2UgaWYgKElTX0dFTjlfTFAoaTkx NSkpCisJCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkJICAgR0VOOF9MM19MUkFfMV9H UEdQVSwKKwkJCQkgICBHRU45X0wzX0xSQV8xX0dQR1BVX0RFRkFVTFRfVkFMVUVfQlhUKTsKKwll bHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPj0gOSAmJiBJTlRFTF9HRU4oaTkxNSkgPD0gMTEpCisJ CWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkJICAgR0VOOF9MM19MUkFfMV9HUEdQVSwK KwkJCQkgICBHRU45X0wzX0xSQV8xX0dQR1BVX0RFRkFVTFRfVkFMVUVfU0tMKTsKKworCS8qCisJ ICogVG8gc3VwcG9ydCA2NEsgUFRFcyB3ZSBuZWVkIHRvIGZpcnN0IGVuYWJsZSB0aGUgdXNlIG9m IHRoZQorCSAqIEludGVybWVkaWF0ZS1QYWdlLVNpemUoSVBTKSBiaXQgb2YgdGhlIFBERSBmaWVs ZCB2aWEgc29tZSBtYWdpY2FsCisJICogbW1pbywgb3RoZXJ3aXNlIHRoZSBwYWdlLXdhbGtlciB3 aWxsIHNpbXBseSBpZ25vcmUgdGhlIElQUyBiaXQuIFRoaXMKKwkgKiBzaG91bGRuJ3QgYmUgbmVl ZGVkIGFmdGVyIEdFTjEwLgorCSAqCisJICogNjRLIHBhZ2VzIHdlcmUgZmlyc3QgaW50cm9kdWNl ZCBmcm9tIEJEVyssIGFsdGhvdWdoIHRlY2huaWNhbGx5IHRoZXkKKwkgKiBvbmx5ICp3b3JrKiBm cm9tIGdlbjkrLiBGb3IgcHJlLUJEVyB3ZSBpbnN0ZWFkIGhhdmUgdGhlIG9wdGlvbiBmb3IKKwkg KiAzMksgcGFnZXMsIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBhbnkgc3VwcG9ydCBmb3Ig aXQgaW4gb3VyCisJICogZHJpdmVyLgorCSAqLworCWlmIChIQVNfUEFHRV9TSVpFUyhpOTE1LCBJ OTE1X0dUVF9QQUdFX1NJWkVfNjRLKSAmJgorCSAgICBJTlRFTF9HRU4oaTkxNSkgPD0gMTApCisJ CWludGVsX3VuY29yZV9ybXcodW5jb3JlLAorCQkJCSBHRU44X0dBTVdfRUNPX0RFVl9SV19JQSwK KwkJCQkgMCwKKwkJCQkgR0FNV19FQ09fRU5BQkxFXzY0S19JUFNfRklFTEQpOworCisJaWYgKElT X0dFTl9SQU5HRShpOTE1LCA4LCAxMSkpIHsKKwkJYm9vbCBjYW5fdXNlX2d0dF9jYWNoZSA9IHRy dWU7CisKKwkJLyoKKwkJICogQWNjb3JkaW5nIHRvIHRoZSBCU3BlYyBpZiB3ZSB1c2UgMk0vMUcg cGFnZXMgdGhlbiB3ZSBhbHNvCisJCSAqIG5lZWQgdG8gZGlzYWJsZSB0aGUgR1RUIGNhY2hlLiBB dCBsZWFzdCBvbiBCRFcgd2UgY2FuIHNlZQorCQkgKiB2aXN1YWwgY29ycnVwdGlvbiB3aGVuIHVz aW5nIDJNIHBhZ2VzLCBhbmQgbm90IGRpc2FibGluZyB0aGUKKwkJICogR1RUIGNhY2hlLgorCQkg Ki8KKwkJaWYgKEhBU19QQUdFX1NJWkVTKGk5MTUsIEk5MTVfR1RUX1BBR0VfU0laRV8yTSkpCisJ CQljYW5fdXNlX2d0dF9jYWNoZSA9IGZhbHNlOworCisJCS8qIFdhR3R0Q2FjaGluZ09mZkJ5RGVm YXVsdCAqLworCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJCSAgIEhTV19HVFRfQ0FD SEVfRU4sCisJCQkJICAgY2FuX3VzZV9ndHRfY2FjaGUgPyBHVFRfQ0FDSEVfRU5fQUxMIDogMCk7 CisJCVdBUk5fT05fT05DRShjYW5fdXNlX2d0dF9jYWNoZSAmJgorCQkJICAgICBpbnRlbF91bmNv cmVfcmVhZCh1bmNvcmUsCisJCQkJCSAgICAgICBIU1dfR1RUX0NBQ0hFX0VOKSA9PSAwKTsKKwl9 Cit9CisKK3U2NCBnZW44X3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAorCQkgICAgZW51bSBp OTE1X2NhY2hlX2xldmVsIGxldmVsLAorCQkgICAgdTMyIGZsYWdzKQoreworCWdlbjhfcHRlX3Qg cHRlID0gYWRkciB8IF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVzsKKworCWlmICh1bmxpa2VseShm bGFncyAmIFBURV9SRUFEX09OTFkpKQorCQlwdGUgJj0gfl9QQUdFX1JXOworCisJc3dpdGNoIChs ZXZlbCkgeworCWNhc2UgSTkxNV9DQUNIRV9OT05FOgorCQlwdGUgfD0gUFBBVF9VTkNBQ0hFRDsK KwkJYnJlYWs7CisJY2FzZSBJOTE1X0NBQ0hFX1dUOgorCQlwdGUgfD0gUFBBVF9ESVNQTEFZX0VM TEM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXB0ZSB8PSBQUEFUX0NBQ0hFRDsKKwkJYnJlYWs7 CisJfQorCisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIHZvaWQgdGdsX3NldHVwX3ByaXZhdGVf cHBhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCit7CisJLyogVEdMIGRvZXNuJ3Qgc3Vw cG9ydCBMTEMgb3IgQUdFIHNldHRpbmdzICovCisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwg R0VOMTJfUEFUX0lOREVYKDApLCBHRU44X1BQQVRfV0IpOworCWludGVsX3VuY29yZV93cml0ZSh1 bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCgxKSwgR0VOOF9QUEFUX1dDKTsKKwlpbnRlbF91bmNvcmVf d3JpdGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoMiksIEdFTjhfUFBBVF9XVCk7CisJaW50ZWxf dW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVYKDMpLCBHRU44X1BQQVRfVUMpOwor CWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCg0KSwgR0VOOF9QUEFU X1dCKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoNSksIEdF TjhfUFBBVF9XQik7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVY KDYpLCBHRU44X1BQQVRfV0IpOworCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BB VF9JTkRFWCg3KSwgR0VOOF9QUEFUX1dCKTsKK30KKworc3RhdGljIHZvaWQgY25sX3NldHVwX3By aXZhdGVfcHBhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCit7CisJaW50ZWxfdW5jb3Jl X3dyaXRlKHVuY29yZSwKKwkJCSAgIEdFTjEwX1BBVF9JTkRFWCgwKSwKKwkJCSAgIEdFTjhfUFBB VF9XQiB8IEdFTjhfUFBBVF9MTEMpOworCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCisJCQkg ICBHRU4xMF9QQVRfSU5ERVgoMSksCisJCQkgICBHRU44X1BQQVRfV0MgfCBHRU44X1BQQVRfTExD RUxMQyk7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKKwkJCSAgIEdFTjEwX1BBVF9JTkRF WCgyKSwKKwkJCSAgIEdFTjhfUFBBVF9XVCB8IEdFTjhfUFBBVF9MTENFTExDKTsKKwlpbnRlbF91 bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJICAgR0VOMTBfUEFUX0lOREVYKDMpLAorCQkJICAgR0VO OF9QUEFUX1VDKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJICAgR0VOMTBfUEFU X0lOREVYKDQpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44 X1BQQVRfQUdFKDApKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJICAgR0VOMTBf UEFUX0lOREVYKDUpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBH RU44X1BQQVRfQUdFKDEpKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJICAgR0VO MTBfUEFUX0lOREVYKDYpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMg fCBHRU44X1BQQVRfQUdFKDIpKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAorCQkJICAg R0VOMTBfUEFUX0lOREVYKDcpLAorCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQ0VM TEMgfCBHRU44X1BQQVRfQUdFKDMpKTsKK30KKworLyogVGhlIEdHVFQgYW5kIFBQR1RUIG5lZWQg YSBwcml2YXRlIFBQQVQgc2V0dXAgaW4gb3JkZXIgdG8gaGFuZGxlIGNhY2hlYWJpbGl0eQorICog Yml0cy4gV2hlbiB1c2luZyBhZHZhbmNlZCBjb250ZXh0cyBlYWNoIGNvbnRleHQgc3RvcmVzIGl0 cyBvd24gUEFULCBidXQKKyAqIHdyaXRpbmcgdGhpcyBkYXRhIHNob3VsZG4ndCBiZSBoYXJtZnVs IGV2ZW4gaW4gdGhvc2UgY2FzZXMuICovCitzdGF0aWMgdm9pZCBiZHdfc2V0dXBfcHJpdmF0ZV9w cGF0KHN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSkKK3sKKwl1NjQgcGF0OworCisJcGF0ID0g R0VOOF9QUEFUKDAsIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTEMpIHwJLyogZm9yIG5vcm1h bCBvYmplY3RzLCBubyBlTExDICovCisJICAgICAgR0VOOF9QUEFUKDEsIEdFTjhfUFBBVF9XQyB8 IEdFTjhfUFBBVF9MTENFTExDKSB8CS8qIGZvciBzb21ldGhpbmcgcG9pbnRpbmcgdG8gcHRlcz8g Ki8KKwkgICAgICBHRU44X1BQQVQoMiwgR0VOOF9QUEFUX1dUIHwgR0VOOF9QUEFUX0xMQ0VMTEMp IHwJLyogZm9yIHNjYW5vdXQgd2l0aCBlTExDICovCisJICAgICAgR0VOOF9QUEFUKDMsIEdFTjhf UFBBVF9VQykgfAkJCS8qIFVuY2FjaGVkIG9iamVjdHMsIG1vc3RseSBmb3Igc2Nhbm91dCAqLwor CSAgICAgIEdFTjhfUFBBVCg0LCBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDRUxMQyB8IEdF TjhfUFBBVF9BR0UoMCkpIHwKKwkgICAgICBHRU44X1BQQVQoNSwgR0VOOF9QUEFUX1dCIHwgR0VO OF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDEpKSB8CisJICAgICAgR0VOOF9QUEFUKDYs IEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FHRSgyKSkgfAor CSAgICAgIEdFTjhfUFBBVCg3LCBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDRUxMQyB8IEdF TjhfUFBBVF9BR0UoMykpOworCisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOOF9QUklW QVRFX1BBVF9MTywgbG93ZXJfMzJfYml0cyhwYXQpKTsKKwlpbnRlbF91bmNvcmVfd3JpdGUodW5j b3JlLCBHRU44X1BSSVZBVEVfUEFUX0hJLCB1cHBlcl8zMl9iaXRzKHBhdCkpOworfQorCitzdGF0 aWMgdm9pZCBjaHZfc2V0dXBfcHJpdmF0ZV9wcGF0KHN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29y ZSkKK3sKKwl1NjQgcGF0OworCisJLyoKKwkgKiBNYXAgV0Igb24gQkRXIHRvIHNub29wZWQgb24g Q0hWLgorCSAqCisJICogT25seSB0aGUgc25vb3AgYml0IGhhcyBtZWFuaW5nIGZvciBDSFYsIHRo ZSByZXN0IGlzCisJICogaWdub3JlZC4KKwkgKgorCSAqIFRoZSBoYXJkd2FyZSB3aWxsIG5ldmVy IHNub29wIGZvciBjZXJ0YWluIHR5cGVzIG9mIGFjY2Vzc2VzOgorCSAqIC0gQ1BVIEdUVCAoR01B RFItPkdHVFQtPm5vIHNub29wLT5tZW1vcnkpCisJICogLSBQUEdUVCBwYWdlIHRhYmxlcworCSAq IC0gc29tZSBvdGhlciBzcGVjaWFsIGN5Y2xlcworCSAqCisJICogQXMgd2l0aCBCRFcsIHdlIGFs c28gbmVlZCB0byBjb25zaWRlciB0aGUgZm9sbG93aW5nIGZvciBHVCBhY2Nlc3NlczoKKwkgKiAi Rm9yIEdHVFQsIHRoZXJlIGlzIE5PIHBhdF9zZWxbMjowXSBmcm9tIHRoZSBlbnRyeSwKKwkgKiBz byBSVEwgd2lsbCBhbHdheXMgdXNlIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvCisJICogcGF0 X3NlbCA9IDAwMCIuCisJICogV2hpY2ggbWVhbnMgd2UgbXVzdCBzZXQgdGhlIHNub29wIGJpdCBp biBQQVQgZW50cnkgMAorCSAqIGluIG9yZGVyIHRvIGtlZXAgdGhlIGdsb2JhbCBzdGF0dXMgcGFn ZSB3b3JraW5nLgorCSAqLworCisJcGF0ID0gR0VOOF9QUEFUKDAsIENIVl9QUEFUX1NOT09QKSB8 CisJICAgICAgR0VOOF9QUEFUKDEsIDApIHwKKwkgICAgICBHRU44X1BQQVQoMiwgMCkgfAorCSAg ICAgIEdFTjhfUFBBVCgzLCAwKSB8CisJICAgICAgR0VOOF9QUEFUKDQsIENIVl9QUEFUX1NOT09Q KSB8CisJICAgICAgR0VOOF9QUEFUKDUsIENIVl9QUEFUX1NOT09QKSB8CisJICAgICAgR0VOOF9Q UEFUKDYsIENIVl9QUEFUX1NOT09QKSB8CisJICAgICAgR0VOOF9QUEFUKDcsIENIVl9QUEFUX1NO T09QKTsKKworCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjhfUFJJVkFURV9QQVRfTE8s IGxvd2VyXzMyX2JpdHMocGF0KSk7CisJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOOF9Q UklWQVRFX1BBVF9ISSwgdXBwZXJfMzJfYml0cyhwYXQpKTsKK30KKwordm9pZCBzZXR1cF9wcml2 YXRlX3BhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpCit7CisJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUgPSB1bmNvcmUtPmk5MTU7CisKKwlHRU1fQlVHX09OKElOVEVMX0dFTihp OTE1KSA8IDgpOworCisJaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMikKKwkJdGdsX3NldHVwX3By aXZhdGVfcHBhdCh1bmNvcmUpOworCWVsc2UgaWYgKElOVEVMX0dFTihpOTE1KSA+PSAxMCkKKwkJ Y25sX3NldHVwX3ByaXZhdGVfcHBhdCh1bmNvcmUpOworCWVsc2UgaWYgKElTX0NIRVJSWVZJRVco aTkxNSkgfHwgSVNfR0VOOV9MUChpOTE1KSkKKwkJY2h2X3NldHVwX3ByaXZhdGVfcHBhdCh1bmNv cmUpOworCWVsc2UKKwkJYmR3X3NldHVwX3ByaXZhdGVfcHBhdCh1bmNvcmUpOworfQorCisjaWYg SVNfRU5BQkxFRChDT05GSUdfRFJNX0k5MTVfU0VMRlRFU1QpCisjaW5jbHVkZSAic2VsZnRlc3Rz L21vY2tfZ3R0LmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0 L2ludGVsX2d0dC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfZ3R0LmgKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi43NTQ4NjFiZDUyMjgKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndC9pbnRlbF9ndHQuaApAQCAtMCwwICsx LDU4MSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCAqLworLyoKKyAqIENvcHly aWdodCDCqSAyMDIwIEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGxlYXNlIHRyeSB0byBtYWlu dGFpbiB0aGUgZm9sbG93aW5nIG9yZGVyIHdpdGhpbiB0aGlzIGZpbGUgdW5sZXNzIGl0IG1ha2Vz CisgKiBzZW5zZSB0byBkbyBvdGhlcndpc2UuIEZyb20gdG9wIHRvIGJvdHRvbToKKyAqIDEuIHR5 cGVkZWZzCisgKiAyLiAjZGVmaW5lcywgYW5kIG1hY3JvcworICogMy4gc3RydWN0dXJlIGRlZmlu aXRpb25zCisgKiA0LiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKgorICogV2l0aGluIGVhY2ggc2Vj dGlvbiwgcGxlYXNlIHRyeSB0byBvcmRlciBieSBnZW5lcmF0aW9uIGluIGFzY2VuZGluZyBvcmRl ciwKKyAqIGZyb20gdG9wIHRvIGJvdHRvbSAoaWUuIGdlbjYgb24gdGhlIHRvcCwgZ2VuOCBvbiB0 aGUgYm90dG9tKS4KKyAqLworCisjaWZuZGVmIF9fSU5URUxfR1RUX0hfXworI2RlZmluZSBfX0lO VEVMX0dUVF9IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxs aW51eC9rcmVmLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdl dmVjLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC93 b3JrcXVldWUuaD4KKworI2luY2x1ZGUgPGRybS9kcm1fbW0uaD4KKworI2luY2x1ZGUgImd0L2lu dGVsX3Jlc2V0LmgiCisjaW5jbHVkZSAiaTkxNV9nZW1fZmVuY2VfcmVnLmgiCisjaW5jbHVkZSAi aTkxNV9zZWxmdGVzdC5oIgorI2luY2x1ZGUgImk5MTVfdm1hX3R5cGVzLmgiCisKKyNkZWZpbmUg STkxNV9HRlBfQUxMT1dfRkFJTCAoR0ZQX0tFUk5FTCB8IF9fR0ZQX1JFVFJZX01BWUZBSUwgfCBf X0dGUF9OT1dBUk4pCisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fSTkxNV9UUkFDRV9HVFQp CisjZGVmaW5lIERCRyguLi4pIHRyYWNlX3ByaW50ayhfX1ZBX0FSR1NfXykKKyNlbHNlCisjZGVm aW5lIERCRyguLi4pCisjZW5kaWYKKworI2RlZmluZSBOQUxMT0MgMyAvKiAxIG5vcm1hbCwgMSBm b3IgY29uY3VycmVudCB0aHJlYWRzLCAxIGZvciBwcmVhbGxvY2F0aW9uICovCisKKyNkZWZpbmUg STkxNV9HVFRfUEFHRV9TSVpFXzRLCUJJVF9VTEwoMTIpCisjZGVmaW5lIEk5MTVfR1RUX1BBR0Vf U0laRV82NEsJQklUX1VMTCgxNikKKyNkZWZpbmUgSTkxNV9HVFRfUEFHRV9TSVpFXzJNCUJJVF9V TEwoMjEpCisKKyNkZWZpbmUgSTkxNV9HVFRfUEFHRV9TSVpFIEk5MTVfR1RUX1BBR0VfU0laRV80 SworI2RlZmluZSBJOTE1X0dUVF9NQVhfUEFHRV9TSVpFIEk5MTVfR1RUX1BBR0VfU0laRV8yTQor CisjZGVmaW5lIEk5MTVfR1RUX1BBR0VfTUFTSyAtSTkxNV9HVFRfUEFHRV9TSVpFCisKKyNkZWZp bmUgSTkxNV9HVFRfTUlOX0FMSUdOTUVOVCBJOTE1X0dUVF9QQUdFX1NJWkUKKworI2RlZmluZSBJ OTE1X0ZFTkNFX1JFR19OT05FIC0xCisjZGVmaW5lIEk5MTVfTUFYX05VTV9GRU5DRVMgMzIKKy8q IDMyIGZlbmNlcyArIHNpZ24gYml0IGZvciBGRU5DRV9SRUdfTk9ORSAqLworI2RlZmluZSBJOTE1 X01BWF9OVU1fRkVOQ0VfQklUUyA2CisKK3R5cGVkZWYgdTMyIGdlbjZfcHRlX3Q7Cit0eXBlZGVm IHU2NCBnZW44X3B0ZV90OworCisjZGVmaW5lIGdndHRfdG90YWxfZW50cmllcyhnZ3R0KSAoKGdn dHQpLT52bS50b3RhbCA+PiBQQUdFX1NISUZUKQorCisjZGVmaW5lIEk5MTVfUFRFUyhwdGVfbGVu KQkJKCh1bnNpZ25lZCBpbnQpKFBBR0VfU0laRSAvIChwdGVfbGVuKSkpCisjZGVmaW5lIEk5MTVf UFRFX01BU0socHRlX2xlbikJCShJOTE1X1BURVMocHRlX2xlbikgLSAxKQorI2RlZmluZSBJOTE1 X1BERVMJCQk1MTIKKyNkZWZpbmUgSTkxNV9QREVfTUFTSwkJCShJOTE1X1BERVMgLSAxKQorCisv KiBnZW42LWhzdyBoYXMgYml0IDExLTQgZm9yIHBoeXNpY2FsIGFkZHIgYml0IDM5LTMyICovCisj ZGVmaW5lIEdFTjZfR1RUX0FERFJfRU5DT0RFKGFkZHIpCSgoYWRkcikgfCAoKChhZGRyKSA+PiAy OCkgJiAweGZmMCkpCisjZGVmaW5lIEdFTjZfUFRFX0FERFJfRU5DT0RFKGFkZHIpCUdFTjZfR1RU X0FERFJfRU5DT0RFKGFkZHIpCisjZGVmaW5lIEdFTjZfUERFX0FERFJfRU5DT0RFKGFkZHIpCUdF TjZfR1RUX0FERFJfRU5DT0RFKGFkZHIpCisjZGVmaW5lIEdFTjZfUFRFX0NBQ0hFX0xMQwkJKDIg PDwgMSkKKyNkZWZpbmUgR0VONl9QVEVfVU5DQUNIRUQJCSgxIDw8IDEpCisjZGVmaW5lIEdFTjZf UFRFX1ZBTElECQkJUkVHX0JJVCgwKQorCisjZGVmaW5lIEdFTjZfUFRFUwkJCUk5MTVfUFRFUyhz aXplb2YoZ2VuNl9wdGVfdCkpCisjZGVmaW5lIEdFTjZfUERfU0laRQkJICAgICAgICAoSTkxNV9Q REVTICogUEFHRV9TSVpFKQorI2RlZmluZSBHRU42X1BEX0FMSUdOCQkJKFBBR0VfU0laRSAqIDE2 KQorI2RlZmluZSBHRU42X1BERV9TSElGVAkJCTIyCisjZGVmaW5lIEdFTjZfUERFX1ZBTElECQkJ UkVHX0JJVCgwKQorI2RlZmluZSBOVU1fUFRFKHBkZV9zaGlmdCkgICAgICgxIDw8IChwZGVfc2hp ZnQgLSBQQUdFX1NISUZUKSkKKworI2RlZmluZSBHRU43X1BURV9DQUNIRV9MM19MTEMJCSgzIDw8 IDEpCisKKyNkZWZpbmUgQllUX1BURV9TTk9PUEVEX0JZX0NQVV9DQUNIRVMJUkVHX0JJVCgyKQor I2RlZmluZSBCWVRfUFRFX1dSSVRFQUJMRQkJUkVHX0JJVCgxKQorCisvKiBDYWNoZWFiaWxpdHkg Q29udHJvbCBpcyBhIDQtYml0IHZhbHVlLiBUaGUgbG93IHRocmVlIGJpdHMgYXJlIHN0b3JlZCBp biBiaXRzCisgKiAzOjEgb2YgdGhlIFBURSwgd2hpbGUgdGhlIGZvdXJ0aCBiaXQgaXMgc3RvcmVk IGluIGJpdCAxMSBvZiB0aGUgUFRFLgorICovCisjZGVmaW5lIEhTV19DQUNIRUFCSUxJVFlfQ09O VFJPTChiaXRzKQkoKCgoYml0cykgJiAweDcpIDw8IDEpIHwgXAorCQkJCQkgKCgoYml0cykgJiAw eDgpIDw8ICgxMSAtIDMpKSkKKyNkZWZpbmUgSFNXX1dCX0xMQ19BR0UzCQkJSFNXX0NBQ0hFQUJJ TElUWV9DT05UUk9MKDB4MikKKyNkZWZpbmUgSFNXX1dCX0xMQ19BR0UwCQkJSFNXX0NBQ0hFQUJJ TElUWV9DT05UUk9MKDB4MykKKyNkZWZpbmUgSFNXX1dCX0VMTENfTExDX0FHRTMJCUhTV19DQUNI RUFCSUxJVFlfQ09OVFJPTCgweDgpCisjZGVmaW5lIEhTV19XQl9FTExDX0xMQ19BR0UwCQlIU1df Q0FDSEVBQklMSVRZX0NPTlRST0woMHhiKQorI2RlZmluZSBIU1dfV1RfRUxMQ19MTENfQUdFMwkJ SFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKDB4NykKKyNkZWZpbmUgSFNXX1dUX0VMTENfTExDX0FH RTAJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweDYpCisjZGVmaW5lIEhTV19QVEVfVU5DQUNI RUQJCSgwKQorI2RlZmluZSBIU1dfR1RUX0FERFJfRU5DT0RFKGFkZHIpCSgoYWRkcikgfCAoKChh ZGRyKSA+PiAyOCkgJiAweDdmMCkpCisjZGVmaW5lIEhTV19QVEVfQUREUl9FTkNPREUoYWRkcikJ SFNXX0dUVF9BRERSX0VOQ09ERShhZGRyKQorCisvKgorICogR0VOOCAzMmIgc3R5bGUgYWRkcmVz cyBpcyBkZWZpbmVkIGFzIGEgMyBsZXZlbCBwYWdlIHRhYmxlOgorICogMzE6MzAgfCAyOToyMSB8 IDIwOjEyIHwgIDExOjAKKyAqIFBEUEUgIHwgIFBERSAgfCAgUFRFICB8IG9mZnNldAorICogVGhl IGRpZmZlcmVuY2UgYXMgY29tcGFyZWQgdG8gbm9ybWFsIHg4NiAzIGxldmVsIHBhZ2UgdGFibGUg aXMgdGhlIFBEUEVzIGFyZQorICogcHJvZ3JhbW1lZCB2aWEgcmVnaXN0ZXIuCisgKgorICogR0VO OCA0OGIgc3R5bGUgYWRkcmVzcyBpcyBkZWZpbmVkIGFzIGEgNCBsZXZlbCBwYWdlIHRhYmxlOgor ICogNDc6MzkgfCAzODozMCB8IDI5OjIxIHwgMjA6MTIgfCAgMTE6MAorICogUE1MNEUgfCBQRFBF ICB8ICBQREUgIHwgIFBURSAgfCBvZmZzZXQKKyAqLworI2RlZmluZSBHRU44XzNMVkxfUERQRVMJ CQk0CisKKyNkZWZpbmUgUFBBVF9VTkNBQ0hFRAkJCShfUEFHRV9QV1QgfCBfUEFHRV9QQ0QpCisj ZGVmaW5lIFBQQVRfQ0FDSEVEX1BERQkJCTAgLyogV0IgTExDICovCisjZGVmaW5lIFBQQVRfQ0FD SEVECQkJX1BBR0VfUEFUIC8qIFdCIExMQ2VMTEMgKi8KKyNkZWZpbmUgUFBBVF9ESVNQTEFZX0VM TEMJCV9QQUdFX1BDRCAvKiBXVCBlTExDICovCisKKyNkZWZpbmUgQ0hWX1BQQVRfU05PT1AJCQlS RUdfQklUKDYpCisjZGVmaW5lIEdFTjhfUFBBVF9BR0UoeCkJCSgoeCk8PDQpCisjZGVmaW5lIEdF TjhfUFBBVF9MTENlTExDCQkoMzw8MikKKyNkZWZpbmUgR0VOOF9QUEFUX0xMQ0VMTEMJCSgyPDwy KQorI2RlZmluZSBHRU44X1BQQVRfTExDCQkJKDE8PDIpCisjZGVmaW5lIEdFTjhfUFBBVF9XQgkJ CSgzPDwwKQorI2RlZmluZSBHRU44X1BQQVRfV1QJCQkoMjw8MCkKKyNkZWZpbmUgR0VOOF9QUEFU X1dDCQkJKDE8PDApCisjZGVmaW5lIEdFTjhfUFBBVF9VQwkJCSgwPDwwKQorI2RlZmluZSBHRU44 X1BQQVRfRUxMQ19PVkVSUklERQkJKDA8PDIpCisjZGVmaW5lIEdFTjhfUFBBVChpLCB4KQkJCSgo dTY0KSh4KSA8PCAoKGkpICogOCkpCisKKyNkZWZpbmUgR0VOOF9QREVfSVBTXzY0SyBCSVQoMTEp CisjZGVmaW5lIEdFTjhfUERFX1BTXzJNICAgQklUKDcpCisKKyNkZWZpbmUgZm9yX2VhY2hfc2d0 X2RhZGRyKF9fZHAsIF9faXRlciwgX19zZ3QpIFwKKwlfX2Zvcl9lYWNoX3NndF9kYWRkcihfX2Rw LCBfX2l0ZXIsIF9fc2d0LCBJOTE1X0dUVF9QQUdFX1NJWkUpCisKK3N0cnVjdCBpOTE1X3BhZ2Vf ZG1hIHsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwl1bmlvbiB7CisJCWRtYV9hZGRyX3QgZGFkZHI7 CisKKwkJLyogRm9yIGdlbjYvZ2VuNyBvbmx5LiBUaGlzIGlzIHRoZSBvZmZzZXQgaW4gdGhlIEdH VFQKKwkJICogd2hlcmUgdGhlIHBhZ2UgZGlyZWN0b3J5IGVudHJpZXMgZm9yIFBQR1RUIGJlZ2lu CisJCSAqLworCQl1MzIgZ2d0dF9vZmZzZXQ7CisJfTsKK307CisKK3N0cnVjdCBpOTE1X3BhZ2Vf c2NyYXRjaCB7CisJc3RydWN0IGk5MTVfcGFnZV9kbWEgYmFzZTsKKwl1NjQgZW5jb2RlOworfTsK Kworc3RydWN0IGk5MTVfcGFnZV90YWJsZSB7CisJc3RydWN0IGk5MTVfcGFnZV9kbWEgYmFzZTsK KwlhdG9taWNfdCB1c2VkOworfTsKKworc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgeworCXN0 cnVjdCBpOTE1X3BhZ2VfdGFibGUgcHQ7CisJc3BpbmxvY2tfdCBsb2NrOworCXZvaWQgKmVudHJ5 WzUxMl07Cit9OworCisjZGVmaW5lIF9fcHhfY2hvb3NlX2V4cHIoeCwgdHlwZSwgZXhwciwgb3Ro ZXIpIFwKKwlfX2J1aWx0aW5fY2hvb3NlX2V4cHIoIFwKKwlfX2J1aWx0aW5fdHlwZXNfY29tcGF0 aWJsZV9wKHR5cGVvZih4KSwgdHlwZSkgfHwgXAorCV9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxl X3AodHlwZW9mKHgpLCBjb25zdCB0eXBlKSwgXAorCSh7IHR5cGUgX194ID0gKHR5cGUpKHgpOyBl eHByOyB9KSwgXAorCW90aGVyKQorCisjZGVmaW5lIHB4X2Jhc2UocHgpIFwKKwlfX3B4X2Nob29z ZV9leHByKHB4LCBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqLCBfX3gsIFwKKwlfX3B4X2Nob29zZV9l eHByKHB4LCBzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0Y2ggKiwgJl9feC0+YmFzZSwgXAorCV9fcHhf Y2hvb3NlX2V4cHIocHgsIHN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKiwgJl9feC0+YmFzZSwgXAor CV9fcHhfY2hvb3NlX2V4cHIocHgsIHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICosICZfX3gt PnB0LmJhc2UsIFwKKwkodm9pZCkwKSkpKQorI2RlZmluZSBweF9kbWEocHgpIChweF9iYXNlKHB4 KS0+ZGFkZHIpCisKKyNkZWZpbmUgcHhfcHQocHgpIFwKKwlfX3B4X2Nob29zZV9leHByKHB4LCBz dHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICosIF9feCwgXAorCV9fcHhfY2hvb3NlX2V4cHIocHgsIHN0 cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICosICZfX3gtPnB0LCBcCisJKHZvaWQpMCkpCisjZGVm aW5lIHB4X3VzZWQocHgpICgmcHhfcHQocHgpLT51c2VkKQorCitlbnVtIGk5MTVfY2FjaGVfbGV2 ZWw7CisKK3N0cnVjdCBkcm1faTkxNV9maWxlX3ByaXZhdGU7CitzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdDsKK3N0cnVjdCBpOTE1X3ZtYTsKK3N0cnVjdCBpbnRlbF9ndDsKKworc3RydWN0IGk5 MTVfdm1hX29wcyB7CisJLyogTWFwIGFuIG9iamVjdCBpbnRvIGFuIGFkZHJlc3Mgc3BhY2Ugd2l0 aCB0aGUgZ2l2ZW4gY2FjaGUgZmxhZ3MuICovCisJaW50ICgqYmluZF92bWEpKHN0cnVjdCBpOTE1 X3ZtYSAqdm1hLAorCQkJZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAorCQkJdTMy IGZsYWdzKTsKKwkvKgorCSAqIFVubWFwIGFuIG9iamVjdCBmcm9tIGFuIGFkZHJlc3Mgc3BhY2Uu IFRoaXMgdXN1YWxseSBjb25zaXN0cyBvZgorCSAqIHNldHRpbmcgdGhlIHZhbGlkIFBURSBlbnRy aWVzIHRvIGEgcmVzZXJ2ZWQgc2NyYXRjaCBwYWdlLgorCSAqLworCXZvaWQgKCp1bmJpbmRfdm1h KShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7CisKKwlpbnQgKCpzZXRfcGFnZXMpKHN0cnVjdCBpOTE1 X3ZtYSAqdm1hKTsKKwl2b2lkICgqY2xlYXJfcGFnZXMpKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsK K307CisKK3N0cnVjdCBwYWdlc3Rhc2ggeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgcGFn ZXZlYyBwdmVjOworfTsKKwordm9pZCBzdGFzaF9pbml0KHN0cnVjdCBwYWdlc3Rhc2ggKnN0YXNo KTsKKworc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSB7CisJc3RydWN0IGtyZWYgcmVmOworCXN0 cnVjdCByY3Vfd29yayByY3U7CisKKwlzdHJ1Y3QgZHJtX21tIG1tOworCXN0cnVjdCBpbnRlbF9n dCAqZ3Q7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTU7CisJc3RydWN0IGRldmljZSAq ZG1hOworCS8qIEV2ZXJ5IGFkZHJlc3Mgc3BhY2UgYmVsb25ncyB0byBhIHN0cnVjdCBmaWxlIC0g ZXhjZXB0IGZvciB0aGUgZ2xvYmFsCisJICogR1RUIHRoYXQgaXMgb3duZWQgYnkgdGhlIGRyaXZl ciAoYW5kIHNvIEBmaWxlIGlzIHNldCB0byBOVUxMKS4gSW4KKwkgKiBwcmluY2lwbGUsIG5vIGlu Zm9ybWF0aW9uIHNob3VsZCBsZWFrIGZyb20gb25lIGNvbnRleHQgdG8gYW5vdGhlcgorCSAqIChv ciBiZXR3ZWVuIGZpbGVzL3Byb2Nlc3NlcyBldGMpIHVubGVzcyBleHBsaWNpdGx5IHNoYXJlZCBi eSB0aGUKKwkgKiBvd25lci4gVHJhY2tpbmcgdGhlIG93bmVyIGlzIGltcG9ydGFudCBpbiBvcmRl ciB0byBmcmVlIHVwIHBlci1maWxlCisJICogb2JqZWN0cyBhbG9uZyB3aXRoIHRoZSBmaWxlLCB0 byBhaWRlIHJlc291cmNlIHRyYWNraW5nLCBhbmQgdG8KKwkgKiBhc3NpZ24gYmxhbWUuCisJICov CisJc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZSAqZmlsZTsKKwl1NjQgdG90YWw7CQkvKiBz aXplIGFkZHIgc3BhY2UgbWFwcyAoZXguIDJHQiBmb3IgZ2d0dCkgKi8KKwl1NjQgcmVzZXJ2ZWQ7 CQkvKiBzaXplIGFkZHIgc3BhY2UgcmVzZXJ2ZWQgKi8KKworCXVuc2lnbmVkIGludCBiaW5kX2Fz eW5jX2ZsYWdzOworCisJLyoKKwkgKiBFYWNoIGFjdGl2ZSB1c2VyIGNvbnRleHQgaGFzIGl0cyBv d24gYWRkcmVzcyBzcGFjZSAoaW4gZnVsbC1wcGd0dCkuCisJICogU2luY2UgdGhlIHZtIG1heSBi ZSBzaGFyZWQgYmV0d2VlbiBtdWx0aXBsZSBjb250ZXh0cywgd2UgY291bnQgaG93CisJICogbWFu eSBjb250ZXh0cyBrZWVwIHVzICJvcGVuIi4gT25jZSBvcGVuIGhpdHMgemVybywgd2UgYXJlIGNs b3NlZAorCSAqIGFuZCBkbyBub3QgYWxsb3cgYW55IG5ldyBhdHRhY2htZW50cywgYW5kIHByb2Nl ZWQgdG8gc2h1dGRvd24gb3VyCisJICogdm1hIGFuZCBwYWdlIGRpcmVjdG9yaWVzLgorCSAqLwor CWF0b21pY190IG9wZW47CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7IC8qIHByb3RlY3RzIHZtYSBh bmQgb3VyIGxpc3RzICovCisjZGVmaW5lIFZNX0NMQVNTX0dHVFQgMAorI2RlZmluZSBWTV9DTEFT U19QUEdUVCAxCisKKwlzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0Y2ggc2NyYXRjaFs0XTsKKwl1bnNp Z25lZCBpbnQgc2NyYXRjaF9vcmRlcjsKKwl1bnNpZ25lZCBpbnQgdG9wOworCisJLyoqCisJICog TGlzdCBvZiB2bWEgY3VycmVudGx5IGJvdW5kLgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQgYm91 bmRfbGlzdDsKKworCXN0cnVjdCBwYWdlc3Rhc2ggZnJlZV9wYWdlczsKKworCS8qIEdsb2JhbCBH VFQgKi8KKwlib29sIGlzX2dndHQ6MTsKKworCS8qIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVuY2Fj aGVkIHVwZGF0ZXMgb2YgdGhlIHBhZ2UgZGlyZWN0b3JpZXMgKi8KKwlib29sIHB0X2ttYXBfd2M6 MTsKKworCS8qIFNvbWUgc3lzdGVtcyBzdXBwb3J0IHJlYWQtb25seSBtYXBwaW5ncyBmb3IgR0dU VCBhbmQvb3IgUFBHVFQgKi8KKwlib29sIGhhc19yZWFkX29ubHk6MTsKKworCXU2NCAoKnB0ZV9l bmNvZGUpKGRtYV9hZGRyX3QgYWRkciwKKwkJCSAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVs LAorCQkJICB1MzIgZmxhZ3MpOyAvKiBDcmVhdGUgYSB2YWxpZCBQVEUgKi8KKyNkZWZpbmUgUFRF X1JFQURfT05MWQlCSVQoMCkKKworCWludCAoKmFsbG9jYXRlX3ZhX3JhbmdlKShzdHJ1Y3QgaTkx NV9hZGRyZXNzX3NwYWNlICp2bSwKKwkJCQkgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKTsKKwl2b2lk ICgqY2xlYXJfcmFuZ2UpKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJICAgIHU2 NCBzdGFydCwgdTY0IGxlbmd0aCk7CisJdm9pZCAoKmluc2VydF9wYWdlKShzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSwKKwkJCSAgICBkbWFfYWRkcl90IGFkZHIsCisJCQkgICAgdTY0IG9m ZnNldCwKKwkJCSAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCisJCQkgICAg dTMyIGZsYWdzKTsKKwl2b2lkICgqaW5zZXJ0X2VudHJpZXMpKHN0cnVjdCBpOTE1X2FkZHJlc3Nf c3BhY2UgKnZtLAorCQkJICAgICAgIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkJICAgICAgIGVu dW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKKwkJCSAgICAgICB1MzIgZmxhZ3MpOwor CXZvaWQgKCpjbGVhbnVwKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSk7CisKKwlzdHJ1 Y3QgaTkxNV92bWFfb3BzIHZtYV9vcHM7CisKKwlJOTE1X1NFTEZURVNUX0RFQ0xBUkUoc3RydWN0 IGZhdWx0X2F0dHIgZmF1bHRfYXR0cik7CisJSTkxNV9TRUxGVEVTVF9ERUNMQVJFKGJvb2wgc2Ny dWJfNjRLKTsKK307CisKKy8qIFRoZSBHcmFwaGljcyBUcmFuc2xhdGlvbiBUYWJsZSBpcyB0aGUg d2F5IGluIHdoaWNoIEdFTiBoYXJkd2FyZSB0cmFuc2xhdGVzIGEKKyAqIEdyYXBoaWNzIFZpcnR1 YWwgQWRkcmVzcyBpbnRvIGEgUGh5c2ljYWwgQWRkcmVzcy4gSW4gYWRkaXRpb24gdG8gdGhlIG5v cm1hbAorICogY29sbGF0ZXJhbCBhc3NvY2lhdGVkIHdpdGggYW55IHZhLT5wYSB0cmFuc2xhdGlv bnMgR0VOIGhhcmR3YXJlIGFsc28gaGFzIGEKKyAqIHBvcnRpb24gb2YgdGhlIEdUVCB3aGljaCBj YW4gYmUgbWFwcGVkIGJ5IHRoZSBDUFUgYW5kIHJlbWFpbiBib3RoIGNvaGVyZW50CisgKiBhbmQg Y29ycmVjdCAoaW4gY2FzZXMgbGlrZSBzd2l6emxpbmcpLiBUaGF0IHJlZ2lvbiBpcyByZWZlcnJl ZCB0byBhcyBHTUFEUiBpbgorICogdGhlIHNwZWMuCisgKi8KK3N0cnVjdCBpOTE1X2dndHQgewor CXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ugdm07CisKKwlzdHJ1Y3QgaW9fbWFwcGluZyBpb21h cDsJLyogTWFwcGluZyB0byBvdXIgQ1BVIG1hcHBhYmxlIHJlZ2lvbiAqLworCXN0cnVjdCByZXNv dXJjZSBnbWFkcjsgICAgICAgICAgLyogR01BRFIgcmVzb3VyY2UgKi8KKwlyZXNvdXJjZV9zaXpl X3QgbWFwcGFibGVfZW5kOwkvKiBFbmQgb2Zmc2V0IHRoYXQgd2UgY2FuIENQVSBtYXAgKi8KKwor CS8qKiAiR3JhcGhpY3MgU3RvbGVuIE1lbW9yeSIgaG9sZHMgdGhlIGdsb2JhbCBQVEVzICovCisJ dm9pZCBfX2lvbWVtICpnc207CisJdm9pZCAoKmludmFsaWRhdGUpKHN0cnVjdCBpOTE1X2dndHQg KmdndHQpOworCisJLyoqIFBQR1RUIHVzZWQgZm9yIGFsaWFzaW5nIHRoZSBQUEdUVCB3aXRoIHRo ZSBHVFQgKi8KKwlzdHJ1Y3QgaTkxNV9wcGd0dCAqYWxpYXM7CisKKwlib29sIGRvX2lkbGVfbWFw czsKKworCWludCBtdHJyOworCisJLyoqIEJpdCA2IHN3aXp6bGluZyByZXF1aXJlZCBmb3IgWCB0 aWxpbmcgKi8KKwl1MzIgYml0XzZfc3dpenpsZV94OworCS8qKiBCaXQgNiBzd2l6emxpbmcgcmVx dWlyZWQgZm9yIFkgdGlsaW5nICovCisJdTMyIGJpdF82X3N3aXp6bGVfeTsKKworCXUzMiBwaW5f YmlhczsKKworCXVuc2lnbmVkIGludCBudW1fZmVuY2VzOworCXN0cnVjdCBpOTE1X2ZlbmNlX3Jl ZyBmZW5jZV9yZWdzW0k5MTVfTUFYX05VTV9GRU5DRVNdOworCXN0cnVjdCBsaXN0X2hlYWQgZmVu Y2VfbGlzdDsKKworCS8qKiBMaXN0IG9mIGFsbCBvYmplY3RzIGluIGd0dF9zcGFjZSwgY3VycmVu dGx5IG1tYXBlZCBieSB1c2Vyc3BhY2UuCisJICogQWxsIG9iamVjdHMgd2l0aGluIHRoaXMgbGlz dCBtdXN0IGFsc28gYmUgb24gYm91bmRfbGlzdC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHVz ZXJmYXVsdF9saXN0OworCisJLyogTWFudWFsIHJ1bnRpbWUgcG0gYXV0b3N1c3BlbmQgZGVsYXkg Zm9yIHVzZXIgR0dUVCBtbWFwcyAqLworCXN0cnVjdCBpbnRlbF93YWtlcmVmX2F1dG8gdXNlcmZh dWx0X3dha2VyZWY7CisKKwlzdHJ1Y3QgZHJtX21tX25vZGUgZXJyb3JfY2FwdHVyZTsKKwlzdHJ1 Y3QgZHJtX21tX25vZGUgdWNfZnc7Cit9OworCitzdHJ1Y3QgaTkxNV9wcGd0dCB7CisJc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSB2bTsKKworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpw ZDsKK307CisKKyNkZWZpbmUgaTkxNV9pc19nZ3R0KHZtKSAoKHZtKS0+aXNfZ2d0dCkKKworc3Rh dGljIGlubGluZSBib29sCitpOTE1X3ZtX2lzXzRsdmwoY29uc3Qgc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0pCit7CisJcmV0dXJuICh2bS0+dG90YWwgLSAxKSA+PiAzMjsKK30KKworc3Rh dGljIGlubGluZSBib29sCitpOTE1X3ZtX2hhc19zY3JhdGNoXzY0SyhzdHJ1Y3QgaTkxNV9hZGRy ZXNzX3NwYWNlICp2bSkKK3sKKwlyZXR1cm4gdm0tPnNjcmF0Y2hfb3JkZXIgPT0gZ2V0X29yZGVy KEk5MTVfR1RUX1BBR0VfU0laRV82NEspOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2k5MTVf dm1faGFzX2NhY2hlX2NvbG9yaW5nKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQorewor CXJldHVybiBpOTE1X2lzX2dndHQodm0pICYmIHZtLT5tbS5jb2xvcl9hZGp1c3Q7Cit9CisKK3N0 YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfZ2d0dCAqCitpOTE1X3ZtX3RvX2dndHQoc3RydWN0IGk5 MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBp OTE1X2dndHQsIHZtKSk7CisJR0VNX0JVR19PTighaTkxNV9pc19nZ3R0KHZtKSk7CisJcmV0dXJu IGNvbnRhaW5lcl9vZih2bSwgc3RydWN0IGk5MTVfZ2d0dCwgdm0pOworfQorCitzdGF0aWMgaW5s aW5lIHN0cnVjdCBpOTE1X3BwZ3R0ICoKK2k5MTVfdm1fdG9fcHBndHQoc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0pCit7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpOTE1X3Bw Z3R0LCB2bSkpOworCUdFTV9CVUdfT04oaTkxNV9pc19nZ3R0KHZtKSk7CisJcmV0dXJuIGNvbnRh aW5lcl9vZih2bSwgc3RydWN0IGk5MTVfcHBndHQsIHZtKTsKK30KKworc3RhdGljIGlubGluZSBz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICoKK2k5MTVfdm1fZ2V0KHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtKQoreworCWtyZWZfZ2V0KCZ2bS0+cmVmKTsKKwlyZXR1cm4gdm07Cit9CisK K3ZvaWQgaTkxNV92bV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKTsKKworc3RhdGljIGlubGlu ZSB2b2lkIGk5MTVfdm1fcHV0KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQoreworCWty ZWZfcHV0KCZ2bS0+cmVmLCBpOTE1X3ZtX3JlbGVhc2UpOworfQorCitzdGF0aWMgaW5saW5lIHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKgoraTkxNV92bV9vcGVuKHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtKQoreworCUdFTV9CVUdfT04oIWF0b21pY19yZWFkKCZ2bS0+b3BlbikpOwor CWF0b21pY19pbmMoJnZtLT5vcGVuKTsKKwlyZXR1cm4gaTkxNV92bV9nZXQodm0pOworfQorCitz dGF0aWMgaW5saW5lIGJvb2wKK2k5MTVfdm1fdHJ5b3BlbihzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSkKK3sKKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnZtLT5vcGVuLCAxLCAwKSkKKwkJ cmV0dXJuIGk5MTVfdm1fZ2V0KHZtKTsKKworCXJldHVybiBmYWxzZTsKK30KKwordm9pZCBfX2k5 MTVfdm1fY2xvc2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOworCitzdGF0aWMgaW5s aW5lIHZvaWQKK2k5MTVfdm1fY2xvc2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCit7 CisJR0VNX0JVR19PTighYXRvbWljX3JlYWQoJnZtLT5vcGVuKSk7CisJaWYgKGF0b21pY19kZWNf YW5kX3Rlc3QoJnZtLT5vcGVuKSkKKwkJX19pOTE1X3ZtX2Nsb3NlKHZtKTsKKworCWk5MTVfdm1f cHV0KHZtKTsKK30KKwordm9pZCBpOTE1X2FkZHJlc3Nfc3BhY2VfaW5pdChzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSwgaW50IHN1YmNsYXNzKTsKK3ZvaWQgaTkxNV9hZGRyZXNzX3NwYWNl X2Zpbmkoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOworCitzdGF0aWMgaW5saW5lIHUz MiBpOTE1X3B0ZV9pbmRleCh1NjQgYWRkcmVzcywgdW5zaWduZWQgaW50IHBkZV9zaGlmdCkKK3sK Kwljb25zdCB1MzIgbWFzayA9IE5VTV9QVEUocGRlX3NoaWZ0KSAtIDE7CisKKwlyZXR1cm4gKGFk ZHJlc3MgPj4gUEFHRV9TSElGVCkgJiBtYXNrOworfQorCisvKgorICogSGVscGVyIHRvIGNvdW50 cyB0aGUgbnVtYmVyIG9mIFBURXMgd2l0aGluIHRoZSBnaXZlbiBsZW5ndGguIFRoaXMgY291bnQK KyAqIGRvZXMgbm90IGNyb3NzIGEgcGFnZSB0YWJsZSBib3VuZGFyeSwgc28gdGhlIG1heCB2YWx1 ZSB3b3VsZCBiZQorICogR0VONl9QVEVTIGZvciBHRU42LCBhbmQgR0VOOF9QVEVTIGZvciBHRU44 LgorICovCitzdGF0aWMgaW5saW5lIHUzMiBpOTE1X3B0ZV9jb3VudCh1NjQgYWRkciwgdTY0IGxl bmd0aCwgdW5zaWduZWQgaW50IHBkZV9zaGlmdCkKK3sKKwljb25zdCB1NjQgbWFzayA9IH4oKDFV TEwgPDwgcGRlX3NoaWZ0KSAtIDEpOworCXU2NCBlbmQ7CisKKwlHRU1fQlVHX09OKGxlbmd0aCA9 PSAwKTsKKwlHRU1fQlVHX09OKG9mZnNldF9pbl9wYWdlKGFkZHIgfCBsZW5ndGgpKTsKKworCWVu ZCA9IGFkZHIgKyBsZW5ndGg7CisKKwlpZiAoKGFkZHIgJiBtYXNrKSAhPSAoZW5kICYgbWFzaykp CisJCXJldHVybiBOVU1fUFRFKHBkZV9zaGlmdCkgLSBpOTE1X3B0ZV9pbmRleChhZGRyLCBwZGVf c2hpZnQpOworCisJcmV0dXJuIGk5MTVfcHRlX2luZGV4KGVuZCwgcGRlX3NoaWZ0KSAtIGk5MTVf cHRlX2luZGV4KGFkZHIsIHBkZV9zaGlmdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGk5MTVf cGRlX2luZGV4KHU2NCBhZGRyLCB1MzIgc2hpZnQpCit7CisJcmV0dXJuIChhZGRyID4+IHNoaWZ0 KSAmIEk5MTVfUERFX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGk5MTVfcGFnZV90 YWJsZSAqCitpOTE1X3B0X2VudHJ5KGNvbnN0IHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICog Y29uc3QgcGQsCisJICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgbikKK3sKKwlyZXR1cm4gcGQt PmVudHJ5W25dOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5 ICoKK2k5MTVfcGRfZW50cnkoY29uc3Qgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25z dCBwZHAsCisJICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgbikKK3sKKwlyZXR1cm4gcGRwLT5l bnRyeVtuXTsKK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90CitpOTE1X3BhZ2VfZGlyX2Rt YV9hZGRyKGNvbnN0IHN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dCwgY29uc3QgdW5zaWduZWQgaW50 IG4pCit7CisJc3RydWN0IGk5MTVfcGFnZV9kbWEgKnB0ID0gcHBndHQtPnBkLT5lbnRyeVtuXTsK KworCXJldHVybiBweF9kbWEocHQgPzogcHhfYmFzZSgmcHBndHQtPnZtLnNjcmF0Y2hbcHBndHQt PnZtLnRvcF0pKTsKK30KKwordm9pZCBwcGd0dF9pbml0KHN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0 dCwgc3RydWN0IGludGVsX2d0ICpndCk7CisKK2ludCBpOTE1X2dndHRfcHJvYmVfaHcoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpOworaW50IGk5MTVfZ2d0dF9pbml0X2h3KHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1KTsKK2ludCBpOTE1X2dndHRfZW5hYmxlX2h3KHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1KTsKK3ZvaWQgaTkxNV9nZ3R0X2VuYWJsZV9ndWMoc3RydWN0 IGk5MTVfZ2d0dCAqZ2d0dCk7Cit2b2lkIGk5MTVfZ2d0dF9kaXNhYmxlX2d1YyhzdHJ1Y3QgaTkx NV9nZ3R0ICpnZ3R0KTsKK2ludCBpOTE1X2luaXRfZ2d0dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSk7Cit2b2lkIGk5MTVfZ2d0dF9kcml2ZXJfcmVsZWFzZShzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpOTE1X2dndHRfaGFzX2FwZXJ0 dXJlKGNvbnN0IHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCit7CisJcmV0dXJuIGdndHQtPm1hcHBh YmxlX2VuZCA+IDA7Cit9CisKK2ludCBpOTE1X3BwZ3R0X2luaXRfaHcoc3RydWN0IGludGVsX2d0 ICpndCk7CisKK3N0cnVjdCBpOTE1X3BwZ3R0ICppOTE1X3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgaW50 ZWxfZ3QgKmd0KTsKKwordm9pZCBpOTE1X2dlbV9zdXNwZW5kX2d0dF9tYXBwaW5ncyhzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSk7Cit2b2lkIGk5MTVfZ2VtX3Jlc3RvcmVfZ3R0X21hcHBp bmdzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KTsKKwordTY0IGdlbjhfcHRlX2VuY29k ZShkbWFfYWRkcl90IGFkZHIsCisJCSAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCisJ CSAgICB1MzIgZmxhZ3MpOworCitpbnQgc2V0dXBfcGFnZV9kbWEoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sIHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwKTsKK3ZvaWQgY2xlYW51cF9wYWdl X2RtYShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgc3RydWN0IGk5MTVfcGFnZV9kbWEg KnApOworCisjZGVmaW5lIGttYXBfYXRvbWljX3B4KHB4KSBrbWFwX2F0b21pYyhweF9iYXNlKHB4 KS0+cGFnZSkKKwordm9pZAorZmlsbF9wYWdlX2RtYShjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX2Rt YSAqcCwgY29uc3QgdTY0IHZhbCwgdW5zaWduZWQgaW50IGNvdW50KTsKKworI2RlZmluZSBmaWxs X3B4KHB4LCB2KSBmaWxsX3BhZ2VfZG1hKHB4X2Jhc2UocHgpLCAodiksIFBBR0VfU0laRSAvIHNp emVvZih1NjQpKQorI2RlZmluZSBmaWxsMzJfcHgocHgsIHYpIGRvIHsJCQkJCQlcCisJdTY0IHZf XyA9IGxvd2VyXzMyX2JpdHModik7CQkJCQlcCisJZmlsbF9weCgocHgpLCB2X18gPDwgMzIgfCB2 X18pOwkJCQkJXAorfSB3aGlsZSAoMCkKKworaW50IHNldHVwX3NjcmF0Y2hfcGFnZShzdHJ1Y3Qg aTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgZ2ZwX3QgZ2ZwKTsKK3ZvaWQgY2xlYW51cF9zY3JhdGNo X3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOwordm9pZCBmcmVlX3NjcmF0Y2go c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOworCitzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxl ICphbGxvY19wdChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSk7CitzdHJ1Y3QgaTkxNV9w YWdlX2RpcmVjdG9yeSAqYWxsb2NfcGQoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOwor c3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKl9fYWxsb2NfcGQoc2l6ZV90IHN6KTsKKwordm9p ZCBmcmVlX3BkKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLCBzdHJ1Y3QgaTkxNV9wYWdl X2RtYSAqcGQpOworCisjZGVmaW5lIGZyZWVfcHgodm0sIHB4KSBmcmVlX3BkKHZtLCBweF9iYXNl KHB4KSkKKwordm9pZAorX19zZXRfcGRfZW50cnkoc3RydWN0IGk5MTVfcGFnZV9kaXJlY3Rvcnkg KiBjb25zdCBwZCwKKwkgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgaWR4LAorCSAgICAgICBz dHJ1Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHRvLAorCSAgICAgICB1NjQgKCplbmNvZGUpKGNv bnN0IGRtYV9hZGRyX3QsIGNvbnN0IGVudW0gaTkxNV9jYWNoZV9sZXZlbCkpOworCisjZGVmaW5l IHNldF9wZF9lbnRyeShwZCwgaWR4LCB0bykgXAorCV9fc2V0X3BkX2VudHJ5KChwZCksIChpZHgp LCBweF9iYXNlKHRvKSwgZ2VuOF9wZGVfZW5jb2RlKQorCit2b2lkCitjbGVhcl9wZF9lbnRyeShz dHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkLAorCSAgICAgICBjb25zdCB1bnNp Z25lZCBzaG9ydCBpZHgsCisJICAgICAgIGNvbnN0IHN0cnVjdCBpOTE1X3BhZ2Vfc2NyYXRjaCAq IGNvbnN0IHNjcmF0Y2gpOworCitib29sCityZWxlYXNlX3BkX2VudHJ5KHN0cnVjdCBpOTE1X3Bh Z2VfZGlyZWN0b3J5ICogY29uc3QgcGQsCisJCSBjb25zdCB1bnNpZ25lZCBzaG9ydCBpZHgsCisJ CSBzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICogY29uc3QgcHQsCisJCSBjb25zdCBzdHJ1Y3QgaTkx NV9wYWdlX3NjcmF0Y2ggKiBjb25zdCBzY3JhdGNoKTsKK3ZvaWQgZ2VuNl9nZ3R0X2ludmFsaWRh dGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCk7CisKK2ludCBnZ3R0X3NldF9wYWdlcyhzdHJ1Y3Qg aTkxNV92bWEgKnZtYSk7CitpbnQgcHBndHRfc2V0X3BhZ2VzKHN0cnVjdCBpOTE1X3ZtYSAqdm1h KTsKK3ZvaWQgY2xlYXJfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpOworCit2b2lkIGd0dF93 cml0ZV93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZ3QgKmd0KTsKKwordm9pZCBzZXR1cF9wcml2 YXRlX3BhdChzdHJ1Y3QgaW50ZWxfdW5jb3JlICp1bmNvcmUpOworCitzdGF0aWMgaW5saW5lIHN0 cnVjdCBzZ3RfZG1hIHsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWRtYV9hZGRyX3QgZG1h LCBtYXg7Cit9IHNndF9kbWEoc3RydWN0IGk5MTVfdm1hICp2bWEpIHsKKwlzdHJ1Y3Qgc2NhdHRl cmxpc3QgKnNnID0gdm1hLT5wYWdlcy0+c2dsOworCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9h ZGRyZXNzKHNnKTsKKworCXJldHVybiAoc3RydWN0IHNndF9kbWEpeyBzZywgYWRkciwgYWRkciAr IHNnLT5sZW5ndGggfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v aTkxNS9ndC9pbnRlbF9wcGd0dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcHBn dHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmY4NmY3ZTY4Y2U1 ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2d0L2ludGVsX3BwZ3R0 LmMKQEAgLTAsMCArMSwyMTggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKKy8q CisgKiBDb3B5cmlnaHQgwqkgMjAyMCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpbmNsdWRl IDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCisjaW5jbHVkZSAiaW50 ZWxfZ3R0LmgiCisjaW5jbHVkZSAiZ2VuNl9wcGd0dC5oIgorI2luY2x1ZGUgImdlbjhfcHBndHQu aCIKKworc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqYWxsb2NfcHQoc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0pCit7CisJc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQ7CisKKwlwdCA9IGtt YWxsb2Moc2l6ZW9mKCpwdCksIEk5MTVfR0ZQX0FMTE9XX0ZBSUwpOworCWlmICh1bmxpa2VseSgh cHQpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmICh1bmxpa2VseShzZXR1cF9w YWdlX2RtYSh2bSwgJnB0LT5iYXNlKSkpIHsKKwkJa2ZyZWUocHQpOworCQlyZXR1cm4gRVJSX1BU UigtRU5PTUVNKTsKKwl9CisKKwlhdG9taWNfc2V0KCZwdC0+dXNlZCwgMCk7CisJcmV0dXJuIHB0 OworfQorCitzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqX19hbGxvY19wZChzaXplX3Qgc3op Cit7CisJc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKnBkOworCisJcGQgPSBremFsbG9jKHN6 LCBJOTE1X0dGUF9BTExPV19GQUlMKTsKKwlpZiAodW5saWtlbHkoIXBkKSkKKwkJcmV0dXJuIE5V TEw7CisKKwlzcGluX2xvY2tfaW5pdCgmcGQtPmxvY2spOworCXJldHVybiBwZDsKK30KKworc3Ry dWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKmFsbG9jX3BkKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQoreworCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZDsKKworCXBkID0gX19h bGxvY19wZChzaXplb2YoKnBkKSk7CisJaWYgKHVubGlrZWx5KCFwZCkpCisJCXJldHVybiBFUlJf UFRSKC1FTk9NRU0pOworCisJaWYgKHVubGlrZWx5KHNldHVwX3BhZ2VfZG1hKHZtLCBweF9iYXNl KHBkKSkpKSB7CisJCWtmcmVlKHBkKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQor CisJcmV0dXJuIHBkOworfQorCit2b2lkIGZyZWVfcGQoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFj ZSAqdm0sIHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwZCkKK3sKKwljbGVhbnVwX3BhZ2VfZG1hKHZt LCBwZCk7CisJa2ZyZWUocGQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX2RtYV9l bnRyeShzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHBkbWEsCisJCWNvbnN0IHVuc2lnbmVk IHNob3J0IGlkeCwKKwkJY29uc3QgdTY0IGVuY29kZWRfZW50cnkpCit7CisJdTY0ICogY29uc3Qg dmFkZHIgPSBrbWFwX2F0b21pYyhwZG1hLT5wYWdlKTsKKworCXZhZGRyW2lkeF0gPSBlbmNvZGVk X2VudHJ5OworCWt1bm1hcF9hdG9taWModmFkZHIpOworfQorCit2b2lkCitfX3NldF9wZF9lbnRy eShzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkLAorCSAgICAgICBjb25zdCB1 bnNpZ25lZCBzaG9ydCBpZHgsCisJICAgICAgIHN0cnVjdCBpOTE1X3BhZ2VfZG1hICogY29uc3Qg dG8sCisJICAgICAgIHU2NCAoKmVuY29kZSkoY29uc3QgZG1hX2FkZHJfdCwgY29uc3QgZW51bSBp OTE1X2NhY2hlX2xldmVsKSkKK3sKKwkvKiBFYWNoIHRocmVhZCBwcmUtcGlucyB0aGUgcGQsIGFu ZCB3ZSBtYXkgaGF2ZSBhIHRocmVhZCBwZXIgcGRlLiAqLworCUdFTV9CVUdfT04oYXRvbWljX3Jl YWQocHhfdXNlZChwZCkpID4gTkFMTE9DICogQVJSQVlfU0laRShwZC0+ZW50cnkpKTsKKworCWF0 b21pY19pbmMocHhfdXNlZChwZCkpOworCXBkLT5lbnRyeVtpZHhdID0gdG87CisJd3JpdGVfZG1h X2VudHJ5KHB4X2Jhc2UocGQpLCBpZHgsIGVuY29kZSh0by0+ZGFkZHIsIEk5MTVfQ0FDSEVfTExD KSk7Cit9CisKK3ZvaWQKK2NsZWFyX3BkX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5 ICogY29uc3QgcGQsCisJICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGlkeCwKKwkgICAgICAg Y29uc3Qgc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoICogY29uc3Qgc2NyYXRjaCkKK3sKKwlHRU1f QlVHX09OKGF0b21pY19yZWFkKHB4X3VzZWQocGQpKSA9PSAwKTsKKworCXdyaXRlX2RtYV9lbnRy eShweF9iYXNlKHBkKSwgaWR4LCBzY3JhdGNoLT5lbmNvZGUpOworCXBkLT5lbnRyeVtpZHhdID0g TlVMTDsKKwlhdG9taWNfZGVjKHB4X3VzZWQocGQpKTsKK30KKworYm9vbAorcmVsZWFzZV9wZF9l bnRyeShzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkLAorCQkgY29uc3QgdW5z aWduZWQgc2hvcnQgaWR4LAorCQkgc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqIGNvbnN0IHB0LAor CQkgY29uc3Qgc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoICogY29uc3Qgc2NyYXRjaCkKK3sKKwli b29sIGZyZWUgPSBmYWxzZTsKKworCWlmIChhdG9taWNfYWRkX3VubGVzcygmcHQtPnVzZWQsIC0x LCAxKSkKKwkJcmV0dXJuIGZhbHNlOworCisJc3Bpbl9sb2NrKCZwZC0+bG9jayk7CisJaWYgKGF0 b21pY19kZWNfYW5kX3Rlc3QoJnB0LT51c2VkKSkgeworCQljbGVhcl9wZF9lbnRyeShwZCwgaWR4 LCBzY3JhdGNoKTsKKwkJZnJlZSA9IHRydWU7CisJfQorCXNwaW5fdW5sb2NrKCZwZC0+bG9jayk7 CisKKwlyZXR1cm4gZnJlZTsKK30KKworaW50IGk5MTVfcHBndHRfaW5pdF9odyhzdHJ1Y3QgaW50 ZWxfZ3QgKmd0KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5MTU7 CisKKwlndHRfd3JpdGVfd29ya2Fyb3VuZHMoZ3QpOworCisJaWYgKElTX0dFTihpOTE1LCA2KSkK KwkJZ2VuNl9wcGd0dF9lbmFibGUoZ3QpOworCWVsc2UgaWYgKElTX0dFTihpOTE1LCA3KSkKKwkJ Z2VuN19wcGd0dF9lbmFibGUoZ3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qg aTkxNV9wcGd0dCAqCitfX3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQoreworCWlm IChJTlRFTF9HRU4oZ3QtPmk5MTUpIDwgOCkKKwkJcmV0dXJuIGdlbjZfcHBndHRfY3JlYXRlKGd0 KTsKKwllbHNlCisJCXJldHVybiBnZW44X3BwZ3R0X2NyZWF0ZShndCk7Cit9CisKK3N0cnVjdCBp OTE1X3BwZ3R0ICppOTE1X3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQoreworCXN0 cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsKKworCXBwZ3R0ID0gX19wcGd0dF9jcmVhdGUoZ3QpOwor CWlmIChJU19FUlIocHBndHQpKQorCQlyZXR1cm4gcHBndHQ7CisKKwl0cmFjZV9pOTE1X3BwZ3R0 X2NyZWF0ZSgmcHBndHQtPnZtKTsKKworCXJldHVybiBwcGd0dDsKK30KKworc3RhdGljIGludCBw cGd0dF9iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJCSAgZW51bSBpOTE1X2NhY2hl X2xldmVsIGNhY2hlX2xldmVsLAorCQkJICB1MzIgZmxhZ3MpCit7CisJdTMyIHB0ZV9mbGFnczsK KwlpbnQgZXJyOworCisJaWYgKGZsYWdzICYgSTkxNV9WTUFfQUxMT0MpIHsKKwkJZXJyID0gdm1h LT52bS0+YWxsb2NhdGVfdmFfcmFuZ2Uodm1hLT52bSwKKwkJCQkJCSB2bWEtPm5vZGUuc3RhcnQs IHZtYS0+c2l6ZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCXNldF9iaXQoSTkx NV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkpOworCX0KKworCS8qIEFwcGxp Y2FibGUgdG8gVkxWLCBhbmQgZ2VuOCsgKi8KKwlwdGVfZmxhZ3MgPSAwOworCWlmIChpOTE1X2dl bV9vYmplY3RfaXNfcmVhZG9ubHkodm1hLT5vYmopKQorCQlwdGVfZmxhZ3MgfD0gUFRFX1JFQURf T05MWTsKKworCUdFTV9CVUdfT04oIXRlc3RfYml0KEk5MTVfVk1BX0FMTE9DX0JJVCwgX19pOTE1 X3ZtYV9mbGFncyh2bWEpKSk7CisJdm1hLT52bS0+aW5zZXJ0X2VudHJpZXModm1hLT52bSwgdm1h LCBjYWNoZV9sZXZlbCwgcHRlX2ZsYWdzKTsKKwl3bWIoKTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBwcGd0dF91bmJpbmRfdm1hKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCWlm ICh0ZXN0X2FuZF9jbGVhcl9iaXQoSTkxNV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1hX2ZsYWdz KHZtYSkpKQorCQl2bWEtPnZtLT5jbGVhcl9yYW5nZSh2bWEtPnZtLCB2bWEtPm5vZGUuc3RhcnQs IHZtYS0+c2l6ZSk7Cit9CisKK2ludCBwcGd0dF9zZXRfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2 bWEpCit7CisJR0VNX0JVR19PTih2bWEtPnBhZ2VzKTsKKworCXZtYS0+cGFnZXMgPSB2bWEtPm9i ai0+bW0ucGFnZXM7CisKKwl2bWEtPnBhZ2Vfc2l6ZXMgPSB2bWEtPm9iai0+bW0ucGFnZV9zaXpl czsKKworCXJldHVybiAwOworfQorCit2b2lkIHBwZ3R0X2luaXQoc3RydWN0IGk5MTVfcHBndHQg KnBwZ3R0LCBzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1ID0gZ3QtPmk5MTU7CisKKwlwcGd0dC0+dm0uZ3QgPSBndDsKKwlwcGd0dC0+dm0uaTkx NSA9IGk5MTU7CisJcHBndHQtPnZtLmRtYSA9ICZpOTE1LT5kcm0ucGRldi0+ZGV2OworCXBwZ3R0 LT52bS50b3RhbCA9IEJJVF9VTEwoSU5URUxfSU5GTyhpOTE1KS0+cHBndHRfc2l6ZSk7CisKKwlp OTE1X2FkZHJlc3Nfc3BhY2VfaW5pdCgmcHBndHQtPnZtLCBWTV9DTEFTU19QUEdUVCk7CisKKwlw cGd0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAgICA9IHBwZ3R0X2JpbmRfdm1hOworCXBwZ3R0LT52 bS52bWFfb3BzLnVuYmluZF92bWEgID0gcHBndHRfdW5iaW5kX3ZtYTsKKwlwcGd0dC0+dm0udm1h X29wcy5zZXRfcGFnZXMgICA9IHBwZ3R0X3NldF9wYWdlczsKKwlwcGd0dC0+dm0udm1hX29wcy5j bGVhcl9wYWdlcyA9IGNsZWFyX3BhZ2VzOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2k5MTUvZ3QvaW50ZWxfcmluZ19zdWJtaXNzaW9uLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9n dC9pbnRlbF9yaW5nX3N1Ym1pc3Npb24uYwppbmRleCAyZTE0NzhhNDhhNGIuLjQ5OWM4NzUyOGI2 MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcmluZ19zdWJtaXNz aW9uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3QvaW50ZWxfcmluZ19zdWJtaXNzaW9u LmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogI2luY2x1ZGUgImdlbS9pOTE1X2dlbV9jb250ZXh0Lmgi CiAKKyNpbmNsdWRlICJnZW42X3BwZ3R0LmgiCiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNs dWRlICJpOTE1X3RyYWNlLmgiCiAjaW5jbHVkZSAiaW50ZWxfY29udGV4dC5oIgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qvc2VsZnRlc3RfaGFuZ2NoZWNrLmMgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9ndC9zZWxmdGVzdF9oYW5nY2hlY2suYwppbmRleCA1ZGJkYTJhNzQyNzIu LjdjODI0YzI2YjcwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qvc2VsZnRl c3RfaGFuZ2NoZWNrLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvZ3Qvc2VsZnRlc3RfaGFu Z2NoZWNrLmMKQEAgLTEzMTIsNyArMTMxMiw3IEBAIHN0YXRpYyBpbnQgaWd0X3Jlc2V0X2V2aWN0 X3BwZ3R0KHZvaWQgKmFyZykKIAlpZiAoSU5URUxfUFBHVFQoZ3QtPmk5MTUpIDwgSU5URUxfUFBH VFRfRlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGd0LT5p OTE1KTsKKwlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGd0KTsKIAlpZiAoSVNfRVJSKHBwZ3R0 KSkKIAkJcmV0dXJuIFBUUl9FUlIocHBndHQpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9ndnQvc2NoZWR1bGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9ndnQvc2NoZWR1 bGVyLmMKaW5kZXggYjMyOTlmODhlMjRlLi42ODVkMWUwNGE1ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2d2dC9zY2hlZHVsZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9ndnQvc2NoZWR1bGVyLmMKQEAgLTEyMjQsNyArMTIyNCw3IEBAIGludCBpbnRlbF92Z3B1X3Nl dHVwX3N1Ym1pc3Npb24oc3RydWN0IGludGVsX3ZncHUgKnZncHUpCiAJZW51bSBpbnRlbF9lbmdp bmVfaWQgaTsKIAlpbnQgcmV0OwogCi0JcHBndHQgPSBpOTE1X3BwZ3R0X2NyZWF0ZShpOTE1KTsK KwlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKCZpOTE1LT5ndCk7CiAJaWYgKElTX0VSUihwcGd0 dCkpCiAJCXJldHVybiBQVFJfRVJSKHBwZ3R0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9n dHQuYwppbmRleCAxZWZlNThhZDBjZTkuLmUwMzllYjU2OTAwZiAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW1fZ3R0LmMKQEAgLTEsMjYgKzEsNyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IE1JVAogLyoKICAqIENvcHlyaWdodCDCqSAyMDEwIERhbmllbCBWZXR0ZXIKLSAqIENvcHly aWdodCDCqSAyMDExLTIwMTQgSW50ZWwgQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIGlz IGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcg YQotICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24g ZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhv dXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdo dHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJs aWNlbnNlLAotICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBl cm1pdCBwZXJzb25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8g c28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92 ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcg dGhlIG5leHQKLSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBv ciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBT T0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5E LCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRI RSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICog VEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0s IERBTUFHRVMgT1IgT1RIRVIKLSAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0Yg Q09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi0gKiBGUk9NLCBPVVQgT0YgT1Ig SU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJ TkdTCi0gKiBJTiBUSEUgU09GVFdBUkUuCi0gKgorICogQ29weXJpZ2h0IMKpIDIwMjAgSW50ZWwg Q29ycG9yYXRpb24KICAqLwogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPiAvKiBmYXVsdC1pbmpl Y3QuaCBpcyBub3Qgc3RhbmRhbG9uZSEgKi8KQEAgLTQ1LDM1ODYgKzI2LDUwIEBACiAjaW5jbHVk ZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImk5MTVfdmdwdS5oIgogCi0jZGVmaW5lIEk5MTVf R0ZQX0FMTE9XX0ZBSUwgKEdGUF9LRVJORUwgfCBfX0dGUF9SRVRSWV9NQVlGQUlMIHwgX19HRlBf Tk9XQVJOKQotCi0jaWYgSVNfRU5BQkxFRChDT05GSUdfRFJNX0k5MTVfVFJBQ0VfR1RUKQotI2Rl ZmluZSBEQkcoLi4uKSB0cmFjZV9wcmludGsoX19WQV9BUkdTX18pCi0jZWxzZQotI2RlZmluZSBE QkcoLi4uKQotI2VuZGlmCi0KLSNkZWZpbmUgTkFMTE9DIDMgLyogMSBub3JtYWwsIDEgZm9yIGNv bmN1cnJlbnQgdGhyZWFkcywgMSBmb3IgcHJlYWxsb2NhdGlvbiAqLwotCi0vKioKLSAqIERPQzog R2xvYmFsIEdUVCB2aWV3cwotICoKLSAqIEJhY2tncm91bmQgYW5kIHByZXZpb3VzIHN0YXRlCi0g KgotICogSGlzdG9yaWNhbGx5IG9iamVjdHMgY291bGQgZXhpc3RzIChiZSBib3VuZCkgaW4gZ2xv YmFsIEdUVCBzcGFjZSBvbmx5IGFzCi0gKiBzaW5ndWxhciBpbnN0YW5jZXMgd2l0aCBhIHZpZXcg cmVwcmVzZW50aW5nIGFsbCBvZiB0aGUgb2JqZWN0J3MgYmFja2luZyBwYWdlcwotICogaW4gYSBs aW5lYXIgZmFzaGlvbi4gVGhpcyB2aWV3IHdpbGwgYmUgY2FsbGVkIGEgbm9ybWFsIHZpZXcuCi0g KgotICogVG8gc3VwcG9ydCBtdWx0aXBsZSB2aWV3cyBvZiB0aGUgc2FtZSBvYmplY3QsIHdoZXJl IHRoZSBudW1iZXIgb2YgbWFwcGVkCi0gKiBwYWdlcyBpcyBub3QgZXF1YWwgdG8gdGhlIGJhY2tp bmcgc3RvcmUsIG9yIHdoZXJlIHRoZSBsYXlvdXQgb2YgdGhlIHBhZ2VzCi0gKiBpcyBub3QgbGlu ZWFyLCBjb25jZXB0IG9mIGEgR0dUVCB2aWV3IHdhcyBhZGRlZC4KLSAqCi0gKiBPbmUgZXhhbXBs ZSBvZiBhbiBhbHRlcm5hdGl2ZSB2aWV3IGlzIGEgc3RlcmVvIGRpc3BsYXkgZHJpdmVuIGJ5IGEg c2luZ2xlCi0gKiBpbWFnZS4gSW4gdGhpcyBjYXNlIHdlIHdvdWxkIGhhdmUgYSBmcmFtZWJ1ZmZl ciBsb29raW5nIGxpa2UgdGhpcwotICogKDJ4MiBwYWdlcyk6Ci0gKgotICogICAgMTIKLSAqICAg IDM0Ci0gKgotICogQWJvdmUgd291bGQgcmVwcmVzZW50IGEgbm9ybWFsIEdHVFQgdmlldyBhcyBu b3JtYWxseSBtYXBwZWQgZm9yIEdQVSBvciBDUFUKLSAqIHJlbmRlcmluZy4gSW4gY29udHJhc3Qs IGZlZCB0byB0aGUgZGlzcGxheSBlbmdpbmUgd291bGQgYmUgYW4gYWx0ZXJuYXRpdmUKLSAqIHZp ZXcgd2hpY2ggY291bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgotICoKLSAqICAgMTIxMgot ICogICAzNDM0Ci0gKgotICogSW4gdGhpcyBleGFtcGxlIGJvdGggdGhlIHNpemUgYW5kIGxheW91 dCBvZiBwYWdlcyBpbiB0aGUgYWx0ZXJuYXRpdmUgdmlldyBpcwotICogZGlmZmVyZW50IGZyb20g dGhlIG5vcm1hbCB2aWV3LgotICoKLSAqIEltcGxlbWVudGF0aW9uIGFuZCB1c2FnZQotICoKLSAq IEdHVFQgdmlld3MgYXJlIGltcGxlbWVudGVkIHVzaW5nIFZNQXMgYW5kIGFyZSBkaXN0aW5ndWlz aGVkIHZpYSBlbnVtCi0gKiBpOTE1X2dndHRfdmlld190eXBlIGFuZCBzdHJ1Y3QgaTkxNV9nZ3R0 X3ZpZXcuCi0gKgotICogQSBuZXcgZmxhdm91ciBvZiBjb3JlIEdFTSBmdW5jdGlvbnMgd2hpY2gg d29yayB3aXRoIEdHVFQgYm91bmQgb2JqZWN0cyB3ZXJlCi0gKiBhZGRlZCB3aXRoIHRoZSBfZ2d0 dF8gaW5maXgsIGFuZCBzb21ldGltZXMgd2l0aCBfdmlldyBwb3N0Zml4IHRvIGF2b2lkCi0gKiBy ZW5hbWluZyAgaW4gbGFyZ2UgYW1vdW50cyBvZiBjb2RlLiBUaGV5IHRha2UgdGhlIHN0cnVjdCBp OTE1X2dndHRfdmlldwotICogcGFyYW1ldGVyIGVuY2Fwc3VsYXRpbmcgYWxsIG1ldGFkYXRhIHJl cXVpcmVkIHRvIGltcGxlbWVudCBhIHZpZXcuCi0gKgotICogQXMgYSBoZWxwZXIgZm9yIGNhbGxl cnMgd2hpY2ggYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgbm9ybWFsIHZpZXcsCi0gKiBnbG9i YWxseSBjb25zdCBpOTE1X2dndHRfdmlld19ub3JtYWwgc2luZ2xldG9uIGluc3RhbmNlIGV4aXN0 cy4gQWxsIG9sZCBjb3JlCi0gKiBHRU0gQVBJIGZ1bmN0aW9ucywgdGhlIG9uZXMgbm90IHRha2lu ZyB0aGUgdmlldyBwYXJhbWV0ZXIsIGFyZSBvcGVyYXRpbmcgb24sCi0gKiBvciB3aXRoIHRoZSBu b3JtYWwgR0dUVCB2aWV3LgotICoKLSAqIENvZGUgd2FudGluZyB0byBhZGQgb3IgdXNlIGEgbmV3 IEdHVFQgdmlldyBuZWVkcyB0bzoKLSAqCi0gKiAxLiBBZGQgYSBuZXcgZW51bSB3aXRoIGEgc3Vp dGFibGUgbmFtZS4KLSAqIDIuIEV4dGVuZCB0aGUgbWV0YWRhdGEgaW4gdGhlIGk5MTVfZ2d0dF92 aWV3IHN0cnVjdHVyZSBpZiByZXF1aXJlZC4KLSAqIDMuIEFkZCBzdXBwb3J0IHRvIGk5MTVfZ2V0 X3ZtYV9wYWdlcygpLgotICoKLSAqIE5ldyB2aWV3cyBhcmUgcmVxdWlyZWQgdG8gYnVpbGQgYSBz Y2F0dGVyLWdhdGhlciB0YWJsZSBmcm9tIHdpdGhpbiB0aGUKLSAqIGk5MTVfZ2V0X3ZtYV9wYWdl cyBmdW5jdGlvbi4gVGhpcyB0YWJsZSBpcyBzdG9yZWQgaW4gdGhlIHZtYS5nZ3R0X3ZpZXcgYW5k Ci0gKiBleGlzdHMgZm9yIHRoZSBsaWZldGltZSBvZiBhbiBWTUEuCi0gKgotICogQ29yZSBBUEkg aXMgZGVzaWduZWQgdG8gaGF2ZSBjb3B5IHNlbWFudGljcyB3aGljaCBtZWFucyB0aGF0IHBhc3Nl ZCBpbgotICogc3RydWN0IGk5MTVfZ2d0dF92aWV3IGRvZXMgbm90IG5lZWQgdG8gYmUgcGVyc2lz dGVudCAobGVmdCBhcm91bmQgYWZ0ZXIKLSAqIGNhbGxpbmcgdGhlIGNvcmUgQVBJIGZ1bmN0aW9u cykuCi0gKgotICovCi0KLSNkZWZpbmUgYXNfcGQoeCkgY29udGFpbmVyX29mKCh4KSwgdHlwZW9m KHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5KSwgcHQpCi0KLXN0YXRpYyBpbnQKLWk5MTVfZ2V0 X2dndHRfdm1hX3BhZ2VzKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKTsKLQotc3RhdGljIHZvaWQgZ2Vu Nl9nZ3R0X2ludmFsaWRhdGUoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsKLQlzdHJ1Y3QgaW50 ZWxfdW5jb3JlICp1bmNvcmUgPSBnZ3R0LT52bS5ndC0+dW5jb3JlOwotCi0Jc3Bpbl9sb2NrX2ly cSgmdW5jb3JlLT5sb2NrKTsKLQlpbnRlbF91bmNvcmVfd3JpdGVfZncodW5jb3JlLCBHRlhfRkxT SF9DTlRMX0dFTjYsIEdGWF9GTFNIX0NOVExfRU4pOwotCWludGVsX3VuY29yZV9yZWFkX2Z3KHVu Y29yZSwgR0ZYX0ZMU0hfQ05UTF9HRU42KTsKLQlzcGluX3VubG9ja19pcnEoJnVuY29yZS0+bG9j ayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhfZ2d0dF9pbnZhbGlkYXRlKHN0cnVjdCBpOTE1X2dn dHQgKmdndHQpCi17Ci0Jc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlID0gZ2d0dC0+dm0uZ3Qt PnVuY29yZTsKLQotCS8qCi0JICogTm90ZSB0aGF0IGFzIGFuIHVuY2FjaGVkIG1taW8gd3JpdGUs IHRoaXMgd2lsbCBmbHVzaCB0aGUKLQkgKiBXQ0Igb2YgdGhlIHdyaXRlcyBpbnRvIHRoZSBHR1RU IGJlZm9yZSBpdCB0cmlnZ2VycyB0aGUgaW52YWxpZGF0ZS4KLQkgKi8KLQlpbnRlbF91bmNvcmVf d3JpdGVfZncodW5jb3JlLCBHRlhfRkxTSF9DTlRMX0dFTjYsIEdGWF9GTFNIX0NOVExfRU4pOwot fQotCi1zdGF0aWMgdm9pZCBndWNfZ2d0dF9pbnZhbGlkYXRlKHN0cnVjdCBpOTE1X2dndHQgKmdn dHQpCi17Ci0Jc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlID0gZ2d0dC0+dm0uZ3QtPnVuY29y ZTsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQtPnZtLmk5MTU7Ci0KLQln ZW44X2dndHRfaW52YWxpZGF0ZShnZ3R0KTsKLQotCWlmIChJTlRFTF9HRU4oaTkxNSkgPj0gMTIp Ci0JCWludGVsX3VuY29yZV93cml0ZV9mdyh1bmNvcmUsIEdFTjEyX0dVQ19UTEJfSU5WX0NSLAot CQkJCSAgICAgIEdFTjEyX0dVQ19UTEJfSU5WX0NSX0lOVkFMSURBVEUpOwotCWVsc2UKLQkJaW50 ZWxfdW5jb3JlX3dyaXRlX2Z3KHVuY29yZSwgR0VOOF9HVENSLCBHRU44X0dUQ1JfSU5WQUxJREFU RSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdtY2hfZ2d0dF9pbnZhbGlkYXRlKHN0cnVjdCBpOTE1X2dn dHQgKmdndHQpCi17Ci0JaW50ZWxfZ3R0X2NoaXBzZXRfZmx1c2goKTsKLX0KLQotc3RhdGljIGlu dCBwcGd0dF9iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCSAgZW51bSBpOTE1X2Nh Y2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkJICB1MzIgZmxhZ3MpCi17Ci0JdTMyIHB0ZV9mbGFn czsKLQlpbnQgZXJyOwotCi0JaWYgKGZsYWdzICYgSTkxNV9WTUFfQUxMT0MpIHsKLQkJZXJyID0g dm1hLT52bS0+YWxsb2NhdGVfdmFfcmFuZ2Uodm1hLT52bSwKLQkJCQkJCSB2bWEtPm5vZGUuc3Rh cnQsIHZtYS0+c2l6ZSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCXNldF9iaXQo STkxNV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkpOwotCX0KLQotCS8qIEFw cGxpY2FibGUgdG8gVkxWLCBhbmQgZ2VuOCsgKi8KLQlwdGVfZmxhZ3MgPSAwOwotCWlmIChpOTE1 X2dlbV9vYmplY3RfaXNfcmVhZG9ubHkodm1hLT5vYmopKQotCQlwdGVfZmxhZ3MgfD0gUFRFX1JF QURfT05MWTsKLQotCUdFTV9CVUdfT04oIXRlc3RfYml0KEk5MTVfVk1BX0FMTE9DX0JJVCwgX19p OTE1X3ZtYV9mbGFncyh2bWEpKSk7Ci0Jdm1hLT52bS0+aW5zZXJ0X2VudHJpZXModm1hLT52bSwg dm1hLCBjYWNoZV9sZXZlbCwgcHRlX2ZsYWdzKTsKLQl3bWIoKTsKLQotCXJldHVybiAwOwotfQot Ci1zdGF0aWMgdm9pZCBwcGd0dF91bmJpbmRfdm1hKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewot CWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSTkxNV9WTUFfQUxMT0NfQklULCBfX2k5MTVfdm1hX2Zs YWdzKHZtYSkpKQotCQl2bWEtPnZtLT5jbGVhcl9yYW5nZSh2bWEtPnZtLCB2bWEtPm5vZGUuc3Rh cnQsIHZtYS0+c2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgcHBndHRfc2V0X3BhZ2VzKHN0cnVjdCBp OTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04odm1hLT5wYWdlcyk7Ci0KLQl2bWEtPnBhZ2Vz ID0gdm1hLT5vYmotPm1tLnBhZ2VzOwotCi0Jdm1hLT5wYWdlX3NpemVzID0gdm1hLT5vYmotPm1t LnBhZ2Vfc2l6ZXM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2xlYXJfcGFnZXMo c3RydWN0IGk5MTVfdm1hICp2bWEpCi17Ci0JR0VNX0JVR19PTighdm1hLT5wYWdlcyk7Ci0KLQlp ZiAodm1hLT5wYWdlcyAhPSB2bWEtPm9iai0+bW0ucGFnZXMpIHsKLQkJc2dfZnJlZV90YWJsZSh2 bWEtPnBhZ2VzKTsKLQkJa2ZyZWUodm1hLT5wYWdlcyk7Ci0JfQotCXZtYS0+cGFnZXMgPSBOVUxM OwotCi0JbWVtc2V0KCZ2bWEtPnBhZ2Vfc2l6ZXMsIDAsIHNpemVvZih2bWEtPnBhZ2Vfc2l6ZXMp KTsKLX0KLQotc3RhdGljIHU2NCBnZW44X3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAotCQkJ ICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAotCQkJICAgdTMyIGZsYWdzKQotewotCWdl bjhfcHRlX3QgcHRlID0gYWRkciB8IF9QQUdFX1BSRVNFTlQgfCBfUEFHRV9SVzsKLQotCWlmICh1 bmxpa2VseShmbGFncyAmIFBURV9SRUFEX09OTFkpKQotCQlwdGUgJj0gfl9QQUdFX1JXOwotCi0J c3dpdGNoIChsZXZlbCkgewotCWNhc2UgSTkxNV9DQUNIRV9OT05FOgotCQlwdGUgfD0gUFBBVF9V TkNBQ0hFRDsKLQkJYnJlYWs7Ci0JY2FzZSBJOTE1X0NBQ0hFX1dUOgotCQlwdGUgfD0gUFBBVF9E SVNQTEFZX0VMTEM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXB0ZSB8PSBQUEFUX0NBQ0hFRDsK LQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIHU2NCBnZW44X3BkZV9l bmNvZGUoY29uc3QgZG1hX2FkZHJfdCBhZGRyLAotCQkJICAgY29uc3QgZW51bSBpOTE1X2NhY2hl X2xldmVsIGxldmVsKQotewotCXU2NCBwZGUgPSBfUEFHRV9QUkVTRU5UIHwgX1BBR0VfUlc7Ci0J cGRlIHw9IGFkZHI7Ci0JaWYgKGxldmVsICE9IEk5MTVfQ0FDSEVfTk9ORSkKLQkJcGRlIHw9IFBQ QVRfQ0FDSEVEX1BERTsKLQllbHNlCi0JCXBkZSB8PSBQUEFUX1VOQ0FDSEVEOwotCXJldHVybiBw ZGU7Ci19Ci0KLXN0YXRpYyB1NjQgc25iX3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBhZGRyLAotCQkJ ICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgbGV2ZWwsCi0JCQkgIHUzMiBmbGFncykKLXsKLQlnZW42 X3B0ZV90IHB0ZSA9IEdFTjZfUFRFX1ZBTElEOwotCXB0ZSB8PSBHRU42X1BURV9BRERSX0VOQ09E RShhZGRyKTsKLQotCXN3aXRjaCAobGV2ZWwpIHsKLQljYXNlIEk5MTVfQ0FDSEVfTDNfTExDOgot CWNhc2UgSTkxNV9DQUNIRV9MTEM6Ci0JCXB0ZSB8PSBHRU42X1BURV9DQUNIRV9MTEM7Ci0JCWJy ZWFrOwotCWNhc2UgSTkxNV9DQUNIRV9OT05FOgotCQlwdGUgfD0gR0VONl9QVEVfVU5DQUNIRUQ7 Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCU1JU1NJTkdfQ0FTRShsZXZlbCk7Ci0JfQotCi0JcmV0 dXJuIHB0ZTsKLX0KLQotc3RhdGljIHU2NCBpdmJfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIs Ci0JCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJCSAgdTMyIGZsYWdzKQotewot CWdlbjZfcHRlX3QgcHRlID0gR0VONl9QVEVfVkFMSUQ7Ci0JcHRlIHw9IEdFTjZfUFRFX0FERFJf RU5DT0RFKGFkZHIpOwotCi0Jc3dpdGNoIChsZXZlbCkgewotCWNhc2UgSTkxNV9DQUNIRV9MM19M TEM6Ci0JCXB0ZSB8PSBHRU43X1BURV9DQUNIRV9MM19MTEM7Ci0JCWJyZWFrOwotCWNhc2UgSTkx NV9DQUNIRV9MTEM6Ci0JCXB0ZSB8PSBHRU42X1BURV9DQUNIRV9MTEM7Ci0JCWJyZWFrOwotCWNh c2UgSTkxNV9DQUNIRV9OT05FOgotCQlwdGUgfD0gR0VONl9QVEVfVU5DQUNIRUQ7Ci0JCWJyZWFr OwotCWRlZmF1bHQ6Ci0JCU1JU1NJTkdfQ0FTRShsZXZlbCk7Ci0JfQotCi0JcmV0dXJuIHB0ZTsK LX0KLQotc3RhdGljIHU2NCBieXRfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCi0JCQkgIGVu dW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJCSAgdTMyIGZsYWdzKQotewotCWdlbjZfcHRl X3QgcHRlID0gR0VONl9QVEVfVkFMSUQ7Ci0JcHRlIHw9IEdFTjZfUFRFX0FERFJfRU5DT0RFKGFk ZHIpOwotCi0JaWYgKCEoZmxhZ3MgJiBQVEVfUkVBRF9PTkxZKSkKLQkJcHRlIHw9IEJZVF9QVEVf V1JJVEVBQkxFOwotCi0JaWYgKGxldmVsICE9IEk5MTVfQ0FDSEVfTk9ORSkKLQkJcHRlIHw9IEJZ VF9QVEVfU05PT1BFRF9CWV9DUFVfQ0FDSEVTOwotCi0JcmV0dXJuIHB0ZTsKLX0KLQotc3RhdGlj IHU2NCBoc3dfcHRlX2VuY29kZShkbWFfYWRkcl90IGFkZHIsCi0JCQkgIGVudW0gaTkxNV9jYWNo ZV9sZXZlbCBsZXZlbCwKLQkJCSAgdTMyIGZsYWdzKQotewotCWdlbjZfcHRlX3QgcHRlID0gR0VO Nl9QVEVfVkFMSUQ7Ci0JcHRlIHw9IEhTV19QVEVfQUREUl9FTkNPREUoYWRkcik7Ci0KLQlpZiAo bGV2ZWwgIT0gSTkxNV9DQUNIRV9OT05FKQotCQlwdGUgfD0gSFNXX1dCX0xMQ19BR0UzOwotCi0J cmV0dXJuIHB0ZTsKLX0KLQotc3RhdGljIHU2NCBpcmlzX3B0ZV9lbmNvZGUoZG1hX2FkZHJfdCBh ZGRyLAotCQkJICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsLAotCQkJICAgdTMyIGZsYWdz KQotewotCWdlbjZfcHRlX3QgcHRlID0gR0VONl9QVEVfVkFMSUQ7Ci0JcHRlIHw9IEhTV19QVEVf QUREUl9FTkNPREUoYWRkcik7Ci0KLQlzd2l0Y2ggKGxldmVsKSB7Ci0JY2FzZSBJOTE1X0NBQ0hF X05PTkU6Ci0JCWJyZWFrOwotCWNhc2UgSTkxNV9DQUNIRV9XVDoKLQkJcHRlIHw9IEhTV19XVF9F TExDX0xMQ19BR0UzOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwdGUgfD0gSFNXX1dCX0VMTENf TExDX0FHRTM7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBwdGU7Ci19Ci0KLXN0YXRpYyB2b2lk IHN0YXNoX2luaXQoc3RydWN0IHBhZ2VzdGFzaCAqc3Rhc2gpCi17Ci0JcGFnZXZlY19pbml0KCZz dGFzaC0+cHZlYyk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnN0YXNoLT5sb2NrKTsKLX0KLQotc3RhdGlj IHN0cnVjdCBwYWdlICpzdGFzaF9wb3BfcGFnZShzdHJ1Y3QgcGFnZXN0YXNoICpzdGFzaCkKLXsK LQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0KLQlzcGluX2xvY2soJnN0YXNoLT5sb2NrKTsK LQlpZiAobGlrZWx5KHN0YXNoLT5wdmVjLm5yKSkKLQkJcGFnZSA9IHN0YXNoLT5wdmVjLnBhZ2Vz Wy0tc3Rhc2gtPnB2ZWMubnJdOwotCXNwaW5fdW5sb2NrKCZzdGFzaC0+bG9jayk7Ci0KLQlyZXR1 cm4gcGFnZTsKLX0KLQotc3RhdGljIHZvaWQgc3Rhc2hfcHVzaF9wYWdldmVjKHN0cnVjdCBwYWdl c3Rhc2ggKnN0YXNoLCBzdHJ1Y3QgcGFnZXZlYyAqcHZlYykKLXsKLQl1bnNpZ25lZCBpbnQgbnI7 Ci0KLQlzcGluX2xvY2tfbmVzdGVkKCZzdGFzaC0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcp OwotCi0JbnIgPSBtaW5fdCh0eXBlb2YobnIpLCBwdmVjLT5uciwgcGFnZXZlY19zcGFjZSgmc3Rh c2gtPnB2ZWMpKTsKLQltZW1jcHkoc3Rhc2gtPnB2ZWMucGFnZXMgKyBzdGFzaC0+cHZlYy5uciwK LQkgICAgICAgcHZlYy0+cGFnZXMgKyBwdmVjLT5uciAtIG5yLAotCSAgICAgICBzaXplb2YocHZl Yy0+cGFnZXNbMF0pICogbnIpOwotCXN0YXNoLT5wdmVjLm5yICs9IG5yOwotCi0Jc3Bpbl91bmxv Y2soJnN0YXNoLT5sb2NrKTsKLQotCXB2ZWMtPm5yIC09IG5yOwotfQotCi1zdGF0aWMgc3RydWN0 IHBhZ2UgKnZtX2FsbG9jX3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sIGdmcF90 IGdmcCkKK2ludCBpOTE1X2dlbV9ndHRfcHJlcGFyZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqLAorCQkJICAgICAgIHN0cnVjdCBzZ190YWJsZSAqcGFnZXMpCiB7Ci0Jc3Ry dWN0IHBhZ2V2ZWMgc3RhY2s7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0KLQlpZiAoSTkxNV9TRUxG VEVTVF9PTkxZKHNob3VsZF9mYWlsKCZ2bS0+ZmF1bHRfYXR0ciwgMSkpKQotCQlpOTE1X2dlbV9z aHJpbmtfYWxsKHZtLT5pOTE1KTsKLQotCXBhZ2UgPSBzdGFzaF9wb3BfcGFnZSgmdm0tPmZyZWVf cGFnZXMpOwotCWlmIChwYWdlKQotCQlyZXR1cm4gcGFnZTsKLQotCWlmICghdm0tPnB0X2ttYXBf d2MpCi0JCXJldHVybiBhbGxvY19wYWdlKGdmcCk7Ci0KLQkvKiBMb29rIGluIG91ciBnbG9iYWwg c3Rhc2ggb2YgV0MgcGFnZXMuLi4gKi8KLQlwYWdlID0gc3Rhc2hfcG9wX3BhZ2UoJnZtLT5pOTE1 LT5tbS53Y19zdGFzaCk7Ci0JaWYgKHBhZ2UpCi0JCXJldHVybiBwYWdlOwotCi0JLyoKLQkgKiBP dGhlcndpc2UgYmF0Y2ggYWxsb2NhdGUgcGFnZXMgdG8gYW1vcnRpemUgY29zdCBvZiBzZXRfcGFn ZXNfd2MuCi0JICoKLQkgKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgYXMgcGFnZSBhbGxvY2F0aW9u IG1heSB0cmlnZ2VyIHRoZSBzaHJpbmtlcgotCSAqICh2aWEgZGlyZWN0IHJlY2xhaW0pIHdoaWNo IHdpbGwgZmlsbCB1cCB0aGUgV0Mgc3Rhc2ggdW5kZXJuZWF0aCB1cy4KLQkgKiBTbyB3ZSBhZGQg b3VyIFdCIHBhZ2VzIGludG8gYSB0ZW1wb3JhcnkgcHZlYyBvbiB0aGUgc3RhY2sgYW5kIG1lcmdl Ci0JICogdGhlbSBpbnRvIHRoZSBXQyBzdGFzaCBhZnRlciBhbGwgdGhlIGFsbG9jYXRpb25zIGFy ZSBjb21wbGV0ZS4KLQkgKi8KLQlwYWdldmVjX2luaXQoJnN0YWNrKTsKIAlkbyB7Ci0JCXN0cnVj dCBwYWdlICpwYWdlOwotCi0JCXBhZ2UgPSBhbGxvY19wYWdlKGdmcCk7Ci0JCWlmICh1bmxpa2Vs eSghcGFnZSkpCi0JCQlicmVhazsKLQotCQlzdGFjay5wYWdlc1tzdGFjay5ucisrXSA9IHBhZ2U7 Ci0JfSB3aGlsZSAocGFnZXZlY19zcGFjZSgmc3RhY2spKTsKLQotCWlmIChzdGFjay5uciAmJiAh c2V0X3BhZ2VzX2FycmF5X3djKHN0YWNrLnBhZ2VzLCBzdGFjay5ucikpIHsKLQkJcGFnZSA9IHN0 YWNrLnBhZ2VzWy0tc3RhY2subnJdOwotCi0JCS8qIE1lcmdlIHNwYXJlIFdDIHBhZ2VzIHRvIHRo ZSBnbG9iYWwgc3Rhc2ggKi8KLQkJaWYgKHN0YWNrLm5yKQotCQkJc3Rhc2hfcHVzaF9wYWdldmVj KCZ2bS0+aTkxNS0+bW0ud2Nfc3Rhc2gsICZzdGFjayk7Ci0KLQkJLyogUHVzaCBhbnkgc3VycGx1 cyBXQyBwYWdlcyBvbnRvIHRoZSBsb2NhbCBWTSBzdGFzaCAqLwotCQlpZiAoc3RhY2subnIpCi0J CQlzdGFzaF9wdXNoX3BhZ2V2ZWMoJnZtLT5mcmVlX3BhZ2VzLCAmc3RhY2spOwotCX0KLQotCS8q IFJldHVybiB1bndhbnRlZCBsZWZ0b3ZlcnMgKi8KLQlpZiAodW5saWtlbHkoc3RhY2subnIpKSB7 Ci0JCVdBUk5fT05fT05DRShzZXRfcGFnZXNfYXJyYXlfd2Ioc3RhY2sucGFnZXMsIHN0YWNrLm5y KSk7Ci0JCV9fcGFnZXZlY19yZWxlYXNlKCZzdGFjayk7Ci0JfQotCi0JcmV0dXJuIHBhZ2U7Ci19 Ci0KLXN0YXRpYyB2b2lkIHZtX2ZyZWVfcGFnZXNfcmVsZWFzZShzdHJ1Y3QgaTkxNV9hZGRyZXNz X3NwYWNlICp2bSwKLQkJCQkgIGJvb2wgaW1tZWRpYXRlKQotewotCXN0cnVjdCBwYWdldmVjICpw dmVjID0gJnZtLT5mcmVlX3BhZ2VzLnB2ZWM7Ci0Jc3RydWN0IHBhZ2V2ZWMgc3RhY2s7Ci0KLQls b2NrZGVwX2Fzc2VydF9oZWxkKCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKLQlHRU1fQlVHX09OKCFw YWdldmVjX2NvdW50KHB2ZWMpKTsKLQotCWlmICh2bS0+cHRfa21hcF93YykgewotCQkvKgotCQkg KiBXaGVuIHdlIHVzZSBXQywgZmlyc3QgZmlsbCB1cCB0aGUgZ2xvYmFsIHN0YXNoIGFuZCB0aGVu Ci0JCSAqIG9ubHkgaWYgZnVsbCBpbW1lZGlhdGVseSBmcmVlIHRoZSBvdmVyZmxvdy4KLQkJICov Ci0JCXN0YXNoX3B1c2hfcGFnZXZlYygmdm0tPmk5MTUtPm1tLndjX3N0YXNoLCBwdmVjKTsKLQot CQkvKgotCQkgKiBBcyB3ZSBoYXZlIG1hZGUgc29tZSByb29tIGluIHRoZSBWTSdzIGZyZWVfcGFn ZXMsCi0JCSAqIHdlIGNhbiB3YWl0IGZvciBpdCB0byBmaWxsIGFnYWluLiBVbmxlc3Mgd2UgYXJl Ci0JCSAqIGluc2lkZSBpOTE1X2FkZHJlc3Nfc3BhY2VfZmluaSgpIGFuZCBtdXN0Ci0JCSAqIGlt bWVkaWF0ZWx5IHJlbGVhc2UgdGhlIHBhZ2VzIQotCQkgKi8KLQkJaWYgKHB2ZWMtPm5yIDw9IChp bW1lZGlhdGUgPyAwIDogUEFHRVZFQ19TSVpFIC0gMSkpCi0JCQlyZXR1cm47CisJCWlmIChkbWFf bWFwX3NnX2F0dHJzKCZvYmotPmJhc2UuZGV2LT5wZGV2LT5kZXYsCisJCQkJICAgICBwYWdlcy0+ c2dsLCBwYWdlcy0+bmVudHMsCisJCQkJICAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwsCisJCQkJ ICAgICBETUFfQVRUUl9OT19XQVJOKSkKKwkJCXJldHVybiAwOwogCiAJCS8qCi0JCSAqIFdlIGhh dmUgdG8gZHJvcCB0aGUgbG9jayB0byBhbGxvdyBvdXJzZWx2ZXMgdG8gc2xlZXAsCi0JCSAqIHNv IHRha2UgYSBjb3B5IG9mIHRoZSBwdmVjIGFuZCBjbGVhciB0aGUgc3Rhc2ggZm9yCi0JCSAqIG90 aGVycyB0byB1c2UgaXQgYXMgd2Ugc2xlZXAuCisJCSAqIElmIHRoZSBETUEgcmVtYXAgZmFpbHMs IG9uZSBjYXVzZSBjYW4gYmUgdGhhdCB3ZSBoYXZlCisJCSAqIHRvbyBtYW55IG9iamVjdHMgcGlu bmVkIGluIGEgc21hbGwgcmVtYXBwaW5nIHRhYmxlLAorCQkgKiBzdWNoIGFzIHN3aW90bGIuIElu Y3JlbWVudGFsbHkgcHVyZ2UgYWxsIG90aGVyIG9iamVjdHMgYW5kCisJCSAqIHRyeSBhZ2FpbiAt IGlmIHRoZXJlIGFyZSBubyBtb3JlIHBhZ2VzIHRvIHJlbW92ZSBmcm9tCisJCSAqIHRoZSBETUEg cmVtYXBwZXIsIGk5MTVfZ2VtX3NocmluayB3aWxsIHJldHVybiAwLgogCQkgKi8KLQkJc3RhY2sg PSAqcHZlYzsKLQkJcGFnZXZlY19yZWluaXQocHZlYyk7Ci0JCXNwaW5fdW5sb2NrKCZ2bS0+ZnJl ZV9wYWdlcy5sb2NrKTsKLQotCQlwdmVjID0gJnN0YWNrOwotCQlzZXRfcGFnZXNfYXJyYXlfd2Io cHZlYy0+cGFnZXMsIHB2ZWMtPm5yKTsKLQotCQlzcGluX2xvY2soJnZtLT5mcmVlX3BhZ2VzLmxv Y2spOwotCX0KLQotCV9fcGFnZXZlY19yZWxlYXNlKHB2ZWMpOwotfQotCi1zdGF0aWMgdm9pZCB2 bV9mcmVlX3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sIHN0cnVjdCBwYWdlICpw YWdlKQotewotCS8qCi0JICogT24gIWxsYywgd2UgbmVlZCB0byBjaGFuZ2UgdGhlIHBhZ2VzIGJh Y2sgdG8gV0IuIFdlIG9ubHkgZG8gc28KLQkgKiBpbiBidWxrLCBzbyB3ZSByYXJlbHkgbmVlZCB0 byBjaGFuZ2UgdGhlIHBhZ2UgYXR0cmlidXRlcyBoZXJlLAotCSAqIGJ1dCBkb2luZyBzbyByZXF1 aXJlcyBhIHN0b3BfbWFjaGluZSgpIGZyb20gZGVlcCBpbnNpZGUgYXJjaC94ODYvbW0uCi0JICog VG8gbWFrZSBkZXRlY3Rpb24gb2YgdGhlIHBvc3NpYmxlIHNsZWVwIG1vcmUgbGlrZWx5LCB1c2Ug YW4KLQkgKiB1bmNvbmRpdGlvbmFsIG1pZ2h0X3NsZWVwKCkgZm9yIGV2ZXJ5Ym9keS4KLQkgKi8K LQltaWdodF9zbGVlcCgpOwotCXNwaW5fbG9jaygmdm0tPmZyZWVfcGFnZXMubG9jayk7Ci0Jd2hp bGUgKCFwYWdldmVjX3NwYWNlKCZ2bS0+ZnJlZV9wYWdlcy5wdmVjKSkKLQkJdm1fZnJlZV9wYWdl c19yZWxlYXNlKHZtLCBmYWxzZSk7Ci0JR0VNX0JVR19PTihwYWdldmVjX2NvdW50KCZ2bS0+ZnJl ZV9wYWdlcy5wdmVjKSA+PSBQQUdFVkVDX1NJWkUpOwotCXBhZ2V2ZWNfYWRkKCZ2bS0+ZnJlZV9w YWdlcy5wdmVjLCBwYWdlKTsKLQlzcGluX3VubG9jaygmdm0tPmZyZWVfcGFnZXMubG9jayk7Ci19 Ci0KLXN0YXRpYyB2b2lkIGk5MTVfYWRkcmVzc19zcGFjZV9maW5pKHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtKQotewotCXNwaW5fbG9jaygmdm0tPmZyZWVfcGFnZXMubG9jayk7Ci0JaWYg KHBhZ2V2ZWNfY291bnQoJnZtLT5mcmVlX3BhZ2VzLnB2ZWMpKQotCQl2bV9mcmVlX3BhZ2VzX3Jl bGVhc2Uodm0sIHRydWUpOwotCUdFTV9CVUdfT04ocGFnZXZlY19jb3VudCgmdm0tPmZyZWVfcGFn ZXMucHZlYykpOwotCXNwaW5fdW5sb2NrKCZ2bS0+ZnJlZV9wYWdlcy5sb2NrKTsKLQotCWRybV9t bV90YWtlZG93bigmdm0tPm1tKTsKLQotCW11dGV4X2Rlc3Ryb3koJnZtLT5tdXRleCk7Ci19Ci0K LXZvaWQgX19pOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewot CXN0cnVjdCBpOTE1X3ZtYSAqdm1hLCAqdm47Ci0KLQltdXRleF9sb2NrKCZ2bS0+bXV0ZXgpOwot CWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bWEsIHZuLCAmdm0tPmJvdW5kX2xpc3QsIHZtX2xp bmspIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IHZtYS0+b2JqOwotCi0J CS8qIEtlZXAgdGhlIG9iaiAoYW5kIGhlbmNlIHRoZSB2bWEpIGFsaXZlIGFzIF93ZV8gZGVzdHJv eSBpdCAqLwotCQlpZiAoIWtyZWZfZ2V0X3VubGVzc196ZXJvKCZvYmotPmJhc2UucmVmY291bnQp KQotCQkJY29udGludWU7Ci0KLQkJYXRvbWljX2FuZCh+STkxNV9WTUFfUElOX01BU0ssICZ2bWEt PmZsYWdzKTsKLQkJV0FSTl9PTihfX2k5MTVfdm1hX3VuYmluZCh2bWEpKTsKLQkJX19pOTE1X3Zt YV9wdXQodm1hKTsKLQotCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0JfQotCUdFTV9CVUdf T04oIWxpc3RfZW1wdHkoJnZtLT5ib3VuZF9saXN0KSk7Ci0JbXV0ZXhfdW5sb2NrKCZ2bS0+bXV0 ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBfX2k5MTVfdm1fcmVsZWFzZShzdHJ1Y3Qgd29ya19zdHJ1 Y3QgKndvcmspCi17Ci0Jc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPQotCQljb250YWlu ZXJfb2Yod29yaywgc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSwgcmN1LndvcmspOwotCi0Jdm0t PmNsZWFudXAodm0pOwotCWk5MTVfYWRkcmVzc19zcGFjZV9maW5pKHZtKTsKLQotCWtmcmVlKHZt KTsKLX0KLQotdm9pZCBpOTE1X3ZtX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0Jc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPQotCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSwgcmVmKTsKLQotCUdFTV9CVUdfT04oaTkxNV9pc19nZ3R0KHZt KSk7Ci0JdHJhY2VfaTkxNV9wcGd0dF9yZWxlYXNlKHZtKTsKLQotCXF1ZXVlX3JjdV93b3JrKHZt LT5pOTE1LT53cSwgJnZtLT5yY3UpOwotfQotCi1zdGF0aWMgdm9pZCBpOTE1X2FkZHJlc3Nfc3Bh Y2VfaW5pdChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwgaW50IHN1YmNsYXNzKQotewot CWtyZWZfaW5pdCgmdm0tPnJlZik7Ci0JSU5JVF9SQ1VfV09SSygmdm0tPnJjdSwgX19pOTE1X3Zt X3JlbGVhc2UpOwotCWF0b21pY19zZXQoJnZtLT5vcGVuLCAxKTsKLQotCS8qCi0JICogVGhlIHZt LT5tdXRleCBtdXN0IGJlIHJlY2xhaW0gc2FmZSAoZm9yIHVzZSBpbiB0aGUgc2hyaW5rZXIpLgot CSAqIERvIGEgZHVtbXkgYWNxdWlyZSBub3cgdW5kZXIgZnNfcmVjbGFpbSBzbyB0aGF0IGFueSBh bGxvY2F0aW9uCi0JICogYXR0ZW1wdCBob2xkaW5nIHRoZSBsb2NrIGlzIGltbWVkaWF0ZWx5IHJl cG9ydGVkIGJ5IGxvY2tkZXAuCi0JICovCi0JbXV0ZXhfaW5pdCgmdm0tPm11dGV4KTsKLQlsb2Nr ZGVwX3NldF9zdWJjbGFzcygmdm0tPm11dGV4LCBzdWJjbGFzcyk7Ci0JaTkxNV9nZW1fc2hyaW5r ZXJfdGFpbnRzX211dGV4KHZtLT5pOTE1LCAmdm0tPm11dGV4KTsKLQotCUdFTV9CVUdfT04oIXZt LT50b3RhbCk7Ci0JZHJtX21tX2luaXQoJnZtLT5tbSwgMCwgdm0tPnRvdGFsKTsKLQl2bS0+bW0u aGVhZF9ub2RlLmNvbG9yID0gSTkxNV9DT0xPUl9VTkVWSUNUQUJMRTsKLQotCXN0YXNoX2luaXQo JnZtLT5mcmVlX3BhZ2VzKTsKLQotCUlOSVRfTElTVF9IRUFEKCZ2bS0+Ym91bmRfbGlzdCk7Ci19 Ci0KLXN0YXRpYyBpbnQgX19zZXR1cF9wYWdlX2RtYShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNl ICp2bSwKLQkJCSAgICBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCwKLQkJCSAgICBnZnBfdCBnZnAp Ci17Ci0JcC0+cGFnZSA9IHZtX2FsbG9jX3BhZ2Uodm0sIGdmcCB8IEk5MTVfR0ZQX0FMTE9XX0ZB SUwpOwotCWlmICh1bmxpa2VseSghcC0+cGFnZSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcC0+ ZGFkZHIgPSBkbWFfbWFwX3BhZ2VfYXR0cnModm0tPmRtYSwKLQkJCQkgICAgICBwLT5wYWdlLCAw LCBQQUdFX1NJWkUsCi0JCQkJICAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMLAotCQkJCSAgICAg IERNQV9BVFRSX1NLSVBfQ1BVX1NZTkMgfAotCQkJCSAgICAgIERNQV9BVFRSX05PX1dBUk4pOwot CWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcih2bS0+ZG1hLCBwLT5kYWRkcikpKSB7Ci0J CXZtX2ZyZWVfcGFnZSh2bSwgcC0+cGFnZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNldHVwX3BhZ2VfZG1hKHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtLAotCQkJICBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCkKLXsKLQlyZXR1cm4g X19zZXR1cF9wYWdlX2RtYSh2bSwgcCwgX19HRlBfSElHSE1FTSk7Ci19Ci0KLXN0YXRpYyB2b2lk IGNsZWFudXBfcGFnZV9kbWEoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkgICAg IHN0cnVjdCBpOTE1X3BhZ2VfZG1hICpwKQotewotCWRtYV91bm1hcF9wYWdlKHZtLT5kbWEsIHAt PmRhZGRyLCBQQUdFX1NJWkUsIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0Jdm1fZnJlZV9wYWdl KHZtLCBwLT5wYWdlKTsKLX0KLQotI2RlZmluZSBrbWFwX2F0b21pY19weChweCkga21hcF9hdG9t aWMocHhfYmFzZShweCktPnBhZ2UpCisJCUdFTV9CVUdfT04ob2JqLT5tbS5wYWdlcyA9PSBwYWdl cyk7CisJfSB3aGlsZSAoaTkxNV9nZW1fc2hyaW5rKHRvX2k5MTUob2JqLT5iYXNlLmRldiksCisJ CQkJIG9iai0+YmFzZS5zaXplID4+IFBBR0VfU0hJRlQsIE5VTEwsCisJCQkJIEk5MTVfU0hSSU5L X0JPVU5EIHwKKwkJCQkgSTkxNV9TSFJJTktfVU5CT1VORCkpOwogCi1zdGF0aWMgdm9pZAotZmls bF9wYWdlX2RtYShjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcCwgY29uc3QgdTY0IHZhbCwg dW5zaWduZWQgaW50IGNvdW50KQotewotCWt1bm1hcF9hdG9taWMobWVtc2V0NjQoa21hcF9hdG9t aWMocC0+cGFnZSksIHZhbCwgY291bnQpKTsKKwlyZXR1cm4gLUVOT1NQQzsKIH0KIAotI2RlZmlu ZSBmaWxsX3B4KHB4LCB2KSBmaWxsX3BhZ2VfZG1hKHB4X2Jhc2UocHgpLCAodiksIFBBR0VfU0la RSAvIHNpemVvZih1NjQpKQotI2RlZmluZSBmaWxsMzJfcHgocHgsIHYpIGRvIHsJCQkJCQlcCi0J dTY0IHZfXyA9IGxvd2VyXzMyX2JpdHModik7CQkJCQlcCi0JZmlsbF9weCgocHgpLCB2X18gPDwg MzIgfCB2X18pOwkJCQkJXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIGludAotc2V0dXBfc2NyYXRj aF9wYWdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLCBnZnBfdCBnZnApCit2b2lkIGk5 MTVfZ2VtX2d0dF9maW5pc2hfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK KwkJCSAgICAgICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQogewotCXVuc2lnbmVkIGxvbmcgc2l6 ZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFz ZS5kZXYpOworCXN0cnVjdCBkZXZpY2UgKmtkZXYgPSAmZGV2X3ByaXYtPmRybS5wZGV2LT5kZXY7 CisJc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9ICZkZXZfcHJpdi0+Z2d0dDsKIAotCS8qCi0JICog SW4gb3JkZXIgdG8gdXRpbGl6ZSA2NEsgcGFnZXMgZm9yIGFuIG9iamVjdCB3aXRoIGEgc2l6ZSA8 IDJNLCB3ZSB3aWxsCi0JICogbmVlZCB0byBzdXBwb3J0IGEgNjRLIHNjcmF0Y2ggcGFnZSwgZ2l2 ZW4gdGhhdCBldmVyeSAxNnRoIGVudHJ5IGZvciBhCi0JICogcGFnZS10YWJsZSBvcGVyYXRpbmcg aW4gNjRLIG1vZGUgbXVzdCBwb2ludCB0byBhIHByb3Blcmx5IGFsaWduZWQgNjRLCi0JICogcmVn aW9uLCBpbmNsdWRpbmcgYW55IFBURXMgd2hpY2ggaGFwcGVuIHRvIHBvaW50IHRvIHNjcmF0Y2gu Ci0JICoKLQkgKiBUaGlzIGlzIG9ubHkgcmVsZXZhbnQgZm9yIHRoZSA0OGIgUFBHVFQgd2hlcmUg d2Ugc3VwcG9ydAotCSAqIGh1Z2UtZ3R0LXBhZ2VzLCBzZWUgYWxzbyBpOTE1X3ZtYV9pbnNlcnQo KS4gSG93ZXZlciwgYXMgd2Ugc2hhcmUgdGhlCi0JICogc2NyYXRjaCAocmVhZC1vbmx5KSBiZXR3 ZWVuIGFsbCB2bSwgd2UgY3JlYXRlIG9uZSA2NGsgc2NyYXRjaCBwYWdlCi0JICogZm9yIGFsbC4K LQkgKi8KLQlzaXplID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLOwotCWlmIChpOTE1X3ZtX2lzXzRs dmwodm0pICYmCi0JICAgIEhBU19QQUdFX1NJWkVTKHZtLT5pOTE1LCBJOTE1X0dUVF9QQUdFX1NJ WkVfNjRLKSkgewotCQlzaXplID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SzsKLQkJZ2ZwIHw9IF9f R0ZQX05PV0FSTjsKKwlpZiAodW5saWtlbHkoZ2d0dC0+ZG9faWRsZV9tYXBzKSkgeworCQkvKiBY WFggVGhpcyBkb2VzIG5vdCBwcmV2ZW50IG1vcmUgcmVxdWVzdHMgYmVpbmcgc3VibWl0dGVkISAq LworCQlpZiAoaW50ZWxfZ3RfcmV0aXJlX3JlcXVlc3RzX3RpbWVvdXQoZ2d0dC0+dm0uZ3QsCisJ CQkJCQkgICAgIC1NQVhfU0NIRURVTEVfVElNRU9VVCkpIHsKKwkJCURSTV9FUlJPUigiRmFpbGVk IHRvIHdhaXQgZm9yIGlkbGU7IFZUJ2QgbWF5IGhhbmcuXG4iKTsKKwkJCS8qIFdhaXQgYSBiaXQs IGluIGhvcGVzIGl0IGF2b2lkcyB0aGUgaGFuZyAqLworCQkJdWRlbGF5KDEwKTsKKwkJfQogCX0K LQlnZnAgfD0gX19HRlBfWkVSTyB8IF9fR0ZQX1JFVFJZX01BWUZBSUw7Ci0KLQlkbyB7Ci0JCXVu c2lnbmVkIGludCBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQkJc3RydWN0IHBhZ2UgKnBhZ2U7 Ci0JCWRtYV9hZGRyX3QgYWRkcjsKIAotCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwLCBvcmRlcik7 Ci0JCWlmICh1bmxpa2VseSghcGFnZSkpCi0JCQlnb3RvIHNraXA7Ci0KLQkJYWRkciA9IGRtYV9t YXBfcGFnZV9hdHRycyh2bS0+ZG1hLAotCQkJCQkgIHBhZ2UsIDAsIHNpemUsCi0JCQkJCSAgUENJ X0RNQV9CSURJUkVDVElPTkFMLAotCQkJCQkgIERNQV9BVFRSX1NLSVBfQ1BVX1NZTkMgfAotCQkJ CQkgIERNQV9BVFRSX05PX1dBUk4pOwotCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3Io dm0tPmRtYSwgYWRkcikpKQotCQkJZ290byBmcmVlX3BhZ2U7Ci0KLQkJaWYgKHVubGlrZWx5KCFJ U19BTElHTkVEKGFkZHIsIHNpemUpKSkKLQkJCWdvdG8gdW5tYXBfcGFnZTsKLQotCQl2bS0+c2Ny YXRjaFswXS5iYXNlLnBhZ2UgPSBwYWdlOwotCQl2bS0+c2NyYXRjaFswXS5iYXNlLmRhZGRyID0g YWRkcjsKLQkJdm0tPnNjcmF0Y2hfb3JkZXIgPSBvcmRlcjsKLQkJcmV0dXJuIDA7Ci0KLXVubWFw X3BhZ2U6Ci0JCWRtYV91bm1hcF9wYWdlKHZtLT5kbWEsIGFkZHIsIHNpemUsIFBDSV9ETUFfQklE SVJFQ1RJT05BTCk7Ci1mcmVlX3BhZ2U6Ci0JCV9fZnJlZV9wYWdlcyhwYWdlLCBvcmRlcik7Ci1z a2lwOgotCQlpZiAoc2l6ZSA9PSBJOTE1X0dUVF9QQUdFX1NJWkVfNEspCi0JCQlyZXR1cm4gLUVO T01FTTsKLQotCQlzaXplID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLOwotCQlnZnAgJj0gfl9fR0ZQ X05PV0FSTjsKLQl9IHdoaWxlICgxKTsKLX0KLQotc3RhdGljIHZvaWQgY2xlYW51cF9zY3JhdGNo X3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0Jc3RydWN0IGk5MTVfcGFn ZV9kbWEgKnAgPSBweF9iYXNlKCZ2bS0+c2NyYXRjaFswXSk7Ci0JdW5zaWduZWQgaW50IG9yZGVy ID0gdm0tPnNjcmF0Y2hfb3JkZXI7Ci0KLQlkbWFfdW5tYXBfcGFnZSh2bS0+ZG1hLCBwLT5kYWRk ciwgQklUKG9yZGVyKSA8PCBQQUdFX1NISUZULAotCQkgICAgICAgUENJX0RNQV9CSURJUkVDVElP TkFMKTsKLQlfX2ZyZWVfcGFnZXMocC0+cGFnZSwgb3JkZXIpOwotfQotCi1zdGF0aWMgdm9pZCBm cmVlX3NjcmF0Y2goc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pCi17Ci0JaW50IGk7Ci0K LQlpZiAoIXB4X2RtYSgmdm0tPnNjcmF0Y2hbMF0pKSAvKiBzZXQgdG8gMCBvbiBjbG9uZXMgKi8K LQkJcmV0dXJuOwotCi0JZm9yIChpID0gMTsgaSA8PSB2bS0+dG9wOyBpKyspIHsKLQkJaWYgKCFw eF9kbWEoJnZtLT5zY3JhdGNoW2ldKSkKLQkJCWJyZWFrOwotCQljbGVhbnVwX3BhZ2VfZG1hKHZt LCBweF9iYXNlKCZ2bS0+c2NyYXRjaFtpXSkpOwotCX0KLQotCWNsZWFudXBfc2NyYXRjaF9wYWdl KHZtKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKmFsbG9jX3B0KHN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCXN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKnB0 OwotCi0JcHQgPSBrbWFsbG9jKHNpemVvZigqcHQpLCBJOTE1X0dGUF9BTExPV19GQUlMKTsKLQlp ZiAodW5saWtlbHkoIXB0KSkKLQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0KLQlpZiAodW5s aWtlbHkoc2V0dXBfcGFnZV9kbWEodm0sICZwdC0+YmFzZSkpKSB7Ci0JCWtmcmVlKHB0KTsKLQkJ cmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCi0JYXRvbWljX3NldCgmcHQtPnVzZWQsIDAp OwotCXJldHVybiBwdDsKLX0KLQotc3RhdGljIHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpf X2FsbG9jX3BkKHNpemVfdCBzeikKLXsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQ7 Ci0KLQlwZCA9IGt6YWxsb2Moc3osIEk5MTVfR0ZQX0FMTE9XX0ZBSUwpOwotCWlmICh1bmxpa2Vs eSghcGQpKQotCQlyZXR1cm4gTlVMTDsKLQotCXNwaW5fbG9ja19pbml0KCZwZC0+bG9jayk7Ci0J cmV0dXJuIHBkOwotfQotCi1zdGF0aWMgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKmFsbG9j X3BkKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCXN0cnVjdCBpOTE1X3BhZ2Vf ZGlyZWN0b3J5ICpwZDsKLQotCXBkID0gX19hbGxvY19wZChzaXplb2YoKnBkKSk7Ci0JaWYgKHVu bGlrZWx5KCFwZCkpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JaWYgKHVubGlrZWx5 KHNldHVwX3BhZ2VfZG1hKHZtLCBweF9iYXNlKHBkKSkpKSB7Ci0JCWtmcmVlKHBkKTsKLQkJcmV0 dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQotCi0JcmV0dXJuIHBkOwotfQotCi1zdGF0aWMgdm9p ZCBmcmVlX3BkKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLCBzdHJ1Y3QgaTkxNV9wYWdl X2RtYSAqcGQpCi17Ci0JY2xlYW51cF9wYWdlX2RtYSh2bSwgcGQpOwotCWtmcmVlKHBkKTsKLX0K LQotI2RlZmluZSBmcmVlX3B4KHZtLCBweCkgZnJlZV9wZCh2bSwgcHhfYmFzZShweCkpCi0KLXN0 YXRpYyBpbmxpbmUgdm9pZAotd3JpdGVfZG1hX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZG1hICog Y29uc3QgcGRtYSwKLQkJY29uc3QgdW5zaWduZWQgc2hvcnQgaWR4LAotCQljb25zdCB1NjQgZW5j b2RlZF9lbnRyeSkKLXsKLQl1NjQgKiBjb25zdCB2YWRkciA9IGttYXBfYXRvbWljKHBkbWEtPnBh Z2UpOwotCi0JdmFkZHJbaWR4XSA9IGVuY29kZWRfZW50cnk7Ci0Ja3VubWFwX2F0b21pYyh2YWRk cik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19zZXRfcGRfZW50cnkoc3RydWN0IGk5MTVf cGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKLQkgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQg aWR4LAotCSAgICAgICBzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqIGNvbnN0IHRvLAotCSAgICAgICB1 NjQgKCplbmNvZGUpKGNvbnN0IGRtYV9hZGRyX3QsIGNvbnN0IGVudW0gaTkxNV9jYWNoZV9sZXZl bCkpCi17Ci0JLyogRWFjaCB0aHJlYWQgcHJlLXBpbnMgdGhlIHBkLCBhbmQgd2UgbWF5IGhhdmUg YSB0aHJlYWQgcGVyIHBkZS4gKi8KLQlHRU1fQlVHX09OKGF0b21pY19yZWFkKHB4X3VzZWQocGQp KSA+IE5BTExPQyAqIEFSUkFZX1NJWkUocGQtPmVudHJ5KSk7Ci0KLQlhdG9taWNfaW5jKHB4X3Vz ZWQocGQpKTsKLQlwZC0+ZW50cnlbaWR4XSA9IHRvOwotCXdyaXRlX2RtYV9lbnRyeShweF9iYXNl KHBkKSwgaWR4LCBlbmNvZGUodG8tPmRhZGRyLCBJOTE1X0NBQ0hFX0xMQykpOwotfQotCi0jZGVm aW5lIHNldF9wZF9lbnRyeShwZCwgaWR4LCB0bykgXAotCV9fc2V0X3BkX2VudHJ5KChwZCksIChp ZHgpLCBweF9iYXNlKHRvKSwgZ2VuOF9wZGVfZW5jb2RlKQotCi1zdGF0aWMgaW5saW5lIHZvaWQK LWNsZWFyX3BkX2VudHJ5KHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGQsCi0J ICAgICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IGlkeCwKLQkgICAgICAgY29uc3Qgc3RydWN0IGk5 MTVfcGFnZV9zY3JhdGNoICogY29uc3Qgc2NyYXRjaCkKLXsKLQlHRU1fQlVHX09OKGF0b21pY19y ZWFkKHB4X3VzZWQocGQpKSA9PSAwKTsKLQotCXdyaXRlX2RtYV9lbnRyeShweF9iYXNlKHBkKSwg aWR4LCBzY3JhdGNoLT5lbmNvZGUpOwotCXBkLT5lbnRyeVtpZHhdID0gTlVMTDsKLQlhdG9taWNf ZGVjKHB4X3VzZWQocGQpKTsKLX0KLQotc3RhdGljIGJvb2wKLXJlbGVhc2VfcGRfZW50cnkoc3Ry dWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKLQkJIGNvbnN0IHVuc2lnbmVkIHNo b3J0IGlkeCwKLQkJIHN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKiBjb25zdCBwdCwKLQkJIGNvbnN0 IHN0cnVjdCBpOTE1X3BhZ2Vfc2NyYXRjaCAqIGNvbnN0IHNjcmF0Y2gpCi17Ci0JYm9vbCBmcmVl ID0gZmFsc2U7Ci0KLQlpZiAoYXRvbWljX2FkZF91bmxlc3MoJnB0LT51c2VkLCAtMSwgMSkpCi0J CXJldHVybiBmYWxzZTsKLQotCXNwaW5fbG9jaygmcGQtPmxvY2spOwotCWlmIChhdG9taWNfZGVj X2FuZF90ZXN0KCZwdC0+dXNlZCkpIHsKLQkJY2xlYXJfcGRfZW50cnkocGQsIGlkeCwgc2NyYXRj aCk7Ci0JCWZyZWUgPSB0cnVlOwotCX0KLQlzcGluX3VubG9jaygmcGQtPmxvY2spOwotCi0JcmV0 dXJuIGZyZWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhfcHBndHRfbm90aWZ5X3ZndChzdHJ1Y3Qg aTkxNV9wcGd0dCAqcHBndHQsIGJvb2wgY3JlYXRlKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IHBwZ3R0LT52bS5pOTE1OwotCWVudW0gdmd0X2cydl90eXBlIG1zZzsK LQlpbnQgaTsKLQotCWlmIChjcmVhdGUpCi0JCWF0b21pY19pbmMocHhfdXNlZChwcGd0dC0+cGQp KTsgLyogbmV2ZXIgcmVtb3ZlICovCi0JZWxzZQotCQlhdG9taWNfZGVjKHB4X3VzZWQocHBndHQt PnBkKSk7Ci0KLQltdXRleF9sb2NrKCZkZXZfcHJpdi0+dmdwdS5sb2NrKTsKLQotCWlmIChpOTE1 X3ZtX2lzXzRsdmwoJnBwZ3R0LT52bSkpIHsKLQkJY29uc3QgdTY0IGRhZGRyID0gcHhfZG1hKHBw Z3R0LT5wZCk7Ci0KLQkJSTkxNV9XUklURSh2Z3RpZl9yZWcocGRwWzBdLmxvKSwgbG93ZXJfMzJf Yml0cyhkYWRkcikpOwotCQlJOTE1X1dSSVRFKHZndGlmX3JlZyhwZHBbMF0uaGkpLCB1cHBlcl8z Ml9iaXRzKGRhZGRyKSk7Ci0KLQkJbXNnID0gKGNyZWF0ZSA/IFZHVF9HMlZfUFBHVFRfTDRfUEFH RV9UQUJMRV9DUkVBVEUgOgotCQkJCVZHVF9HMlZfUFBHVFRfTDRfUEFHRV9UQUJMRV9ERVNUUk9Z KTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgR0VOOF8zTFZMX1BEUEVTOyBpKyspIHsK LQkJCWNvbnN0IHU2NCBkYWRkciA9IGk5MTVfcGFnZV9kaXJfZG1hX2FkZHIocHBndHQsIGkpOwot Ci0JCQlJOTE1X1dSSVRFKHZndGlmX3JlZyhwZHBbaV0ubG8pLCBsb3dlcl8zMl9iaXRzKGRhZGRy KSk7Ci0JCQlJOTE1X1dSSVRFKHZndGlmX3JlZyhwZHBbaV0uaGkpLCB1cHBlcl8zMl9iaXRzKGRh ZGRyKSk7Ci0JCX0KLQotCQltc2cgPSAoY3JlYXRlID8gVkdUX0cyVl9QUEdUVF9MM19QQUdFX1RB QkxFX0NSRUFURSA6Ci0JCQkJVkdUX0cyVl9QUEdUVF9MM19QQUdFX1RBQkxFX0RFU1RST1kpOwot CX0KLQotCS8qIGcydl9ub3RpZnkgYXRvbWljYWxseSAodmlhIGh2IHRyYXApIGNvbnN1bWVzIHRo ZSBtZXNzYWdlIHBhY2tldC4gKi8KLQlJOTE1X1dSSVRFKHZndGlmX3JlZyhnMnZfbm90aWZ5KSwg bXNnKTsKLQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnZncHUubG9jayk7Ci19Ci0KLS8qIElu ZGV4IHNoaWZ0cyBpbnRvIHRoZSBwYWdldGFibGUgYXJlIG9mZnNldCBieSBHRU44X1BURV9TSElG VCBbMTJdICovCi0jZGVmaW5lIEdFTjhfUEFHRV9TSVpFIChTWl80SykgLyogcGFnZSBhbmQgcGFn ZS1kaXJlY3Rvcnkgc2l6ZXMgYXJlIHRoZSBzYW1lICovCi0jZGVmaW5lIEdFTjhfUFRFX1NISUZU IChpbG9nMihHRU44X1BBR0VfU0laRSkpCi0jZGVmaW5lIEdFTjhfUERFUyAoR0VOOF9QQUdFX1NJ WkUgLyBzaXplb2YodTY0KSkKLSNkZWZpbmUgZ2VuOF9wZF9zaGlmdChsdmwpICgobHZsKSAqIGls b2cyKEdFTjhfUERFUykpCi0jZGVmaW5lIGdlbjhfcGRfaW5kZXgoaSwgbHZsKSBpOTE1X3BkZV9p bmRleCgoaSksIGdlbjhfcGRfc2hpZnQobHZsKSkKLSNkZWZpbmUgX19nZW44X3B0ZV9zaGlmdChs dmwpIChHRU44X1BURV9TSElGVCArIGdlbjhfcGRfc2hpZnQobHZsKSkKLSNkZWZpbmUgX19nZW44 X3B0ZV9pbmRleChhLCBsdmwpIGk5MTVfcGRlX2luZGV4KChhKSwgX19nZW44X3B0ZV9zaGlmdChs dmwpKQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludAotZ2VuOF9wZF9yYW5nZSh1NjQgc3Rh cnQsIHU2NCBlbmQsIGludCBsdmwsIHVuc2lnbmVkIGludCAqaWR4KQotewotCWNvbnN0IGludCBz aGlmdCA9IGdlbjhfcGRfc2hpZnQobHZsKTsKLQljb25zdCB1NjQgbWFzayA9IH4wdWxsIDw8IGdl bjhfcGRfc2hpZnQobHZsICsgMSk7Ci0KLQlHRU1fQlVHX09OKHN0YXJ0ID49IGVuZCk7Ci0JZW5k ICs9IH5tYXNrID4+IGdlbjhfcGRfc2hpZnQoMSk7Ci0KLQkqaWR4ID0gaTkxNV9wZGVfaW5kZXgo c3RhcnQsIHNoaWZ0KTsKLQlpZiAoKHN0YXJ0IF4gZW5kKSAmIG1hc2spCi0JCXJldHVybiBHRU44 X1BERVMgLSAqaWR4OwotCWVsc2UKLQkJcmV0dXJuIGk5MTVfcGRlX2luZGV4KGVuZCwgc2hpZnQp IC0gKmlkeDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIGdlbjhfcGRfY29udGFpbnModTY0IHN0 YXJ0LCB1NjQgZW5kLCBpbnQgbHZsKQotewotCWNvbnN0IHU2NCBtYXNrID0gfjB1bGwgPDwgZ2Vu OF9wZF9zaGlmdChsdmwgKyAxKTsKLQotCUdFTV9CVUdfT04oc3RhcnQgPj0gZW5kKTsKLQlyZXR1 cm4gKHN0YXJ0IF4gZW5kKSAmIG1hc2sgJiYgKHN0YXJ0ICYgfm1hc2spID09IDA7Ci19Ci0KLXN0 YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdlbjhfcHRfY291bnQodTY0IHN0YXJ0LCB1NjQgZW5k KQotewotCUdFTV9CVUdfT04oc3RhcnQgPj0gZW5kKTsKLQlpZiAoKHN0YXJ0IF4gZW5kKSA+PiBn ZW44X3BkX3NoaWZ0KDEpKQotCQlyZXR1cm4gR0VOOF9QREVTIC0gKHN0YXJ0ICYgKEdFTjhfUERF UyAtIDEpKTsKLQllbHNlCi0JCXJldHVybiBlbmQgLSBzdGFydDsKLX0KLQotc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgZ2VuOF9wZF90b3BfY291bnQoY29uc3Qgc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0pCi17Ci0JdW5zaWduZWQgaW50IHNoaWZ0ID0gX19nZW44X3B0ZV9zaGlmdCh2 bS0+dG9wKTsKLQlyZXR1cm4gKHZtLT50b3RhbCArICgxdWxsIDw8IHNoaWZ0KSAtIDEpID4+IHNo aWZ0OwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICoKLWdl bjhfcGRwX2Zvcl9wYWdlX2luZGV4KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKiBjb25zdCB2 bSwgY29uc3QgdTY0IGlkeCkKLXsKLQlzdHJ1Y3QgaTkxNV9wcGd0dCAqIGNvbnN0IHBwZ3R0ID0g aTkxNV92bV90b19wcGd0dCh2bSk7Ci0KLQlpZiAodm0tPnRvcCA9PSAyKQotCQlyZXR1cm4gcHBn dHQtPnBkOwotCWVsc2UKLQkJcmV0dXJuIGk5MTVfcGRfZW50cnkocHBndHQtPnBkLCBnZW44X3Bk X2luZGV4KGlkeCwgdm0tPnRvcCkpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpOTE1X3Bh Z2VfZGlyZWN0b3J5ICoKLWdlbjhfcGRwX2Zvcl9wYWdlX2FkZHJlc3Moc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqIGNvbnN0IHZtLCBjb25zdCB1NjQgYWRkcikKLXsKLQlyZXR1cm4gZ2VuOF9w ZHBfZm9yX3BhZ2VfaW5kZXgodm0sIGFkZHIgPj4gR0VOOF9QVEVfU0hJRlQpOwotfQotCi1zdGF0 aWMgdm9pZCBfX2dlbjhfcHBndHRfY2xlYW51cChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2 bSwKLQkJCQkgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKnBkLAotCQkJCSBpbnQgY291bnQs IGludCBsdmwpCi17Ci0JaWYgKGx2bCkgewotCQl2b2lkICoqcGRlID0gcGQtPmVudHJ5OwotCi0J CWRvIHsKLQkJCWlmICghKnBkZSkKLQkJCQljb250aW51ZTsKLQotCQkJX19nZW44X3BwZ3R0X2Ns ZWFudXAodm0sICpwZGUsIEdFTjhfUERFUywgbHZsIC0gMSk7Ci0JCX0gd2hpbGUgKHBkZSsrLCAt LWNvdW50KTsKLQl9Ci0KLQlmcmVlX3B4KHZtLCBwZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhf cHBndHRfY2xlYW51cChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlzdHJ1Y3Qg aTkxNV9wcGd0dCAqcHBndHQgPSBpOTE1X3ZtX3RvX3BwZ3R0KHZtKTsKLQotCWlmIChpbnRlbF92 Z3B1X2FjdGl2ZSh2bS0+aTkxNSkpCi0JCWdlbjhfcHBndHRfbm90aWZ5X3ZndChwcGd0dCwgZmFs c2UpOwotCi0JX19nZW44X3BwZ3R0X2NsZWFudXAodm0sIHBwZ3R0LT5wZCwgZ2VuOF9wZF90b3Bf Y291bnQodm0pLCB2bS0+dG9wKTsKLQlmcmVlX3NjcmF0Y2godm0pOwotfQotCi1zdGF0aWMgdTY0 IF9fZ2VuOF9wcGd0dF9jbGVhcihzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICogY29uc3Qgdm0s Ci0JCQkgICAgICBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkLAotCQkJICAg ICAgdTY0IHN0YXJ0LCBjb25zdCB1NjQgZW5kLCBpbnQgbHZsKQotewotCWNvbnN0IHN0cnVjdCBp OTE1X3BhZ2Vfc2NyYXRjaCAqIGNvbnN0IHNjcmF0Y2ggPSAmdm0tPnNjcmF0Y2hbbHZsXTsKLQl1 bnNpZ25lZCBpbnQgaWR4LCBsZW47Ci0KLQlHRU1fQlVHX09OKGVuZCA+IHZtLT50b3RhbCA+PiBH RU44X1BURV9TSElGVCk7Ci0KLQlsZW4gPSBnZW44X3BkX3JhbmdlKHN0YXJ0LCBlbmQsIGx2bC0t LCAmaWR4KTsKLQlEQkcoIiVzKCVwKTp7IGx2bDolZCwgc3RhcnQ6JWxseCwgZW5kOiVsbHgsIGlk eDolZCwgbGVuOiVkLCB1c2VkOiVkIH1cbiIsCi0JICAgIF9fZnVuY19fLCB2bSwgbHZsICsgMSwg c3RhcnQsIGVuZCwKLQkgICAgaWR4LCBsZW4sIGF0b21pY19yZWFkKHB4X3VzZWQocGQpKSk7Ci0J R0VNX0JVR19PTighbGVuIHx8IGxlbiA+PSBhdG9taWNfcmVhZChweF91c2VkKHBkKSkpOwotCi0J ZG8gewotCQlzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICpwdCA9IHBkLT5lbnRyeVtpZHhdOwotCi0J CWlmIChhdG9taWNfZmV0Y2hfaW5jKCZwdC0+dXNlZCkgPj4gZ2VuOF9wZF9zaGlmdCgxKSAmJgot CQkgICAgZ2VuOF9wZF9jb250YWlucyhzdGFydCwgZW5kLCBsdmwpKSB7Ci0JCQlEQkcoIiVzKCVw KTp7IGx2bDolZCwgaWR4OiVkLCBzdGFydDolbGx4LCBlbmQ6JWxseCB9IHJlbW92aW5nIHBkXG4i LAotCQkJICAgIF9fZnVuY19fLCB2bSwgbHZsICsgMSwgaWR4LCBzdGFydCwgZW5kKTsKLQkJCWNs ZWFyX3BkX2VudHJ5KHBkLCBpZHgsIHNjcmF0Y2gpOwotCQkJX19nZW44X3BwZ3R0X2NsZWFudXAo dm0sIGFzX3BkKHB0KSwgSTkxNV9QREVTLCBsdmwpOwotCQkJc3RhcnQgKz0gKHU2NClJOTE1X1BE RVMgPDwgZ2VuOF9wZF9zaGlmdChsdmwpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAobHZs KSB7Ci0JCQlzdGFydCA9IF9fZ2VuOF9wcGd0dF9jbGVhcih2bSwgYXNfcGQocHQpLAotCQkJCQkJ ICAgc3RhcnQsIGVuZCwgbHZsKTsKLQkJfSBlbHNlIHsKLQkJCXVuc2lnbmVkIGludCBjb3VudDsK LQkJCXU2NCAqdmFkZHI7Ci0KLQkJCWNvdW50ID0gZ2VuOF9wdF9jb3VudChzdGFydCwgZW5kKTsK LQkJCURCRygiJXMoJXApOnsgbHZsOiVkLCBzdGFydDolbGx4LCBlbmQ6JWxseCwgaWR4OiVkLCBs ZW46JWQsIHVzZWQ6JWQgfSByZW1vdmluZyBwdGVcbiIsCi0JCQkgICAgX19mdW5jX18sIHZtLCBs dmwsIHN0YXJ0LCBlbmQsCi0JCQkgICAgZ2VuOF9wZF9pbmRleChzdGFydCwgMCksIGNvdW50LAot CQkJICAgIGF0b21pY19yZWFkKCZwdC0+dXNlZCkpOwotCQkJR0VNX0JVR19PTighY291bnQgfHwg Y291bnQgPj0gYXRvbWljX3JlYWQoJnB0LT51c2VkKSk7Ci0KLQkJCXZhZGRyID0ga21hcF9hdG9t aWNfcHgocHQpOwotCQkJbWVtc2V0NjQodmFkZHIgKyBnZW44X3BkX2luZGV4KHN0YXJ0LCAwKSwK LQkJCQkgdm0tPnNjcmF0Y2hbMF0uZW5jb2RlLAotCQkJCSBjb3VudCk7Ci0JCQlrdW5tYXBfYXRv bWljKHZhZGRyKTsKLQotCQkJYXRvbWljX3N1Yihjb3VudCwgJnB0LT51c2VkKTsKLQkJCXN0YXJ0 ICs9IGNvdW50OwotCQl9Ci0KLQkJaWYgKHJlbGVhc2VfcGRfZW50cnkocGQsIGlkeCwgcHQsIHNj cmF0Y2gpKQotCQkJZnJlZV9weCh2bSwgcHQpOwotCX0gd2hpbGUgKGlkeCsrLCAtLWxlbik7Ci0K LQlyZXR1cm4gc3RhcnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhfcHBndHRfY2xlYXIoc3RydWN0 IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkgICAgIHU2NCBzdGFydCwgdTY0IGxlbmd0aCkK LXsKLQlHRU1fQlVHX09OKCFJU19BTElHTkVEKHN0YXJ0LCBCSVRfVUxMKEdFTjhfUFRFX1NISUZU KSkpOwotCUdFTV9CVUdfT04oIUlTX0FMSUdORUQobGVuZ3RoLCBCSVRfVUxMKEdFTjhfUFRFX1NI SUZUKSkpOwotCUdFTV9CVUdfT04ocmFuZ2Vfb3ZlcmZsb3dzKHN0YXJ0LCBsZW5ndGgsIHZtLT50 b3RhbCkpOwotCi0Jc3RhcnQgPj49IEdFTjhfUFRFX1NISUZUOwotCWxlbmd0aCA+Pj0gR0VOOF9Q VEVfU0hJRlQ7Ci0JR0VNX0JVR19PTihsZW5ndGggPT0gMCk7Ci0KLQlfX2dlbjhfcHBndHRfY2xl YXIodm0sIGk5MTVfdm1fdG9fcHBndHQodm0pLT5wZCwKLQkJCSAgIHN0YXJ0LCBzdGFydCArIGxl bmd0aCwgdm0tPnRvcCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19nZW44X3BwZ3R0X2FsbG9jKHN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKiBjb25zdCB2bSwKLQkJCSAgICAgIHN0cnVjdCBpOTE1X3Bh Z2VfZGlyZWN0b3J5ICogY29uc3QgcGQsCi0JCQkgICAgICB1NjQgKiBjb25zdCBzdGFydCwgY29u c3QgdTY0IGVuZCwgaW50IGx2bCkKLXsKLQljb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3NjcmF0Y2gg KiBjb25zdCBzY3JhdGNoID0gJnZtLT5zY3JhdGNoW2x2bF07Ci0Jc3RydWN0IGk5MTVfcGFnZV90 YWJsZSAqYWxsb2MgPSBOVUxMOwotCXVuc2lnbmVkIGludCBpZHgsIGxlbjsKLQlpbnQgcmV0ID0g MDsKLQotCUdFTV9CVUdfT04oZW5kID4gdm0tPnRvdGFsID4+IEdFTjhfUFRFX1NISUZUKTsKLQot CWxlbiA9IGdlbjhfcGRfcmFuZ2UoKnN0YXJ0LCBlbmQsIGx2bC0tLCAmaWR4KTsKLQlEQkcoIiVz KCVwKTp7IGx2bDolZCwgc3RhcnQ6JWxseCwgZW5kOiVsbHgsIGlkeDolZCwgbGVuOiVkLCB1c2Vk OiVkIH1cbiIsCi0JICAgIF9fZnVuY19fLCB2bSwgbHZsICsgMSwgKnN0YXJ0LCBlbmQsCi0JICAg IGlkeCwgbGVuLCBhdG9taWNfcmVhZChweF91c2VkKHBkKSkpOwotCUdFTV9CVUdfT04oIWxlbiB8 fCAoaWR4ICsgbGVuIC0gMSkgPj4gZ2VuOF9wZF9zaGlmdCgxKSk7Ci0KLQlzcGluX2xvY2soJnBk LT5sb2NrKTsKLQlHRU1fQlVHX09OKCFhdG9taWNfcmVhZChweF91c2VkKHBkKSkpOyAvKiBNdXN0 IGJlIHBpbm5lZCEgKi8KLQlkbyB7Ci0JCXN0cnVjdCBpOTE1X3BhZ2VfdGFibGUgKnB0ID0gcGQt PmVudHJ5W2lkeF07Ci0KLQkJaWYgKCFwdCkgewotCQkJc3Bpbl91bmxvY2soJnBkLT5sb2NrKTsK LQotCQkJREJHKCIlcyglcCk6eyBsdmw6JWQsIGlkeDolZCB9IGFsbG9jYXRpbmcgbmV3IHRyZWVc biIsCi0JCQkgICAgX19mdW5jX18sIHZtLCBsdmwgKyAxLCBpZHgpOwotCi0JCQlwdCA9IGZldGNo X2FuZF96ZXJvKCZhbGxvYyk7Ci0JCQlpZiAobHZsKSB7Ci0JCQkJaWYgKCFwdCkgewotCQkJCQlw dCA9ICZhbGxvY19wZCh2bSktPnB0OwotCQkJCQlpZiAoSVNfRVJSKHB0KSkgewotCQkJCQkJcmV0 ID0gUFRSX0VSUihwdCk7Ci0JCQkJCQlnb3RvIG91dDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZp bGxfcHgocHQsIHZtLT5zY3JhdGNoW2x2bF0uZW5jb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYg KCFwdCkgewotCQkJCQlwdCA9IGFsbG9jX3B0KHZtKTsKLQkJCQkJaWYgKElTX0VSUihwdCkpIHsK LQkJCQkJCXJldCA9IFBUUl9FUlIocHQpOwotCQkJCQkJZ290byBvdXQ7Ci0JCQkJCX0KLQkJCQl9 Ci0KLQkJCQlpZiAoaW50ZWxfdmdwdV9hY3RpdmUodm0tPmk5MTUpIHx8Ci0JCQkJICAgIGdlbjhf cHRfY291bnQoKnN0YXJ0LCBlbmQpIDwgSTkxNV9QREVTKQotCQkJCQlmaWxsX3B4KHB0LCB2bS0+ c2NyYXRjaFtsdmxdLmVuY29kZSk7Ci0JCQl9Ci0KLQkJCXNwaW5fbG9jaygmcGQtPmxvY2spOwot CQkJaWYgKGxpa2VseSghcGQtPmVudHJ5W2lkeF0pKQotCQkJCXNldF9wZF9lbnRyeShwZCwgaWR4 LCBwdCk7Ci0JCQllbHNlCi0JCQkJYWxsb2MgPSBwdCwgcHQgPSBwZC0+ZW50cnlbaWR4XTsKLQkJ fQotCi0JCWlmIChsdmwpIHsKLQkJCWF0b21pY19pbmMoJnB0LT51c2VkKTsKLQkJCXNwaW5fdW5s b2NrKCZwZC0+bG9jayk7Ci0KLQkJCXJldCA9IF9fZ2VuOF9wcGd0dF9hbGxvYyh2bSwgYXNfcGQo cHQpLAotCQkJCQkJIHN0YXJ0LCBlbmQsIGx2bCk7Ci0JCQlpZiAodW5saWtlbHkocmV0KSkgewot CQkJCWlmIChyZWxlYXNlX3BkX2VudHJ5KHBkLCBpZHgsIHB0LCBzY3JhdGNoKSkKLQkJCQkJZnJl ZV9weCh2bSwgcHQpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlzcGluX2xvY2soJnBkLT5s b2NrKTsKLQkJCWF0b21pY19kZWMoJnB0LT51c2VkKTsKLQkJCUdFTV9CVUdfT04oIWF0b21pY19y ZWFkKCZwdC0+dXNlZCkpOwotCQl9IGVsc2UgewotCQkJdW5zaWduZWQgaW50IGNvdW50ID0gZ2Vu OF9wdF9jb3VudCgqc3RhcnQsIGVuZCk7Ci0KLQkJCURCRygiJXMoJXApOnsgbHZsOiVkLCBzdGFy dDolbGx4LCBlbmQ6JWxseCwgaWR4OiVkLCBsZW46JWQsIHVzZWQ6JWQgfSBpbnNlcnRpbmcgcHRl XG4iLAotCQkJICAgIF9fZnVuY19fLCB2bSwgbHZsLCAqc3RhcnQsIGVuZCwKLQkJCSAgICBnZW44 X3BkX2luZGV4KCpzdGFydCwgMCksIGNvdW50LAotCQkJICAgIGF0b21pY19yZWFkKCZwdC0+dXNl ZCkpOwotCi0JCQlhdG9taWNfYWRkKGNvdW50LCAmcHQtPnVzZWQpOwotCQkJLyogQWxsIG90aGVy IHBkZXMgbWF5IGJlIHNpbXVsdGFuZW91c2x5IHJlbW92ZWQgKi8KLQkJCUdFTV9CVUdfT04oYXRv bWljX3JlYWQoJnB0LT51c2VkKSA+IE5BTExPQyAqIEk5MTVfUERFUyk7Ci0JCQkqc3RhcnQgKz0g Y291bnQ7Ci0JCX0KLQl9IHdoaWxlIChpZHgrKywgLS1sZW4pOwotCXNwaW5fdW5sb2NrKCZwZC0+ bG9jayk7Ci1vdXQ6Ci0JaWYgKGFsbG9jKQotCQlmcmVlX3B4KHZtLCBhbGxvYyk7Ci0JcmV0dXJu IHJldDsKLX0KLQotc3RhdGljIGludCBnZW44X3BwZ3R0X2FsbG9jKHN0cnVjdCBpOTE1X2FkZHJl c3Nfc3BhY2UgKnZtLAotCQkJICAgIHU2NCBzdGFydCwgdTY0IGxlbmd0aCkKLXsKLQl1NjQgZnJv bTsKLQlpbnQgZXJyOwotCi0JR0VNX0JVR19PTighSVNfQUxJR05FRChzdGFydCwgQklUX1VMTChH RU44X1BURV9TSElGVCkpKTsKLQlHRU1fQlVHX09OKCFJU19BTElHTkVEKGxlbmd0aCwgQklUX1VM TChHRU44X1BURV9TSElGVCkpKTsKLQlHRU1fQlVHX09OKHJhbmdlX292ZXJmbG93cyhzdGFydCwg bGVuZ3RoLCB2bS0+dG90YWwpKTsKLQotCXN0YXJ0ID4+PSBHRU44X1BURV9TSElGVDsKLQlsZW5n dGggPj49IEdFTjhfUFRFX1NISUZUOwotCUdFTV9CVUdfT04obGVuZ3RoID09IDApOwotCWZyb20g PSBzdGFydDsKLQotCWVyciA9IF9fZ2VuOF9wcGd0dF9hbGxvYyh2bSwgaTkxNV92bV90b19wcGd0 dCh2bSktPnBkLAotCQkJCSAmc3RhcnQsIHN0YXJ0ICsgbGVuZ3RoLCB2bS0+dG9wKTsKLQlpZiAo dW5saWtlbHkoZXJyICYmIGZyb20gIT0gc3RhcnQpKQotCQlfX2dlbjhfcHBndHRfY2xlYXIodm0s IGk5MTVfdm1fdG9fcHBndHQodm0pLT5wZCwKLQkJCQkgICBmcm9tLCBzdGFydCwgdm0tPnRvcCk7 Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzZ3RfZG1hIHsKLQlz dHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCWRtYV9hZGRyX3QgZG1hLCBtYXg7Ci19IHNndF9kbWEo c3RydWN0IGk5MTVfdm1hICp2bWEpIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gdm1hLT5w YWdlcy0+c2dsOwotCWRtYV9hZGRyX3QgYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKLQlyZXR1 cm4gKHN0cnVjdCBzZ3RfZG1hKSB7IHNnLCBhZGRyLCBhZGRyICsgc2ctPmxlbmd0aCB9OwotfQot Ci1zdGF0aWMgX19hbHdheXNfaW5saW5lIHU2NAotZ2VuOF9wcGd0dF9pbnNlcnRfcHRlKHN0cnVj dCBpOTE1X3BwZ3R0ICpwcGd0dCwKLQkJICAgICAgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3Rvcnkg KnBkcCwKLQkJICAgICAgc3RydWN0IHNndF9kbWEgKml0ZXIsCi0JCSAgICAgIHU2NCBpZHgsCi0J CSAgICAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9sZXZlbCwKLQkJICAgICAgdTMyIGZs YWdzKQotewotCXN0cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICpwZDsKLQljb25zdCBnZW44X3B0 ZV90IHB0ZV9lbmNvZGUgPSBnZW44X3B0ZV9lbmNvZGUoMCwgY2FjaGVfbGV2ZWwsIGZsYWdzKTsK LQlnZW44X3B0ZV90ICp2YWRkcjsKLQotCXBkID0gaTkxNV9wZF9lbnRyeShwZHAsIGdlbjhfcGRf aW5kZXgoaWR4LCAyKSk7Ci0JdmFkZHIgPSBrbWFwX2F0b21pY19weChpOTE1X3B0X2VudHJ5KHBk LCBnZW44X3BkX2luZGV4KGlkeCwgMSkpKTsKLQlkbyB7Ci0JCXZhZGRyW2dlbjhfcGRfaW5kZXgo aWR4LCAwKV0gPSBwdGVfZW5jb2RlIHwgaXRlci0+ZG1hOwotCi0JCWl0ZXItPmRtYSArPSBJOTE1 X0dUVF9QQUdFX1NJWkU7Ci0JCWlmIChpdGVyLT5kbWEgPj0gaXRlci0+bWF4KSB7Ci0JCQlpdGVy LT5zZyA9IF9fc2dfbmV4dChpdGVyLT5zZyk7Ci0JCQlpZiAoIWl0ZXItPnNnKSB7Ci0JCQkJaWR4 ID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaXRlci0+ZG1hID0gc2dfZG1hX2FkZHJlc3Mo aXRlci0+c2cpOwotCQkJaXRlci0+bWF4ID0gaXRlci0+ZG1hICsgaXRlci0+c2ctPmxlbmd0aDsK LQkJfQotCi0JCWlmIChnZW44X3BkX2luZGV4KCsraWR4LCAwKSA9PSAwKSB7Ci0JCQlpZiAoZ2Vu OF9wZF9pbmRleChpZHgsIDEpID09IDApIHsKLQkJCQkvKiBMaW1pdGVkIGJ5IHNnIGxlbmd0aCBm b3IgM2x2bCAqLwotCQkJCWlmIChnZW44X3BkX2luZGV4KGlkeCwgMikgPT0gMCkKLQkJCQkJYnJl YWs7Ci0KLQkJCQlwZCA9IHBkcC0+ZW50cnlbZ2VuOF9wZF9pbmRleChpZHgsIDIpXTsKLQkJCX0K LQotCQkJa3VubWFwX2F0b21pYyh2YWRkcik7Ci0JCQl2YWRkciA9IGttYXBfYXRvbWljX3B4KGk5 MTVfcHRfZW50cnkocGQsIGdlbjhfcGRfaW5kZXgoaWR4LCAxKSkpOwotCQl9Ci0JfSB3aGlsZSAo MSk7Ci0Ja3VubWFwX2F0b21pYyh2YWRkcik7Ci0KLQlyZXR1cm4gaWR4OwotfQotCi1zdGF0aWMg dm9pZCBnZW44X3BwZ3R0X2luc2VydF9odWdlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJCSAg IHN0cnVjdCBzZ3RfZG1hICppdGVyLAotCQkJCSAgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNo ZV9sZXZlbCwKLQkJCQkgICB1MzIgZmxhZ3MpCi17Ci0JY29uc3QgZ2VuOF9wdGVfdCBwdGVfZW5j b2RlID0gZ2VuOF9wdGVfZW5jb2RlKDAsIGNhY2hlX2xldmVsLCBmbGFncyk7Ci0JdTY0IHN0YXJ0 ID0gdm1hLT5ub2RlLnN0YXJ0OwotCWRtYV9hZGRyX3QgcmVtID0gaXRlci0+c2ctPmxlbmd0aDsK LQotCUdFTV9CVUdfT04oIWk5MTVfdm1faXNfNGx2bCh2bWEtPnZtKSk7Ci0KLQlkbyB7Ci0JCXN0 cnVjdCBpOTE1X3BhZ2VfZGlyZWN0b3J5ICogY29uc3QgcGRwID0KLQkJCWdlbjhfcGRwX2Zvcl9w YWdlX2FkZHJlc3Modm1hLT52bSwgc3RhcnQpOwotCQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9y eSAqIGNvbnN0IHBkID0KLQkJCWk5MTVfcGRfZW50cnkocGRwLCBfX2dlbjhfcHRlX2luZGV4KHN0 YXJ0LCAyKSk7Ci0JCWdlbjhfcHRlX3QgZW5jb2RlID0gcHRlX2VuY29kZTsKLQkJdW5zaWduZWQg aW50IG1heWJlXzY0SyA9IC0xOwotCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplOwotCQlnZW44X3B0 ZV90ICp2YWRkcjsKLQkJdTE2IGluZGV4OwotCi0JCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuc2cgJiBJ OTE1X0dUVF9QQUdFX1NJWkVfMk0gJiYKLQkJICAgIElTX0FMSUdORUQoaXRlci0+ZG1hLCBJOTE1 X0dUVF9QQUdFX1NJWkVfMk0pICYmCi0JCSAgICByZW0gPj0gSTkxNV9HVFRfUEFHRV9TSVpFXzJN ICYmCi0JCSAgICAhX19nZW44X3B0ZV9pbmRleChzdGFydCwgMCkpIHsKLQkJCWluZGV4ID0gX19n ZW44X3B0ZV9pbmRleChzdGFydCwgMSk7Ci0JCQllbmNvZGUgfD0gR0VOOF9QREVfUFNfMk07Ci0J CQlwYWdlX3NpemUgPSBJOTE1X0dUVF9QQUdFX1NJWkVfMk07Ci0KLQkJCXZhZGRyID0ga21hcF9h dG9taWNfcHgocGQpOwotCQl9IGVsc2UgewotCQkJc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQg PQotCQkJCWk5MTVfcHRfZW50cnkocGQsIF9fZ2VuOF9wdGVfaW5kZXgoc3RhcnQsIDEpKTsKLQot CQkJaW5kZXggPSBfX2dlbjhfcHRlX2luZGV4KHN0YXJ0LCAwKTsKLQkJCXBhZ2Vfc2l6ZSA9IEk5 MTVfR1RUX1BBR0VfU0laRTsKLQotCQkJaWYgKCFpbmRleCAmJgotCQkJICAgIHZtYS0+cGFnZV9z aXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEsgJiYKLQkJCSAgICBJU19BTElHTkVEKGl0 ZXItPmRtYSwgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgJiYKLQkJCSAgICAoSVNfQUxJR05FRChy ZW0sIEk5MTVfR1RUX1BBR0VfU0laRV82NEspIHx8Ci0JCQkgICAgIHJlbSA+PSAoSTkxNV9QREVT IC0gaW5kZXgpICogSTkxNV9HVFRfUEFHRV9TSVpFKSkKLQkJCQltYXliZV82NEsgPSBfX2dlbjhf cHRlX2luZGV4KHN0YXJ0LCAxKTsKLQotCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChwdCk7Ci0J CX0KLQotCQlkbyB7Ci0JCQlHRU1fQlVHX09OKGl0ZXItPnNnLT5sZW5ndGggPCBwYWdlX3NpemUp OwotCQkJdmFkZHJbaW5kZXgrK10gPSBlbmNvZGUgfCBpdGVyLT5kbWE7Ci0KLQkJCXN0YXJ0ICs9 IHBhZ2Vfc2l6ZTsKLQkJCWl0ZXItPmRtYSArPSBwYWdlX3NpemU7Ci0JCQlyZW0gLT0gcGFnZV9z aXplOwotCQkJaWYgKGl0ZXItPmRtYSA+PSBpdGVyLT5tYXgpIHsKLQkJCQlpdGVyLT5zZyA9IF9f c2dfbmV4dChpdGVyLT5zZyk7Ci0JCQkJaWYgKCFpdGVyLT5zZykKLQkJCQkJYnJlYWs7Ci0KLQkJ CQlyZW0gPSBpdGVyLT5zZy0+bGVuZ3RoOwotCQkJCWl0ZXItPmRtYSA9IHNnX2RtYV9hZGRyZXNz KGl0ZXItPnNnKTsKLQkJCQlpdGVyLT5tYXggPSBpdGVyLT5kbWEgKyByZW07Ci0KLQkJCQlpZiAo bWF5YmVfNjRLICE9IC0xICYmIGluZGV4IDwgSTkxNV9QREVTICYmCi0JCQkJICAgICEoSVNfQUxJ R05FRChpdGVyLT5kbWEsIEk5MTVfR1RUX1BBR0VfU0laRV82NEspICYmCi0JCQkJICAgICAgKElT X0FMSUdORUQocmVtLCBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSB8fAotCQkJCSAgICAgICByZW0g Pj0gKEk5MTVfUERFUyAtIGluZGV4KSAqIEk5MTVfR1RUX1BBR0VfU0laRSkpKQotCQkJCQltYXli ZV82NEsgPSAtMTsKLQotCQkJCWlmICh1bmxpa2VseSghSVNfQUxJR05FRChpdGVyLT5kbWEsIHBh Z2Vfc2l6ZSkpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfSB3aGlsZSAocmVtID49IHBhZ2Vfc2l6 ZSAmJiBpbmRleCA8IEk5MTVfUERFUyk7Ci0KLQkJa3VubWFwX2F0b21pYyh2YWRkcik7Ci0KLQkJ LyoKLQkJICogSXMgaXQgc2FmZSB0byBtYXJrIHRoZSAyTSBibG9jayBhcyA2NEs/IC0tIEVpdGhl ciB3ZSBoYXZlCi0JCSAqIGZpbGxlZCB3aG9sZSBwYWdlLXRhYmxlIHdpdGggNjRLIGVudHJpZXMs IG9yIGZpbGxlZCBwYXJ0IG9mCi0JCSAqIGl0IGFuZCBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0 aGUgc2cgdGFibGUgYW5kIHdlIGhhdmUKLQkJICogZW5vdWdoIHBhZGRpbmcuCi0JCSAqLwotCQlp ZiAobWF5YmVfNjRLICE9IC0xICYmCi0JCSAgICAoaW5kZXggPT0gSTkxNV9QREVTIHx8Ci0JCSAg ICAgKGk5MTVfdm1faGFzX3NjcmF0Y2hfNjRLKHZtYS0+dm0pICYmCi0JCSAgICAgICFpdGVyLT5z ZyAmJiBJU19BTElHTkVEKHZtYS0+bm9kZS5zdGFydCArCi0JCQkJCSAgICAgIHZtYS0+bm9kZS5z aXplLAotCQkJCQkgICAgICBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKSkpIHsKLQkJCXZhZGRyID0g a21hcF9hdG9taWNfcHgocGQpOwotCQkJdmFkZHJbbWF5YmVfNjRLXSB8PSBHRU44X1BERV9JUFNf NjRLOwotCQkJa3VubWFwX2F0b21pYyh2YWRkcik7Ci0JCQlwYWdlX3NpemUgPSBJOTE1X0dUVF9Q QUdFX1NJWkVfNjRLOwotCi0JCQkvKgotCQkJICogV2Ugd3JpdGUgYWxsIDRLIHBhZ2UgZW50cmll cywgZXZlbiB3aGVuIHVzaW5nIDY0SwotCQkJICogcGFnZXMuIEluIG9yZGVyIHRvIHZlcmlmeSB0 aGF0IHRoZSBIVyBpc24ndCBjaGVhdGluZwotCQkJICogYnkgdXNpbmcgdGhlIDRLIFBURSBpbnN0 ZWFkIG9mIHRoZSA2NEsgUFRFLCB3ZSB3YW50Ci0JCQkgKiB0byByZW1vdmUgYWxsIHRoZSBzdXJw bHVzIGVudHJpZXMuIElmIHRoZSBIVyBza2lwcGVkCi0JCQkgKiB0aGUgNjRLIFBURSwgaXQgd2ls bCByZWFkL3dyaXRlIGludG8gdGhlIHNjcmF0Y2ggcGFnZQotCQkJICogaW5zdGVhZCAtIHdoaWNo IHdlIGRldGVjdCBhcyBtaXNzaW5nIHJlc3VsdHMgZHVyaW5nCi0JCQkgKiBzZWxmdGVzdHMuCi0J CQkgKi8KLQkJCWlmIChJOTE1X1NFTEZURVNUX09OTFkodm1hLT52bS0+c2NydWJfNjRLKSkgewot CQkJCXUxNiBpOwotCi0JCQkJZW5jb2RlID0gdm1hLT52bS0+c2NyYXRjaFswXS5lbmNvZGU7Ci0J CQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChpOTE1X3B0X2VudHJ5KHBkLCBtYXliZV82NEspKTsK LQotCQkJCWZvciAoaSA9IDE7IGkgPCBpbmRleDsgaSArPSAxNikKLQkJCQkJbWVtc2V0NjQodmFk ZHIgKyBpLCBlbmNvZGUsIDE1KTsKLQotCQkJCWt1bm1hcF9hdG9taWModmFkZHIpOwotCQkJfQot CQl9Ci0KLQkJdm1hLT5wYWdlX3NpemVzLmd0dCB8PSBwYWdlX3NpemU7Ci0JfSB3aGlsZSAoaXRl ci0+c2cpOwotfQotCi1zdGF0aWMgdm9pZCBnZW44X3BwZ3R0X2luc2VydChzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICAgIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJICAg ICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkJICAgICAgdTMyIGZsYWdz KQotewotCXN0cnVjdCBpOTE1X3BwZ3R0ICogY29uc3QgcHBndHQgPSBpOTE1X3ZtX3RvX3BwZ3R0 KHZtKTsKLQlzdHJ1Y3Qgc2d0X2RtYSBpdGVyID0gc2d0X2RtYSh2bWEpOwotCi0JaWYgKHZtYS0+ cGFnZV9zaXplcy5zZyA+IEk5MTVfR1RUX1BBR0VfU0laRSkgewotCQlnZW44X3BwZ3R0X2luc2Vy dF9odWdlKHZtYSwgJml0ZXIsIGNhY2hlX2xldmVsLCBmbGFncyk7Ci0JfSBlbHNlICB7Ci0JCXU2 NCBpZHggPSB2bWEtPm5vZGUuc3RhcnQgPj4gR0VOOF9QVEVfU0hJRlQ7Ci0KLQkJZG8gewotCQkJ c3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZHAgPQotCQkJCWdlbjhfcGRwX2Zv cl9wYWdlX2luZGV4KHZtLCBpZHgpOwotCi0JCQlpZHggPSBnZW44X3BwZ3R0X2luc2VydF9wdGUo cHBndHQsIHBkcCwgJml0ZXIsIGlkeCwKLQkJCQkJCSAgICBjYWNoZV9sZXZlbCwgZmxhZ3MpOwot CQl9IHdoaWxlIChpZHgpOwotCi0JCXZtYS0+cGFnZV9zaXplcy5ndHQgPSBJOTE1X0dUVF9QQUdF X1NJWkU7Ci0JfQotfQotCi1zdGF0aWMgaW50IGdlbjhfaW5pdF9zY3JhdGNoKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCWludCByZXQ7Ci0JaW50IGk7Ci0KLQkvKgotCSAqIElm IGV2ZXJ5Ym9keSBhZ3JlZXMgdG8gbm90IHRvIHdyaXRlIGludG8gdGhlIHNjcmF0Y2ggcGFnZSwK LQkgKiB3ZSBjYW4gcmV1c2UgaXQgZm9yIGFsbCB2bSwga2VlcGluZyBjb250ZXh0cyBhbmQgcHJv Y2Vzc2VzIHNlcGFyYXRlLgotCSAqLwotCWlmICh2bS0+aGFzX3JlYWRfb25seSAmJiB2bS0+Z3Qt PnZtICYmICFpOTE1X2lzX2dndHQodm0tPmd0LT52bSkpIHsKLQkJc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqY2xvbmUgPSB2bS0+Z3QtPnZtOwotCi0JCUdFTV9CVUdfT04oIWNsb25lLT5oYXNf cmVhZF9vbmx5KTsKLQotCQl2bS0+c2NyYXRjaF9vcmRlciA9IGNsb25lLT5zY3JhdGNoX29yZGVy OwotCQltZW1jcHkodm0tPnNjcmF0Y2gsIGNsb25lLT5zY3JhdGNoLCBzaXplb2Yodm0tPnNjcmF0 Y2gpKTsKLQkJcHhfZG1hKCZ2bS0+c2NyYXRjaFswXSkgPSAwOyAvKiBubyB4ZmVyIG9mIG93bmVy c2hpcCAqLwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXQgPSBzZXR1cF9zY3JhdGNoX3BhZ2Uodm0s IF9fR0ZQX0hJR0hNRU0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl2bS0+c2NyYXRj aFswXS5lbmNvZGUgPQotCQlnZW44X3B0ZV9lbmNvZGUocHhfZG1hKCZ2bS0+c2NyYXRjaFswXSks Ci0JCQkJSTkxNV9DQUNIRV9MTEMsIHZtLT5oYXNfcmVhZF9vbmx5KTsKLQotCWZvciAoaSA9IDE7 IGkgPD0gdm0tPnRvcDsgaSsrKSB7Ci0JCWlmICh1bmxpa2VseShzZXR1cF9wYWdlX2RtYSh2bSwg cHhfYmFzZSgmdm0tPnNjcmF0Y2hbaV0pKSkpCi0JCQlnb3RvIGZyZWVfc2NyYXRjaDsKLQotCQlm aWxsX3B4KCZ2bS0+c2NyYXRjaFtpXSwgdm0tPnNjcmF0Y2hbaSAtIDFdLmVuY29kZSk7Ci0JCXZt LT5zY3JhdGNoW2ldLmVuY29kZSA9Ci0JCQlnZW44X3BkZV9lbmNvZGUocHhfZG1hKCZ2bS0+c2Ny YXRjaFtpXSksCi0JCQkJCUk5MTVfQ0FDSEVfTExDKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZnJl ZV9zY3JhdGNoOgotCWZyZWVfc2NyYXRjaCh2bSk7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0 YXRpYyBpbnQgZ2VuOF9wcmVhbGxvY2F0ZV90b3BfbGV2ZWxfcGRwKHN0cnVjdCBpOTE1X3BwZ3R0 ICpwcGd0dCkKLXsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSA9ICZwcGd0dC0+dm07 Ci0Jc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKnBkID0gcHBndHQtPnBkOwotCXVuc2lnbmVk IGludCBpZHg7Ci0KLQlHRU1fQlVHX09OKHZtLT50b3AgIT0gMik7Ci0JR0VNX0JVR19PTihnZW44 X3BkX3RvcF9jb3VudCh2bSkgIT0gR0VOOF8zTFZMX1BEUEVTKTsKLQotCWZvciAoaWR4ID0gMDsg aWR4IDwgR0VOOF8zTFZMX1BEUEVTOyBpZHgrKykgewotCQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVj dG9yeSAqcGRlOwotCi0JCXBkZSA9IGFsbG9jX3BkKHZtKTsKLQkJaWYgKElTX0VSUihwZGUpKQot CQkJcmV0dXJuIFBUUl9FUlIocGRlKTsKLQotCQlmaWxsX3B4KHBkZSwgdm0tPnNjcmF0Y2hbMV0u ZW5jb2RlKTsKLQkJc2V0X3BkX2VudHJ5KHBkLCBpZHgsIHBkZSk7Ci0JCWF0b21pY19pbmMocHhf dXNlZChwZGUpKTsgLyoga2VlcCBwaW5uZWQgKi8KLQl9Ci0Jd21iKCk7Ci0KLQlyZXR1cm4gMDsK LX0KLQotc3RhdGljIHZvaWQgcHBndHRfaW5pdChzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQsIHN0 cnVjdCBpbnRlbF9ndCAqZ3QpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBn dC0+aTkxNTsKLQotCXBwZ3R0LT52bS5ndCA9IGd0OwotCXBwZ3R0LT52bS5pOTE1ID0gaTkxNTsK LQlwcGd0dC0+dm0uZG1hID0gJmk5MTUtPmRybS5wZGV2LT5kZXY7Ci0JcHBndHQtPnZtLnRvdGFs ID0gQklUX1VMTChJTlRFTF9JTkZPKGk5MTUpLT5wcGd0dF9zaXplKTsKLQotCWk5MTVfYWRkcmVz c19zcGFjZV9pbml0KCZwcGd0dC0+dm0sIFZNX0NMQVNTX1BQR1RUKTsKLQotCXBwZ3R0LT52bS52 bWFfb3BzLmJpbmRfdm1hICAgID0gcHBndHRfYmluZF92bWE7Ci0JcHBndHQtPnZtLnZtYV9vcHMu dW5iaW5kX3ZtYSAgPSBwcGd0dF91bmJpbmRfdm1hOwotCXBwZ3R0LT52bS52bWFfb3BzLnNldF9w YWdlcyAgID0gcHBndHRfc2V0X3BhZ2VzOwotCXBwZ3R0LT52bS52bWFfb3BzLmNsZWFyX3BhZ2Vz ID0gY2xlYXJfcGFnZXM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAq Ci1nZW44X2FsbG9jX3RvcF9wZChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlj b25zdCB1bnNpZ25lZCBpbnQgY291bnQgPSBnZW44X3BkX3RvcF9jb3VudCh2bSk7Ci0Jc3RydWN0 IGk5MTVfcGFnZV9kaXJlY3RvcnkgKnBkOwotCi0JR0VNX0JVR19PTihjb3VudCA+IEFSUkFZX1NJ WkUocGQtPmVudHJ5KSk7Ci0KLQlwZCA9IF9fYWxsb2NfcGQob2Zmc2V0b2YodHlwZW9mKCpwZCks IGVudHJ5W2NvdW50XSkpOwotCWlmICh1bmxpa2VseSghcGQpKQotCQlyZXR1cm4gRVJSX1BUUigt RU5PTUVNKTsKLQotCWlmICh1bmxpa2VseShzZXR1cF9wYWdlX2RtYSh2bSwgcHhfYmFzZShwZCkp KSkgewotCQlrZnJlZShwZCk7Ci0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCX0KLQotCWZp bGxfcGFnZV9kbWEocHhfYmFzZShwZCksIHZtLT5zY3JhdGNoW3ZtLT50b3BdLmVuY29kZSwgY291 bnQpOwotCWF0b21pY19pbmMocHhfdXNlZChwZCkpOyAvKiBtYXJrIGFzIHBpbm5lZCAqLwotCXJl dHVybiBwZDsKLX0KLQotLyoKLSAqIEdFTjggbGVnYWN5IHBwZ3R0IHByb2dyYW1taW5nIGlzIGFj Y29tcGxpc2hlZCB0aHJvdWdoIGEgbWF4IDQgUERQIHJlZ2lzdGVycwotICogd2l0aCBhIG5ldCBl ZmZlY3QgcmVzZW1ibGluZyBhIDItbGV2ZWwgcGFnZSB0YWJsZSBpbiBub3JtYWwgeDg2IHRlcm1z LiBFYWNoCi0gKiBQRFAgcmVwcmVzZW50cyAxR0Igb2YgbWVtb3J5IDQgKiA1MTIgKiA1MTIgKiA0 MDk2ID0gNEdCIGxlZ2FjeSAzMmIgYWRkcmVzcwotICogc3BhY2UuCi0gKgotICovCi1zdGF0aWMg c3RydWN0IGk5MTVfcHBndHQgKmdlbjhfcHBndHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1KQotewotCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsKLQlpbnQgZXJyOwotCi0J cHBndHQgPSBremFsbG9jKHNpemVvZigqcHBndHQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBwZ3R0 KQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCXBwZ3R0X2luaXQocHBndHQsICZpOTE1 LT5ndCk7Ci0JcHBndHQtPnZtLnRvcCA9IGk5MTVfdm1faXNfNGx2bCgmcHBndHQtPnZtKSA/IDMg OiAyOwotCi0JLyoKLQkgKiBGcm9tIGJkdywgdGhlcmUgaXMgaHcgc3VwcG9ydCBmb3IgcmVhZC1v bmx5IHBhZ2VzIGluIHRoZSBQUEdUVC4KLQkgKgotCSAqIEdlbjExIGhhcyBIU0RFUyM6MTgwNzEz NjE4NyB1bnJlc29sdmVkLiBEaXNhYmxlIHJvIHN1cHBvcnQKLQkgKiBmb3Igbm93LgotCSAqCi0J ICogR2VuMTIgaGFzIGluaGVyaXRlZCB0aGUgc2FtZSByZWFkLW9ubHkgZmF1bHQgaXNzdWUgZnJv bSBnZW4xMS4KLQkgKi8KLQlwcGd0dC0+dm0uaGFzX3JlYWRfb25seSA9ICFJU19HRU5fUkFOR0Uo aTkxNSwgMTEsIDEyKTsKLQotCS8qIFRoZXJlIGFyZSBvbmx5IGZldyBleGNlcHRpb25zIGZvciBn ZW4gPj02LiBjaHYgYW5kIGJ4dC4KLQkgKiBBbmQgd2UgYXJlIG5vdCBzdXJlIGFib3V0IHRoZSBs YXR0ZXIgc28gcGxheSBzYWZlIGZvciBub3cuCi0JICovCi0JaWYgKElTX0NIRVJSWVZJRVcoaTkx NSkgfHwgSVNfQlJPWFRPTihpOTE1KSkKLQkJcHBndHQtPnZtLnB0X2ttYXBfd2MgPSB0cnVlOwot Ci0JZXJyID0gZ2VuOF9pbml0X3NjcmF0Y2goJnBwZ3R0LT52bSk7Ci0JaWYgKGVycikKLQkJZ290 byBlcnJfZnJlZTsKLQotCXBwZ3R0LT5wZCA9IGdlbjhfYWxsb2NfdG9wX3BkKCZwcGd0dC0+dm0p OwotCWlmIChJU19FUlIocHBndHQtPnBkKSkgewotCQllcnIgPSBQVFJfRVJSKHBwZ3R0LT5wZCk7 Ci0JCWdvdG8gZXJyX2ZyZWVfc2NyYXRjaDsKLQl9Ci0KLQlpZiAoIWk5MTVfdm1faXNfNGx2bCgm cHBndHQtPnZtKSkgewotCQllcnIgPSBnZW44X3ByZWFsbG9jYXRlX3RvcF9sZXZlbF9wZHAocHBn dHQpOwotCQlpZiAoZXJyKQotCQkJZ290byBlcnJfZnJlZV9wZDsKLQl9Ci0KLQlwcGd0dC0+dm0u YmluZF9hc3luY19mbGFncyA9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7Ci0JcHBndHQtPnZtLmluc2Vy dF9lbnRyaWVzID0gZ2VuOF9wcGd0dF9pbnNlcnQ7Ci0JcHBndHQtPnZtLmFsbG9jYXRlX3ZhX3Jh bmdlID0gZ2VuOF9wcGd0dF9hbGxvYzsKLQlwcGd0dC0+dm0uY2xlYXJfcmFuZ2UgPSBnZW44X3Bw Z3R0X2NsZWFyOwotCi0JaWYgKGludGVsX3ZncHVfYWN0aXZlKGk5MTUpKQotCQlnZW44X3BwZ3R0 X25vdGlmeV92Z3QocHBndHQsIHRydWUpOwotCi0JcHBndHQtPnZtLmNsZWFudXAgPSBnZW44X3Bw Z3R0X2NsZWFudXA7Ci0KLQlyZXR1cm4gcHBndHQ7Ci0KLWVycl9mcmVlX3BkOgotCV9fZ2VuOF9w cGd0dF9jbGVhbnVwKCZwcGd0dC0+dm0sIHBwZ3R0LT5wZCwKLQkJCSAgICAgZ2VuOF9wZF90b3Bf Y291bnQoJnBwZ3R0LT52bSksIHBwZ3R0LT52bS50b3ApOwotZXJyX2ZyZWVfc2NyYXRjaDoKLQlm cmVlX3NjcmF0Y2goJnBwZ3R0LT52bSk7Ci1lcnJfZnJlZToKLQlrZnJlZShwcGd0dCk7Ci0JcmV0 dXJuIEVSUl9QVFIoZXJyKTsKLX0KLQotLyogV3JpdGUgcGRlIChpbmRleCkgZnJvbSB0aGUgcGFn ZSBkaXJlY3RvcnkgQHBkIHRvIHRoZSBwYWdlIHRhYmxlIEBwdCAqLwotc3RhdGljIGlubGluZSB2 b2lkIGdlbjZfd3JpdGVfcGRlKGNvbnN0IHN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCwKLQkJCQkg IGNvbnN0IHVuc2lnbmVkIGludCBwZGUsCi0JCQkJICBjb25zdCBzdHJ1Y3QgaTkxNV9wYWdlX3Rh YmxlICpwdCkKLXsKLQkvKiBDYWxsZXIgbmVlZHMgdG8gbWFrZSBzdXJlIHRoZSB3cml0ZSBjb21w bGV0ZXMgaWYgbmVjZXNzYXJ5ICovCi0JaW93cml0ZTMyKEdFTjZfUERFX0FERFJfRU5DT0RFKHB4 X2RtYShwdCkpIHwgR0VONl9QREVfVkFMSUQsCi0JCSAgcHBndHQtPnBkX2FkZHIgKyBwZGUpOwot fQotCi1zdGF0aWMgdm9pZCBnZW43X3BwZ3R0X2VuYWJsZShzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQot ewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5MTU7Ci0Jc3RydWN0IGlu dGVsX3VuY29yZSAqdW5jb3JlID0gZ3QtPnVuY29yZTsKLQlzdHJ1Y3QgaW50ZWxfZW5naW5lX2Nz ICplbmdpbmU7Ci0JZW51bSBpbnRlbF9lbmdpbmVfaWQgaWQ7Ci0JdTMyIGVjb2NoazsKLQotCWlu dGVsX3VuY29yZV9ybXcodW5jb3JlLCBHQUNfRUNPX0JJVFMsIDAsIEVDT0JJVFNfUFBHVFRfQ0FD SEU2NEIpOwotCi0JZWNvY2hrID0gaW50ZWxfdW5jb3JlX3JlYWQodW5jb3JlLCBHQU1fRUNPQ0hL KTsKLQlpZiAoSVNfSEFTV0VMTChpOTE1KSkgewotCQllY29jaGsgfD0gRUNPQ0hLX1BQR1RUX1dC X0hTVzsKLQl9IGVsc2UgewotCQllY29jaGsgfD0gRUNPQ0hLX1BQR1RUX0xMQ19JVkI7Ci0JCWVj b2NoayAmPSB+RUNPQ0hLX1BQR1RUX0dGRFRfSVZCOwotCX0KLQlpbnRlbF91bmNvcmVfd3JpdGUo dW5jb3JlLCBHQU1fRUNPQ0hLLCBlY29jaGspOwotCi0JZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwg Z3QsIGlkKSB7Ci0JCS8qIEdGWF9NT0RFIGlzIHBlci1yaW5nIG9uIGdlbjcrICovCi0JCUVOR0lO RV9XUklURShlbmdpbmUsCi0JCQkgICAgIFJJTkdfTU9ERV9HRU43LAotCQkJICAgICBfTUFTS0VE X0JJVF9FTkFCTEUoR0ZYX1BQR1RUX0VOQUJMRSkpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgZ2Vu Nl9wcGd0dF9lbmFibGUoc3RydWN0IGludGVsX2d0ICpndCkKLXsKLQlzdHJ1Y3QgaW50ZWxfdW5j b3JlICp1bmNvcmUgPSBndC0+dW5jb3JlOwotCi0JaW50ZWxfdW5jb3JlX3Jtdyh1bmNvcmUsCi0J CQkgR0FDX0VDT19CSVRTLAotCQkJIDAsCi0JCQkgRUNPQklUU19TTkJfQklUIHwgRUNPQklUU19Q UEdUVF9DQUNIRTY0Qik7Ci0KLQlpbnRlbF91bmNvcmVfcm13KHVuY29yZSwKLQkJCSBHQUJfQ1RM LAotCQkJIDAsCi0JCQkgR0FCX0NUTF9DT05UX0FGVEVSX1BBR0VGQVVMVCk7Ci0KLQlpbnRlbF91 bmNvcmVfcm13KHVuY29yZSwKLQkJCSBHQU1fRUNPQ0hLLAotCQkJIDAsCi0JCQkgRUNPQ0hLX1NO Ql9CSVQgfCBFQ09DSEtfUFBHVFRfQ0FDSEU2NEIpOwotCi0JaWYgKEhBU19QUEdUVCh1bmNvcmUt Pmk5MTUpKSAvKiBtYXkgYmUgZGlzYWJsZWQgZm9yIFZULWQgKi8KLQkJaW50ZWxfdW5jb3JlX3dy aXRlKHVuY29yZSwKLQkJCQkgICBHRlhfTU9ERSwKLQkJCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUo R0ZYX1BQR1RUX0VOQUJMRSkpOwotfQotCi0vKiBQUEdUVCBzdXBwb3J0IGZvciBTYW5keWJkcmln ZS9HZW42IGFuZCBsYXRlciAqLwotc3RhdGljIHZvaWQgZ2VuNl9wcGd0dF9jbGVhcl9yYW5nZShz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgICB1NjQgc3RhcnQsIHU2NCBsZW5n dGgpCi17Ci0Jc3RydWN0IGdlbjZfcHBndHQgKiBjb25zdCBwcGd0dCA9IHRvX2dlbjZfcHBndHQo aTkxNV92bV90b19wcGd0dCh2bSkpOwotCWNvbnN0IHVuc2lnbmVkIGludCBmaXJzdF9lbnRyeSA9 IHN0YXJ0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCWNvbnN0IGdlbjZfcHRlX3Qgc2NyYXRjaF9w dGUgPSB2bS0+c2NyYXRjaFswXS5lbmNvZGU7Ci0JdW5zaWduZWQgaW50IHBkZSA9IGZpcnN0X2Vu dHJ5IC8gR0VONl9QVEVTOwotCXVuc2lnbmVkIGludCBwdGUgPSBmaXJzdF9lbnRyeSAlIEdFTjZf UFRFUzsKLQl1bnNpZ25lZCBpbnQgbnVtX2VudHJpZXMgPSBsZW5ndGggLyBJOTE1X0dUVF9QQUdF X1NJWkU7Ci0KLQl3aGlsZSAobnVtX2VudHJpZXMpIHsKLQkJc3RydWN0IGk5MTVfcGFnZV90YWJs ZSAqIGNvbnN0IHB0ID0KLQkJCWk5MTVfcHRfZW50cnkocHBndHQtPmJhc2UucGQsIHBkZSsrKTsK LQkJY29uc3QgdW5zaWduZWQgaW50IGNvdW50ID0gbWluKG51bV9lbnRyaWVzLCBHRU42X1BURVMg LSBwdGUpOwotCQlnZW42X3B0ZV90ICp2YWRkcjsKLQotCQlHRU1fQlVHX09OKHB4X2Jhc2UocHQp ID09IHB4X2Jhc2UoJnZtLT5zY3JhdGNoWzFdKSk7Ci0KLQkJbnVtX2VudHJpZXMgLT0gY291bnQ7 Ci0KLQkJR0VNX0JVR19PTihjb3VudCA+IGF0b21pY19yZWFkKCZwdC0+dXNlZCkpOwotCQlpZiAo IWF0b21pY19zdWJfcmV0dXJuKGNvdW50LCAmcHQtPnVzZWQpKQotCQkJcHBndHQtPnNjYW5fZm9y X3VudXNlZF9wdCA9IHRydWU7Ci0KLQkJLyoKLQkJICogTm90ZSB0aGF0IHRoZSBodyBkb2Vzbid0 IHN1cHBvcnQgcmVtb3ZpbmcgUERFIG9uIHRoZSBmbHkKLQkJICogKHRoZXkgYXJlIGNhY2hlZCBp bnNpZGUgdGhlIGNvbnRleHQgd2l0aCBubyBtZWFucyB0bwotCQkgKiBpbnZhbGlkYXRlIHRoZSBj YWNoZSksIHNvIHdlIGNhbiBvbmx5IHJlc2V0IHRoZSBQVEUKLQkJICogZW50cmllcyBiYWNrIHRv IHNjcmF0Y2guCi0JCSAqLwotCi0JCXZhZGRyID0ga21hcF9hdG9taWNfcHgocHQpOwotCQltZW1z ZXQzMih2YWRkciArIHB0ZSwgc2NyYXRjaF9wdGUsIGNvdW50KTsKLQkJa3VubWFwX2F0b21pYyh2 YWRkcik7Ci0KLQkJcHRlID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjZfcHBndHRfaW5z ZXJ0X2VudHJpZXMoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkJICAgICAgc3Ry dWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJICAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hl X2xldmVsLAotCQkJCSAgICAgIHUzMiBmbGFncykKLXsKLQlzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBn dHQgPSBpOTE1X3ZtX3RvX3BwZ3R0KHZtKTsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAq IGNvbnN0IHBkID0gcHBndHQtPnBkOwotCXVuc2lnbmVkIGZpcnN0X2VudHJ5ID0gdm1hLT5ub2Rl LnN0YXJ0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCXVuc2lnbmVkIGFjdF9wdCA9IGZpcnN0X2Vu dHJ5IC8gR0VONl9QVEVTOwotCXVuc2lnbmVkIGFjdF9wdGUgPSBmaXJzdF9lbnRyeSAlIEdFTjZf UFRFUzsKLQljb25zdCB1MzIgcHRlX2VuY29kZSA9IHZtLT5wdGVfZW5jb2RlKDAsIGNhY2hlX2xl dmVsLCBmbGFncyk7Ci0Jc3RydWN0IHNndF9kbWEgaXRlciA9IHNndF9kbWEodm1hKTsKLQlnZW42 X3B0ZV90ICp2YWRkcjsKLQotCUdFTV9CVUdfT04ocGQtPmVudHJ5W2FjdF9wdF0gPT0gJnZtLT5z Y3JhdGNoWzFdKTsKLQotCXZhZGRyID0ga21hcF9hdG9taWNfcHgoaTkxNV9wdF9lbnRyeShwZCwg YWN0X3B0KSk7Ci0JZG8gewotCQl2YWRkclthY3RfcHRlXSA9IHB0ZV9lbmNvZGUgfCBHRU42X1BU RV9BRERSX0VOQ09ERShpdGVyLmRtYSk7Ci0KLQkJaXRlci5kbWEgKz0gSTkxNV9HVFRfUEFHRV9T SVpFOwotCQlpZiAoaXRlci5kbWEgPT0gaXRlci5tYXgpIHsKLQkJCWl0ZXIuc2cgPSBfX3NnX25l eHQoaXRlci5zZyk7Ci0JCQlpZiAoIWl0ZXIuc2cpCi0JCQkJYnJlYWs7Ci0KLQkJCWl0ZXIuZG1h ID0gc2dfZG1hX2FkZHJlc3MoaXRlci5zZyk7Ci0JCQlpdGVyLm1heCA9IGl0ZXIuZG1hICsgaXRl ci5zZy0+bGVuZ3RoOwotCQl9Ci0KLQkJaWYgKCsrYWN0X3B0ZSA9PSBHRU42X1BURVMpIHsKLQkJ CWt1bm1hcF9hdG9taWModmFkZHIpOwotCQkJdmFkZHIgPSBrbWFwX2F0b21pY19weChpOTE1X3B0 X2VudHJ5KHBkLCArK2FjdF9wdCkpOwotCQkJYWN0X3B0ZSA9IDA7Ci0JCX0KLQl9IHdoaWxlICgx KTsKLQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKLQotCXZtYS0+cGFnZV9zaXplcy5ndHQgPSBJOTE1 X0dUVF9QQUdFX1NJWkU7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjZfZmx1c2hfcGQoc3RydWN0IGdl bjZfcHBndHQgKnBwZ3R0LCB1NjQgc3RhcnQsIHU2NCBlbmQpCi17Ci0Jc3RydWN0IGk5MTVfcGFn ZV9kaXJlY3RvcnkgKiBjb25zdCBwZCA9IHBwZ3R0LT5iYXNlLnBkOwotCXN0cnVjdCBpOTE1X3Bh Z2VfdGFibGUgKnB0OwotCXVuc2lnbmVkIGludCBwZGU7Ci0KLQlzdGFydCA9IHJvdW5kX2Rvd24o c3RhcnQsIFNaXzY0Syk7Ci0JZW5kID0gcm91bmRfdXAoZW5kLCBTWl82NEspIC0gc3RhcnQ7Ci0K LQltdXRleF9sb2NrKCZwcGd0dC0+Zmx1c2gpOwotCi0JZ2VuNl9mb3JfZWFjaF9wZGUocHQsIHBk LCBzdGFydCwgZW5kLCBwZGUpCi0JCWdlbjZfd3JpdGVfcGRlKHBwZ3R0LCBwZGUsIHB0KTsKLQot CW1iKCk7Ci0JaW9yZWFkMzIocHBndHQtPnBkX2FkZHIgKyBwZGUgLSAxKTsKLQlnZW42X2dndHRf aW52YWxpZGF0ZShwcGd0dC0+YmFzZS52bS5ndC0+Z2d0dCk7Ci0JbWIoKTsKLQotCW11dGV4X3Vu bG9jaygmcHBndHQtPmZsdXNoKTsKLX0KLQotc3RhdGljIGludCBnZW42X2FsbG9jX3ZhX3Jhbmdl KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJICAgICAgIHU2NCBzdGFydCwgdTY0 IGxlbmd0aCkKLXsKLQlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB0b19nZW42X3BwZ3R0KGk5 MTVfdm1fdG9fcHBndHQodm0pKTsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0 IHBkID0gcHBndHQtPmJhc2UucGQ7Ci0Jc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQsICphbGxv YyA9IE5VTEw7Ci0JaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7Ci0JdTY0IGZyb20gPSBzdGFydDsK LQl1bnNpZ25lZCBpbnQgcGRlOwotCWludCByZXQgPSAwOwotCi0Jd2FrZXJlZiA9IGludGVsX3J1 bnRpbWVfcG1fZ2V0KCZ2bS0+aTkxNS0+cnVudGltZV9wbSk7Ci0KLQlzcGluX2xvY2soJnBkLT5s b2NrKTsKLQlnZW42X2Zvcl9lYWNoX3BkZShwdCwgcGQsIHN0YXJ0LCBsZW5ndGgsIHBkZSkgewot CQljb25zdCB1bnNpZ25lZCBpbnQgY291bnQgPSBnZW42X3B0ZV9jb3VudChzdGFydCwgbGVuZ3Ro KTsKLQotCQlpZiAocHhfYmFzZShwdCkgPT0gcHhfYmFzZSgmdm0tPnNjcmF0Y2hbMV0pKSB7Ci0J CQlzcGluX3VubG9jaygmcGQtPmxvY2spOwotCi0JCQlwdCA9IGZldGNoX2FuZF96ZXJvKCZhbGxv Yyk7Ci0JCQlpZiAoIXB0KQotCQkJCXB0ID0gYWxsb2NfcHQodm0pOwotCQkJaWYgKElTX0VSUihw dCkpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKHB0KTsKLQkJCQlnb3RvIHVud2luZF9vdXQ7Ci0JCQl9 Ci0KLQkJCWZpbGwzMl9weChwdCwgdm0tPnNjcmF0Y2hbMF0uZW5jb2RlKTsKLQotCQkJc3Bpbl9s b2NrKCZwZC0+bG9jayk7Ci0JCQlpZiAocGQtPmVudHJ5W3BkZV0gPT0gJnZtLT5zY3JhdGNoWzFd KSB7Ci0JCQkJcGQtPmVudHJ5W3BkZV0gPSBwdDsKLQkJCX0gZWxzZSB7Ci0JCQkJYWxsb2MgPSBw dDsKLQkJCQlwdCA9IHBkLT5lbnRyeVtwZGVdOwotCQkJfQotCQl9Ci0KLQkJYXRvbWljX2FkZChj b3VudCwgJnB0LT51c2VkKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnBkLT5sb2NrKTsKLQotCWlmIChp OTE1X3ZtYV9pc19ib3VuZChwcGd0dC0+dm1hLCBJOTE1X1ZNQV9HTE9CQUxfQklORCkpCi0JCWdl bjZfZmx1c2hfcGQocHBndHQsIGZyb20sIHN0YXJ0KTsKLQotCWdvdG8gb3V0OwotCi11bndpbmRf b3V0OgotCWdlbjZfcHBndHRfY2xlYXJfcmFuZ2Uodm0sIGZyb20sIHN0YXJ0IC0gZnJvbSk7Ci1v dXQ6Ci0JaWYgKGFsbG9jKQotCQlmcmVlX3B4KHZtLCBhbGxvYyk7Ci0JaW50ZWxfcnVudGltZV9w bV9wdXQoJnZtLT5pOTE1LT5ydW50aW1lX3BtLCB3YWtlcmVmKTsKLQlyZXR1cm4gcmV0OwotfQot Ci1zdGF0aWMgaW50IGdlbjZfcHBndHRfaW5pdF9zY3JhdGNoKHN0cnVjdCBnZW42X3BwZ3R0ICpw cGd0dCkKLXsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICogY29uc3Qgdm0gPSAmcHBndHQt PmJhc2Uudm07Ci0Jc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCA9IHBwZ3R0 LT5iYXNlLnBkOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzZXR1cF9zY3JhdGNoX3BhZ2Uodm0sIF9f R0ZQX0hJR0hNRU0pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl2bS0+c2NyYXRjaFsw XS5lbmNvZGUgPQotCQl2bS0+cHRlX2VuY29kZShweF9kbWEoJnZtLT5zY3JhdGNoWzBdKSwKLQkJ CSAgICAgICBJOTE1X0NBQ0hFX05PTkUsIFBURV9SRUFEX09OTFkpOwotCi0JaWYgKHVubGlrZWx5 KHNldHVwX3BhZ2VfZG1hKHZtLCBweF9iYXNlKCZ2bS0+c2NyYXRjaFsxXSkpKSkgewotCQljbGVh bnVwX3NjcmF0Y2hfcGFnZSh2bSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWZpbGwzMl9w eCgmdm0tPnNjcmF0Y2hbMV0sIHZtLT5zY3JhdGNoWzBdLmVuY29kZSk7Ci0JbWVtc2V0X3AocGQt PmVudHJ5LCAmdm0tPnNjcmF0Y2hbMV0sIEk5MTVfUERFUyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQot c3RhdGljIHZvaWQgZ2VuNl9wcGd0dF9mcmVlX3BkKHN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dCkK LXsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkID0gcHBndHQtPmJhc2Uu cGQ7Ci0Jc3RydWN0IGk5MTVfcGFnZV9kbWEgKiBjb25zdCBzY3JhdGNoID0KLQkJcHhfYmFzZSgm cHBndHQtPmJhc2Uudm0uc2NyYXRjaFsxXSk7Ci0Jc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQ7 Ci0JdTMyIHBkZTsKLQotCWdlbjZfZm9yX2FsbF9wZGVzKHB0LCBwZCwgcGRlKQotCQlpZiAocHhf YmFzZShwdCkgIT0gc2NyYXRjaCkKLQkJCWZyZWVfcHgoJnBwZ3R0LT5iYXNlLnZtLCBwdCk7Ci19 Ci0KLXN0YXRpYyB2b2lkIGdlbjZfcHBndHRfY2xlYW51cChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSkKLXsKLQlzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQgPSB0b19nZW42X3BwZ3R0KGk5 MTVfdm1fdG9fcHBndHQodm0pKTsKLQotCV9faTkxNV92bWFfcHV0KHBwZ3R0LT52bWEpOwotCi0J Z2VuNl9wcGd0dF9mcmVlX3BkKHBwZ3R0KTsKLQlmcmVlX3NjcmF0Y2godm0pOwotCi0JbXV0ZXhf ZGVzdHJveSgmcHBndHQtPmZsdXNoKTsKLQltdXRleF9kZXN0cm95KCZwcGd0dC0+cGluX211dGV4 KTsKLQlrZnJlZShwcGd0dC0+YmFzZS5wZCk7Ci19Ci0KLXN0YXRpYyBpbnQgcGRfdm1hX3NldF9w YWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQl2bWEtPnBhZ2VzID0gRVJSX1BUUigtRU5P REVWKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGRfdm1hX2NsZWFyX3BhZ2VzKHN0 cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCUdFTV9CVUdfT04oIXZtYS0+cGFnZXMpOwotCi0Jdm1h LT5wYWdlcyA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcGRfdm1hX2JpbmQoc3RydWN0IGk5MTVf dm1hICp2bWEsCi0JCSAgICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0J CSAgICAgICB1MzIgdW51c2VkKQotewotCXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSBpOTE1X3Zt X3RvX2dndHQodm1hLT52bSk7Ci0Jc3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0ID0gdm1hLT5wcml2 YXRlOwotCXUzMiBnZ3R0X29mZnNldCA9IGk5MTVfZ2d0dF9vZmZzZXQodm1hKSAvIEk5MTVfR1RU X1BBR0VfU0laRTsKLQotCXB4X2Jhc2UocHBndHQtPmJhc2UucGQpLT5nZ3R0X29mZnNldCA9IGdn dHRfb2Zmc2V0ICogc2l6ZW9mKGdlbjZfcHRlX3QpOwotCXBwZ3R0LT5wZF9hZGRyID0gKGdlbjZf cHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIGdndHRfb2Zmc2V0OwotCi0JZ2VuNl9mbHVzaF9w ZChwcGd0dCwgMCwgcHBndHQtPmJhc2Uudm0udG90YWwpOwotCXJldHVybiAwOwotfQotCi1zdGF0 aWMgdm9pZCBwZF92bWFfdW5iaW5kKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQotewotCXN0cnVjdCBn ZW42X3BwZ3R0ICpwcGd0dCA9IHZtYS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RpcmVj dG9yeSAqIGNvbnN0IHBkID0gcHBndHQtPmJhc2UucGQ7Ci0Jc3RydWN0IGk5MTVfcGFnZV9kbWEg KiBjb25zdCBzY3JhdGNoID0KLQkJcHhfYmFzZSgmcHBndHQtPmJhc2Uudm0uc2NyYXRjaFsxXSk7 Ci0Jc3RydWN0IGk5MTVfcGFnZV90YWJsZSAqcHQ7Ci0JdW5zaWduZWQgaW50IHBkZTsKLQotCWlm ICghcHBndHQtPnNjYW5fZm9yX3VudXNlZF9wdCkKLQkJcmV0dXJuOwotCi0JLyogRnJlZSBhbGwg bm8gbG9uZ2VyIHVzZWQgcGFnZSB0YWJsZXMgKi8KLQlnZW42X2Zvcl9hbGxfcGRlcyhwdCwgcHBn dHQtPmJhc2UucGQsIHBkZSkgewotCQlpZiAocHhfYmFzZShwdCkgPT0gc2NyYXRjaCB8fCBhdG9t aWNfcmVhZCgmcHQtPnVzZWQpKQotCQkJY29udGludWU7Ci0KLQkJZnJlZV9weCgmcHBndHQtPmJh c2Uudm0sIHB0KTsKLQkJcGQtPmVudHJ5W3BkZV0gPSBzY3JhdGNoOwotCX0KLQotCXBwZ3R0LT5z Y2FuX2Zvcl91bnVzZWRfcHQgPSBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1 X3ZtYV9vcHMgcGRfdm1hX29wcyA9IHsKLQkuc2V0X3BhZ2VzID0gcGRfdm1hX3NldF9wYWdlcywK LQkuY2xlYXJfcGFnZXMgPSBwZF92bWFfY2xlYXJfcGFnZXMsCi0JLmJpbmRfdm1hID0gcGRfdm1h X2JpbmQsCi0JLnVuYmluZF92bWEgPSBwZF92bWFfdW5iaW5kLAotfTsKLQotc3RhdGljIHN0cnVj dCBpOTE1X3ZtYSAqcGRfdm1hX2NyZWF0ZShzdHJ1Y3QgZ2VuNl9wcGd0dCAqcHBndHQsIGludCBz aXplKQotewotCXN0cnVjdCBpOTE1X2dndHQgKmdndHQgPSBwcGd0dC0+YmFzZS52bS5ndC0+Z2d0 dDsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKLQotCUdFTV9CVUdfT04oIUlTX0FMSUdORUQoc2l6 ZSwgSTkxNV9HVFRfUEFHRV9TSVpFKSk7Ci0JR0VNX0JVR19PTihzaXplID4gZ2d0dC0+dm0udG90 YWwpOwotCi0Jdm1hID0gaTkxNV92bWFfYWxsb2MoKTsKLQlpZiAoIXZtYSkKLQkJcmV0dXJuIEVS Ul9QVFIoLUVOT01FTSk7Ci0KLQlpOTE1X2FjdGl2ZV9pbml0KCZ2bWEtPmFjdGl2ZSwgTlVMTCwg TlVMTCk7Ci0KLQlrcmVmX2luaXQoJnZtYS0+cmVmKTsKLQltdXRleF9pbml0KCZ2bWEtPnBhZ2Vz X211dGV4KTsKLQl2bWEtPnZtID0gaTkxNV92bV9nZXQoJmdndHQtPnZtKTsKLQl2bWEtPm9wcyA9 ICZwZF92bWFfb3BzOwotCXZtYS0+cHJpdmF0ZSA9IHBwZ3R0OwotCi0Jdm1hLT5zaXplID0gc2l6 ZTsKLQl2bWEtPmZlbmNlX3NpemUgPSBzaXplOwotCWF0b21pY19zZXQoJnZtYS0+ZmxhZ3MsIEk5 MTVfVk1BX0dHVFQpOwotCXZtYS0+Z2d0dF92aWV3LnR5cGUgPSBJOTE1X0dHVFRfVklFV19ST1RB VEVEOyAvKiBwcmV2ZW50IGZlbmNpbmcgKi8KLQotCUlOSVRfTElTVF9IRUFEKCZ2bWEtPm9ial9s aW5rKTsKLQlJTklUX0xJU1RfSEVBRCgmdm1hLT5jbG9zZWRfbGluayk7Ci0KLQlyZXR1cm4gdm1h OwotfQotCi1pbnQgZ2VuNl9wcGd0dF9waW4oc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpCi17Ci0J c3RydWN0IGdlbjZfcHBndHQgKnBwZ3R0ID0gdG9fZ2VuNl9wcGd0dChiYXNlKTsKLQlpbnQgZXJy ID0gMDsKLQotCUdFTV9CVUdfT04oIWF0b21pY19yZWFkKCZwcGd0dC0+YmFzZS52bS5vcGVuKSk7 Ci0KLQkvKgotCSAqIFdvcmthcm91bmQgdGhlIGxpbWl0ZWQgbWF4aW11bSB2bWEtPnBpbl9jb3Vu dCBhbmQgdGhlIGFsaWFzaW5nX3BwZ3R0Ci0JICogd2hpY2ggd2lsbCBiZSBwaW5uZWQgaW50byBl dmVyeSBhY3RpdmUgY29udGV4dC4KLQkgKiAoV2hlbiB2bWEtPnBpbl9jb3VudCBiZWNvbWVzIGF0 b21pYywgSSBleHBlY3Qgd2Ugd2lsbCBuYXR1cmFsbHkKLQkgKiBuZWVkIGEgbGFyZ2VyLCB1bnBh Y2tlZCwgdHlwZSBhbmQga2lsbCB0aGlzIHJlZHVuZGFuY3kuKQotCSAqLwotCWlmIChhdG9taWNf YWRkX3VubGVzcygmcHBndHQtPnBpbl9jb3VudCwgMSwgMCkpCi0JCXJldHVybiAwOwotCi0JaWYg KG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmcHBndHQtPnBpbl9tdXRleCkpCi0JCXJldHVybiAt RUlOVFI7Ci0KLQkvKgotCSAqIFBQR1RUIFBERXMgcmVzaWRlIGluIHRoZSBHR1RUIGFuZCBjb25z aXN0cyBvZiA1MTIgZW50cmllcy4gVGhlCi0JICogYWxsb2NhdG9yIHdvcmtzIGluIGFkZHJlc3Mg c3BhY2Ugc2l6ZXMsIHNvIGl0J3MgbXVsdGlwbGllZCBieSBwYWdlCi0JICogc2l6ZS4gV2UgYWxs b2NhdGUgYXQgdGhlIHRvcCBvZiB0aGUgR1RUIHRvIGF2b2lkIGZyYWdtZW50YXRpb24uCi0JICov Ci0JaWYgKCFhdG9taWNfcmVhZCgmcHBndHQtPnBpbl9jb3VudCkpIHsKLQkJZXJyID0gaTkxNV9n Z3R0X3BpbihwcGd0dC0+dm1hLCBHRU42X1BEX0FMSUdOLCBQSU5fSElHSCk7Ci0JfQotCWlmICgh ZXJyKQotCQlhdG9taWNfaW5jKCZwcGd0dC0+cGluX2NvdW50KTsKLQltdXRleF91bmxvY2soJnBw Z3R0LT5waW5fbXV0ZXgpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotdm9pZCBnZW42X3BwZ3R0X3Vu cGluKHN0cnVjdCBpOTE1X3BwZ3R0ICpiYXNlKQotewotCXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0 dCA9IHRvX2dlbjZfcHBndHQoYmFzZSk7Ci0KLQlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmcHBn dHQtPnBpbl9jb3VudCkpOwotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwcGd0dC0+cGluX2Nv dW50KSkKLQkJaTkxNV92bWFfdW5waW4ocHBndHQtPnZtYSk7Ci19Ci0KLXZvaWQgZ2VuNl9wcGd0 dF91bnBpbl9hbGwoc3RydWN0IGk5MTVfcHBndHQgKmJhc2UpCi17Ci0Jc3RydWN0IGdlbjZfcHBn dHQgKnBwZ3R0ID0gdG9fZ2VuNl9wcGd0dChiYXNlKTsKLQotCWlmICghYXRvbWljX3JlYWQoJnBw Z3R0LT5waW5fY291bnQpKQotCQlyZXR1cm47Ci0KLQlpOTE1X3ZtYV91bnBpbihwcGd0dC0+dm1h KTsKLQlhdG9taWNfc2V0KCZwcGd0dC0+cGluX2NvdW50LCAwKTsKLX0KLQotc3RhdGljIHN0cnVj dCBpOTE1X3BwZ3R0ICpnZW42X3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSkKLXsKLQlzdHJ1Y3QgaTkxNV9nZ3R0ICogY29uc3QgZ2d0dCA9ICZpOTE1LT5nZ3R0Owot CXN0cnVjdCBnZW42X3BwZ3R0ICpwcGd0dDsKLQlpbnQgZXJyOwotCi0JcHBndHQgPSBremFsbG9j KHNpemVvZigqcHBndHQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBwZ3R0KQotCQlyZXR1cm4gRVJS X1BUUigtRU5PTUVNKTsKLQotCW11dGV4X2luaXQoJnBwZ3R0LT5mbHVzaCk7Ci0JbXV0ZXhfaW5p dCgmcHBndHQtPnBpbl9tdXRleCk7Ci0KLQlwcGd0dF9pbml0KCZwcGd0dC0+YmFzZSwgJmk5MTUt Pmd0KTsKLQlwcGd0dC0+YmFzZS52bS50b3AgPSAxOwotCi0JcHBndHQtPmJhc2Uudm0uYmluZF9h c3luY19mbGFncyA9IEk5MTVfVk1BX0xPQ0FMX0JJTkQ7Ci0JcHBndHQtPmJhc2Uudm0uYWxsb2Nh dGVfdmFfcmFuZ2UgPSBnZW42X2FsbG9jX3ZhX3JhbmdlOwotCXBwZ3R0LT5iYXNlLnZtLmNsZWFy X3JhbmdlID0gZ2VuNl9wcGd0dF9jbGVhcl9yYW5nZTsKLQlwcGd0dC0+YmFzZS52bS5pbnNlcnRf ZW50cmllcyA9IGdlbjZfcHBndHRfaW5zZXJ0X2VudHJpZXM7Ci0JcHBndHQtPmJhc2Uudm0uY2xl YW51cCA9IGdlbjZfcHBndHRfY2xlYW51cDsKLQotCXBwZ3R0LT5iYXNlLnZtLnB0ZV9lbmNvZGUg PSBnZ3R0LT52bS5wdGVfZW5jb2RlOwotCi0JcHBndHQtPmJhc2UucGQgPSBfX2FsbG9jX3BkKHNp emVvZigqcHBndHQtPmJhc2UucGQpKTsKLQlpZiAoIXBwZ3R0LT5iYXNlLnBkKSB7Ci0JCWVyciA9 IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQotCi0JZXJyID0gZ2VuNl9wcGd0dF9pbml0 X3NjcmF0Y2gocHBndHQpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3BkOwotCi0JcHBndHQtPnZt YSA9IHBkX3ZtYV9jcmVhdGUocHBndHQsIEdFTjZfUERfU0laRSk7Ci0JaWYgKElTX0VSUihwcGd0 dC0+dm1hKSkgewotCQllcnIgPSBQVFJfRVJSKHBwZ3R0LT52bWEpOwotCQlnb3RvIGVycl9zY3Jh dGNoOwotCX0KLQotCXJldHVybiAmcHBndHQtPmJhc2U7Ci0KLWVycl9zY3JhdGNoOgotCWZyZWVf c2NyYXRjaCgmcHBndHQtPmJhc2Uudm0pOwotZXJyX3BkOgotCWtmcmVlKHBwZ3R0LT5iYXNlLnBk KTsKLWVycl9mcmVlOgotCW11dGV4X2Rlc3Ryb3koJnBwZ3R0LT5waW5fbXV0ZXgpOwotCWtmcmVl KHBwZ3R0KTsKLQlyZXR1cm4gRVJSX1BUUihlcnIpOwotfQotCi1zdGF0aWMgdm9pZCBndHRfd3Jp dGVfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2d0ICpndCkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSA9IGd0LT5pOTE1OwotCXN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSA9 IGd0LT51bmNvcmU7Ci0KLQkvKiBUaGlzIGZ1bmN0aW9uIGlzIGZvciBndHQgcmVsYXRlZCB3b3Jr YXJvdW5kcy4gVGhpcyBmdW5jdGlvbiBpcwotCSAqIGNhbGxlZCBvbiBkcml2ZXIgbG9hZCBhbmQg YWZ0ZXIgYSBHUFUgcmVzZXQsIHNvIHlvdSBjYW4gcGxhY2UKLQkgKiB3b3JrYXJvdW5kcyBoZXJl IGV2ZW4gaWYgdGhleSBnZXQgb3ZlcndyaXR0ZW4gYnkgR1BVIHJlc2V0LgotCSAqLwotCS8qIFdh SW5jcmVhc2VEZWZhdWx0VExCRW50cmllczpjaHYsYmR3LHNrbCxieHQsa2JsLGdsayxjZmwsY25s LGljbCAqLwotCWlmIChJU19CUk9BRFdFTEwoaTkxNSkpCi0JCWludGVsX3VuY29yZV93cml0ZSh1 bmNvcmUsCi0JCQkJICAgR0VOOF9MM19MUkFfMV9HUEdQVSwKLQkJCQkgICBHRU44X0wzX0xSQV8x X0dQR1BVX0RFRkFVTFRfVkFMVUVfQkRXKTsKLQllbHNlIGlmIChJU19DSEVSUllWSUVXKGk5MTUp KQotCQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAotCQkJCSAgIEdFTjhfTDNfTFJBXzFfR1BH UFUsCi0JCQkJICAgR0VOOF9MM19MUkFfMV9HUEdQVV9ERUZBVUxUX1ZBTFVFX0NIVik7Ci0JZWxz ZSBpZiAoSVNfR0VOOV9MUChpOTE1KSkKLQkJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJ CQkgICBHRU44X0wzX0xSQV8xX0dQR1BVLAotCQkJCSAgIEdFTjlfTDNfTFJBXzFfR1BHUFVfREVG QVVMVF9WQUxVRV9CWFQpOwotCWVsc2UgaWYgKElOVEVMX0dFTihpOTE1KSA+PSA5ICYmIElOVEVM X0dFTihpOTE1KSA8PSAxMSkKLQkJaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJCQkgICBH RU44X0wzX0xSQV8xX0dQR1BVLAotCQkJCSAgIEdFTjlfTDNfTFJBXzFfR1BHUFVfREVGQVVMVF9W QUxVRV9TS0wpOwotCi0JLyoKLQkgKiBUbyBzdXBwb3J0IDY0SyBQVEVzIHdlIG5lZWQgdG8gZmly c3QgZW5hYmxlIHRoZSB1c2Ugb2YgdGhlCi0JICogSW50ZXJtZWRpYXRlLVBhZ2UtU2l6ZShJUFMp IGJpdCBvZiB0aGUgUERFIGZpZWxkIHZpYSBzb21lIG1hZ2ljYWwKLQkgKiBtbWlvLCBvdGhlcndp c2UgdGhlIHBhZ2Utd2Fsa2VyIHdpbGwgc2ltcGx5IGlnbm9yZSB0aGUgSVBTIGJpdC4gVGhpcwot CSAqIHNob3VsZG4ndCBiZSBuZWVkZWQgYWZ0ZXIgR0VOMTAuCi0JICoKLQkgKiA2NEsgcGFnZXMg d2VyZSBmaXJzdCBpbnRyb2R1Y2VkIGZyb20gQkRXKywgYWx0aG91Z2ggdGVjaG5pY2FsbHkgdGhl eQotCSAqIG9ubHkgKndvcmsqIGZyb20gZ2VuOSsuIEZvciBwcmUtQkRXIHdlIGluc3RlYWQgaGF2 ZSB0aGUgb3B0aW9uIGZvcgotCSAqIDMySyBwYWdlcywgYnV0IHdlIGRvbid0IGN1cnJlbnRseSBo YXZlIGFueSBzdXBwb3J0IGZvciBpdCBpbiBvdXIKLQkgKiBkcml2ZXIuCi0JICovCi0JaWYgKEhB U19QQUdFX1NJWkVTKGk5MTUsIEk5MTVfR1RUX1BBR0VfU0laRV82NEspICYmCi0JICAgIElOVEVM X0dFTihpOTE1KSA8PSAxMCkKLQkJaW50ZWxfdW5jb3JlX3Jtdyh1bmNvcmUsCi0JCQkJIEdFTjhf R0FNV19FQ09fREVWX1JXX0lBLAotCQkJCSAwLAotCQkJCSBHQU1XX0VDT19FTkFCTEVfNjRLX0lQ U19GSUVMRCk7Ci0KLQlpZiAoSVNfR0VOX1JBTkdFKGk5MTUsIDgsIDExKSkgewotCQlib29sIGNh bl91c2VfZ3R0X2NhY2hlID0gdHJ1ZTsKLQotCQkvKgotCQkgKiBBY2NvcmRpbmcgdG8gdGhlIEJT cGVjIGlmIHdlIHVzZSAyTS8xRyBwYWdlcyB0aGVuIHdlIGFsc28KLQkJICogbmVlZCB0byBkaXNh YmxlIHRoZSBHVFQgY2FjaGUuIEF0IGxlYXN0IG9uIEJEVyB3ZSBjYW4gc2VlCi0JCSAqIHZpc3Vh bCBjb3JydXB0aW9uIHdoZW4gdXNpbmcgMk0gcGFnZXMsIGFuZCBub3QgZGlzYWJsaW5nIHRoZQot CQkgKiBHVFQgY2FjaGUuCi0JCSAqLwotCQlpZiAoSEFTX1BBR0VfU0laRVMoaTkxNSwgSTkxNV9H VFRfUEFHRV9TSVpFXzJNKSkKLQkJCWNhbl91c2VfZ3R0X2NhY2hlID0gZmFsc2U7Ci0KLQkJLyog V2FHdHRDYWNoaW5nT2ZmQnlEZWZhdWx0ICovCi0JCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUs Ci0JCQkJICAgSFNXX0dUVF9DQUNIRV9FTiwKLQkJCQkgICBjYW5fdXNlX2d0dF9jYWNoZSA/IEdU VF9DQUNIRV9FTl9BTEwgOiAwKTsKLQkJV0FSTl9PTl9PTkNFKGNhbl91c2VfZ3R0X2NhY2hlICYm Ci0JCQkgICAgIGludGVsX3VuY29yZV9yZWFkKHVuY29yZSwKLQkJCQkJICAgICAgIEhTV19HVFRf Q0FDSEVfRU4pID09IDApOwotCX0KLX0KLQotaW50IGk5MTVfcHBndHRfaW5pdF9odyhzdHJ1Y3Qg aW50ZWxfZ3QgKmd0KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5 MTU7Ci0KLQlndHRfd3JpdGVfd29ya2Fyb3VuZHMoZ3QpOwotCi0JaWYgKElTX0dFTihpOTE1LCA2 KSkKLQkJZ2VuNl9wcGd0dF9lbmFibGUoZ3QpOwotCWVsc2UgaWYgKElTX0dFTihpOTE1LCA3KSkK LQkJZ2VuN19wcGd0dF9lbmFibGUoZ3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1 Y3QgaTkxNV9wcGd0dCAqCi1fX3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSkKLXsKLQlpZiAoSU5URUxfR0VOKGk5MTUpIDwgOCkKLQkJcmV0dXJuIGdlbjZfcHBndHRf Y3JlYXRlKGk5MTUpOwotCWVsc2UKLQkJcmV0dXJuIGdlbjhfcHBndHRfY3JlYXRlKGk5MTUpOwot fQotCi1zdHJ1Y3QgaTkxNV9wcGd0dCAqCi1pOTE1X3BwZ3R0X2NyZWF0ZShzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSkKLXsKLQlzdHJ1Y3QgaTkxNV9wcGd0dCAqcHBndHQ7Ci0KLQlwcGd0 dCA9IF9fcHBndHRfY3JlYXRlKGk5MTUpOwotCWlmIChJU19FUlIocHBndHQpKQotCQlyZXR1cm4g cHBndHQ7Ci0KLQl0cmFjZV9pOTE1X3BwZ3R0X2NyZWF0ZSgmcHBndHQtPnZtKTsKLQotCXJldHVy biBwcGd0dDsKLX0KLQotLyogQ2VydGFpbiBHZW41IGNoaXBzZXRzIHJlcXVpcmUgcmVxdWlyZSBp ZGxpbmcgdGhlIEdQVSBiZWZvcmUKLSAqIHVubWFwcGluZyBhbnl0aGluZyBmcm9tIHRoZSBHVFQg d2hlbiBWVC1kIGlzIGVuYWJsZWQuCi0gKi8KLXN0YXRpYyBib29sIG5lZWRzX2lkbGVfbWFwcyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JLyogUXVlcnkgaW50ZWxfaW9t bXUgdG8gc2VlIGlmIHdlIG5lZWQgdGhlIHdvcmthcm91bmQuIFByZXN1bWFibHkgdGhhdAotCSAq IHdhcyBsb2FkZWQgZmlyc3QuCi0JICovCi0JcmV0dXJuIElTX0dFTihkZXZfcHJpdiwgNSkgJiYg SVNfTU9CSUxFKGRldl9wcml2KSAmJiBpbnRlbF92dGRfYWN0aXZlKCk7Ci19Ci0KLXN0YXRpYyB2 b2lkIGdndHRfc3VzcGVuZF9tYXBwaW5ncyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQotewotCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ2d0dC0+dm0uaTkxNTsKLQotCS8qIERvbid0 IGJvdGhlciBtZXNzaW5nIHdpdGggZmF1bHRzIHByZSBHRU42IGFzIHdlIGhhdmUgbGl0dGxlCi0J ICogZG9jdW1lbnRhdGlvbiBzdXBwb3J0aW5nIHRoYXQgaXQncyBhIGdvb2QgaWRlYS4KLQkgKi8K LQlpZiAoSU5URUxfR0VOKGk5MTUpIDwgNikKLQkJcmV0dXJuOwotCi0JaW50ZWxfZ3RfY2hlY2tf YW5kX2NsZWFyX2ZhdWx0cyhnZ3R0LT52bS5ndCk7Ci0KLQlnZ3R0LT52bS5jbGVhcl9yYW5nZSgm Z2d0dC0+dm0sIDAsIGdndHQtPnZtLnRvdGFsKTsKLQotCWdndHQtPmludmFsaWRhdGUoZ2d0dCk7 Ci19Ci0KLXZvaWQgaTkxNV9nZW1fc3VzcGVuZF9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUpCi17Ci0JZ2d0dF9zdXNwZW5kX21hcHBpbmdzKCZpOTE1LT5nZ3R0KTsK LX0KLQotaW50IGk5MTVfZ2VtX2d0dF9wcmVwYXJlX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmosCi0JCQkgICAgICAgc3RydWN0IHNnX3RhYmxlICpwYWdlcykKLXsKLQlkbyB7 Ci0JCWlmIChkbWFfbWFwX3NnX2F0dHJzKCZvYmotPmJhc2UuZGV2LT5wZGV2LT5kZXYsCi0JCQkJ ICAgICBwYWdlcy0+c2dsLCBwYWdlcy0+bmVudHMsCi0JCQkJICAgICBQQ0lfRE1BX0JJRElSRUNU SU9OQUwsCi0JCQkJICAgICBETUFfQVRUUl9OT19XQVJOKSkKLQkJCXJldHVybiAwOwotCi0JCS8q Ci0JCSAqIElmIHRoZSBETUEgcmVtYXAgZmFpbHMsIG9uZSBjYXVzZSBjYW4gYmUgdGhhdCB3ZSBo YXZlCi0JCSAqIHRvbyBtYW55IG9iamVjdHMgcGlubmVkIGluIGEgc21hbGwgcmVtYXBwaW5nIHRh YmxlLAotCQkgKiBzdWNoIGFzIHN3aW90bGIuIEluY3JlbWVudGFsbHkgcHVyZ2UgYWxsIG90aGVy IG9iamVjdHMgYW5kCi0JCSAqIHRyeSBhZ2FpbiAtIGlmIHRoZXJlIGFyZSBubyBtb3JlIHBhZ2Vz IHRvIHJlbW92ZSBmcm9tCi0JCSAqIHRoZSBETUEgcmVtYXBwZXIsIGk5MTVfZ2VtX3NocmluayB3 aWxsIHJldHVybiAwLgotCQkgKi8KLQkJR0VNX0JVR19PTihvYmotPm1tLnBhZ2VzID09IHBhZ2Vz KTsKLQl9IHdoaWxlIChpOTE1X2dlbV9zaHJpbmsodG9faTkxNShvYmotPmJhc2UuZGV2KSwKLQkJ CQkgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCwgTlVMTCwKLQkJCQkgSTkxNV9TSFJJTktf Qk9VTkQgfAotCQkJCSBJOTE1X1NIUklOS19VTkJPVU5EKSk7Ci0KLQlyZXR1cm4gLUVOT1NQQzsK LX0KLQotc3RhdGljIHZvaWQgZ2VuOF9zZXRfcHRlKHZvaWQgX19pb21lbSAqYWRkciwgZ2VuOF9w dGVfdCBwdGUpCi17Ci0Jd3JpdGVxKHB0ZSwgYWRkcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhf Z2d0dF9pbnNlcnRfcGFnZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgIGRt YV9hZGRyX3QgYWRkciwKLQkJCQkgIHU2NCBvZmZzZXQsCi0JCQkJICBlbnVtIGk5MTVfY2FjaGVf bGV2ZWwgbGV2ZWwsCi0JCQkJICB1MzIgdW51c2VkKQotewotCXN0cnVjdCBpOTE1X2dndHQgKmdn dHQgPSBpOTE1X3ZtX3RvX2dndHQodm0pOwotCWdlbjhfcHRlX3QgX19pb21lbSAqcHRlID0KLQkJ KGdlbjhfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIG9mZnNldCAvIEk5MTVfR1RUX1BBR0Vf U0laRTsKLQotCWdlbjhfc2V0X3B0ZShwdGUsIGdlbjhfcHRlX2VuY29kZShhZGRyLCBsZXZlbCwg MCkpOwotCi0JZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKLX0KLQotc3RhdGljIHZvaWQgZ2VuOF9n Z3R0X2luc2VydF9lbnRyaWVzKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSAg ICAgc3RydWN0IGk5MTVfdm1hICp2bWEsCi0JCQkJICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2ZWwg bGV2ZWwsCi0JCQkJICAgICB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCA9 IGk5MTVfdm1fdG9fZ2d0dCh2bSk7Ci0Jc3RydWN0IHNndF9pdGVyIHNndF9pdGVyOwotCWdlbjhf cHRlX3QgX19pb21lbSAqZ3R0X2VudHJpZXM7Ci0JY29uc3QgZ2VuOF9wdGVfdCBwdGVfZW5jb2Rl ID0gZ2VuOF9wdGVfZW5jb2RlKDAsIGxldmVsLCAwKTsKLQlkbWFfYWRkcl90IGFkZHI7Ci0KLQkv KgotCSAqIE5vdGUgdGhhdCB3ZSBpZ25vcmUgUFRFX1JFQURfT05MWSBoZXJlLiBUaGUgY2FsbGVy IG11c3QgYmUgY2FyZWZ1bAotCSAqIG5vdCB0byBhbGxvdyB0aGUgdXNlciB0byBvdmVycmlkZSBh Y2Nlc3MgdG8gYSByZWFkIG9ubHkgcGFnZS4KLQkgKi8KLQotCWd0dF9lbnRyaWVzID0gKGdlbjhf cHRlX3QgX19pb21lbSAqKWdndHQtPmdzbTsKLQlndHRfZW50cmllcyArPSB2bWEtPm5vZGUuc3Rh cnQgLyBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0JZm9yX2VhY2hfc2d0X2RhZGRyKGFkZHIsIHNndF9p dGVyLCB2bWEtPnBhZ2VzKQotCQlnZW44X3NldF9wdGUoZ3R0X2VudHJpZXMrKywgcHRlX2VuY29k ZSB8IGFkZHIpOwotCi0JLyoKLQkgKiBXZSB3YW50IHRvIGZsdXNoIHRoZSBUTEJzIG9ubHkgYWZ0 ZXIgd2UncmUgY2VydGFpbiBhbGwgdGhlIFBURQotCSAqIHVwZGF0ZXMgaGF2ZSBmaW5pc2hlZC4K LQkgKi8KLQlnZ3R0LT5pbnZhbGlkYXRlKGdndHQpOwotfQotCi1zdGF0aWMgdm9pZCBnZW42X2dn dHRfaW5zZXJ0X3BhZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCi0JCQkJICBkbWFf YWRkcl90IGFkZHIsCi0JCQkJICB1NjQgb2Zmc2V0LAotCQkJCSAgZW51bSBpOTE1X2NhY2hlX2xl dmVsIGxldmVsLAotCQkJCSAgdTMyIGZsYWdzKQotewotCXN0cnVjdCBpOTE1X2dndHQgKmdndHQg PSBpOTE1X3ZtX3RvX2dndHQodm0pOwotCWdlbjZfcHRlX3QgX19pb21lbSAqcHRlID0KLQkJKGdl bjZfcHRlX3QgX19pb21lbSAqKWdndHQtPmdzbSArIG9mZnNldCAvIEk5MTVfR1RUX1BBR0VfU0la RTsKLQotCWlvd3JpdGUzMih2bS0+cHRlX2VuY29kZShhZGRyLCBsZXZlbCwgZmxhZ3MpLCBwdGUp OwotCi0JZ2d0dC0+aW52YWxpZGF0ZShnZ3R0KTsKLX0KLQotLyoKLSAqIEJpbmRzIGFuIG9iamVj dCBpbnRvIHRoZSBnbG9iYWwgZ3R0IHdpdGggdGhlIHNwZWNpZmllZCBjYWNoZSBsZXZlbC4gVGhl IG9iamVjdAotICogd2lsbCBiZSBhY2Nlc3NpYmxlIHRvIHRoZSBHUFUgdmlhIGNvbW1hbmRzIHdo b3NlIG9wZXJhbmRzIHJlZmVyZW5jZSBvZmZzZXRzCi0gKiB3aXRoaW4gdGhlIGdsb2JhbCBHVFQg YXMgd2VsbCBhcyBhY2Nlc3NpYmxlIGJ5IHRoZSBHUFUgdGhyb3VnaCB0aGUgR01BRFIKLSAqIG1h cHBlZCBCQVIgKGRldl9wcml2LT5tbS5ndHQtPmd0dCkuCi0gKi8KLXN0YXRpYyB2b2lkIGdlbjZf Z2d0dF9pbnNlcnRfZW50cmllcyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkg ICAgIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJCSAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVs IGxldmVsLAotCQkJCSAgICAgdTMyIGZsYWdzKQotewotCXN0cnVjdCBpOTE1X2dndHQgKmdndHQg PSBpOTE1X3ZtX3RvX2dndHQodm0pOwotCWdlbjZfcHRlX3QgX19pb21lbSAqZW50cmllcyA9IChn ZW42X3B0ZV90IF9faW9tZW0gKilnZ3R0LT5nc207Ci0JdW5zaWduZWQgaW50IGkgPSB2bWEtPm5v ZGUuc3RhcnQgLyBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0Jc3RydWN0IHNndF9pdGVyIGl0ZXI7Ci0J ZG1hX2FkZHJfdCBhZGRyOwotCWZvcl9lYWNoX3NndF9kYWRkcihhZGRyLCBpdGVyLCB2bWEtPnBh Z2VzKQotCQlpb3dyaXRlMzIodm0tPnB0ZV9lbmNvZGUoYWRkciwgbGV2ZWwsIGZsYWdzKSwgJmVu dHJpZXNbaSsrXSk7Ci0KLQkvKgotCSAqIFdlIHdhbnQgdG8gZmx1c2ggdGhlIFRMQnMgb25seSBh ZnRlciB3ZSdyZSBjZXJ0YWluIGFsbCB0aGUgUFRFCi0JICogdXBkYXRlcyBoYXZlIGZpbmlzaGVk LgotCSAqLwotCWdndHQtPmludmFsaWRhdGUoZ2d0dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIG5vcF9j bGVhcl9yYW5nZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICB1NjQgc3Rh cnQsIHU2NCBsZW5ndGgpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGdlbjhfZ2d0dF9jbGVhcl9yYW5n ZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgIHU2NCBzdGFydCwgdTY0IGxl bmd0aCkKLXsKLQlzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0ID0gaTkxNV92bV90b19nZ3R0KHZtKTsK LQl1bnNpZ25lZCBmaXJzdF9lbnRyeSA9IHN0YXJ0IC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCXVu c2lnbmVkIG51bV9lbnRyaWVzID0gbGVuZ3RoIC8gSTkxNV9HVFRfUEFHRV9TSVpFOwotCWNvbnN0 IGdlbjhfcHRlX3Qgc2NyYXRjaF9wdGUgPSB2bS0+c2NyYXRjaFswXS5lbmNvZGU7Ci0JZ2VuOF9w dGVfdCBfX2lvbWVtICpndHRfYmFzZSA9Ci0JCShnZW44X3B0ZV90IF9faW9tZW0gKilnZ3R0LT5n c20gKyBmaXJzdF9lbnRyeTsKLQljb25zdCBpbnQgbWF4X2VudHJpZXMgPSBnZ3R0X3RvdGFsX2Vu dHJpZXMoZ2d0dCkgLSBmaXJzdF9lbnRyeTsKLQlpbnQgaTsKLQotCWlmIChXQVJOKG51bV9lbnRy aWVzID4gbWF4X2VudHJpZXMsCi0JCSAiRmlyc3QgZW50cnkgPSAlZDsgTnVtIGVudHJpZXMgPSAl ZCAobWF4PSVkKVxuIiwKLQkJIGZpcnN0X2VudHJ5LCBudW1fZW50cmllcywgbWF4X2VudHJpZXMp KQotCQludW1fZW50cmllcyA9IG1heF9lbnRyaWVzOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9l bnRyaWVzOyBpKyspCi0JCWdlbjhfc2V0X3B0ZSgmZ3R0X2Jhc2VbaV0sIHNjcmF0Y2hfcHRlKTsK LX0KLQotc3RhdGljIHZvaWQgYnh0X3Z0ZF9nZ3R0X3dhKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHZtLT5pOTE1 OwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgdGhlIGludGVybmFsIEdBTSBmaWZvIGhhcyBiZWVuIGNs ZWFyZWQgb2YgYWxsIEdUVAotCSAqIHdyaXRlcyBiZWZvcmUgZXhpdGluZyBzdG9wX21hY2hpbmUo KS4gVGhpcyBndWFyYW50ZWVzIHRoYXQKLQkgKiBhbnkgYXBlcnR1cmUgYWNjZXNzZXMgd2FpdGlu ZyB0byBzdGFydCBpbiBhbm90aGVyIHByb2Nlc3MKLQkgKiBjYW5ub3QgYmFjayB1cCBiZWhpbmQg dGhlIEdUVCB3cml0ZXMgY2F1c2luZyBhIGhhbmcuCi0JICogVGhlIHJlZ2lzdGVyIGNhbiBiZSBh bnkgYXJiaXRyYXJ5IEdBTSByZWdpc3Rlci4KLQkgKi8KLQlQT1NUSU5HX1JFQUQoR0ZYX0ZMU0hf Q05UTF9HRU42KTsKLX0KLQotc3RydWN0IGluc2VydF9wYWdlIHsKLQlzdHJ1Y3QgaTkxNV9hZGRy ZXNzX3NwYWNlICp2bTsKLQlkbWFfYWRkcl90IGFkZHI7Ci0JdTY0IG9mZnNldDsKLQllbnVtIGk5 MTVfY2FjaGVfbGV2ZWwgbGV2ZWw7Ci19OwotCi1zdGF0aWMgaW50IGJ4dF92dGRfZ2d0dF9pbnNl cnRfcGFnZV9fY2Iodm9pZCAqX2FyZykKLXsKLQlzdHJ1Y3QgaW5zZXJ0X3BhZ2UgKmFyZyA9IF9h cmc7Ci0KLQlnZW44X2dndHRfaW5zZXJ0X3BhZ2UoYXJnLT52bSwgYXJnLT5hZGRyLCBhcmctPm9m ZnNldCwgYXJnLT5sZXZlbCwgMCk7Ci0JYnh0X3Z0ZF9nZ3R0X3dhKGFyZy0+dm0pOwotCi0JcmV0 dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ4dF92dGRfZ2d0dF9pbnNlcnRfcGFnZV9fQktMKHN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCQkgIGRtYV9hZGRyX3QgYWRkciwKLQkJ CQkJICB1NjQgb2Zmc2V0LAotCQkJCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJ CQkJICB1MzIgdW51c2VkKQotewotCXN0cnVjdCBpbnNlcnRfcGFnZSBhcmcgPSB7IHZtLCBhZGRy LCBvZmZzZXQsIGxldmVsIH07Ci0KLQlzdG9wX21hY2hpbmUoYnh0X3Z0ZF9nZ3R0X2luc2VydF9w YWdlX19jYiwgJmFyZywgTlVMTCk7Ci19Ci0KLXN0cnVjdCBpbnNlcnRfZW50cmllcyB7Ci0Jc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm07Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0JZW51 bSBpOTE1X2NhY2hlX2xldmVsIGxldmVsOwotCXUzMiBmbGFnczsKLX07Ci0KLXN0YXRpYyBpbnQg Ynh0X3Z0ZF9nZ3R0X2luc2VydF9lbnRyaWVzX19jYih2b2lkICpfYXJnKQotewotCXN0cnVjdCBp bnNlcnRfZW50cmllcyAqYXJnID0gX2FyZzsKLQotCWdlbjhfZ2d0dF9pbnNlcnRfZW50cmllcyhh cmctPnZtLCBhcmctPnZtYSwgYXJnLT5sZXZlbCwgYXJnLT5mbGFncyk7Ci0JYnh0X3Z0ZF9nZ3R0 X3dhKGFyZy0+dm0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJ4dF92dGRfZ2d0 dF9pbnNlcnRfZW50cmllc19fQktMKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJ CQkgICAgIHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAotCQkJCQkgICAgIGVudW0gaTkxNV9jYWNoZV9s ZXZlbCBsZXZlbCwKLQkJCQkJICAgICB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGluc2VydF9lbnRy aWVzIGFyZyA9IHsgdm0sIHZtYSwgbGV2ZWwsIGZsYWdzIH07Ci0KLQlzdG9wX21hY2hpbmUoYnh0 X3Z0ZF9nZ3R0X2luc2VydF9lbnRyaWVzX19jYiwgJmFyZywgTlVMTCk7Ci19Ci0KLXN0cnVjdCBj bGVhcl9yYW5nZSB7Ci0Jc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm07Ci0JdTY0IHN0YXJ0 OwotCXU2NCBsZW5ndGg7Ci19OwotCi1zdGF0aWMgaW50IGJ4dF92dGRfZ2d0dF9jbGVhcl9yYW5n ZV9fY2Iodm9pZCAqX2FyZykKLXsKLQlzdHJ1Y3QgY2xlYXJfcmFuZ2UgKmFyZyA9IF9hcmc7Ci0K LQlnZW44X2dndHRfY2xlYXJfcmFuZ2UoYXJnLT52bSwgYXJnLT5zdGFydCwgYXJnLT5sZW5ndGgp OwotCWJ4dF92dGRfZ2d0dF93YShhcmctPnZtKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMg dm9pZCBieHRfdnRkX2dndHRfY2xlYXJfcmFuZ2VfX0JLTChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSwKLQkJCQkJICB1NjQgc3RhcnQsCi0JCQkJCSAgdTY0IGxlbmd0aCkKLXsKLQlzdHJ1 Y3QgY2xlYXJfcmFuZ2UgYXJnID0geyB2bSwgc3RhcnQsIGxlbmd0aCB9OwotCi0Jc3RvcF9tYWNo aW5lKGJ4dF92dGRfZ2d0dF9jbGVhcl9yYW5nZV9fY2IsICZhcmcsIE5VTEwpOwotfQotCi1zdGF0 aWMgdm9pZCBnZW42X2dndHRfY2xlYXJfcmFuZ2Uoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq dm0sCi0JCQkJICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCi17Ci0Jc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCA9IGk5MTVfdm1fdG9fZ2d0dCh2bSk7Ci0JdW5zaWduZWQgZmlyc3RfZW50cnkgPSBzdGFy dCAvIEk5MTVfR1RUX1BBR0VfU0laRTsKLQl1bnNpZ25lZCBudW1fZW50cmllcyA9IGxlbmd0aCAv IEk5MTVfR1RUX1BBR0VfU0laRTsKLQlnZW42X3B0ZV90IHNjcmF0Y2hfcHRlLCBfX2lvbWVtICpn dHRfYmFzZSA9Ci0JCShnZW42X3B0ZV90IF9faW9tZW0gKilnZ3R0LT5nc20gKyBmaXJzdF9lbnRy eTsKLQljb25zdCBpbnQgbWF4X2VudHJpZXMgPSBnZ3R0X3RvdGFsX2VudHJpZXMoZ2d0dCkgLSBm aXJzdF9lbnRyeTsKLQlpbnQgaTsKLQotCWlmIChXQVJOKG51bV9lbnRyaWVzID4gbWF4X2VudHJp ZXMsCi0JCSAiRmlyc3QgZW50cnkgPSAlZDsgTnVtIGVudHJpZXMgPSAlZCAobWF4PSVkKVxuIiwK LQkJIGZpcnN0X2VudHJ5LCBudW1fZW50cmllcywgbWF4X2VudHJpZXMpKQotCQludW1fZW50cmll cyA9IG1heF9lbnRyaWVzOwotCi0Jc2NyYXRjaF9wdGUgPSB2bS0+c2NyYXRjaFswXS5lbmNvZGU7 Ci0JZm9yIChpID0gMDsgaSA8IG51bV9lbnRyaWVzOyBpKyspCi0JCWlvd3JpdGUzMihzY3JhdGNo X3B0ZSwgJmd0dF9iYXNlW2ldKTsKLX0KLQotc3RhdGljIHZvaWQgaTkxNV9nZ3R0X2luc2VydF9w YWdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAotCQkJCSAgZG1hX2FkZHJfdCBhZGRy LAotCQkJCSAgdTY0IG9mZnNldCwKLQkJCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBjYWNoZV9s ZXZlbCwKLQkJCQkgIHUzMiB1bnVzZWQpCi17Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gKGNhY2hl X2xldmVsID09IEk5MTVfQ0FDSEVfTk9ORSkgPwotCQlBR1BfVVNFUl9NRU1PUlkgOiBBR1BfVVNF Ul9DQUNIRURfTUVNT1JZOwotCi0JaW50ZWxfZ3R0X2luc2VydF9wYWdlKGFkZHIsIG9mZnNldCA+ PiBQQUdFX1NISUZULCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5MTVfZ2d0dF9pbnNlcnRf ZW50cmllcyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCQkgICAgIHN0cnVjdCBp OTE1X3ZtYSAqdm1hLAotCQkJCSAgICAgZW51bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVs LAotCQkJCSAgICAgdTMyIHVudXNlZCkKLXsKLQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSAoY2FjaGVf bGV2ZWwgPT0gSTkxNV9DQUNIRV9OT05FKSA/Ci0JCUFHUF9VU0VSX01FTU9SWSA6IEFHUF9VU0VS X0NBQ0hFRF9NRU1PUlk7Ci0KLQlpbnRlbF9ndHRfaW5zZXJ0X3NnX2VudHJpZXModm1hLT5wYWdl cywgdm1hLT5ub2RlLnN0YXJ0ID4+IFBBR0VfU0hJRlQsCi0JCQkJICAgIGZsYWdzKTsKLX0KLQot c3RhdGljIHZvaWQgaTkxNV9nZ3R0X2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtLAotCQkJCSAgdTY0IHN0YXJ0LCB1NjQgbGVuZ3RoKQotewotCWludGVsX2d0dF9jbGVh cl9yYW5nZShzdGFydCA+PiBQQUdFX1NISUZULCBsZW5ndGggPj4gUEFHRV9TSElGVCk7Ci19Ci0K LXN0YXRpYyBpbnQgZ2d0dF9iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCSBlbnVt IGk5MTVfY2FjaGVfbGV2ZWwgY2FjaGVfbGV2ZWwsCi0JCQkgdTMyIGZsYWdzKQotewotCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdm1hLT52bS0+aTkxNTsKLQlzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5vYmo7Ci0JaW50ZWxfd2FrZXJlZl90IHdha2VyZWY7 Ci0JdTMyIHB0ZV9mbGFnczsKLQotCS8qIEFwcGxpY2FibGUgdG8gVkxWIChnZW44KyBkbyBub3Qg c3VwcG9ydCBSTyBpbiB0aGUgR0dUVCkgKi8KLQlwdGVfZmxhZ3MgPSAwOwotCWlmIChpOTE1X2dl bV9vYmplY3RfaXNfcmVhZG9ubHkob2JqKSkKLQkJcHRlX2ZsYWdzIHw9IFBURV9SRUFEX09OTFk7 Ci0KLQl3aXRoX2ludGVsX3J1bnRpbWVfcG0oJmk5MTUtPnJ1bnRpbWVfcG0sIHdha2VyZWYpCi0J CXZtYS0+dm0tPmluc2VydF9lbnRyaWVzKHZtYS0+dm0sIHZtYSwgY2FjaGVfbGV2ZWwsIHB0ZV9m bGFncyk7Ci0KLQl2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFOwotCi0J LyoKLQkgKiBXaXRob3V0IGFsaWFzaW5nIFBQR1RUIHRoZXJlJ3Mgbm8gZGlmZmVyZW5jZSBiZXR3 ZWVuCi0JICogR0xPQkFML0xPQ0FMX0JJTkQsIGl0J3MgYWxsIHRoZSBzYW1lIHB0ZXMuIEhlbmNl IHVuY29uZGl0aW9uYWxseQotCSAqIHVwZ3JhZGUgdG8gYm90aCBib3VuZCBpZiB3ZSBiaW5kIGVp dGhlciB0byBhdm9pZCBkb3VibGUtYmluZGluZy4KLQkgKi8KLQlhdG9taWNfb3IoSTkxNV9WTUFf R0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5ELCAmdm1hLT5mbGFncyk7Ci0KLQlyZXR1 cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZ2d0dF91bmJpbmRfdm1hKHN0cnVjdCBpOTE1X3ZtYSAq dm1hKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdm1hLT52bS0+aTkxNTsK LQlpbnRlbF93YWtlcmVmX3Qgd2FrZXJlZjsKLQotCXdpdGhfaW50ZWxfcnVudGltZV9wbSgmaTkx NS0+cnVudGltZV9wbSwgd2FrZXJlZikKLQkJdm1hLT52bS0+Y2xlYXJfcmFuZ2Uodm1hLT52bSwg dm1hLT5ub2RlLnN0YXJ0LCB2bWEtPnNpemUpOwotfQotCi1zdGF0aWMgaW50IGFsaWFzaW5nX2d0 dF9iaW5kX3ZtYShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCQkgZW51bSBpOTE1X2NhY2hlX2xl dmVsIGNhY2hlX2xldmVsLAotCQkJCSB1MzIgZmxhZ3MpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmk5MTUgPSB2bWEtPnZtLT5pOTE1OwotCXUzMiBwdGVfZmxhZ3M7Ci0JaW50IHJldDsK LQotCS8qIEN1cnJlbnRseSBhcHBsaWNhYmxlIG9ubHkgdG8gVkxWICovCi0JcHRlX2ZsYWdzID0g MDsKLQlpZiAoaTkxNV9nZW1fb2JqZWN0X2lzX3JlYWRvbmx5KHZtYS0+b2JqKSkKLQkJcHRlX2Zs YWdzIHw9IFBURV9SRUFEX09OTFk7Ci0KLQlpZiAoZmxhZ3MgJiBJOTE1X1ZNQV9MT0NBTF9CSU5E KSB7Ci0JCXN0cnVjdCBpOTE1X3BwZ3R0ICphbGlhcyA9IGk5MTVfdm1fdG9fZ2d0dCh2bWEtPnZt KS0+YWxpYXM7Ci0KLQkJaWYgKGZsYWdzICYgSTkxNV9WTUFfQUxMT0MpIHsKLQkJCXJldCA9IGFs aWFzLT52bS5hbGxvY2F0ZV92YV9yYW5nZSgmYWxpYXMtPnZtLAotCQkJCQkJCSAgdm1hLT5ub2Rl LnN0YXJ0LAotCQkJCQkJCSAgdm1hLT5zaXplKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJl dDsKLQotCQkJc2V0X2JpdChJOTE1X1ZNQV9BTExPQ19CSVQsIF9faTkxNV92bWFfZmxhZ3Modm1h KSk7Ci0JCX0KLQotCQlHRU1fQlVHX09OKCF0ZXN0X2JpdChJOTE1X1ZNQV9BTExPQ19CSVQsCi0J CQkJICAgICBfX2k5MTVfdm1hX2ZsYWdzKHZtYSkpKTsKLQkJYWxpYXMtPnZtLmluc2VydF9lbnRy aWVzKCZhbGlhcy0+dm0sIHZtYSwKLQkJCQkJIGNhY2hlX2xldmVsLCBwdGVfZmxhZ3MpOwotCX0K LQotCWlmIChmbGFncyAmIEk5MTVfVk1BX0dMT0JBTF9CSU5EKSB7Ci0JCWludGVsX3dha2VyZWZf dCB3YWtlcmVmOwotCi0JCXdpdGhfaW50ZWxfcnVudGltZV9wbSgmaTkxNS0+cnVudGltZV9wbSwg d2FrZXJlZikgewotCQkJdm1hLT52bS0+aW5zZXJ0X2VudHJpZXModm1hLT52bSwgdm1hLAotCQkJ CQkJY2FjaGVfbGV2ZWwsIHB0ZV9mbGFncyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQot c3RhdGljIHZvaWQgYWxpYXNpbmdfZ3R0X3VuYmluZF92bWEoc3RydWN0IGk5MTVfdm1hICp2bWEp Ci17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB2bWEtPnZtLT5pOTE1OwotCi0J aWYgKGk5MTVfdm1hX2lzX2JvdW5kKHZtYSwgSTkxNV9WTUFfR0xPQkFMX0JJTkQpKSB7Ci0JCXN0 cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0gdm1hLT52bTsKLQkJaW50ZWxfd2FrZXJlZl90 IHdha2VyZWY7Ci0KLQkJd2l0aF9pbnRlbF9ydW50aW1lX3BtKCZpOTE1LT5ydW50aW1lX3BtLCB3 YWtlcmVmKQotCQkJdm0tPmNsZWFyX3JhbmdlKHZtLCB2bWEtPm5vZGUuc3RhcnQsIHZtYS0+c2l6 ZSk7Ci0JfQotCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJOTE1X1ZNQV9BTExPQ19CSVQsIF9f aTkxNV92bWFfZmxhZ3Modm1hKSkpIHsKLQkJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0g PQotCQkJJmk5MTVfdm1fdG9fZ2d0dCh2bWEtPnZtKS0+YWxpYXMtPnZtOwotCi0JCXZtLT5jbGVh cl9yYW5nZSh2bSwgdm1hLT5ub2RlLnN0YXJ0LCB2bWEtPnNpemUpOwotCX0KLX0KLQotdm9pZCBp OTE1X2dlbV9ndHRfZmluaXNoX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmos Ci0JCQkgICAgICAgc3RydWN0IHNnX3RhYmxlICpwYWdlcykKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwotCXN0cnVjdCBkZXZp Y2UgKmtkZXYgPSAmZGV2X3ByaXYtPmRybS5wZGV2LT5kZXY7Ci0Jc3RydWN0IGk5MTVfZ2d0dCAq Z2d0dCA9ICZkZXZfcHJpdi0+Z2d0dDsKLQotCWlmICh1bmxpa2VseShnZ3R0LT5kb19pZGxlX21h cHMpKSB7Ci0JCS8qIFhYWCBUaGlzIGRvZXMgbm90IHByZXZlbnQgbW9yZSByZXF1ZXN0cyBiZWlu ZyBzdWJtaXR0ZWQhICovCi0JCWlmIChpbnRlbF9ndF9yZXRpcmVfcmVxdWVzdHNfdGltZW91dChn Z3R0LT52bS5ndCwKLQkJCQkJCSAgICAgLU1BWF9TQ0hFRFVMRV9USU1FT1VUKSkgewotCQkJRFJN X0VSUk9SKCJGYWlsZWQgdG8gd2FpdCBmb3IgaWRsZTsgVlQnZCBtYXkgaGFuZy5cbiIpOwotCQkJ LyogV2FpdCBhIGJpdCwgaW4gaG9wZXMgaXQgYXZvaWRzIHRoZSBoYW5nICovCi0JCQl1ZGVsYXko MTApOwotCQl9Ci0JfQotCi0JZG1hX3VubWFwX3NnKGtkZXYsIHBhZ2VzLT5zZ2wsIHBhZ2VzLT5u ZW50cywgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLX0KLQotc3RhdGljIGludCBnZ3R0X3NldF9w YWdlcyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSkKLXsKLQlpbnQgcmV0OwotCi0JR0VNX0JVR19PTih2 bWEtPnBhZ2VzKTsKLQotCXJldCA9IGk5MTVfZ2V0X2dndHRfdm1hX3BhZ2VzKHZtYSk7Ci0JaWYg KHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXZtYS0+cGFnZV9zaXplcyA9IHZtYS0+b2JqLT5tbS5w YWdlX3NpemVzOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5MTVfZ2d0dF9jb2xv cl9hZGp1c3QoY29uc3Qgc3RydWN0IGRybV9tbV9ub2RlICpub2RlLAotCQkJCSAgIHVuc2lnbmVk IGxvbmcgY29sb3IsCi0JCQkJICAgdTY0ICpzdGFydCwKLQkJCQkgICB1NjQgKmVuZCkKLXsKLQlp ZiAoaTkxNV9ub2RlX2NvbG9yX2RpZmZlcnMobm9kZSwgY29sb3IpKQotCQkqc3RhcnQgKz0gSTkx NV9HVFRfUEFHRV9TSVpFOwotCi0JLyogQWxzbyBsZWF2ZSBhIHNwYWNlIGJldHdlZW4gdGhlIHVu YWxsb2NhdGVkIHJlc2VydmVkIG5vZGUgYWZ0ZXIgdGhlCi0JICogR1RUIGFuZCBhbnkgb2JqZWN0 cyB3aXRoaW4gdGhlIEdUVCwgaS5lLiB3ZSB1c2UgdGhlIGNvbG9yIGFkanVzdG1lbnQKLQkgKiB0 byBpbnNlcnQgYSBndWFyZCBwYWdlIHRvIHByZXZlbnQgcHJlZmV0Y2hlcyBjcm9zc2luZyBvdmVy IHRoZQotCSAqIEdUVCBib3VuZGFyeS4KLQkgKi8KLQlub2RlID0gbGlzdF9uZXh0X2VudHJ5KG5v ZGUsIG5vZGVfbGlzdCk7Ci0JaWYgKG5vZGUtPmNvbG9yICE9IGNvbG9yKQotCQkqZW5kIC09IEk5 MTVfR1RUX1BBR0VfU0laRTsKLX0KLQotc3RhdGljIGludCBpbml0X2FsaWFzaW5nX3BwZ3R0KHN0 cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0Jc3RydWN0IGk5MTVfcHBndHQgKnBwZ3R0OwotCWlu dCBlcnI7Ci0KLQlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGdndHQtPnZtLmk5MTUpOwotCWlm IChJU19FUlIocHBndHQpKQotCQlyZXR1cm4gUFRSX0VSUihwcGd0dCk7Ci0KLQlpZiAoR0VNX1dB Uk5fT04ocHBndHQtPnZtLnRvdGFsIDwgZ2d0dC0+dm0udG90YWwpKSB7Ci0JCWVyciA9IC1FTk9E RVY7Ci0JCWdvdG8gZXJyX3BwZ3R0OwotCX0KLQotCS8qCi0JICogTm90ZSB3ZSBvbmx5IHByZS1h bGxvY2F0ZSBhcyBmYXIgYXMgdGhlIGVuZCBvZiB0aGUgZ2xvYmFsCi0JICogR1RULiBPbiA0OGIg LyA0LWxldmVsIHBhZ2UtdGFibGVzLCB0aGUgZGlmZmVyZW5jZSBpcyB2ZXJ5LAotCSAqIHZlcnkg c2lnbmlmaWNhbnQhIFdlIGhhdmUgdG8gcHJlYWxsb2NhdGUgYXMgR1ZUL3ZncHUgZG9lcwotCSAq IG5vdCBsaWtlIHRoZSBwYWdlIGRpcmVjdG9yeSBkaXNhcHBlYXJpbmcuCi0JICovCi0JZXJyID0g cHBndHQtPnZtLmFsbG9jYXRlX3ZhX3JhbmdlKCZwcGd0dC0+dm0sIDAsIGdndHQtPnZtLnRvdGFs KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9wcGd0dDsKLQotCWdndHQtPmFsaWFzID0gcHBndHQ7 Ci0JZ2d0dC0+dm0uYmluZF9hc3luY19mbGFncyB8PSBwcGd0dC0+dm0uYmluZF9hc3luY19mbGFn czsKLQotCUdFTV9CVUdfT04oZ2d0dC0+dm0udm1hX29wcy5iaW5kX3ZtYSAhPSBnZ3R0X2JpbmRf dm1hKTsKLQlnZ3R0LT52bS52bWFfb3BzLmJpbmRfdm1hID0gYWxpYXNpbmdfZ3R0X2JpbmRfdm1h OwotCi0JR0VNX0JVR19PTihnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgIT0gZ2d0dF91bmJp bmRfdm1hKTsKLQlnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEgPSBhbGlhc2luZ19ndHRfdW5i aW5kX3ZtYTsKLQotCXJldHVybiAwOwotCi1lcnJfcHBndHQ6Ci0JaTkxNV92bV9wdXQoJnBwZ3R0 LT52bSk7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgZmluaV9hbGlhc2luZ19wcGd0 dChzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQotewotCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsK LQotCXBwZ3R0ID0gZmV0Y2hfYW5kX3plcm8oJmdndHQtPmFsaWFzKTsKLQlpZiAoIXBwZ3R0KQot CQlyZXR1cm47Ci0KLQlpOTE1X3ZtX3B1dCgmcHBndHQtPnZtKTsKLQotCWdndHQtPnZtLnZtYV9v cHMuYmluZF92bWEgICA9IGdndHRfYmluZF92bWE7Ci0JZ2d0dC0+dm0udm1hX29wcy51bmJpbmRf dm1hID0gZ2d0dF91bmJpbmRfdm1hOwotfQotCi1zdGF0aWMgaW50IGdndHRfcmVzZXJ2ZV9ndWNf dG9wKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0JdTY0IHNpemU7Ci0JaW50IHJldDsKLQot CWlmICghVVNFU19HVUMoZ2d0dC0+dm0uaTkxNSkpCi0JCXJldHVybiAwOwotCi0JR0VNX0JVR19P TihnZ3R0LT52bS50b3RhbCA8PSBHVUNfR0dUVF9UT1ApOwotCXNpemUgPSBnZ3R0LT52bS50b3Rh bCAtIEdVQ19HR1RUX1RPUDsKLQotCXJldCA9IGk5MTVfZ2VtX2d0dF9yZXNlcnZlKCZnZ3R0LT52 bSwgJmdndHQtPnVjX2Z3LCBzaXplLAotCQkJCSAgIEdVQ19HR1RUX1RPUCwgSTkxNV9DT0xPUl9V TkVWSUNUQUJMRSwKLQkJCQkgICBQSU5fTk9FVklDVCk7Ci0JaWYgKHJldCkKLQkJRFJNX0RFQlVH X0RSSVZFUigiRmFpbGVkIHRvIHJlc2VydmUgdG9wIG9mIEdHVFQgZm9yIEd1Q1xuIik7Ci0KLQly ZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBnZ3R0X3JlbGVhc2VfZ3VjX3RvcChzdHJ1Y3Qg aTkxNV9nZ3R0ICpnZ3R0KQotewotCWlmIChkcm1fbW1fbm9kZV9hbGxvY2F0ZWQoJmdndHQtPnVj X2Z3KSkKLQkJZHJtX21tX3JlbW92ZV9ub2RlKCZnZ3R0LT51Y19mdyk7Ci19Ci0KLXN0YXRpYyB2 b2lkIGNsZWFudXBfaW5pdF9nZ3R0KHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0JZ2d0dF9y ZWxlYXNlX2d1Y190b3AoZ2d0dCk7Ci0JaWYgKGRybV9tbV9ub2RlX2FsbG9jYXRlZCgmZ2d0dC0+ ZXJyb3JfY2FwdHVyZSkpCi0JCWRybV9tbV9yZW1vdmVfbm9kZSgmZ2d0dC0+ZXJyb3JfY2FwdHVy ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9nZ3R0KHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17 Ci0JLyogTGV0IEdFTSBNYW5hZ2UgYWxsIG9mIHRoZSBhcGVydHVyZS4KLQkgKgotCSAqIEhvd2V2 ZXIsIGxlYXZlIG9uZSBwYWdlIGF0IHRoZSBlbmQgc3RpbGwgYm91bmQgdG8gdGhlIHNjcmF0Y2gg cGFnZS4KLQkgKiBUaGVyZSBhcmUgYSBudW1iZXIgb2YgcGxhY2VzIHdoZXJlIHRoZSBoYXJkd2Fy ZSBhcHBhcmVudGx5IHByZWZldGNoZXMKLQkgKiBwYXN0IHRoZSBlbmQgb2YgdGhlIG9iamVjdCwg YW5kIHdlJ3ZlIHNlZW4gbXVsdGlwbGUgaGFuZ3Mgd2l0aCB0aGUKLQkgKiBHUFUgaGVhZCBwb2lu dGVyIHN0dWNrIGluIGEgYmF0Y2hidWZmZXIgYm91bmQgYXQgdGhlIGxhc3QgcGFnZSBvZiB0aGUK LQkgKiBhcGVydHVyZS4gIE9uZSBwYWdlIHNob3VsZCBiZSBlbm91Z2ggdG8ga2VlcCBhbnkgcHJl ZmV0Y2hpbmcgaW5zaWRlCi0JICogb2YgdGhlIGFwZXJ0dXJlLgotCSAqLwotCXVuc2lnbmVkIGxv bmcgaG9sZV9zdGFydCwgaG9sZV9lbmQ7Ci0Jc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKLQlp bnQgcmV0OwotCi0JLyoKLQkgKiBHdUMgcmVxdWlyZXMgYWxsIHJlc291cmNlcyB0aGF0IHdlJ3Jl IHNoYXJpbmcgd2l0aCBpdCB0byBiZSBwbGFjZWQgaW4KLQkgKiBub24tV09QQ00gbWVtb3J5LiBJ ZiBHdUMgaXMgbm90IHByZXNlbnQgb3Igbm90IGluIHVzZSB3ZSBzdGlsbCBuZWVkIGEKLQkgKiBz bWFsbCBiaWFzIGFzIHJpbmcgd3JhcGFyb3VuZCBhdCBvZmZzZXQgMCBzb21ldGltZXMgaGFuZ3Mu IE5vIGlkZWEKLQkgKiB3aHkuCi0JICovCi0JZ2d0dC0+cGluX2JpYXMgPSBtYXhfdCh1MzIsIEk5 MTVfR1RUX1BBR0VfU0laRSwKLQkJCSAgICAgICBpbnRlbF93b3BjbV9ndWNfc2l6ZSgmZ2d0dC0+ dm0uaTkxNS0+d29wY20pKTsKLQotCXJldCA9IGludGVsX3ZndF9iYWxsb29uKGdndHQpOwotCWlm IChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoZ2d0dC0+bWFwcGFibGVfZW5kKSB7Ci0JCS8q IFJlc2VydmUgYSBtYXBwYWJsZSBzbG90IGZvciBvdXIgbG9ja2xlc3MgZXJyb3IgY2FwdHVyZSAq LwotCQlyZXQgPSBkcm1fbW1faW5zZXJ0X25vZGVfaW5fcmFuZ2UoJmdndHQtPnZtLm1tLCAmZ2d0 dC0+ZXJyb3JfY2FwdHVyZSwKLQkJCQkJCSAgUEFHRV9TSVpFLCAwLCBJOTE1X0NPTE9SX1VORVZJ Q1RBQkxFLAotCQkJCQkJICAwLCBnZ3R0LT5tYXBwYWJsZV9lbmQsCi0JCQkJCQkgIERSTV9NTV9J TlNFUlRfTE9XKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBU aGUgdXBwZXIgcG9ydGlvbiBvZiB0aGUgR3VDIGFkZHJlc3Mgc3BhY2UgaGFzIGEgc2l6ZWFibGUg aG9sZQotCSAqIChzZXZlcmFsIE1CKSB0aGF0IGlzIGluYWNjZXNzaWJsZSBieSBHdUMuIFJlc2Vy dmUgdGhpcyByYW5nZSB3aXRoaW4KLQkgKiBHR1RUIGFzIGl0IGNhbiBjb21mb3J0YWJseSBob2xk IEd1Qy9IdUMgZmlybXdhcmUgaW1hZ2VzLgotCSAqLwotCXJldCA9IGdndHRfcmVzZXJ2ZV9ndWNf dG9wKGdndHQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JLyogQ2xlYXIgYW55IG5vbi1w cmVhbGxvY2F0ZWQgYmxvY2tzICovCi0JZHJtX21tX2Zvcl9lYWNoX2hvbGUoZW50cnksICZnZ3R0 LT52bS5tbSwgaG9sZV9zdGFydCwgaG9sZV9lbmQpIHsKLQkJRFJNX0RFQlVHX0tNUygiY2xlYXJp bmcgdW51c2VkIEdUVCBzcGFjZTogWyVseCwgJWx4XVxuIiwKLQkJCSAgICAgIGhvbGVfc3RhcnQs IGhvbGVfZW5kKTsKLQkJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UoJmdndHQtPnZtLCBob2xlX3N0YXJ0 LAotCQkJCSAgICAgaG9sZV9lbmQgLSBob2xlX3N0YXJ0KTsKLQl9Ci0KLQkvKiBBbmQgZmluYWxs eSBjbGVhciB0aGUgcmVzZXJ2ZWQgZ3VhcmQgcGFnZSAqLwotCWdndHQtPnZtLmNsZWFyX3Jhbmdl KCZnZ3R0LT52bSwgZ2d0dC0+dm0udG90YWwgLSBQQUdFX1NJWkUsIFBBR0VfU0laRSk7Ci0KLQly ZXR1cm4gMDsKLQotZXJyOgotCWNsZWFudXBfaW5pdF9nZ3R0KGdndHQpOwotCXJldHVybiByZXQ7 Ci19Ci0KLWludCBpOTE1X2luaXRfZ2d0dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkK LXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaW5pdF9nZ3R0KCZpOTE1LT5nZ3R0KTsKLQlpZiAocmV0 KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKElOVEVMX1BQR1RUKGk5MTUpID09IElOVEVMX1BQR1RU X0FMSUFTSU5HKSB7Ci0JCXJldCA9IGluaXRfYWxpYXNpbmdfcHBndHQoJmk5MTUtPmdndHQpOwot CQlpZiAocmV0KQotCQkJY2xlYW51cF9pbml0X2dndHQoJmk5MTUtPmdndHQpOwotCX0KLQotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBnZ3R0X2NsZWFudXBfaHcoc3RydWN0IGk5MTVfZ2d0 dCAqZ2d0dCkKLXsKLQlzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgKnZuOwotCi0JYXRvbWljX3NldCgm Z2d0dC0+dm0ub3BlbiwgMCk7Ci0KLQlyY3VfYmFycmllcigpOyAvKiBmbHVzaCB0aGUgUkNVJ2Vk X19pOTE1X3ZtX3JlbGVhc2UgKi8KLQlmbHVzaF93b3JrcXVldWUoZ2d0dC0+dm0uaTkxNS0+d3Ep OwotCi0JbXV0ZXhfbG9jaygmZ2d0dC0+dm0ubXV0ZXgpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRy eV9zYWZlKHZtYSwgdm4sICZnZ3R0LT52bS5ib3VuZF9saXN0LCB2bV9saW5rKQotCQlXQVJOX09O KF9faTkxNV92bWFfdW5iaW5kKHZtYSkpOwotCi0JaWYgKGRybV9tbV9ub2RlX2FsbG9jYXRlZCgm Z2d0dC0+ZXJyb3JfY2FwdHVyZSkpCi0JCWRybV9tbV9yZW1vdmVfbm9kZSgmZ2d0dC0+ZXJyb3Jf Y2FwdHVyZSk7Ci0KLQlnZ3R0X3JlbGVhc2VfZ3VjX3RvcChnZ3R0KTsKLQlpbnRlbF92Z3RfZGVi YWxsb29uKGdndHQpOwotCi0JZ2d0dC0+dm0uY2xlYW51cCgmZ2d0dC0+dm0pOwotCi0JbXV0ZXhf dW5sb2NrKCZnZ3R0LT52bS5tdXRleCk7Ci0JaTkxNV9hZGRyZXNzX3NwYWNlX2ZpbmkoJmdndHQt PnZtKTsKLQotCWFyY2hfcGh5c193Y19kZWwoZ2d0dC0+bXRycik7Ci0KLQlpZiAoZ2d0dC0+aW9t YXAuc2l6ZSkKLQkJaW9fbWFwcGluZ19maW5pKCZnZ3R0LT5pb21hcCk7Ci19Ci0KLS8qKgotICog aTkxNV9nZ3R0X2RyaXZlcl9yZWxlYXNlIC0gQ2xlYW4gdXAgR0dUVCBoYXJkd2FyZSBpbml0aWFs aXphdGlvbgotICogQGk5MTU6IGk5MTUgZGV2aWNlCi0gKi8KLXZvaWQgaTkxNV9nZ3R0X2RyaXZl cl9yZWxlYXNlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1KQotewotCXN0cnVjdCBwYWdl dmVjICpwdmVjOwotCi0JZmluaV9hbGlhc2luZ19wcGd0dCgmaTkxNS0+Z2d0dCk7Ci0KLQlnZ3R0 X2NsZWFudXBfaHcoJmk5MTUtPmdndHQpOwotCi0JcHZlYyA9ICZpOTE1LT5tbS53Y19zdGFzaC5w dmVjOwotCWlmIChwdmVjLT5ucikgewotCQlzZXRfcGFnZXNfYXJyYXlfd2IocHZlYy0+cGFnZXMs IHB2ZWMtPm5yKTsKLQkJX19wYWdldmVjX3JlbGVhc2UocHZlYyk7Ci0JfQotfQotCi1zdGF0aWMg dW5zaWduZWQgaW50IGdlbjZfZ2V0X3RvdGFsX2d0dF9zaXplKHUxNiBzbmJfZ21jaF9jdGwpCi17 Ci0Jc25iX2dtY2hfY3RsID4+PSBTTkJfR01DSF9HR01TX1NISUZUOwotCXNuYl9nbWNoX2N0bCAm PSBTTkJfR01DSF9HR01TX01BU0s7Ci0JcmV0dXJuIHNuYl9nbWNoX2N0bCA8PCAyMDsKLX0KLQot c3RhdGljIHVuc2lnbmVkIGludCBnZW44X2dldF90b3RhbF9ndHRfc2l6ZSh1MTYgYmR3X2dtY2hf Y3RsKQotewotCWJkd19nbWNoX2N0bCA+Pj0gQkRXX0dNQ0hfR0dNU19TSElGVDsKLQliZHdfZ21j aF9jdGwgJj0gQkRXX0dNQ0hfR0dNU19NQVNLOwotCWlmIChiZHdfZ21jaF9jdGwpCi0JCWJkd19n bWNoX2N0bCA9IDEgPDwgYmR3X2dtY2hfY3RsOwotCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCS8q IExpbWl0IDMyYiBwbGF0Zm9ybXMgdG8gYSAyR0IgR0dUVDogNCA8PCAyMCAvIHB0ZSBzaXplICog STkxNV9HVFRfUEFHRV9TSVpFICovCi0JaWYgKGJkd19nbWNoX2N0bCA+IDQpCi0JCWJkd19nbWNo X2N0bCA9IDQ7Ci0jZW5kaWYKLQotCXJldHVybiBiZHdfZ21jaF9jdGwgPDwgMjA7Ci19Ci0KLXN0 YXRpYyB1bnNpZ25lZCBpbnQgY2h2X2dldF90b3RhbF9ndHRfc2l6ZSh1MTYgZ21jaF9jdHJsKQot ewotCWdtY2hfY3RybCA+Pj0gU05CX0dNQ0hfR0dNU19TSElGVDsKLQlnbWNoX2N0cmwgJj0gU05C X0dNQ0hfR0dNU19NQVNLOwotCi0JaWYgKGdtY2hfY3RybCkKLQkJcmV0dXJuIDEgPDwgKDIwICsg Z21jaF9jdHJsKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdndHRfcHJvYmVfY29t bW9uKHN0cnVjdCBpOTE1X2dndHQgKmdndHQsIHU2NCBzaXplKQotewotCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGdndHQtPnZtLmk5MTU7Ci0Jc3RydWN0IHBjaV9kZXYgKnBk ZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0JcGh5c19hZGRyX3QgcGh5c19hZGRyOwotCWludCBy ZXQ7Ci0KLQkvKiBGb3IgTW9kZXJuIEdFTnMgdGhlIFBURXMgYW5kIHJlZ2lzdGVyIHNwYWNlIGFy ZSBzcGxpdCBpbiB0aGUgQkFSICovCi0JcGh5c19hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBk ZXYsIDApICsgcGNpX3Jlc291cmNlX2xlbihwZGV2LCAwKSAvIDI7Ci0KLQkvKgotCSAqIE9uIEJY VCsvQ05MKyB3cml0ZXMgbGFyZ2VyIHRoYW4gNjQgYml0IHRvIHRoZSBHVFQgcGFnZXRhYmxlIHJh bmdlCi0JICogd2lsbCBiZSBkcm9wcGVkLiBGb3IgV0MgbWFwcGluZ3MgaW4gZ2VuZXJhbCB3ZSBo YXZlIDY0IGJ5dGUgYnVyc3QKLQkgKiB3cml0ZXMgd2hlbiB0aGUgV0MgYnVmZmVyIGlzIGZsdXNo ZWQsIHNvIHdlIGNhbid0IHVzZSBpdCwgYnV0IGhhdmUgdG8KLQkgKiByZXNvcnQgdG8gYW4gdW5j YWNoZWQgbWFwcGluZy4gVGhlIFdDIGlzc3VlIGlzIGVhc2lseSBjYXVnaHQgYnkgdGhlCi0JICog cmVhZGJhY2sgY2hlY2sgd2hlbiB3cml0aW5nIEdUVCBQVEUgZW50cmllcy4KLQkgKi8KLQlpZiAo SVNfR0VOOV9MUChkZXZfcHJpdikgfHwgSU5URUxfR0VOKGRldl9wcml2KSA+PSAxMCkKLQkJZ2d0 dC0+Z3NtID0gaW9yZW1hcF9ub2NhY2hlKHBoeXNfYWRkciwgc2l6ZSk7Ci0JZWxzZQotCQlnZ3R0 LT5nc20gPSBpb3JlbWFwX3djKHBoeXNfYWRkciwgc2l6ZSk7Ci0JaWYgKCFnZ3R0LT5nc20pIHsK LQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gbWFwIHRoZSBnZ3R0IHBhZ2UgdGFibGVcbiIpOwotCQly ZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXQgPSBzZXR1cF9zY3JhdGNoX3BhZ2UoJmdndHQtPnZt LCBHRlBfRE1BMzIpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJTY3JhdGNoIHNldHVwIGZh aWxlZFxuIik7Ci0JCS8qIGlvdW5tYXAgd2lsbCBhbHNvIGdldCBjYWxsZWQgYXQgcmVtb3ZlLCBi dXQgbWVoICovCi0JCWlvdW5tYXAoZ2d0dC0+Z3NtKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQln Z3R0LT52bS5zY3JhdGNoWzBdLmVuY29kZSA9Ci0JCWdndHQtPnZtLnB0ZV9lbmNvZGUocHhfZG1h KCZnZ3R0LT52bS5zY3JhdGNoWzBdKSwKLQkJCQkgICAgSTkxNV9DQUNIRV9OT05FLCAwKTsKLQot CXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0Z2xfc2V0dXBfcHJpdmF0ZV9wcGF0KHN0cnVj dCBpbnRlbF91bmNvcmUgKnVuY29yZSkKLXsKLQkvKiBUR0wgZG9lc24ndCBzdXBwb3J0IExMQyBv ciBBR0Ugc2V0dGluZ3MgKi8KLQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4xMl9QQVRf SU5ERVgoMCksIEdFTjhfUFBBVF9XQik7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VO MTJfUEFUX0lOREVYKDEpLCBHRU44X1BQQVRfV0MpOwotCWludGVsX3VuY29yZV93cml0ZSh1bmNv cmUsIEdFTjEyX1BBVF9JTkRFWCgyKSwgR0VOOF9QUEFUX1dUKTsKLQlpbnRlbF91bmNvcmVfd3Jp dGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoMyksIEdFTjhfUFBBVF9VQyk7Ci0JaW50ZWxfdW5j b3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVYKDQpLCBHRU44X1BQQVRfV0IpOwotCWlu dGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjEyX1BBVF9JTkRFWCg1KSwgR0VOOF9QUEFUX1dC KTsKLQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU4xMl9QQVRfSU5ERVgoNiksIEdFTjhf UFBBVF9XQik7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOMTJfUEFUX0lOREVYKDcp LCBHRU44X1BQQVRfV0IpOwotfQotCi1zdGF0aWMgdm9pZCBjbmxfc2V0dXBfcHJpdmF0ZV9wcGF0 KHN0cnVjdCBpbnRlbF91bmNvcmUgKnVuY29yZSkKLXsKLQlpbnRlbF91bmNvcmVfd3JpdGUodW5j b3JlLAotCQkJICAgR0VOMTBfUEFUX0lOREVYKDApLAotCQkJICAgR0VOOF9QUEFUX1dCIHwgR0VO OF9QUEFUX0xMQyk7Ci0JaW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwKLQkJCSAgIEdFTjEwX1BB VF9JTkRFWCgxKSwKLQkJCSAgIEdFTjhfUFBBVF9XQyB8IEdFTjhfUFBBVF9MTENFTExDKTsKLQlp bnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLAotCQkJICAgR0VOMTBfUEFUX0lOREVYKDIpLAotCQkJ ICAgR0VOOF9QUEFUX1dUIHwgR0VOOF9QUEFUX0xMQ0VMTEMpOwotCWludGVsX3VuY29yZV93cml0 ZSh1bmNvcmUsCi0JCQkgICBHRU4xMF9QQVRfSU5ERVgoMyksCi0JCQkgICBHRU44X1BQQVRfVUMp OwotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCi0JCQkgICBHRU4xMF9QQVRfSU5ERVgoNCks Ci0JCQkgICBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDRUxMQyB8IEdFTjhfUFBBVF9BR0Uo MCkpOwotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCi0JCQkgICBHRU4xMF9QQVRfSU5ERVgo NSksCi0JCQkgICBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDRUxMQyB8IEdFTjhfUFBBVF9B R0UoMSkpOwotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCi0JCQkgICBHRU4xMF9QQVRfSU5E RVgoNiksCi0JCQkgICBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDRUxMQyB8IEdFTjhfUFBB VF9BR0UoMikpOwotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsCi0JCQkgICBHRU4xMF9QQVRf SU5ERVgoNyksCi0JCQkgICBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExDRUxMQyB8IEdFTjhf UFBBVF9BR0UoMykpOwotfQotCi0vKiBUaGUgR0dUVCBhbmQgUFBHVFQgbmVlZCBhIHByaXZhdGUg UFBBVCBzZXR1cCBpbiBvcmRlciB0byBoYW5kbGUgY2FjaGVhYmlsaXR5Ci0gKiBiaXRzLiBXaGVu IHVzaW5nIGFkdmFuY2VkIGNvbnRleHRzIGVhY2ggY29udGV4dCBzdG9yZXMgaXRzIG93biBQQVQs IGJ1dAotICogd3JpdGluZyB0aGlzIGRhdGEgc2hvdWxkbid0IGJlIGhhcm1mdWwgZXZlbiBpbiB0 aG9zZSBjYXNlcy4gKi8KLXN0YXRpYyB2b2lkIGJkd19zZXR1cF9wcml2YXRlX3BwYXQoc3RydWN0 IGludGVsX3VuY29yZSAqdW5jb3JlKQotewotCXU2NCBwYXQ7Ci0KLQlwYXQgPSBHRU44X1BQQVQo MCwgR0VOOF9QUEFUX1dCIHwgR0VOOF9QUEFUX0xMQykgfAkvKiBmb3Igbm9ybWFsIG9iamVjdHMs IG5vIGVMTEMgKi8KLQkgICAgICBHRU44X1BQQVQoMSwgR0VOOF9QUEFUX1dDIHwgR0VOOF9QUEFU X0xMQ0VMTEMpIHwJLyogZm9yIHNvbWV0aGluZyBwb2ludGluZyB0byBwdGVzPyAqLwotCSAgICAg IEdFTjhfUFBBVCgyLCBHRU44X1BQQVRfV1QgfCBHRU44X1BQQVRfTExDRUxMQykgfAkvKiBmb3Ig c2Nhbm91dCB3aXRoIGVMTEMgKi8KLQkgICAgICBHRU44X1BQQVQoMywgR0VOOF9QUEFUX1VDKSB8 CQkJLyogVW5jYWNoZWQgb2JqZWN0cywgbW9zdGx5IGZvciBzY2Fub3V0ICovCi0JICAgICAgR0VO OF9QUEFUKDQsIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FH RSgwKSkgfAotCSAgICAgIEdFTjhfUFBBVCg1LCBHRU44X1BQQVRfV0IgfCBHRU44X1BQQVRfTExD RUxMQyB8IEdFTjhfUFBBVF9BR0UoMSkpIHwKLQkgICAgICBHRU44X1BQQVQoNiwgR0VOOF9QUEFU X1dCIHwgR0VOOF9QUEFUX0xMQ0VMTEMgfCBHRU44X1BQQVRfQUdFKDIpKSB8Ci0JICAgICAgR0VO OF9QUEFUKDcsIEdFTjhfUFBBVF9XQiB8IEdFTjhfUFBBVF9MTENFTExDIHwgR0VOOF9QUEFUX0FH RSgzKSk7Ci0KLQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU44X1BSSVZBVEVfUEFUX0xP LCBsb3dlcl8zMl9iaXRzKHBhdCkpOwotCWludGVsX3VuY29yZV93cml0ZSh1bmNvcmUsIEdFTjhf UFJJVkFURV9QQVRfSEksIHVwcGVyXzMyX2JpdHMocGF0KSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNo dl9zZXR1cF9wcml2YXRlX3BwYXQoc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlKQotewotCXU2 NCBwYXQ7Ci0KLQkvKgotCSAqIE1hcCBXQiBvbiBCRFcgdG8gc25vb3BlZCBvbiBDSFYuCi0JICoK LQkgKiBPbmx5IHRoZSBzbm9vcCBiaXQgaGFzIG1lYW5pbmcgZm9yIENIViwgdGhlIHJlc3QgaXMK LQkgKiBpZ25vcmVkLgotCSAqCi0JICogVGhlIGhhcmR3YXJlIHdpbGwgbmV2ZXIgc25vb3AgZm9y IGNlcnRhaW4gdHlwZXMgb2YgYWNjZXNzZXM6Ci0JICogLSBDUFUgR1RUIChHTUFEUi0+R0dUVC0+ bm8gc25vb3AtPm1lbW9yeSkKLQkgKiAtIFBQR1RUIHBhZ2UgdGFibGVzCi0JICogLSBzb21lIG90 aGVyIHNwZWNpYWwgY3ljbGVzCi0JICoKLQkgKiBBcyB3aXRoIEJEVywgd2UgYWxzbyBuZWVkIHRv IGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZm9yIEdUIGFjY2Vzc2VzOgotCSAqICJGb3IgR0dUVCwg dGhlcmUgaXMgTk8gcGF0X3NlbFsyOjBdIGZyb20gdGhlIGVudHJ5LAotCSAqIHNvIFJUTCB3aWxs IGFsd2F5cyB1c2UgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8KLQkgKiBwYXRfc2VsID0gMDAw Ii4KLQkgKiBXaGljaCBtZWFucyB3ZSBtdXN0IHNldCB0aGUgc25vb3AgYml0IGluIFBBVCBlbnRy eSAwCi0JICogaW4gb3JkZXIgdG8ga2VlcCB0aGUgZ2xvYmFsIHN0YXR1cyBwYWdlIHdvcmtpbmcu Ci0JICovCi0KLQlwYXQgPSBHRU44X1BQQVQoMCwgQ0hWX1BQQVRfU05PT1ApIHwKLQkgICAgICBH RU44X1BQQVQoMSwgMCkgfAotCSAgICAgIEdFTjhfUFBBVCgyLCAwKSB8Ci0JICAgICAgR0VOOF9Q UEFUKDMsIDApIHwKLQkgICAgICBHRU44X1BQQVQoNCwgQ0hWX1BQQVRfU05PT1ApIHwKLQkgICAg ICBHRU44X1BQQVQoNSwgQ0hWX1BQQVRfU05PT1ApIHwKLQkgICAgICBHRU44X1BQQVQoNiwgQ0hW X1BQQVRfU05PT1ApIHwKLQkgICAgICBHRU44X1BQQVQoNywgQ0hWX1BQQVRfU05PT1ApOwotCi0J aW50ZWxfdW5jb3JlX3dyaXRlKHVuY29yZSwgR0VOOF9QUklWQVRFX1BBVF9MTywgbG93ZXJfMzJf Yml0cyhwYXQpKTsKLQlpbnRlbF91bmNvcmVfd3JpdGUodW5jb3JlLCBHRU44X1BSSVZBVEVfUEFU X0hJLCB1cHBlcl8zMl9iaXRzKHBhdCkpOwotfQotCi1zdGF0aWMgdm9pZCBnZW42X2dtY2hfcmVt b3ZlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQotewotCXN0cnVjdCBpOTE1X2dndHQg KmdndHQgPSBpOTE1X3ZtX3RvX2dndHQodm0pOwotCi0JaW91bm1hcChnZ3R0LT5nc20pOwotCWNs ZWFudXBfc2NyYXRjaF9wYWdlKHZtKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0dXBfcHJpdmF0ZV9w YXQoc3RydWN0IGludGVsX3VuY29yZSAqdW5jb3JlKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1ID0gdW5jb3JlLT5pOTE1OwotCi0JR0VNX0JVR19PTihJTlRFTF9HRU4oaTkxNSkg PCA4KTsKLQotCWlmIChJTlRFTF9HRU4oaTkxNSkgPj0gMTIpCi0JCXRnbF9zZXR1cF9wcml2YXRl X3BwYXQodW5jb3JlKTsKLQllbHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPj0gMTApCi0JCWNubF9z ZXR1cF9wcml2YXRlX3BwYXQodW5jb3JlKTsKLQllbHNlIGlmIChJU19DSEVSUllWSUVXKGk5MTUp IHx8IElTX0dFTjlfTFAoaTkxNSkpCi0JCWNodl9zZXR1cF9wcml2YXRlX3BwYXQodW5jb3JlKTsK LQllbHNlCi0JCWJkd19zZXR1cF9wcml2YXRlX3BwYXQodW5jb3JlKTsKLX0KLQotc3RhdGljIHN0 cnVjdCByZXNvdXJjZSBwY2lfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIp Ci17Ci0JcmV0dXJuIChzdHJ1Y3QgcmVzb3VyY2UpREVGSU5FX1JFU19NRU0ocGNpX3Jlc291cmNl X3N0YXJ0KHBkZXYsIGJhciksCi0JCQkJCSAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJh cikpOwotfQotCi1zdGF0aWMgaW50IGdlbjhfZ21jaF9wcm9iZShzdHJ1Y3QgaTkxNV9nZ3R0ICpn Z3R0KQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGdndHQtPnZtLmk5 MTU7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0JdW5zaWdu ZWQgaW50IHNpemU7Ci0JdTE2IHNuYl9nbWNoX2N0bDsKLQlpbnQgZXJyOwotCi0JLyogVE9ETzog V2UncmUgbm90IGF3YXJlIG9mIG1hcHBhYmxlIGNvbnN0cmFpbnRzIG9uIGdlbjggeWV0ICovCi0J aWYgKCFJU19ER0ZYKGRldl9wcml2KSkgewotCQlnZ3R0LT5nbWFkciA9IHBjaV9yZXNvdXJjZShw ZGV2LCAyKTsKLQkJZ2d0dC0+bWFwcGFibGVfZW5kID0gcmVzb3VyY2Vfc2l6ZSgmZ2d0dC0+Z21h ZHIpOwotCX0KLQotCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM5 KSk7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2 LCBETUFfQklUX01BU0soMzkpKTsKLQlpZiAoZXJyKQotCQlEUk1fRVJST1IoIkNhbid0IHNldCBE TUEgbWFzay9jb25zaXN0ZW50IG1hc2sgKCVkKVxuIiwgZXJyKTsKLQotCXBjaV9yZWFkX2NvbmZp Z193b3JkKHBkZXYsIFNOQl9HTUNIX0NUUkwsICZzbmJfZ21jaF9jdGwpOwotCWlmIChJU19DSEVS UllWSUVXKGRldl9wcml2KSkKLQkJc2l6ZSA9IGNodl9nZXRfdG90YWxfZ3R0X3NpemUoc25iX2dt Y2hfY3RsKTsKLQllbHNlCi0JCXNpemUgPSBnZW44X2dldF90b3RhbF9ndHRfc2l6ZShzbmJfZ21j aF9jdGwpOwotCi0JZ2d0dC0+dm0udG90YWwgPSAoc2l6ZSAvIHNpemVvZihnZW44X3B0ZV90KSkg KiBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0JZ2d0dC0+dm0uY2xlYW51cCA9IGdlbjZfZ21jaF9yZW1v dmU7Ci0JZ2d0dC0+dm0uaW5zZXJ0X3BhZ2UgPSBnZW44X2dndHRfaW5zZXJ0X3BhZ2U7Ci0JZ2d0 dC0+dm0uY2xlYXJfcmFuZ2UgPSBub3BfY2xlYXJfcmFuZ2U7Ci0JaWYgKGludGVsX3NjYW5vdXRf bmVlZHNfdnRkX3dhKGRldl9wcml2KSkKLQkJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UgPSBnZW44X2dn dHRfY2xlYXJfcmFuZ2U7Ci0KLQlnZ3R0LT52bS5pbnNlcnRfZW50cmllcyA9IGdlbjhfZ2d0dF9p bnNlcnRfZW50cmllczsKLQotCS8qIFNlcmlhbGl6ZSBHVFQgdXBkYXRlcyB3aXRoIGFwZXJ0dXJl IGFjY2VzcyBvbiBCWFQgaWYgVlQtZCBpcyBvbi4gKi8KLQlpZiAoaW50ZWxfZ2d0dF91cGRhdGVf bmVlZHNfdnRkX3dhKGRldl9wcml2KSB8fAotCSAgICBJU19DSEVSUllWSUVXKGRldl9wcml2KSAv KiBmYWlscyB3aXRoIGNvbmN1cnJlbnQgdXNlL3VwZGF0ZSAqLykgewotCQlnZ3R0LT52bS5pbnNl cnRfZW50cmllcyA9IGJ4dF92dGRfZ2d0dF9pbnNlcnRfZW50cmllc19fQktMOwotCQlnZ3R0LT52 bS5pbnNlcnRfcGFnZSAgICA9IGJ4dF92dGRfZ2d0dF9pbnNlcnRfcGFnZV9fQktMOwotCQlpZiAo Z2d0dC0+dm0uY2xlYXJfcmFuZ2UgIT0gbm9wX2NsZWFyX3JhbmdlKQotCQkJZ2d0dC0+dm0uY2xl YXJfcmFuZ2UgPSBieHRfdnRkX2dndHRfY2xlYXJfcmFuZ2VfX0JLTDsKLQl9Ci0KLQlnZ3R0LT5p bnZhbGlkYXRlID0gZ2VuOF9nZ3R0X2ludmFsaWRhdGU7Ci0KLQlnZ3R0LT52bS52bWFfb3BzLmJp bmRfdm1hICAgID0gZ2d0dF9iaW5kX3ZtYTsKLQlnZ3R0LT52bS52bWFfb3BzLnVuYmluZF92bWEg ID0gZ2d0dF91bmJpbmRfdm1hOwotCWdndHQtPnZtLnZtYV9vcHMuc2V0X3BhZ2VzICAgPSBnZ3R0 X3NldF9wYWdlczsKLQlnZ3R0LT52bS52bWFfb3BzLmNsZWFyX3BhZ2VzID0gY2xlYXJfcGFnZXM7 Ci0KLQlnZ3R0LT52bS5wdGVfZW5jb2RlID0gZ2VuOF9wdGVfZW5jb2RlOwotCi0Jc2V0dXBfcHJp dmF0ZV9wYXQoZ2d0dC0+dm0uZ3QtPnVuY29yZSk7Ci0KLQlyZXR1cm4gZ2d0dF9wcm9iZV9jb21t b24oZ2d0dCwgc2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuNl9nbWNoX3Byb2JlKHN0cnVjdCBp OTE1X2dndHQgKmdndHQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0g Z2d0dC0+dm0uaTkxNTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRl djsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQl1MTYgc25iX2dtY2hfY3RsOwotCWludCBlcnI7Ci0K LQlnZ3R0LT5nbWFkciA9Ci0JCShzdHJ1Y3QgcmVzb3VyY2UpIERFRklORV9SRVNfTUVNKHBjaV9y ZXNvdXJjZV9zdGFydChwZGV2LCAyKSwKLQkJCQkJCSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDIp KTsKLQlnZ3R0LT5tYXBwYWJsZV9lbmQgPSByZXNvdXJjZV9zaXplKCZnZ3R0LT5nbWFkcik7Ci0K LQkvKiA2NC81MTJNQiBpcyB0aGUgY3VycmVudCBtaW4vbWF4IHdlIGFjdHVhbGx5IGtub3cgb2Ys IGJ1dCB0aGlzIGlzIGp1c3QKLQkgKiBhIGNvYXJzZSBzYW5pdHkgY2hlY2suCi0JICovCi0JaWYg KGdndHQtPm1hcHBhYmxlX2VuZCA8ICg2NDw8MjApIHx8IGdndHQtPm1hcHBhYmxlX2VuZCA+ICg1 MTI8PDIwKSkgewotCQlEUk1fRVJST1IoIlVua25vd24gR01BRFIgc2l6ZSAoJXBhKVxuIiwgJmdn dHQtPm1hcHBhYmxlX2VuZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JZXJyID0gcGNpX3Nl dF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNDApKTsKLQlpZiAoIWVycikKLQkJZXJyID0g cGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg0MCkpOwotCWlm IChlcnIpCi0JCURSTV9FUlJPUigiQ2FuJ3Qgc2V0IERNQSBtYXNrL2NvbnNpc3RlbnQgbWFzayAo JWQpXG4iLCBlcnIpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIFNOQl9HTUNIX0NUUkws ICZzbmJfZ21jaF9jdGwpOwotCi0Jc2l6ZSA9IGdlbjZfZ2V0X3RvdGFsX2d0dF9zaXplKHNuYl9n bWNoX2N0bCk7Ci0JZ2d0dC0+dm0udG90YWwgPSAoc2l6ZSAvIHNpemVvZihnZW42X3B0ZV90KSkg KiBJOTE1X0dUVF9QQUdFX1NJWkU7Ci0KLQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IG5vcF9jbGVh cl9yYW5nZTsKLQlpZiAoIUhBU19GVUxMX1BQR1RUKGRldl9wcml2KSB8fCBpbnRlbF9zY2Fub3V0 X25lZWRzX3Z0ZF93YShkZXZfcHJpdikpCi0JCWdndHQtPnZtLmNsZWFyX3JhbmdlID0gZ2VuNl9n Z3R0X2NsZWFyX3JhbmdlOwotCWdndHQtPnZtLmluc2VydF9wYWdlID0gZ2VuNl9nZ3R0X2luc2Vy dF9wYWdlOwotCWdndHQtPnZtLmluc2VydF9lbnRyaWVzID0gZ2VuNl9nZ3R0X2luc2VydF9lbnRy aWVzOwotCWdndHQtPnZtLmNsZWFudXAgPSBnZW42X2dtY2hfcmVtb3ZlOwotCi0JZ2d0dC0+aW52 YWxpZGF0ZSA9IGdlbjZfZ2d0dF9pbnZhbGlkYXRlOwotCi0JaWYgKEhBU19FRFJBTShkZXZfcHJp dikpCi0JCWdndHQtPnZtLnB0ZV9lbmNvZGUgPSBpcmlzX3B0ZV9lbmNvZGU7Ci0JZWxzZSBpZiAo SVNfSEFTV0VMTChkZXZfcHJpdikpCi0JCWdndHQtPnZtLnB0ZV9lbmNvZGUgPSBoc3dfcHRlX2Vu Y29kZTsKLQllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSkKLQkJZ2d0dC0+dm0ucHRl X2VuY29kZSA9IGJ5dF9wdGVfZW5jb2RlOwotCWVsc2UgaWYgKElOVEVMX0dFTihkZXZfcHJpdikg Pj0gNykKLQkJZ2d0dC0+dm0ucHRlX2VuY29kZSA9IGl2Yl9wdGVfZW5jb2RlOwotCWVsc2UKLQkJ Z2d0dC0+dm0ucHRlX2VuY29kZSA9IHNuYl9wdGVfZW5jb2RlOwotCi0JZ2d0dC0+dm0udm1hX29w cy5iaW5kX3ZtYSAgICA9IGdndHRfYmluZF92bWE7Ci0JZ2d0dC0+dm0udm1hX29wcy51bmJpbmRf dm1hICA9IGdndHRfdW5iaW5kX3ZtYTsKLQlnZ3R0LT52bS52bWFfb3BzLnNldF9wYWdlcyAgID0g Z2d0dF9zZXRfcGFnZXM7Ci0JZ2d0dC0+dm0udm1hX29wcy5jbGVhcl9wYWdlcyA9IGNsZWFyX3Bh Z2VzOwotCi0JcmV0dXJuIGdndHRfcHJvYmVfY29tbW9uKGdndHQsIHNpemUpOwotfQotCi1zdGF0 aWMgdm9pZCBpOTE1X2dtY2hfcmVtb3ZlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKQot ewotCWludGVsX2dtY2hfcmVtb3ZlKCk7Ci19Ci0KLXN0YXRpYyBpbnQgaTkxNV9nbWNoX3Byb2Jl KHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gZ2d0dC0+dm0uaTkxNTsKLQlwaHlzX2FkZHJfdCBnbWFkcl9iYXNlOwotCWludCBy ZXQ7Ci0KLQlyZXQgPSBpbnRlbF9nbWNoX3Byb2JlKGRldl9wcml2LT5icmlkZ2VfZGV2LCBkZXZf cHJpdi0+ZHJtLnBkZXYsIE5VTEwpOwotCWlmICghcmV0KSB7Ci0JCURSTV9FUlJPUigiZmFpbGVk IHRvIHNldCB1cCBnbWNoXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaW50ZWxfZ3R0X2dl dCgmZ2d0dC0+dm0udG90YWwsICZnbWFkcl9iYXNlLCAmZ2d0dC0+bWFwcGFibGVfZW5kKTsKLQot CWdndHQtPmdtYWRyID0KLQkJKHN0cnVjdCByZXNvdXJjZSkgREVGSU5FX1JFU19NRU0oZ21hZHJf YmFzZSwKLQkJCQkJCSBnZ3R0LT5tYXBwYWJsZV9lbmQpOwotCi0JZ2d0dC0+ZG9faWRsZV9tYXBz ID0gbmVlZHNfaWRsZV9tYXBzKGRldl9wcml2KTsKLQlnZ3R0LT52bS5pbnNlcnRfcGFnZSA9IGk5 MTVfZ2d0dF9pbnNlcnRfcGFnZTsKLQlnZ3R0LT52bS5pbnNlcnRfZW50cmllcyA9IGk5MTVfZ2d0 dF9pbnNlcnRfZW50cmllczsKLQlnZ3R0LT52bS5jbGVhcl9yYW5nZSA9IGk5MTVfZ2d0dF9jbGVh cl9yYW5nZTsKLQlnZ3R0LT52bS5jbGVhbnVwID0gaTkxNV9nbWNoX3JlbW92ZTsKLQotCWdndHQt PmludmFsaWRhdGUgPSBnbWNoX2dndHRfaW52YWxpZGF0ZTsKLQotCWdndHQtPnZtLnZtYV9vcHMu YmluZF92bWEgICAgPSBnZ3R0X2JpbmRfdm1hOwotCWdndHQtPnZtLnZtYV9vcHMudW5iaW5kX3Zt YSAgPSBnZ3R0X3VuYmluZF92bWE7Ci0JZ2d0dC0+dm0udm1hX29wcy5zZXRfcGFnZXMgICA9IGdn dHRfc2V0X3BhZ2VzOwotCWdndHQtPnZtLnZtYV9vcHMuY2xlYXJfcGFnZXMgPSBjbGVhcl9wYWdl czsKLQotCWlmICh1bmxpa2VseShnZ3R0LT5kb19pZGxlX21hcHMpKQotCQlkZXZfbm90aWNlKGRl dl9wcml2LT5kcm0uZGV2LAotCQkJICAgIkFwcGx5aW5nIElyb25sYWtlIHF1aXJrcyBmb3IgaW50 ZWxfaW9tbXVcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2d0dF9wcm9iZV9o dyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0LCBzdHJ1Y3QgaW50ZWxfZ3QgKmd0KQotewotCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gZ3QtPmk5MTU7Ci0JaW50IHJldDsKLQotCWdndHQt PnZtLmd0ID0gZ3Q7Ci0JZ2d0dC0+dm0uaTkxNSA9IGk5MTU7Ci0JZ2d0dC0+dm0uZG1hID0gJmk5 MTUtPmRybS5wZGV2LT5kZXY7Ci0KLQlpZiAoSU5URUxfR0VOKGk5MTUpIDw9IDUpCi0JCXJldCA9 IGk5MTVfZ21jaF9wcm9iZShnZ3R0KTsKLQllbHNlIGlmIChJTlRFTF9HRU4oaTkxNSkgPCA4KQot CQlyZXQgPSBnZW42X2dtY2hfcHJvYmUoZ2d0dCk7Ci0JZWxzZQotCQlyZXQgPSBnZW44X2dtY2hf cHJvYmUoZ2d0dCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICgoZ2d0dC0+dm0u dG90YWwgLSAxKSA+PiAzMikgewotCQlEUk1fRVJST1IoIldlIG5ldmVyIGV4cGVjdGVkIGEgR2xv YmFsIEdUVCB3aXRoIG1vcmUgdGhhbiAzMmJpdHMiCi0JCQkgICIgb2YgYWRkcmVzcyBzcGFjZSEg Rm91bmQgJWxsZE0hXG4iLAotCQkJICBnZ3R0LT52bS50b3RhbCA+PiAyMCk7Ci0JCWdndHQtPnZt LnRvdGFsID0gMVVMTCA8PCAzMjsKLQkJZ2d0dC0+bWFwcGFibGVfZW5kID0KLQkJCW1pbl90KHU2 NCwgZ2d0dC0+bWFwcGFibGVfZW5kLCBnZ3R0LT52bS50b3RhbCk7Ci0JfQotCi0JaWYgKGdndHQt Pm1hcHBhYmxlX2VuZCA+IGdndHQtPnZtLnRvdGFsKSB7Ci0JCURSTV9FUlJPUigibWFwcGFibGUg YXBlcnR1cmUgZXh0ZW5kcyBwYXN0IGVuZCBvZiBHR1RULCIKLQkJCSAgIiBhcGVydHVyZT0lcGEs IHRvdGFsPSVsbHhcbiIsCi0JCQkgICZnZ3R0LT5tYXBwYWJsZV9lbmQsIGdndHQtPnZtLnRvdGFs KTsKLQkJZ2d0dC0+bWFwcGFibGVfZW5kID0gZ2d0dC0+dm0udG90YWw7Ci0JfQotCi0JLyogR01B RFIgaXMgdGhlIFBDSSBtbWlvIGFwZXJ0dXJlIGludG8gdGhlIGdsb2JhbCBHVFQuICovCi0JRFJN X0RFQlVHX0RSSVZFUigiR0dUVCBzaXplID0gJWxsdU1cbiIsIGdndHQtPnZtLnRvdGFsID4+IDIw KTsKLQlEUk1fREVCVUdfRFJJVkVSKCJHTUFEUiBzaXplID0gJWxsdU1cbiIsICh1NjQpZ2d0dC0+ bWFwcGFibGVfZW5kID4+IDIwKTsKLQlEUk1fREVCVUdfRFJJVkVSKCJEU00gc2l6ZSA9ICVsbHVN XG4iLAotCQkJICh1NjQpcmVzb3VyY2Vfc2l6ZSgmaW50ZWxfZ3JhcGhpY3Nfc3RvbGVuX3Jlcykg Pj4gMjApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaTkxNV9nZ3R0X3Byb2JlX2h3IC0g UHJvYmUgR0dUVCBoYXJkd2FyZSBsb2NhdGlvbgotICogQGk5MTU6IGk5MTUgZGV2aWNlCi0gKi8K LWludCBpOTE1X2dndHRfcHJvYmVfaHcoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUpCi17 Ci0JaW50IHJldDsKLQotCXJldCA9IGdndHRfcHJvYmVfaHcoJmk5MTUtPmdndHQsICZpOTE1LT5n dCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChpbnRlbF92dGRfYWN0aXZlKCkp Ci0JCWRldl9pbmZvKGk5MTUtPmRybS5kZXYsICJWVC1kIGFjdGl2ZSBmb3IgZ2Z4IGFjY2Vzc1xu Iik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZ3R0X2luaXRfaHcoc3RydWN0IGk5 MTVfZ2d0dCAqZ2d0dCkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGdndHQt PnZtLmk5MTU7Ci0KLQlpOTE1X2FkZHJlc3Nfc3BhY2VfaW5pdCgmZ2d0dC0+dm0sIFZNX0NMQVNT X0dHVFQpOwotCi0JZ2d0dC0+dm0uaXNfZ2d0dCA9IHRydWU7Ci0KLQkvKiBPbmx5IFZMViBzdXBw b3J0cyByZWFkLW9ubHkgR0dUVCBtYXBwaW5ncyAqLwotCWdndHQtPnZtLmhhc19yZWFkX29ubHkg PSBJU19WQUxMRVlWSUVXKGk5MTUpOwotCi0JaWYgKCFIQVNfTExDKGk5MTUpICYmICFIQVNfUFBH VFQoaTkxNSkpCi0JCWdndHQtPnZtLm1tLmNvbG9yX2FkanVzdCA9IGk5MTVfZ2d0dF9jb2xvcl9h ZGp1c3Q7Ci0KLQlpZiAoZ2d0dC0+bWFwcGFibGVfZW5kKSB7Ci0JCWlmICghaW9fbWFwcGluZ19p bml0X3djKCZnZ3R0LT5pb21hcCwKLQkJCQkJZ2d0dC0+Z21hZHIuc3RhcnQsCi0JCQkJCWdndHQt Pm1hcHBhYmxlX2VuZCkpIHsKLQkJCWdndHQtPnZtLmNsZWFudXAoJmdndHQtPnZtKTsKLQkJCXJl dHVybiAtRUlPOwotCQl9Ci0KLQkJZ2d0dC0+bXRyciA9IGFyY2hfcGh5c193Y19hZGQoZ2d0dC0+ Z21hZHIuc3RhcnQsCi0JCQkJCSAgICAgIGdndHQtPm1hcHBhYmxlX2VuZCk7Ci0JfQotCi0JaTkx NV9nZ3R0X2luaXRfZmVuY2VzKGdndHQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaTkx NV9nZ3R0X2luaXRfaHcgLSBJbml0aWFsaXplIEdHVFQgaGFyZHdhcmUKLSAqIEBkZXZfcHJpdjog aTkxNSBkZXZpY2UKLSAqLwotaW50IGk5MTVfZ2d0dF9pbml0X2h3KHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdikKLXsKLQlpbnQgcmV0OwotCi0Jc3Rhc2hfaW5pdCgmZGV2X3ByaXYt Pm1tLndjX3N0YXNoKTsKLQotCS8qIE5vdGUgdGhhdCB3ZSB1c2UgcGFnZSBjb2xvdXJpbmcgdG8g ZW5mb3JjZSBhIGd1YXJkIHBhZ2UgYXQgdGhlCi0JICogZW5kIG9mIHRoZSBhZGRyZXNzIHNwYWNl LiBUaGlzIGlzIHJlcXVpcmVkIGFzIHRoZSBDUyBtYXkgcHJlZmV0Y2gKLQkgKiBiZXlvbmQgdGhl IGVuZCBvZiB0aGUgYmF0Y2ggYnVmZmVyLCBhY3Jvc3MgdGhlIHBhZ2UgYm91bmRhcnksCi0JICog YW5kIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBHVFQgaWYgd2UgZG8gbm90IHByb3ZpZGUgYSBndWFy ZC4KLQkgKi8KLQlyZXQgPSBnZ3R0X2luaXRfaHcoJmRldl9wcml2LT5nZ3R0KTsKLQlpZiAocmV0 KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpOTE1X2dndHRfZW5hYmxl X2h3KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlpZiAoSU5URUxfR0VO KGRldl9wcml2KSA8IDYgJiYgIWludGVsX2VuYWJsZV9ndHQoKSkKLQkJcmV0dXJuIC1FSU87Ci0K LQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpOTE1X2dndHRfZW5hYmxlX2d1YyhzdHJ1Y3QgaTkxNV9n Z3R0ICpnZ3R0KQotewotCUdFTV9CVUdfT04oZ2d0dC0+aW52YWxpZGF0ZSAhPSBnZW44X2dndHRf aW52YWxpZGF0ZSk7Ci0KLQlnZ3R0LT5pbnZhbGlkYXRlID0gZ3VjX2dndHRfaW52YWxpZGF0ZTsK LQotCWdndHQtPmludmFsaWRhdGUoZ2d0dCk7Ci19Ci0KLXZvaWQgaTkxNV9nZ3R0X2Rpc2FibGVf Z3VjKHN0cnVjdCBpOTE1X2dndHQgKmdndHQpCi17Ci0JLyogWFhYIFRlbXBvcmFyeSBwYXJkb24g Zm9yIGVycm9yIHVubG9hZCAqLwotCWlmIChnZ3R0LT5pbnZhbGlkYXRlID09IGdlbjhfZ2d0dF9p bnZhbGlkYXRlKQotCQlyZXR1cm47Ci0KLQkvKiBXZSBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0 ZXIgaTkxNV9nZ3R0X2VuYWJsZV9ndWMoKSAqLwotCUdFTV9CVUdfT04oZ2d0dC0+aW52YWxpZGF0 ZSAhPSBndWNfZ2d0dF9pbnZhbGlkYXRlKTsKLQotCWdndHQtPmludmFsaWRhdGUgPSBnZW44X2dn dHRfaW52YWxpZGF0ZTsKLQotCWdndHQtPmludmFsaWRhdGUoZ2d0dCk7Ci19Ci0KLXN0YXRpYyB2 b2lkIGdndHRfcmVzdG9yZV9tYXBwaW5ncyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KQotewotCXN0 cnVjdCBpOTE1X3ZtYSAqdm1hLCAqdm47Ci0JYm9vbCBmbHVzaCA9IGZhbHNlOwotCWludCBvcGVu OwotCi0JaW50ZWxfZ3RfY2hlY2tfYW5kX2NsZWFyX2ZhdWx0cyhnZ3R0LT52bS5ndCk7Ci0KLQlt dXRleF9sb2NrKCZnZ3R0LT52bS5tdXRleCk7Ci0KLQkvKiBGaXJzdCBmaWxsIG91ciBwb3J0aW9u IG9mIHRoZSBHVFQgd2l0aCBzY3JhdGNoIHBhZ2VzICovCi0JZ2d0dC0+dm0uY2xlYXJfcmFuZ2Uo JmdndHQtPnZtLCAwLCBnZ3R0LT52bS50b3RhbCk7Ci0KLQkvKiBTa2lwIHJld3JpdGluZyBQVEUg b24gVk1BIHVuYmluZC4gKi8KLQlvcGVuID0gYXRvbWljX3hjaGcoJmdndHQtPnZtLm9wZW4sIDAp OwotCi0JLyogY2xmbHVzaCBvYmplY3RzIGJvdW5kIGludG8gdGhlIEdHVFQgYW5kIHJlYmluZCB0 aGVtLiAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bWEsIHZuLCAmZ2d0dC0+dm0uYm91 bmRfbGlzdCwgdm1fbGluaykgewotCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0g dm1hLT5vYmo7Ci0KLQkJaWYgKCFpOTE1X3ZtYV9pc19ib3VuZCh2bWEsIEk5MTVfVk1BX0dMT0JB TF9CSU5EKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghX19pOTE1X3ZtYV91bmJpbmQodm1hKSkK LQkJCWNvbnRpbnVlOwotCi0JCWNsZWFyX2JpdChJOTE1X1ZNQV9HTE9CQUxfQklORF9CSVQsIF9f aTkxNV92bWFfZmxhZ3Modm1hKSk7Ci0JCVdBUk5fT04oaTkxNV92bWFfYmluZCh2bWEsCi0JCQkJ ICAgICAgb2JqID8gb2JqLT5jYWNoZV9sZXZlbCA6IDAsCi0JCQkJICAgICAgUElOX0dMT0JBTCwg TlVMTCkpOwotCQlpZiAob2JqKSB7IC8qIG9ubHkgdXNlZCBkdXJpbmcgcmVzdW1lID0+IGV4Y2x1 c2l2ZSBhY2Nlc3MgKi8KLQkJCWZsdXNoIHw9IGZldGNoX2FuZF96ZXJvKCZvYmotPndyaXRlX2Rv bWFpbik7Ci0JCQlvYmotPnJlYWRfZG9tYWlucyB8PSBJOTE1X0dFTV9ET01BSU5fR1RUOwotCQl9 Ci0JfQotCi0JYXRvbWljX3NldCgmZ2d0dC0+dm0ub3Blbiwgb3Blbik7Ci0JZ2d0dC0+aW52YWxp ZGF0ZShnZ3R0KTsKLQotCW11dGV4X3VubG9jaygmZ2d0dC0+dm0ubXV0ZXgpOwotCi0JaWYgKGZs dXNoKQotCQl3YmludmRfb25fYWxsX2NwdXMoKTsKLX0KLQotdm9pZCBpOTE1X2dlbV9yZXN0b3Jl X2d0dF9tYXBwaW5ncyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKLXsKLQlzdHJ1Y3Qg aTkxNV9nZ3R0ICpnZ3R0ID0gJmk5MTUtPmdndHQ7Ci0KLQlnZ3R0X3Jlc3RvcmVfbWFwcGluZ3Mo Z2d0dCk7Ci0KLQlpZiAoSU5URUxfR0VOKGk5MTUpID49IDgpCi0JCXNldHVwX3ByaXZhdGVfcGF0 KGdndHQtPnZtLmd0LT51bmNvcmUpOwotfQotCi1zdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICoK LXJvdGF0ZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1bnNpZ25lZCBp bnQgb2Zmc2V0LAotCSAgICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0 LAotCSAgICAgdW5zaWduZWQgaW50IHN0cmlkZSwKLQkgICAgIHN0cnVjdCBzZ190YWJsZSAqc3Qs IHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCi17Ci0JdW5zaWduZWQgaW50IGNvbHVtbiwgcm93Owot CXVuc2lnbmVkIGludCBzcmNfaWR4OwotCi0JZm9yIChjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0 aDsgY29sdW1uKyspIHsKLQkJc3JjX2lkeCA9IHN0cmlkZSAqIChoZWlnaHQgLSAxKSArIGNvbHVt biArIG9mZnNldDsKLQkJZm9yIChyb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0JCQlz dC0+bmVudHMrKzsKLQkJCS8qIFdlIGRvbid0IG5lZWQgdGhlIHBhZ2VzLCBidXQgbmVlZCB0byBp bml0aWFsaXplCi0JCQkgKiB0aGUgZW50cmllcyBzbyB0aGUgc2cgbGlzdCBjYW4gYmUgaGFwcGls eSB0cmF2ZXJzZWQuCi0JCQkgKiBUaGUgb25seSB0aGluZyB3ZSBuZWVkIGFyZSBETUEgYWRkcmVz c2VzLgotCQkJICovCi0JCQlzZ19zZXRfcGFnZShzZywgTlVMTCwgSTkxNV9HVFRfUEFHRV9TSVpF LCAwKTsKLQkJCXNnX2RtYV9hZGRyZXNzKHNnKSA9Ci0JCQkJaTkxNV9nZW1fb2JqZWN0X2dldF9k bWFfYWRkcmVzcyhvYmosIHNyY19pZHgpOwotCQkJc2dfZG1hX2xlbihzZykgPSBJOTE1X0dUVF9Q QUdFX1NJWkU7Ci0JCQlzZyA9IHNnX25leHQoc2cpOwotCQkJc3JjX2lkeCAtPSBzdHJpZGU7Ci0J CX0KLQl9Ci0KLQlyZXR1cm4gc2c7Ci19Ci0KLXN0YXRpYyBub2lubGluZSBzdHJ1Y3Qgc2dfdGFi bGUgKgotaW50ZWxfcm90YXRlX3BhZ2VzKHN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvICpyb3Rf aW5mbywKLQkJICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQl1bnNpZ25l ZCBpbnQgc2l6ZSA9IGludGVsX3JvdGF0aW9uX2luZm9fc2l6ZShyb3RfaW5mbyk7Ci0Jc3RydWN0 IHNnX3RhYmxlICpzdDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCWludCByZXQgPSAtRU5P TUVNOwotCWludCBpOwotCi0JLyogQWxsb2NhdGUgdGFyZ2V0IFNHIGxpc3QuICovCi0Jc3QgPSBr bWFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0KQotCQlnb3RvIGVycl9z dF9hbGxvYzsKLQotCXJldCA9IHNnX2FsbG9jX3RhYmxlKHN0LCBzaXplLCBHRlBfS0VSTkVMKTsK LQlpZiAocmV0KQotCQlnb3RvIGVycl9zZ19hbGxvYzsKLQotCXN0LT5uZW50cyA9IDA7Ci0Jc2cg PSBzdC0+c2dsOwotCi0JZm9yIChpID0gMCA7IGkgPCBBUlJBWV9TSVpFKHJvdF9pbmZvLT5wbGFu ZSk7IGkrKykgewotCQlzZyA9IHJvdGF0ZV9wYWdlcyhvYmosIHJvdF9pbmZvLT5wbGFuZVtpXS5v ZmZzZXQsCi0JCQkJICByb3RfaW5mby0+cGxhbmVbaV0ud2lkdGgsIHJvdF9pbmZvLT5wbGFuZVtp XS5oZWlnaHQsCi0JCQkJICByb3RfaW5mby0+cGxhbmVbaV0uc3RyaWRlLCBzdCwgc2cpOwotCX0K LQotCXJldHVybiBzdDsKLQotZXJyX3NnX2FsbG9jOgotCWtmcmVlKHN0KTsKLWVycl9zdF9hbGxv YzoKLQotCURSTV9ERUJVR19EUklWRVIoIkZhaWxlZCB0byBjcmVhdGUgcm90YXRlZCBtYXBwaW5n IGZvciBvYmplY3Qgc2l6ZSAlenUhICgldXgldSB0aWxlcywgJXUgcGFnZXMpXG4iLAotCQkJIG9i ai0+YmFzZS5zaXplLCByb3RfaW5mby0+cGxhbmVbMF0ud2lkdGgsIHJvdF9pbmZvLT5wbGFuZVsw XS5oZWlnaHQsIHNpemUpOwotCi0JcmV0dXJuIEVSUl9QVFIocmV0KTsKLX0KLQotc3RhdGljIHN0 cnVjdCBzY2F0dGVybGlzdCAqCi1yZW1hcF9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqLCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCSAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIHVu c2lnbmVkIGludCBoZWlnaHQsCi0JICAgIHVuc2lnbmVkIGludCBzdHJpZGUsCi0JICAgIHN0cnVj dCBzZ190YWJsZSAqc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCi17Ci0JdW5zaWduZWQgaW50 IHJvdzsKLQotCWZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotCQl1bnNpZ25l ZCBpbnQgbGVmdCA9IHdpZHRoICogSTkxNV9HVFRfUEFHRV9TSVpFOwotCi0JCXdoaWxlIChsZWZ0 KSB7Ci0JCQlkbWFfYWRkcl90IGFkZHI7Ci0JCQl1bnNpZ25lZCBpbnQgbGVuZ3RoOwotCi0JCQkv KiBXZSBkb24ndCBuZWVkIHRoZSBwYWdlcywgYnV0IG5lZWQgdG8gaW5pdGlhbGl6ZQotCQkJICog dGhlIGVudHJpZXMgc28gdGhlIHNnIGxpc3QgY2FuIGJlIGhhcHBpbHkgdHJhdmVyc2VkLgotCQkJ ICogVGhlIG9ubHkgdGhpbmcgd2UgbmVlZCBhcmUgRE1BIGFkZHJlc3Nlcy4KLQkJCSAqLwotCi0J CQlhZGRyID0gaTkxNV9nZW1fb2JqZWN0X2dldF9kbWFfYWRkcmVzc19sZW4ob2JqLCBvZmZzZXQs ICZsZW5ndGgpOwotCi0JCQlsZW5ndGggPSBtaW4obGVmdCwgbGVuZ3RoKTsKLQotCQkJc3QtPm5l bnRzKys7Ci0KLQkJCXNnX3NldF9wYWdlKHNnLCBOVUxMLCBsZW5ndGgsIDApOwotCQkJc2dfZG1h X2FkZHJlc3Moc2cpID0gYWRkcjsKLQkJCXNnX2RtYV9sZW4oc2cpID0gbGVuZ3RoOwotCQkJc2cg PSBzZ19uZXh0KHNnKTsKLQotCQkJb2Zmc2V0ICs9IGxlbmd0aCAvIEk5MTVfR1RUX1BBR0VfU0la RTsKLQkJCWxlZnQgLT0gbGVuZ3RoOwotCQl9Ci0KLQkJb2Zmc2V0ICs9IHN0cmlkZSAtIHdpZHRo OwotCX0KLQotCXJldHVybiBzZzsKLX0KLQotc3RhdGljIG5vaW5saW5lIHN0cnVjdCBzZ190YWJs ZSAqCi1pbnRlbF9yZW1hcF9wYWdlcyhzdHJ1Y3QgaW50ZWxfcmVtYXBwZWRfaW5mbyAqcmVtX2lu Zm8sCi0JCSAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQl1bnNpZ25lZCBp bnQgc2l6ZSA9IGludGVsX3JlbWFwcGVkX2luZm9fc2l6ZShyZW1faW5mbyk7Ci0Jc3RydWN0IHNn X3RhYmxlICpzdDsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwotCWludCByZXQgPSAtRU5PTUVN OwotCWludCBpOwotCi0JLyogQWxsb2NhdGUgdGFyZ2V0IFNHIGxpc3QuICovCi0Jc3QgPSBrbWFs bG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0KQotCQlnb3RvIGVycl9zdF9h bGxvYzsKLQotCXJldCA9IHNnX2FsbG9jX3RhYmxlKHN0LCBzaXplLCBHRlBfS0VSTkVMKTsKLQlp ZiAocmV0KQotCQlnb3RvIGVycl9zZ19hbGxvYzsKLQotCXN0LT5uZW50cyA9IDA7Ci0Jc2cgPSBz dC0+c2dsOwotCi0JZm9yIChpID0gMCA7IGkgPCBBUlJBWV9TSVpFKHJlbV9pbmZvLT5wbGFuZSk7 IGkrKykgewotCQlzZyA9IHJlbWFwX3BhZ2VzKG9iaiwgcmVtX2luZm8tPnBsYW5lW2ldLm9mZnNl dCwKLQkJCQkgcmVtX2luZm8tPnBsYW5lW2ldLndpZHRoLCByZW1faW5mby0+cGxhbmVbaV0uaGVp Z2h0LAotCQkJCSByZW1faW5mby0+cGxhbmVbaV0uc3RyaWRlLCBzdCwgc2cpOwotCX0KLQotCWk5 MTVfc2dfdHJpbShzdCk7Ci0KLQlyZXR1cm4gc3Q7Ci0KLWVycl9zZ19hbGxvYzoKLQlrZnJlZShz dCk7Ci1lcnJfc3RfYWxsb2M6Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJGYWlsZWQgdG8gY3JlYXRl IHJlbWFwcGVkIG1hcHBpbmcgZm9yIG9iamVjdCBzaXplICV6dSEgKCV1eCV1IHRpbGVzLCAldSBw YWdlcylcbiIsCi0JCQkgb2JqLT5iYXNlLnNpemUsIHJlbV9pbmZvLT5wbGFuZVswXS53aWR0aCwg cmVtX2luZm8tPnBsYW5lWzBdLmhlaWdodCwgc2l6ZSk7Ci0KLQlyZXR1cm4gRVJSX1BUUihyZXQp OwotfQotCi1zdGF0aWMgbm9pbmxpbmUgc3RydWN0IHNnX3RhYmxlICoKLWludGVsX3BhcnRpYWxf cGFnZXMoY29uc3Qgc3RydWN0IGk5MTVfZ2d0dF92aWV3ICp2aWV3LAotCQkgICAgc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaikKLXsKLQlzdHJ1Y3Qgc2dfdGFibGUgKnN0OwotCXN0cnVj dCBzY2F0dGVybGlzdCAqc2csICppdGVyOwotCXVuc2lnbmVkIGludCBjb3VudCA9IHZpZXctPnBh cnRpYWwuc2l6ZTsKLQl1bnNpZ25lZCBpbnQgb2Zmc2V0OwotCWludCByZXQgPSAtRU5PTUVNOwot Ci0Jc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXN0KQotCQln b3RvIGVycl9zdF9hbGxvYzsKLQotCXJldCA9IHNnX2FsbG9jX3RhYmxlKHN0LCBjb3VudCwgR0ZQ X0tFUk5FTCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfc2dfYWxsb2M7Ci0KLQlpdGVyID0gaTkx NV9nZW1fb2JqZWN0X2dldF9zZyhvYmosIHZpZXctPnBhcnRpYWwub2Zmc2V0LCAmb2Zmc2V0KTsK LQlHRU1fQlVHX09OKCFpdGVyKTsKLQotCXNnID0gc3QtPnNnbDsKLQlzdC0+bmVudHMgPSAwOwot CWRvIHsKLQkJdW5zaWduZWQgaW50IGxlbjsKLQotCQlsZW4gPSBtaW4oaXRlci0+bGVuZ3RoIC0g KG9mZnNldCA8PCBQQUdFX1NISUZUKSwKLQkJCSAgY291bnQgPDwgUEFHRV9TSElGVCk7Ci0JCXNn X3NldF9wYWdlKHNnLCBOVUxMLCBsZW4sIDApOwotCQlzZ19kbWFfYWRkcmVzcyhzZykgPQotCQkJ c2dfZG1hX2FkZHJlc3MoaXRlcikgKyAob2Zmc2V0IDw8IFBBR0VfU0hJRlQpOwotCQlzZ19kbWFf bGVuKHNnKSA9IGxlbjsKLQotCQlzdC0+bmVudHMrKzsKLQkJY291bnQgLT0gbGVuID4+IFBBR0Vf U0hJRlQ7Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlzZ19tYXJrX2VuZChzZyk7Ci0JCQlpOTE1 X3NnX3RyaW0oc3QpOyAvKiBEcm9wIGFueSB1bnVzZWQgdGFpbCBlbnRyaWVzLiAqLwotCi0JCQly ZXR1cm4gc3Q7Ci0JCX0KLQotCQlzZyA9IF9fc2dfbmV4dChzZyk7Ci0JCWl0ZXIgPSBfX3NnX25l eHQoaXRlcik7Ci0JCW9mZnNldCA9IDA7Ci0JfSB3aGlsZSAoMSk7Ci0KLWVycl9zZ19hbGxvYzoK LQlrZnJlZShzdCk7Ci1lcnJfc3RfYWxsb2M6Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKLX0KLQot c3RhdGljIGludAotaTkxNV9nZXRfZ2d0dF92bWFfcGFnZXMoc3RydWN0IGk5MTVfdm1hICp2bWEp Ci17Ci0JaW50IHJldDsKLQotCS8qIFRoZSB2bWEtPnBhZ2VzIGFyZSBvbmx5IHZhbGlkIHdpdGhp biB0aGUgbGlmZXNwYW4gb2YgdGhlIGJvcnJvd2VkCi0JICogb2JqLT5tbS5wYWdlcy4gV2hlbiB0 aGUgb2JqLT5tbS5wYWdlcyBzZ190YWJsZSBpcyByZWdlbmVyYXRlZCwgc28KLQkgKiBtdXN0IGJl IHRoZSB2bWEtPnBhZ2VzLiBBIHNpbXBsZSBydWxlIGlzIHRoYXQgdm1hLT5wYWdlcyBtdXN0IG9u bHkKLQkgKiBiZSBhY2Nlc3NlZCB3aGVuIHRoZSBvYmotPm1tLnBhZ2VzIGFyZSBwaW5uZWQuCi0J ICovCi0JR0VNX0JVR19PTighaTkxNV9nZW1fb2JqZWN0X2hhc19waW5uZWRfcGFnZXModm1hLT5v YmopKTsKLQotCXN3aXRjaCAodm1hLT5nZ3R0X3ZpZXcudHlwZSkgewotCWRlZmF1bHQ6Ci0JCUdF TV9CVUdfT04odm1hLT5nZ3R0X3ZpZXcudHlwZSk7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNh c2UgSTkxNV9HR1RUX1ZJRVdfTk9STUFMOgotCQl2bWEtPnBhZ2VzID0gdm1hLT5vYmotPm1tLnBh Z2VzOwotCQlyZXR1cm4gMDsKLQotCWNhc2UgSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRDoKLQkJdm1h LT5wYWdlcyA9Ci0JCQlpbnRlbF9yb3RhdGVfcGFnZXMoJnZtYS0+Z2d0dF92aWV3LnJvdGF0ZWQs IHZtYS0+b2JqKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEk5MTVfR0dUVF9WSUVXX1JFTUFQUEVEOgot CQl2bWEtPnBhZ2VzID0KLQkJCWludGVsX3JlbWFwX3BhZ2VzKCZ2bWEtPmdndHRfdmlldy5yZW1h cHBlZCwgdm1hLT5vYmopOwotCQlicmVhazsKLQotCWNhc2UgSTkxNV9HR1RUX1ZJRVdfUEFSVElB TDoKLQkJdm1hLT5wYWdlcyA9IGludGVsX3BhcnRpYWxfcGFnZXMoJnZtYS0+Z2d0dF92aWV3LCB2 bWEtPm9iaik7Ci0JCWJyZWFrOwotCX0KLQotCXJldCA9IDA7Ci0JaWYgKElTX0VSUih2bWEtPnBh Z2VzKSkgewotCQlyZXQgPSBQVFJfRVJSKHZtYS0+cGFnZXMpOwotCQl2bWEtPnBhZ2VzID0gTlVM TDsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IHBhZ2VzIGZvciBWTUEgdmlldyB0eXBlICV1 ICglZCkhXG4iLAotCQkJICB2bWEtPmdndHRfdmlldy50eXBlLCByZXQpOwotCX0KLQlyZXR1cm4g cmV0OworCWRtYV91bm1hcF9zZyhrZGV2LCBwYWdlcy0+c2dsLCBwYWdlcy0+bmVudHMsIFBDSV9E TUFfQklESVJFQ1RJT05BTCk7CiB9CiAKIC8qKgpAQCAtMzg0OCw2ICsyOTMsNSBAQCBpbnQgaTkx NV9nZW1fZ3R0X2luc2VydChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKIH0KIAogI2lm IElTX0VOQUJMRUQoQ09ORklHX0RSTV9JOTE1X1NFTEZURVNUKQotI2luY2x1ZGUgInNlbGZ0ZXN0 cy9tb2NrX2d0dC5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9pOTE1X2dlbV9ndHQuYyIKICNlbmRp ZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmggYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9ndHQuaAppbmRleCAzMWE0YTk2ZGRkMGQuLmY2MjI2 ZGY5Zjk3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgK KysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZ3R0LmgKQEAgLTEsNjM5ICsxLDIx IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUICovCiAvKgotICogQ29weXJpZ2h0 IMKpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24KLSAqCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAot ICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJz b25zIHRvIHdob20gdGhlCi0gKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1Ympl Y3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBhYm92ZSBjb3B5cmln aHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQK LSAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucyBvZiB0aGUKLSAqIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJ UyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNT IE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAotICogVEhFIEFVVEhP UlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKLSAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCi0gKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCi0gKiBJ TiBUSEUgU09GVFdBUkUuCi0gKgotICogUGxlYXNlIHRyeSB0byBtYWludGFpbiB0aGUgZm9sbG93 aW5nIG9yZGVyIHdpdGhpbiB0aGlzIGZpbGUgdW5sZXNzIGl0IG1ha2VzCi0gKiBzZW5zZSB0byBk byBvdGhlcndpc2UuIEZyb20gdG9wIHRvIGJvdHRvbToKLSAqIDEuIHR5cGVkZWZzCi0gKiAyLiAj ZGVmaW5lcywgYW5kIG1hY3JvcwotICogMy4gc3RydWN0dXJlIGRlZmluaXRpb25zCi0gKiA0LiBm dW5jdGlvbiBwcm90b3R5cGVzCi0gKgotICogV2l0aGluIGVhY2ggc2VjdGlvbiwgcGxlYXNlIHRy eSB0byBvcmRlciBieSBnZW5lcmF0aW9uIGluIGFzY2VuZGluZyBvcmRlciwKLSAqIGZyb20gdG9w IHRvIGJvdHRvbSAoaWUuIGdlbjYgb24gdGhlIHRvcCwgZ2VuOCBvbiB0aGUgYm90dG9tKS4KKyAq IENvcHlyaWdodCDCqSAyMDIwIEludGVsIENvcnBvcmF0aW9uCiAgKi8KIAogI2lmbmRlZiBfX0k5 MTVfR0VNX0dUVF9IX18KICNkZWZpbmUgX19JOTE1X0dFTV9HVFRfSF9fCiAKICNpbmNsdWRlIDxs aW51eC9pby1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgva3JlZi5oPgotI2luY2x1ZGUgPGxp bnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgotI2luY2x1ZGUgPGxpbnV4L3dv cmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNpbmNsdWRlIDxkcm0vZHJt X21tLmg+CiAKLSNpbmNsdWRlICJndC9pbnRlbF9yZXNldC5oIgotI2luY2x1ZGUgImk5MTVfZ2Vt X2ZlbmNlX3JlZy5oIgotI2luY2x1ZGUgImk5MTVfcmVxdWVzdC5oIgorI2luY2x1ZGUgImd0L2lu dGVsX2d0dC5oIgogI2luY2x1ZGUgImk5MTVfc2NhdHRlcmxpc3QuaCIKLSNpbmNsdWRlICJpOTE1 X3NlbGZ0ZXN0LmgiCi0jaW5jbHVkZSAiZ3QvaW50ZWxfdGltZWxpbmUuaCIKIAotI2RlZmluZSBJ OTE1X0dUVF9QQUdFX1NJWkVfNEsJQklUX1VMTCgxMikKLSNkZWZpbmUgSTkxNV9HVFRfUEFHRV9T SVpFXzY0SwlCSVRfVUxMKDE2KQotI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJWkVfMk0JQklUX1VM TCgyMSkKLQotI2RlZmluZSBJOTE1X0dUVF9QQUdFX1NJWkUgSTkxNV9HVFRfUEFHRV9TSVpFXzRL Ci0jZGVmaW5lIEk5MTVfR1RUX01BWF9QQUdFX1NJWkUgSTkxNV9HVFRfUEFHRV9TSVpFXzJNCi0K LSNkZWZpbmUgSTkxNV9HVFRfUEFHRV9NQVNLIC1JOTE1X0dUVF9QQUdFX1NJWkUKLQotI2RlZmlu ZSBJOTE1X0dUVF9NSU5fQUxJR05NRU5UIEk5MTVfR1RUX1BBR0VfU0laRQotCi0jZGVmaW5lIEk5 MTVfRkVOQ0VfUkVHX05PTkUgLTEKLSNkZWZpbmUgSTkxNV9NQVhfTlVNX0ZFTkNFUyAzMgotLyog MzIgZmVuY2VzICsgc2lnbiBiaXQgZm9yIEZFTkNFX1JFR19OT05FICovCi0jZGVmaW5lIEk5MTVf TUFYX05VTV9GRU5DRV9CSVRTIDYKLQotc3RydWN0IGRybV9pOTE1X2ZpbGVfcHJpdmF0ZTsKIHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0Owotc3RydWN0IGk5MTVfdm1hOwotc3RydWN0IGludGVs X2d0OwotCi10eXBlZGVmIHUzMiBnZW42X3B0ZV90OwotdHlwZWRlZiB1NjQgZ2VuOF9wdGVfdDsK LQotI2RlZmluZSBnZ3R0X3RvdGFsX2VudHJpZXMoZ2d0dCkgKChnZ3R0KS0+dm0udG90YWwgPj4g UEFHRV9TSElGVCkKLQotLyogZ2VuNi1oc3cgaGFzIGJpdCAxMS00IGZvciBwaHlzaWNhbCBhZGRy IGJpdCAzOS0zMiAqLwotI2RlZmluZSBHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQkoKGFkZHIp IHwgKCgoYWRkcikgPj4gMjgpICYgMHhmZjApKQotI2RlZmluZSBHRU42X1BURV9BRERSX0VOQ09E RShhZGRyKQlHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQotI2RlZmluZSBHRU42X1BERV9BRERS X0VOQ09ERShhZGRyKQlHRU42X0dUVF9BRERSX0VOQ09ERShhZGRyKQotI2RlZmluZSBHRU42X1BU RV9DQUNIRV9MTEMJCSgyIDw8IDEpCi0jZGVmaW5lIEdFTjZfUFRFX1VOQ0FDSEVECQkoMSA8PCAx KQotI2RlZmluZSBHRU42X1BURV9WQUxJRAkJCSgxIDw8IDApCi0KLSNkZWZpbmUgSTkxNV9QVEVT KHB0ZV9sZW4pCQkoKHVuc2lnbmVkIGludCkoUEFHRV9TSVpFIC8gKHB0ZV9sZW4pKSkKLSNkZWZp bmUgSTkxNV9QVEVfTUFTSyhwdGVfbGVuKQkJKEk5MTVfUFRFUyhwdGVfbGVuKSAtIDEpCi0jZGVm aW5lIEk5MTVfUERFUwkJCTUxMgotI2RlZmluZSBJOTE1X1BERV9NQVNLCQkJKEk5MTVfUERFUyAt IDEpCi0jZGVmaW5lIE5VTV9QVEUocGRlX3NoaWZ0KSAgICAgKDEgPDwgKHBkZV9zaGlmdCAtIFBB R0VfU0hJRlQpKQotCi0jZGVmaW5lIEdFTjZfUFRFUwkJCUk5MTVfUFRFUyhzaXplb2YoZ2VuNl9w dGVfdCkpCi0jZGVmaW5lIEdFTjZfUERfU0laRQkJICAgICAgICAoSTkxNV9QREVTICogUEFHRV9T SVpFKQotI2RlZmluZSBHRU42X1BEX0FMSUdOCQkJKFBBR0VfU0laRSAqIDE2KQotI2RlZmluZSBH RU42X1BERV9TSElGVAkJCTIyCi0jZGVmaW5lIEdFTjZfUERFX1ZBTElECQkJKDEgPDwgMCkKLQot I2RlZmluZSBHRU43X1BURV9DQUNIRV9MM19MTEMJCSgzIDw8IDEpCi0KLSNkZWZpbmUgQllUX1BU RV9TTk9PUEVEX0JZX0NQVV9DQUNIRVMJKDEgPDwgMikKLSNkZWZpbmUgQllUX1BURV9XUklURUFC TEUJCSgxIDw8IDEpCi0KLS8qIENhY2hlYWJpbGl0eSBDb250cm9sIGlzIGEgNC1iaXQgdmFsdWUu IFRoZSBsb3cgdGhyZWUgYml0cyBhcmUgc3RvcmVkIGluIGJpdHMKLSAqIDM6MSBvZiB0aGUgUFRF LCB3aGlsZSB0aGUgZm91cnRoIGJpdCBpcyBzdG9yZWQgaW4gYml0IDExIG9mIHRoZSBQVEUuCi0g Ki8KLSNkZWZpbmUgSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKGJpdHMpCSgoKChiaXRzKSAmIDB4 NykgPDwgMSkgfCBcCi0JCQkJCSAoKChiaXRzKSAmIDB4OCkgPDwgKDExIC0gMykpKQotI2RlZmlu ZSBIU1dfV0JfTExDX0FHRTMJCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHgyKQotI2RlZmlu ZSBIU1dfV0JfTExDX0FHRTAJCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0woMHgzKQotI2RlZmlu ZSBIU1dfV0JfRUxMQ19MTENfQUdFMwkJSFNXX0NBQ0hFQUJJTElUWV9DT05UUk9MKDB4OCkKLSNk ZWZpbmUgSFNXX1dCX0VMTENfTExDX0FHRTAJCUhTV19DQUNIRUFCSUxJVFlfQ09OVFJPTCgweGIp Ci0jZGVmaW5lIEhTV19XVF9FTExDX0xMQ19BR0UzCQlIU1dfQ0FDSEVBQklMSVRZX0NPTlRST0wo MHg3KQotI2RlZmluZSBIU1dfV1RfRUxMQ19MTENfQUdFMAkJSFNXX0NBQ0hFQUJJTElUWV9DT05U Uk9MKDB4NikKLSNkZWZpbmUgSFNXX1BURV9VTkNBQ0hFRAkJKDApCi0jZGVmaW5lIEhTV19HVFRf QUREUl9FTkNPREUoYWRkcikJKChhZGRyKSB8ICgoKGFkZHIpID4+IDI4KSAmIDB4N2YwKSkKLSNk ZWZpbmUgSFNXX1BURV9BRERSX0VOQ09ERShhZGRyKQlIU1dfR1RUX0FERFJfRU5DT0RFKGFkZHIp Ci0KLS8qCi0gKiBHRU44IDMyYiBzdHlsZSBhZGRyZXNzIGlzIGRlZmluZWQgYXMgYSAzIGxldmVs IHBhZ2UgdGFibGU6Ci0gKiAzMTozMCB8IDI5OjIxIHwgMjA6MTIgfCAgMTE6MAotICogUERQRSAg fCAgUERFICB8ICBQVEUgIHwgb2Zmc2V0Ci0gKiBUaGUgZGlmZmVyZW5jZSBhcyBjb21wYXJlZCB0 byBub3JtYWwgeDg2IDMgbGV2ZWwgcGFnZSB0YWJsZSBpcyB0aGUgUERQRXMgYXJlCi0gKiBwcm9n cmFtbWVkIHZpYSByZWdpc3Rlci4KLSAqCi0gKiBHRU44IDQ4YiBzdHlsZSBhZGRyZXNzIGlzIGRl ZmluZWQgYXMgYSA0IGxldmVsIHBhZ2UgdGFibGU6Ci0gKiA0NzozOSB8IDM4OjMwIHwgMjk6MjEg fCAyMDoxMiB8ICAxMTowCi0gKiBQTUw0RSB8IFBEUEUgIHwgIFBERSAgfCAgUFRFICB8IG9mZnNl dAotICovCi0jZGVmaW5lIEdFTjhfM0xWTF9QRFBFUwkJCTQKLQotI2RlZmluZSBQUEFUX1VOQ0FD SEVECQkJKF9QQUdFX1BXVCB8IF9QQUdFX1BDRCkKLSNkZWZpbmUgUFBBVF9DQUNIRURfUERFCQkJ MCAvKiBXQiBMTEMgKi8KLSNkZWZpbmUgUFBBVF9DQUNIRUQJCQlfUEFHRV9QQVQgLyogV0IgTExD ZUxMQyAqLwotI2RlZmluZSBQUEFUX0RJU1BMQVlfRUxMQwkJX1BBR0VfUENEIC8qIFdUIGVMTEMg Ki8KLQotI2RlZmluZSBDSFZfUFBBVF9TTk9PUAkJCSgxPDw2KQotI2RlZmluZSBHRU44X1BQQVRf QUdFKHgpCQkoKHgpPDw0KQotI2RlZmluZSBHRU44X1BQQVRfTExDZUxMQwkJKDM8PDIpCi0jZGVm aW5lIEdFTjhfUFBBVF9MTENFTExDCQkoMjw8MikKLSNkZWZpbmUgR0VOOF9QUEFUX0xMQwkJCSgx PDwyKQotI2RlZmluZSBHRU44X1BQQVRfV0IJCQkoMzw8MCkKLSNkZWZpbmUgR0VOOF9QUEFUX1dU CQkJKDI8PDApCi0jZGVmaW5lIEdFTjhfUFBBVF9XQwkJCSgxPDwwKQotI2RlZmluZSBHRU44X1BQ QVRfVUMJCQkoMDw8MCkKLSNkZWZpbmUgR0VOOF9QUEFUX0VMTENfT1ZFUlJJREUJCSgwPDwyKQot I2RlZmluZSBHRU44X1BQQVQoaSwgeCkJCQkoKHU2NCkoeCkgPDwgKChpKSAqIDgpKQotCi0jZGVm aW5lIEdFTjhfUERFX0lQU182NEsgQklUKDExKQotI2RlZmluZSBHRU44X1BERV9QU18yTSAgIEJJ VCg3KQotCi0jZGVmaW5lIGZvcl9lYWNoX3NndF9kYWRkcihfX2RwLCBfX2l0ZXIsIF9fc2d0KSBc Ci0JX19mb3JfZWFjaF9zZ3RfZGFkZHIoX19kcCwgX19pdGVyLCBfX3NndCwgSTkxNV9HVFRfUEFH RV9TSVpFKQotCi1zdHJ1Y3QgaW50ZWxfcmVtYXBwZWRfcGxhbmVfaW5mbyB7Ci0JLyogaW4gZ3R0 IHBhZ2VzICovCi0JdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgb2Zmc2V0Owot fSBfX3BhY2tlZDsKLQotc3RydWN0IGludGVsX3JlbWFwcGVkX2luZm8gewotCXN0cnVjdCBpbnRl bF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOwotCXVuc2lnbmVkIGludCB1bnVzZWRfbWJ6 OwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGludGVsX3JvdGF0aW9uX2luZm8gewotCXN0cnVjdCBp bnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0 IGludGVsX3BhcnRpYWxfaW5mbyB7Ci0JdTY0IG9mZnNldDsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsK LX0gX19wYWNrZWQ7Ci0KLWVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSB7Ci0JSTkxNV9HR1RUX1ZJ RVdfTk9STUFMID0gMCwKLQlJOTE1X0dHVFRfVklFV19ST1RBVEVEID0gc2l6ZW9mKHN0cnVjdCBp bnRlbF9yb3RhdGlvbl9pbmZvKSwKLQlJOTE1X0dHVFRfVklFV19QQVJUSUFMID0gc2l6ZW9mKHN0 cnVjdCBpbnRlbF9wYXJ0aWFsX2luZm8pLAotCUk5MTVfR0dUVF9WSUVXX1JFTUFQUEVEID0gc2l6 ZW9mKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9p ZCBhc3NlcnRfaTkxNV9nZW1fZ3R0X3R5cGVzKHZvaWQpCi17Ci0JQlVJTERfQlVHX09OKHNpemVv ZihzdHJ1Y3QgaW50ZWxfcm90YXRpb25faW5mbykgIT0gOCpzaXplb2YodW5zaWduZWQgaW50KSk7 Ci0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW50ZWxfcGFydGlhbF9pbmZvKSAhPSBzaXpl b2YodTY0KSArIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKLQlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0 cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSAhPSA5KnNpemVvZih1bnNpZ25lZCBpbnQpKTsKLQot CS8qIENoZWNrIHRoYXQgcm90YXRpb24vcmVtYXBwZWQgc2hhcmVzIG9mZnNldHMgZm9yIHNpbXBs aWNpdHkgKi8KLQlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGludGVsX3JlbWFwcGVkX2lu Zm8sIHBsYW5lWzBdKSAhPQotCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpbnRlbF9yb3RhdGlvbl9p bmZvLCBwbGFuZVswXSkpOwotCUJVSUxEX0JVR19PTihvZmZzZXRvZmVuZChzdHJ1Y3QgaW50ZWxf cmVtYXBwZWRfaW5mbywgcGxhbmVbMV0pICE9Ci0JCSAgICAgb2Zmc2V0b2ZlbmQoc3RydWN0IGlu dGVsX3JvdGF0aW9uX2luZm8sIHBsYW5lWzFdKSk7Ci0KLQkvKiBBcyB3ZSBlbmNvZGUgdGhlIHNp emUgb2YgZWFjaCBicmFuY2ggaW5zaWRlIHRoZSB1bmlvbiBpbnRvIGl0cyB0eXBlLAotCSAqIHdl IGhhdmUgdG8gYmUgY2FyZWZ1bCB0aGF0IGVhY2ggYnJhbmNoIGhhcyBhIHVuaXF1ZSBzaXplLgot CSAqLwotCXN3aXRjaCAoKGVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSkwKSB7Ci0JY2FzZSBJOTE1 X0dHVFRfVklFV19OT1JNQUw6Ci0JY2FzZSBJOTE1X0dHVFRfVklFV19QQVJUSUFMOgotCWNhc2Ug STkxNV9HR1RUX1ZJRVdfUk9UQVRFRDoKLQljYXNlIEk5MTVfR0dUVF9WSUVXX1JFTUFQUEVEOgot CQkvKiBnY2MgY29tcGxhaW5zIGlmIHRoZXNlIGFyZSBpZGVudGljYWwgY2FzZXMgKi8KLQkJYnJl YWs7Ci0JfQotfQotCi1zdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgewotCWVudW0gaTkxNV9nZ3R0X3Zp ZXdfdHlwZSB0eXBlOwotCXVuaW9uIHsKLQkJLyogTWVtYmVycyBuZWVkIHRvIGNvbnRhaW4gbm8g aG9sZXMvcGFkZGluZyAqLwotCQlzdHJ1Y3QgaW50ZWxfcGFydGlhbF9pbmZvIHBhcnRpYWw7Ci0J CXN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvIHJvdGF0ZWQ7Ci0JCXN0cnVjdCBpbnRlbF9yZW1h cHBlZF9pbmZvIHJlbWFwcGVkOwotCX07Ci19OwotCi1lbnVtIGk5MTVfY2FjaGVfbGV2ZWw7Ci0K LXN0cnVjdCBpOTE1X3ZtYTsKLQotc3RydWN0IGk5MTVfcGFnZV9kbWEgewotCXN0cnVjdCBwYWdl ICpwYWdlOwotCXVuaW9uIHsKLQkJZG1hX2FkZHJfdCBkYWRkcjsKLQotCQkvKiBGb3IgZ2VuNi9n ZW43IG9ubHkuIFRoaXMgaXMgdGhlIG9mZnNldCBpbiB0aGUgR0dUVAotCQkgKiB3aGVyZSB0aGUg cGFnZSBkaXJlY3RvcnkgZW50cmllcyBmb3IgUFBHVFQgYmVnaW4KLQkJICovCi0JCXUzMiBnZ3R0 X29mZnNldDsKLQl9OwotfTsKLQotc3RydWN0IGk5MTVfcGFnZV9zY3JhdGNoIHsKLQlzdHJ1Y3Qg aTkxNV9wYWdlX2RtYSBiYXNlOwotCXU2NCBlbmNvZGU7Ci19OwotCi1zdHJ1Y3QgaTkxNV9wYWdl X3RhYmxlIHsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSBiYXNlOwotCWF0b21pY190IHVzZWQ7Ci19 OwotCi1zdHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSB7Ci0Jc3RydWN0IGk5MTVfcGFnZV90YWJs ZSBwdDsKLQlzcGlubG9ja190IGxvY2s7Ci0Jdm9pZCAqZW50cnlbNTEyXTsKLX07Ci0KLSNkZWZp bmUgX19weF9jaG9vc2VfZXhwcih4LCB0eXBlLCBleHByLCBvdGhlcikgXAotCV9fYnVpbHRpbl9j aG9vc2VfZXhwciggXAotCV9fYnVpbHRpbl90eXBlc19jb21wYXRpYmxlX3AodHlwZW9mKHgpLCB0 eXBlKSB8fCBcCi0JX19idWlsdGluX3R5cGVzX2NvbXBhdGlibGVfcCh0eXBlb2YoeCksIGNvbnN0 IHR5cGUpLCBcCi0JKHsgdHlwZSBfX3ggPSAodHlwZSkoeCk7IGV4cHI7IH0pLCBcCi0Jb3RoZXIp Ci0KLSNkZWZpbmUgcHhfYmFzZShweCkgXAotCV9fcHhfY2hvb3NlX2V4cHIocHgsIHN0cnVjdCBp OTE1X3BhZ2VfZG1hICosIF9feCwgXAotCV9fcHhfY2hvb3NlX2V4cHIocHgsIHN0cnVjdCBpOTE1 X3BhZ2Vfc2NyYXRjaCAqLCAmX194LT5iYXNlLCBcCi0JX19weF9jaG9vc2VfZXhwcihweCwgc3Ry dWN0IGk5MTVfcGFnZV90YWJsZSAqLCAmX194LT5iYXNlLCBcCi0JX19weF9jaG9vc2VfZXhwcihw eCwgc3RydWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiwgJl9feC0+cHQuYmFzZSwgXAotCSh2b2lk KTApKSkpCi0jZGVmaW5lIHB4X2RtYShweCkgKHB4X2Jhc2UocHgpLT5kYWRkcikKLQotI2RlZmlu ZSBweF9wdChweCkgXAotCV9fcHhfY2hvb3NlX2V4cHIocHgsIHN0cnVjdCBpOTE1X3BhZ2VfdGFi bGUgKiwgX194LCBcCi0JX19weF9jaG9vc2VfZXhwcihweCwgc3RydWN0IGk5MTVfcGFnZV9kaXJl Y3RvcnkgKiwgJl9feC0+cHQsIFwKLQkodm9pZCkwKSkKLSNkZWZpbmUgcHhfdXNlZChweCkgKCZw eF9wdChweCktPnVzZWQpCi0KLXN0cnVjdCBpOTE1X3ZtYV9vcHMgewotCS8qIE1hcCBhbiBvYmpl Y3QgaW50byBhbiBhZGRyZXNzIHNwYWNlIHdpdGggdGhlIGdpdmVuIGNhY2hlIGZsYWdzLiAqLwot CWludCAoKmJpbmRfdm1hKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCWVudW0gaTkxNV9jYWNo ZV9sZXZlbCBjYWNoZV9sZXZlbCwKLQkJCXUzMiBmbGFncyk7Ci0JLyoKLQkgKiBVbm1hcCBhbiBv YmplY3QgZnJvbSBhbiBhZGRyZXNzIHNwYWNlLiBUaGlzIHVzdWFsbHkgY29uc2lzdHMgb2YKLQkg KiBzZXR0aW5nIHRoZSB2YWxpZCBQVEUgZW50cmllcyB0byBhIHJlc2VydmVkIHNjcmF0Y2ggcGFn ZS4KLQkgKi8KLQl2b2lkICgqdW5iaW5kX3ZtYSkoc3RydWN0IGk5MTVfdm1hICp2bWEpOwotCi0J aW50ICgqc2V0X3BhZ2VzKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7Ci0Jdm9pZCAoKmNsZWFyX3Bh Z2VzKShzdHJ1Y3QgaTkxNV92bWEgKnZtYSk7Ci19OwotCi1zdHJ1Y3QgcGFnZXN0YXNoIHsKLQlz cGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHBhZ2V2ZWMgcHZlYzsKLX07Ci0KLXN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgewotCXN0cnVjdCBrcmVmIHJlZjsKLQlzdHJ1Y3QgcmN1X3dvcmsgcmN1 OwotCi0Jc3RydWN0IGRybV9tbSBtbTsKLQlzdHJ1Y3QgaW50ZWxfZ3QgKmd0OwotCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1OwotCXN0cnVjdCBkZXZpY2UgKmRtYTsKLQkvKiBFdmVyeSBh ZGRyZXNzIHNwYWNlIGJlbG9uZ3MgdG8gYSBzdHJ1Y3QgZmlsZSAtIGV4Y2VwdCBmb3IgdGhlIGds b2JhbAotCSAqIEdUVCB0aGF0IGlzIG93bmVkIGJ5IHRoZSBkcml2ZXIgKGFuZCBzbyBAZmlsZSBp cyBzZXQgdG8gTlVMTCkuIEluCi0JICogcHJpbmNpcGxlLCBubyBpbmZvcm1hdGlvbiBzaG91bGQg bGVhayBmcm9tIG9uZSBjb250ZXh0IHRvIGFub3RoZXIKLQkgKiAob3IgYmV0d2VlbiBmaWxlcy9w cm9jZXNzZXMgZXRjKSB1bmxlc3MgZXhwbGljaXRseSBzaGFyZWQgYnkgdGhlCi0JICogb3duZXIu IFRyYWNraW5nIHRoZSBvd25lciBpcyBpbXBvcnRhbnQgaW4gb3JkZXIgdG8gZnJlZSB1cCBwZXIt ZmlsZQotCSAqIG9iamVjdHMgYWxvbmcgd2l0aCB0aGUgZmlsZSwgdG8gYWlkZSByZXNvdXJjZSB0 cmFja2luZywgYW5kIHRvCi0JICogYXNzaWduIGJsYW1lLgotCSAqLwotCXN0cnVjdCBkcm1faTkx NV9maWxlX3ByaXZhdGUgKmZpbGU7Ci0JdTY0IHRvdGFsOwkJLyogc2l6ZSBhZGRyIHNwYWNlIG1h cHMgKGV4LiAyR0IgZm9yIGdndHQpICovCi0JdTY0IHJlc2VydmVkOwkJLyogc2l6ZSBhZGRyIHNw YWNlIHJlc2VydmVkICovCi0KLQl1bnNpZ25lZCBpbnQgYmluZF9hc3luY19mbGFnczsKLQotCS8q Ci0JICogRWFjaCBhY3RpdmUgdXNlciBjb250ZXh0IGhhcyBpdHMgb3duIGFkZHJlc3Mgc3BhY2Ug KGluIGZ1bGwtcHBndHQpLgotCSAqIFNpbmNlIHRoZSB2bSBtYXkgYmUgc2hhcmVkIGJldHdlZW4g bXVsdGlwbGUgY29udGV4dHMsIHdlIGNvdW50IGhvdwotCSAqIG1hbnkgY29udGV4dHMga2VlcCB1 cyAib3BlbiIuIE9uY2Ugb3BlbiBoaXRzIHplcm8sIHdlIGFyZSBjbG9zZWQKLQkgKiBhbmQgZG8g bm90IGFsbG93IGFueSBuZXcgYXR0YWNobWVudHMsIGFuZCBwcm9jZWVkIHRvIHNodXRkb3duIG91 cgotCSAqIHZtYSBhbmQgcGFnZSBkaXJlY3Rvcmllcy4KLQkgKi8KLQlhdG9taWNfdCBvcGVuOwot Ci0Jc3RydWN0IG11dGV4IG11dGV4OyAvKiBwcm90ZWN0cyB2bWEgYW5kIG91ciBsaXN0cyAqLwot I2RlZmluZSBWTV9DTEFTU19HR1RUIDAKLSNkZWZpbmUgVk1fQ0xBU1NfUFBHVFQgMQotCi0Jc3Ry dWN0IGk5MTVfcGFnZV9zY3JhdGNoIHNjcmF0Y2hbNF07Ci0JdW5zaWduZWQgaW50IHNjcmF0Y2hf b3JkZXI7Ci0JdW5zaWduZWQgaW50IHRvcDsKLQotCS8qKgotCSAqIExpc3Qgb2Ygdm1hIGN1cnJl bnRseSBib3VuZC4KLQkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGJvdW5kX2xpc3Q7Ci0KLQlzdHJ1 Y3QgcGFnZXN0YXNoIGZyZWVfcGFnZXM7Ci0KLQkvKiBHbG9iYWwgR1RUICovCi0JYm9vbCBpc19n Z3R0OjE7Ci0KLQkvKiBTb21lIHN5c3RlbXMgcmVxdWlyZSB1bmNhY2hlZCB1cGRhdGVzIG9mIHRo ZSBwYWdlIGRpcmVjdG9yaWVzICovCi0JYm9vbCBwdF9rbWFwX3djOjE7Ci0KLQkvKiBTb21lIHN5 c3RlbXMgc3VwcG9ydCByZWFkLW9ubHkgbWFwcGluZ3MgZm9yIEdHVFQgYW5kL29yIFBQR1RUICov Ci0JYm9vbCBoYXNfcmVhZF9vbmx5OjE7Ci0KLQl1NjQgKCpwdGVfZW5jb2RlKShkbWFfYWRkcl90 IGFkZHIsCi0JCQkgIGVudW0gaTkxNV9jYWNoZV9sZXZlbCBsZXZlbCwKLQkJCSAgdTMyIGZsYWdz KTsgLyogQ3JlYXRlIGEgdmFsaWQgUFRFICovCi0jZGVmaW5lIFBURV9SRUFEX09OTFkJKDE8PDAp Ci0KLQlpbnQgKCphbGxvY2F0ZV92YV9yYW5nZSkoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq dm0sCi0JCQkJIHU2NCBzdGFydCwgdTY0IGxlbmd0aCk7Ci0Jdm9pZCAoKmNsZWFyX3JhbmdlKShz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAgICB1NjQgc3RhcnQsIHU2NCBsZW5n dGgpOwotCXZvaWQgKCppbnNlcnRfcGFnZSkoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0s Ci0JCQkgICAgZG1hX2FkZHJfdCBhZGRyLAotCQkJICAgIHU2NCBvZmZzZXQsCi0JCQkgICAgZW51 bSBpOTE1X2NhY2hlX2xldmVsIGNhY2hlX2xldmVsLAotCQkJICAgIHUzMiBmbGFncyk7Ci0Jdm9p ZCAoKmluc2VydF9lbnRyaWVzKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKLQkJCSAg ICAgICBzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKLQkJCSAgICAgICBlbnVtIGk5MTVfY2FjaGVfbGV2 ZWwgY2FjaGVfbGV2ZWwsCi0JCQkgICAgICAgdTMyIGZsYWdzKTsKLQl2b2lkICgqY2xlYW51cCko c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0pOwotCi0Jc3RydWN0IGk5MTVfdm1hX29wcyB2 bWFfb3BzOwotCi0JSTkxNV9TRUxGVEVTVF9ERUNMQVJFKHN0cnVjdCBmYXVsdF9hdHRyIGZhdWx0 X2F0dHIpOwotCUk5MTVfU0VMRlRFU1RfREVDTEFSRShib29sIHNjcnViXzY0Syk7Ci19OwotCi0j ZGVmaW5lIGk5MTVfaXNfZ2d0dCh2bSkgKCh2bSktPmlzX2dndHQpCi0KLXN0YXRpYyBpbmxpbmUg Ym9vbAotaTkxNV92bV9pc180bHZsKGNvbnN0IHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZt KQotewotCXJldHVybiAodm0tPnRvdGFsIC0gMSkgPj4gMzI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg Ym9vbAotaTkxNV92bV9oYXNfc2NyYXRjaF82NEsoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAq dm0pCi17Ci0JcmV0dXJuIHZtLT5zY3JhdGNoX29yZGVyID09IGdldF9vcmRlcihJOTE1X0dUVF9Q QUdFX1NJWkVfNjRLKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X3ZtX2hhc19jYWNo ZV9jb2xvcmluZyhzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlyZXR1cm4gaTkx NV9pc19nZ3R0KHZtKSAmJiB2bS0+bW0uY29sb3JfYWRqdXN0OwotfQotCi0vKiBUaGUgR3JhcGhp Y3MgVHJhbnNsYXRpb24gVGFibGUgaXMgdGhlIHdheSBpbiB3aGljaCBHRU4gaGFyZHdhcmUgdHJh bnNsYXRlcyBhCi0gKiBHcmFwaGljcyBWaXJ0dWFsIEFkZHJlc3MgaW50byBhIFBoeXNpY2FsIEFk ZHJlc3MuIEluIGFkZGl0aW9uIHRvIHRoZSBub3JtYWwKLSAqIGNvbGxhdGVyYWwgYXNzb2NpYXRl ZCB3aXRoIGFueSB2YS0+cGEgdHJhbnNsYXRpb25zIEdFTiBoYXJkd2FyZSBhbHNvIGhhcyBhCi0g KiBwb3J0aW9uIG9mIHRoZSBHVFQgd2hpY2ggY2FuIGJlIG1hcHBlZCBieSB0aGUgQ1BVIGFuZCBy ZW1haW4gYm90aCBjb2hlcmVudAotICogYW5kIGNvcnJlY3QgKGluIGNhc2VzIGxpa2Ugc3dpenps aW5nKS4gVGhhdCByZWdpb24gaXMgcmVmZXJyZWQgdG8gYXMgR01BRFIgaW4KLSAqIHRoZSBzcGVj LgotICovCi1zdHJ1Y3QgaTkxNV9nZ3R0IHsKLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlIHZt OwotCi0Jc3RydWN0IGlvX21hcHBpbmcgaW9tYXA7CS8qIE1hcHBpbmcgdG8gb3VyIENQVSBtYXBw YWJsZSByZWdpb24gKi8KLQlzdHJ1Y3QgcmVzb3VyY2UgZ21hZHI7ICAgICAgICAgIC8qIEdNQURS IHJlc291cmNlICovCi0JcmVzb3VyY2Vfc2l6ZV90IG1hcHBhYmxlX2VuZDsJLyogRW5kIG9mZnNl dCB0aGF0IHdlIGNhbiBDUFUgbWFwICovCi0KLQkvKiogIkdyYXBoaWNzIFN0b2xlbiBNZW1vcnki IGhvbGRzIHRoZSBnbG9iYWwgUFRFcyAqLwotCXZvaWQgX19pb21lbSAqZ3NtOwotCXZvaWQgKCpp bnZhbGlkYXRlKShzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KTsKLQotCS8qKiBQUEdUVCB1c2VkIGZv ciBhbGlhc2luZyB0aGUgUFBHVFQgd2l0aCB0aGUgR1RUICovCi0Jc3RydWN0IGk5MTVfcHBndHQg KmFsaWFzOwotCi0JYm9vbCBkb19pZGxlX21hcHM7Ci0KLQlpbnQgbXRycjsKLQotCS8qKiBCaXQg NiBzd2l6emxpbmcgcmVxdWlyZWQgZm9yIFggdGlsaW5nICovCi0JdTMyIGJpdF82X3N3aXp6bGVf eDsKLQkvKiogQml0IDYgc3dpenpsaW5nIHJlcXVpcmVkIGZvciBZIHRpbGluZyAqLwotCXUzMiBi aXRfNl9zd2l6emxlX3k7Ci0KLQl1MzIgcGluX2JpYXM7Ci0KLQl1bnNpZ25lZCBpbnQgbnVtX2Zl bmNlczsKLQlzdHJ1Y3QgaTkxNV9mZW5jZV9yZWcgZmVuY2VfcmVnc1tJOTE1X01BWF9OVU1fRkVO Q0VTXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZlbmNlX2xpc3Q7Ci0KLQkvKiogTGlzdCBvZiBhbGwg b2JqZWN0cyBpbiBndHRfc3BhY2UsIGN1cnJlbnRseSBtbWFwZWQgYnkgdXNlcnNwYWNlLgotCSAq IEFsbCBvYmplY3RzIHdpdGhpbiB0aGlzIGxpc3QgbXVzdCBhbHNvIGJlIG9uIGJvdW5kX2xpc3Qu Ci0JICovCi0Jc3RydWN0IGxpc3RfaGVhZCB1c2VyZmF1bHRfbGlzdDsKLQotCS8qIE1hbnVhbCBy dW50aW1lIHBtIGF1dG9zdXNwZW5kIGRlbGF5IGZvciB1c2VyIEdHVFQgbW1hcHMgKi8KLQlzdHJ1 Y3QgaW50ZWxfd2FrZXJlZl9hdXRvIHVzZXJmYXVsdF93YWtlcmVmOwotCi0Jc3RydWN0IGRybV9t bV9ub2RlIGVycm9yX2NhcHR1cmU7Ci0Jc3RydWN0IGRybV9tbV9ub2RlIHVjX2Z3OwotfTsKLQot c3RydWN0IGk5MTVfcHBndHQgewotCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ugdm07Ci0KLQlz dHJ1Y3QgaTkxNV9wYWdlX2RpcmVjdG9yeSAqcGQ7Ci19OwotCi1zdHJ1Y3QgZ2VuNl9wcGd0dCB7 Ci0Jc3RydWN0IGk5MTVfcHBndHQgYmFzZTsKLQotCXN0cnVjdCBtdXRleCBmbHVzaDsKLQlzdHJ1 Y3QgaTkxNV92bWEgKnZtYTsKLQlnZW42X3B0ZV90IF9faW9tZW0gKnBkX2FkZHI7Ci0KLQlhdG9t aWNfdCBwaW5fY291bnQ7Ci0Jc3RydWN0IG11dGV4IHBpbl9tdXRleDsKLQotCWJvb2wgc2Nhbl9m b3JfdW51c2VkX3B0OwotfTsKLQotI2RlZmluZSBfX3RvX2dlbjZfcHBndHQoYmFzZSkgY29udGFp bmVyX29mKGJhc2UsIHN0cnVjdCBnZW42X3BwZ3R0LCBiYXNlKQotCi1zdGF0aWMgaW5saW5lIHN0 cnVjdCBnZW42X3BwZ3R0ICp0b19nZW42X3BwZ3R0KHN0cnVjdCBpOTE1X3BwZ3R0ICpiYXNlKQot ewotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgZ2VuNl9wcGd0dCwgYmFzZSkpOwotCXJl dHVybiBfX3RvX2dlbjZfcHBndHQoYmFzZSk7Ci19Ci0KLS8qCi0gKiBnZW42X2Zvcl9lYWNoX3Bk ZSgpIGl0ZXJhdGVzIG92ZXIgZXZlcnkgcGRlIGZyb20gc3RhcnQgdW50aWwgc3RhcnQrbGVuZ3Ro LgotICogSWYgc3RhcnQgYW5kIHN0YXJ0K2xlbmd0aCBhcmUgbm90IHBlcmZlY3RseSBkaXZpc2li bGUsIHRoZSBtYWNybyB3aWxsIHJvdW5kCi0gKiBkb3duIGFuZCB1cCBhcyBuZWVkZWQuIFN0YXJ0 PTAgYW5kIGxlbmd0aD0yRyBlZmZlY3RpdmVseSBpdGVyYXRlcyBvdmVyCi0gKiBldmVyeSBQREUg aW4gdGhlIHN5c3RlbS4gVGhlIG1hY3JvIG1vZGlmaWVzIEFMTCBpdHMgcGFyYW1ldGVycyBleGNl cHQgJ3BkJywKLSAqIHNvIGVhY2ggb2YgdGhlIG90aGVyIHBhcmFtZXRlcnMgc2hvdWxkIHByZWZl cmFibHkgYmUgYSBzaW1wbGUgdmFyaWFibGUsIG9yCi0gKiBhdCBtb3N0IGFuIGx2YWx1ZSB3aXRo IG5vIHNpZGUtZWZmZWN0cyEKLSAqLwotI2RlZmluZSBnZW42X2Zvcl9lYWNoX3BkZShwdCwgcGQs IHN0YXJ0LCBsZW5ndGgsIGl0ZXIpCQkJXAotCWZvciAoaXRlciA9IGdlbjZfcGRlX2luZGV4KHN0 YXJ0KTsJCQkJXAotCSAgICAgbGVuZ3RoID4gMCAmJiBpdGVyIDwgSTkxNV9QREVTICYmCQkJCVwK LQkJICAgICAocHQgPSBpOTE1X3B0X2VudHJ5KHBkLCBpdGVyKSwgdHJ1ZSk7CQlcCi0JICAgICAo eyB1MzIgdGVtcCA9IEFMSUdOKHN0YXJ0KzEsIDEgPDwgR0VONl9QREVfU0hJRlQpOwkJXAotCQkg ICAgdGVtcCA9IG1pbih0ZW1wIC0gc3RhcnQsIGxlbmd0aCk7CQkJXAotCQkgICAgc3RhcnQgKz0g dGVtcCwgbGVuZ3RoIC09IHRlbXA7IH0pLCArK2l0ZXIpCi0KLSNkZWZpbmUgZ2VuNl9mb3JfYWxs X3BkZXMocHQsIHBkLCBpdGVyKQkJCQkJXAotCWZvciAoaXRlciA9IDA7CQkJCQkJCVwKLQkgICAg IGl0ZXIgPCBJOTE1X1BERVMgJiYJCQkJCVwKLQkJICAgICAocHQgPSBpOTE1X3B0X2VudHJ5KHBk LCBpdGVyKSwgdHJ1ZSk7CQlcCi0JICAgICArK2l0ZXIpCi0KLXN0YXRpYyBpbmxpbmUgdTMyIGk5 MTVfcHRlX2luZGV4KHU2NCBhZGRyZXNzLCB1bnNpZ25lZCBpbnQgcGRlX3NoaWZ0KQotewotCWNv bnN0IHUzMiBtYXNrID0gTlVNX1BURShwZGVfc2hpZnQpIC0gMTsKLQotCXJldHVybiAoYWRkcmVz cyA+PiBQQUdFX1NISUZUKSAmIG1hc2s7Ci19Ci0KLS8qIEhlbHBlciB0byBjb3VudHMgdGhlIG51 bWJlciBvZiBQVEVzIHdpdGhpbiB0aGUgZ2l2ZW4gbGVuZ3RoLiBUaGlzIGNvdW50Ci0gKiBkb2Vz IG5vdCBjcm9zcyBhIHBhZ2UgdGFibGUgYm91bmRhcnksIHNvIHRoZSBtYXggdmFsdWUgd291bGQg YmUKLSAqIEdFTjZfUFRFUyBmb3IgR0VONiwgYW5kIEdFTjhfUFRFUyBmb3IgR0VOOC4KLSovCi1z dGF0aWMgaW5saW5lIHUzMiBpOTE1X3B0ZV9jb3VudCh1NjQgYWRkciwgdTY0IGxlbmd0aCwgdW5z aWduZWQgaW50IHBkZV9zaGlmdCkKLXsKLQljb25zdCB1NjQgbWFzayA9IH4oKDFVTEwgPDwgcGRl X3NoaWZ0KSAtIDEpOwotCXU2NCBlbmQ7Ci0KLQlHRU1fQlVHX09OKGxlbmd0aCA9PSAwKTsKLQlH RU1fQlVHX09OKG9mZnNldF9pbl9wYWdlKGFkZHIgfCBsZW5ndGgpKTsKLQotCWVuZCA9IGFkZHIg KyBsZW5ndGg7Ci0KLQlpZiAoKGFkZHIgJiBtYXNrKSAhPSAoZW5kICYgbWFzaykpCi0JCXJldHVy biBOVU1fUFRFKHBkZV9zaGlmdCkgLSBpOTE1X3B0ZV9pbmRleChhZGRyLCBwZGVfc2hpZnQpOwot Ci0JcmV0dXJuIGk5MTVfcHRlX2luZGV4KGVuZCwgcGRlX3NoaWZ0KSAtIGk5MTVfcHRlX2luZGV4 KGFkZHIsIHBkZV9zaGlmdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGk5MTVfcGRlX2luZGV4 KHU2NCBhZGRyLCB1MzIgc2hpZnQpCi17Ci0JcmV0dXJuIChhZGRyID4+IHNoaWZ0KSAmIEk5MTVf UERFX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGdlbjZfcHRlX2luZGV4KHUzMiBhZGRy KQotewotCXJldHVybiBpOTE1X3B0ZV9pbmRleChhZGRyLCBHRU42X1BERV9TSElGVCk7Ci19Ci0K LXN0YXRpYyBpbmxpbmUgdTMyIGdlbjZfcHRlX2NvdW50KHUzMiBhZGRyLCB1MzIgbGVuZ3RoKQot ewotCXJldHVybiBpOTE1X3B0ZV9jb3VudChhZGRyLCBsZW5ndGgsIEdFTjZfUERFX1NISUZUKTsK LX0KLQotc3RhdGljIGlubGluZSB1MzIgZ2VuNl9wZGVfaW5kZXgodTMyIGFkZHIpCi17Ci0JcmV0 dXJuIGk5MTVfcGRlX2luZGV4KGFkZHIsIEdFTjZfUERFX1NISUZUKTsKLX0KLQotc3RhdGljIGlu bGluZSBzdHJ1Y3QgaTkxNV9wYWdlX3RhYmxlICoKLWk5MTVfcHRfZW50cnkoY29uc3Qgc3RydWN0 IGk5MTVfcGFnZV9kaXJlY3RvcnkgKiBjb25zdCBwZCwKLQkgICAgICBjb25zdCB1bnNpZ25lZCBz aG9ydCBuKQotewotCXJldHVybiBwZC0+ZW50cnlbbl07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3Ry dWN0IGk5MTVfcGFnZV9kaXJlY3RvcnkgKgotaTkxNV9wZF9lbnRyeShjb25zdCBzdHJ1Y3QgaTkx NV9wYWdlX2RpcmVjdG9yeSAqIGNvbnN0IHBkcCwKLQkgICAgICBjb25zdCB1bnNpZ25lZCBzaG9y dCBuKQotewotCXJldHVybiBwZHAtPmVudHJ5W25dOwotfQotCi1zdGF0aWMgaW5saW5lIGRtYV9h ZGRyX3QKLWk5MTVfcGFnZV9kaXJfZG1hX2FkZHIoY29uc3Qgc3RydWN0IGk5MTVfcHBndHQgKnBw Z3R0LCBjb25zdCB1bnNpZ25lZCBpbnQgbikKLXsKLQlzdHJ1Y3QgaTkxNV9wYWdlX2RtYSAqcHQg PSBwcGd0dC0+cGQtPmVudHJ5W25dOwotCi0JcmV0dXJuIHB4X2RtYShwdCA/OiBweF9iYXNlKCZw cGd0dC0+dm0uc2NyYXRjaFtwcGd0dC0+dm0udG9wXSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHN0 cnVjdCBpOTE1X2dndHQgKgotaTkxNV92bV90b19nZ3R0KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQotewotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaTkxNV9nZ3R0LCB2bSkp OwotCUdFTV9CVUdfT04oIWk5MTVfaXNfZ2d0dCh2bSkpOwotCXJldHVybiBjb250YWluZXJfb2Yo dm0sIHN0cnVjdCBpOTE1X2dndHQsIHZtKTsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaTkx NV9wcGd0dCAqCi1pOTE1X3ZtX3RvX3BwZ3R0KHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZt KQotewotCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaTkxNV9wcGd0dCwgdm0pKTsKLQlH RU1fQlVHX09OKGk5MTVfaXNfZ2d0dCh2bSkpOwotCXJldHVybiBjb250YWluZXJfb2Yodm0sIHN0 cnVjdCBpOTE1X3BwZ3R0LCB2bSk7Ci19Ci0KLWludCBpOTE1X2dndHRfcHJvYmVfaHcoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLWludCBpOTE1X2dndHRfaW5pdF9odyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwotaW50IGk5MTVfZ2d0dF9lbmFibGVfaHco c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLXZvaWQgaTkxNV9nZ3R0X2VuYWJs ZV9ndWMoc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCk7Ci12b2lkIGk5MTVfZ2d0dF9kaXNhYmxlX2d1 YyhzdHJ1Y3QgaTkxNV9nZ3R0ICpnZ3R0KTsKLWludCBpOTE1X2luaXRfZ2d0dChzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwotdm9pZCBpOTE1X2dndHRfZHJpdmVyX3JlbGVhc2Uo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKLQotc3RhdGljIGlubGluZSBib29s IGk5MTVfZ2d0dF9oYXNfYXBlcnR1cmUoY29uc3Qgc3RydWN0IGk5MTVfZ2d0dCAqZ2d0dCkKLXsK LQlyZXR1cm4gZ2d0dC0+bWFwcGFibGVfZW5kID4gMDsKLX0KLQotaW50IGk5MTVfcHBndHRfaW5p dF9odyhzdHJ1Y3QgaW50ZWxfZ3QgKmd0KTsKLQotc3RydWN0IGk5MTVfcHBndHQgKmk5MTVfcHBn dHRfY3JlYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Ci0KLXN0YXRpYyBp bmxpbmUgc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqCi1pOTE1X3ZtX2dldChzdHJ1Y3QgaTkx NV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlrcmVmX2dldCgmdm0tPnJlZik7Ci0JcmV0dXJuIHZt OwotfQotCi12b2lkIGk5MTVfdm1fcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZik7Ci0KLXN0YXRp YyBpbmxpbmUgdm9pZCBpOTE1X3ZtX3B1dChzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSkK LXsKLQlrcmVmX3B1dCgmdm0tPnJlZiwgaTkxNV92bV9yZWxlYXNlKTsKLX0KLQotc3RhdGljIGlu bGluZSBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICoKLWk5MTVfdm1fb3BlbihzdHJ1Y3QgaTkx NV9hZGRyZXNzX3NwYWNlICp2bSkKLXsKLQlHRU1fQlVHX09OKCFhdG9taWNfcmVhZCgmdm0tPm9w ZW4pKTsKLQlhdG9taWNfaW5jKCZ2bS0+b3Blbik7Ci0JcmV0dXJuIGk5MTVfdm1fZ2V0KHZtKTsK LX0KLQotc3RhdGljIGlubGluZSBib29sCi1pOTE1X3ZtX3RyeW9wZW4oc3RydWN0IGk5MTVfYWRk cmVzc19zcGFjZSAqdm0pCi17Ci0JaWYgKGF0b21pY19hZGRfdW5sZXNzKCZ2bS0+b3BlbiwgMSwg MCkpCi0JCXJldHVybiBpOTE1X3ZtX2dldCh2bSk7Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXZv aWQgX19pOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtKTsKLQotc3Rh dGljIGlubGluZSB2b2lkCi1pOTE1X3ZtX2Nsb3NlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2Ug KnZtKQotewotCUdFTV9CVUdfT04oIWF0b21pY19yZWFkKCZ2bS0+b3BlbikpOwotCWlmIChhdG9t aWNfZGVjX2FuZF90ZXN0KCZ2bS0+b3BlbikpCi0JCV9faTkxNV92bV9jbG9zZSh2bSk7Ci0KLQlp OTE1X3ZtX3B1dCh2bSk7Ci19Ci0KLWludCBnZW42X3BwZ3R0X3BpbihzdHJ1Y3QgaTkxNV9wcGd0 dCAqYmFzZSk7Ci12b2lkIGdlbjZfcHBndHRfdW5waW4oc3RydWN0IGk5MTVfcHBndHQgKmJhc2Up Owotdm9pZCBnZW42X3BwZ3R0X3VucGluX2FsbChzdHJ1Y3QgaTkxNV9wcGd0dCAqYmFzZSk7Ci0K LXZvaWQgaTkxNV9nZW1fc3VzcGVuZF9ndHRfbWFwcGluZ3Moc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2KTsKLXZvaWQgaTkxNV9nZW1fcmVzdG9yZV9ndHRfbWFwcGluZ3Moc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK3N0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2U7 CiAKIGludCBfX211c3RfY2hlY2sgaTkxNV9nZW1fZ3R0X3ByZXBhcmVfcGFnZXMoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCQkJICAgIHN0cnVjdCBzZ190YWJsZSAqcGFnZXMp OwpAQCAtNjY0LDYgKzQ2LDYgQEAgaW50IGk5MTVfZ2VtX2d0dF9pbnNlcnQoc3RydWN0IGk5MTVf YWRkcmVzc19zcGFjZSAqdm0sCiAjZGVmaW5lIFBJTl9HTE9CQUwJCUJJVF9VTEwoMTApIC8qIEk5 MTVfVk1BX0dMT0JBTF9CSU5EICovCiAjZGVmaW5lIFBJTl9VU0VSCQlCSVRfVUxMKDExKSAvKiBJ OTE1X1ZNQV9MT0NBTF9CSU5EICovCiAKLSNkZWZpbmUgUElOX09GRlNFVF9NQVNLCQkoLUk5MTVf R1RUX1BBR0VfU0laRSkKKyNkZWZpbmUgUElOX09GRlNFVF9NQVNLCQlJOTE1X0dUVF9QQUdFX01B U0sKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5o IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaAppbmRleCA1ZmZmYTNjNTg5MDguLjAy YjMxYTYyOTUxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWEuaAor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3ZtYS5oCkBAIC0zMCwxNDggKzMwLDE0IEBA CiAKICNpbmNsdWRlIDxkcm0vZHJtX21tLmg+CiAKKyNpbmNsdWRlICJnZW0vaTkxNV9nZW1fb2Jq ZWN0LmgiCisKICNpbmNsdWRlICJpOTE1X2dlbV9ndHQuaCIKICNpbmNsdWRlICJpOTE1X2dlbV9m ZW5jZV9yZWcuaCIKLSNpbmNsdWRlICJnZW0vaTkxNV9nZW1fb2JqZWN0LmgiCiAKICNpbmNsdWRl ICJpOTE1X2FjdGl2ZS5oIgogI2luY2x1ZGUgImk5MTVfcmVxdWVzdC5oIgotCi1lbnVtIGk5MTVf Y2FjaGVfbGV2ZWw7Ci0KLS8qKgotICogRE9DOiBWaXJ0dWFsIE1lbW9yeSBBZGRyZXNzCi0gKgot ICogQSBWTUEgcmVwcmVzZW50cyBhIEdFTSBCTyB0aGF0IGlzIGJvdW5kIGludG8gYW4gYWRkcmVz cyBzcGFjZS4gVGhlcmVmb3JlLCBhCi0gKiBWTUEncyBwcmVzZW5jZSBjYW5ub3QgYmUgZ3VhcmFu dGVlZCBiZWZvcmUgYmluZGluZywgb3IgYWZ0ZXIgdW5iaW5kaW5nIHRoZQotICogb2JqZWN0IGlu dG8vZnJvbSB0aGUgYWRkcmVzcyBzcGFjZS4KLSAqCi0gKiBUbyBtYWtlIHRoaW5ncyBhcyBzaW1w bGUgYXMgcG9zc2libGUgKGllLiBubyByZWZjb3VudGluZyksIGEgVk1BJ3MgbGlmZXRpbWUKLSAq IHdpbGwgYWx3YXlzIGJlIDw9IGFuIG9iamVjdHMgbGlmZXRpbWUuIFNvIG9iamVjdCByZWZjb3Vu dGluZyBzaG91bGQgY292ZXIgdXMuCi0gKi8KLXN0cnVjdCBpOTE1X3ZtYSB7Ci0Jc3RydWN0IGRy bV9tbV9ub2RlIG5vZGU7Ci0KLQlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bTsKLQljb25z dCBzdHJ1Y3QgaTkxNV92bWFfb3BzICpvcHM7Ci0KLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqOwotCXN0cnVjdCBkbWFfcmVzdiAqcmVzdjsgLyoqIEFsaWFzIG9mIG9iai0+cmVzdiAq LwotCi0Jc3RydWN0IHNnX3RhYmxlICpwYWdlczsKLQl2b2lkIF9faW9tZW0gKmlvbWFwOwotCXZv aWQgKnByaXZhdGU7IC8qIG93bmVkIGJ5IGNyZWF0b3IgKi8KLQotCXN0cnVjdCBpOTE1X2ZlbmNl X3JlZyAqZmVuY2U7Ci0KLQl1NjQgc2l6ZTsKLQl1NjQgZGlzcGxheV9hbGlnbm1lbnQ7Ci0Jc3Ry dWN0IGk5MTVfcGFnZV9zaXplcyBwYWdlX3NpemVzOwotCi0JLyogbW1hcC1vZmZzZXQgYXNzb2Np YXRlZCB3aXRoIGZlbmNpbmcgZm9yIHRoaXMgdm1hICovCi0Jc3RydWN0IGk5MTVfbW1hcF9vZmZz ZXQJKm1tbzsKLQotCXUzMiBmZW5jZV9zaXplOwotCXUzMiBmZW5jZV9hbGlnbm1lbnQ7Ci0KLQkv KioKLQkgKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgdm1hIGhhcyBiZWVuIG9w ZW5lZCBieSBkaWZmZXJlbnQKLQkgKiBoYW5kbGVzIChidXQgc2FtZSBmaWxlKSBmb3IgZXhlY2J1 ZiwgaS5lLiB0aGUgbnVtYmVyIG9mIGFsaWFzZXMKLQkgKiB0aGF0IGV4aXN0IGluIHRoZSBjdHgt PmhhbmRsZV92bWFzIExVVCBmb3IgdGhpcyB2bWEuCi0JICovCi0Jc3RydWN0IGtyZWYgcmVmOwot CWF0b21pY190IG9wZW5fY291bnQ7Ci0JYXRvbWljX3QgZmxhZ3M7Ci0JLyoqCi0JICogSG93IG1h bnkgdXNlcnMgaGF2ZSBwaW5uZWQgdGhpcyBvYmplY3QgaW4gR1RUIHNwYWNlLgotCSAqCi0JICog VGhpcyBpcyBhIHRpZ2h0bHkgYm91bmQsIGZhaXJseSBzbWFsbCBudW1iZXIgb2YgdXNlcnMsIHNv IHdlCi0JICogc3R1ZmYgaW5zaWRlIHRoZSBmbGFncyBmaWVsZCBzbyB0aGF0IHdlIGNhbiBib3Ro IGNoZWNrIGZvciBvdmVyZmxvdwotCSAqIGFuZCBkZXRlY3QgYSBuby1vcCBpOTE1X3ZtYV9waW4o KSBpbiBhIHNpbmdsZSBjaGVjaywgd2hpbGUgYWxzbwotCSAqIHBpbm5pbmcgdGhlIHZtYS4KLQkg KgotCSAqIFRoZSB3b3JzdCBjYXNlIGRpc3BsYXkgc2V0dXAgd291bGQgaGF2ZSB0aGUgc2FtZSB2 bWEgcGlubmVkIGZvcgotCSAqIHVzZSBvbiBlYWNoIHBsYW5lIG9uIGVhY2ggY3J0Yywgd2hpbGUg YWxzbyBidWlsZGluZyB0aGUgbmV4dCBhdG9taWMKLQkgKiBzdGF0ZSBhbmQgaG9sZGluZyBhIHBp biBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgY2xlYW51cCBxdWV1ZS4gSW4gdGhlCi0JICogZnV0dXJl LCB0aGUgZmxpcCBxdWV1ZSBtYXkgYmUgaW5jcmVhc2VkIGZyb20gMS4KLQkgKiBFc3RpbWF0ZWQg d29yc3QgY2FzZTogMyBbcWxlbl0gKiA0IFttYXggY3J0Y3NdICogNyBbbWF4IHBsYW5lc10gPSA4 NAotCSAqCi0JICogRm9yIEdFTSwgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IHVzZXJzIGZvciBw d3JpdGUvcHJlYWQgaXMKLQkgKiB1bmJvdW5kZWQuIEZvciBleGVjYnVmZmVyLCBpdCBpcyBjdXJy ZW50bHkgb25lIGJ1dCB3aWxsIGluIGZ1dHVyZQotCSAqIGJlIGV4dGVuZGVkIHRvIGFsbG93IG11 bHRpcGxlIGNsaWVudHMgdG8gcGluIHZtYSBjb25jdXJyZW50bHkuCi0JICoKLQkgKiBXZSBhbHNv IHVzZSBzdWJhbGxvY2F0ZWQgcGFnZXMsIHdpdGggZWFjaCBzdWJhbGxvY2F0aW9uIGNsYWltaW5n Ci0JICogaXRzIG93biBwaW4gb24gdGhlIHNoYXJlZCB2bWEuIEF0IHByZXNlbnQsIHRoaXMgaXMg bGltaXRlZCB0bwotCSAqIGV4Y2x1c2l2ZSBjYWNoZWxpbmVzIG9mIGEgc2luZ2xlIHBhZ2UsIHNv IGEgbWF4aW11bSBvZiA2NCBwb3NzaWJsZQotCSAqIHVzZXJzLgotCSAqLwotI2RlZmluZSBJOTE1 X1ZNQV9QSU5fTUFTSyAweDNmZgotI2RlZmluZSBJOTE1X1ZNQV9PVkVSRkxPVyAweDIwMAotCi0J LyoqIEZsYWdzIGFuZCBhZGRyZXNzIHNwYWNlIHRoaXMgVk1BIGlzIGJvdW5kIHRvICovCi0jZGVm aW5lIEk5MTVfVk1BX0dMT0JBTF9CSU5EX0JJVCAxMAotI2RlZmluZSBJOTE1X1ZNQV9MT0NBTF9C SU5EX0JJVCAgMTEKLQotI2RlZmluZSBJOTE1X1ZNQV9HTE9CQUxfQklORAkoKGludClCSVQoSTkx NV9WTUFfR0xPQkFMX0JJTkRfQklUKSkKLSNkZWZpbmUgSTkxNV9WTUFfTE9DQUxfQklORAkoKGlu dClCSVQoSTkxNV9WTUFfTE9DQUxfQklORF9CSVQpKQotCi0jZGVmaW5lIEk5MTVfVk1BX0JJTkRf TUFTSyAoSTkxNV9WTUFfR0xPQkFMX0JJTkQgfCBJOTE1X1ZNQV9MT0NBTF9CSU5EKQotCi0jZGVm aW5lIEk5MTVfVk1BX0FMTE9DX0JJVAkxMgotI2RlZmluZSBJOTE1X1ZNQV9BTExPQwkJKChpbnQp QklUKEk5MTVfVk1BX0FMTE9DX0JJVCkpCi0KLSNkZWZpbmUgSTkxNV9WTUFfRVJST1JfQklUCTEz Ci0jZGVmaW5lIEk5MTVfVk1BX0VSUk9SCQkoKGludClCSVQoSTkxNV9WTUFfRVJST1JfQklUKSkK LQotI2RlZmluZSBJOTE1X1ZNQV9HR1RUX0JJVAkxNAotI2RlZmluZSBJOTE1X1ZNQV9DQU5fRkVO Q0VfQklUCTE1Ci0jZGVmaW5lIEk5MTVfVk1BX1VTRVJGQVVMVF9CSVQJMTYKLSNkZWZpbmUgSTkx NV9WTUFfR0dUVF9XUklURV9CSVQJMTcKLQotI2RlZmluZSBJOTE1X1ZNQV9HR1RUCQkoKGludClC SVQoSTkxNV9WTUFfR0dUVF9CSVQpKQotI2RlZmluZSBJOTE1X1ZNQV9DQU5fRkVOQ0UJKChpbnQp QklUKEk5MTVfVk1BX0NBTl9GRU5DRV9CSVQpKQotI2RlZmluZSBJOTE1X1ZNQV9VU0VSRkFVTFQJ KChpbnQpQklUKEk5MTVfVk1BX1VTRVJGQVVMVF9CSVQpKQotI2RlZmluZSBJOTE1X1ZNQV9HR1RU X1dSSVRFCSgoaW50KUJJVChJOTE1X1ZNQV9HR1RUX1dSSVRFX0JJVCkpCi0KLQlzdHJ1Y3QgaTkx NV9hY3RpdmUgYWN0aXZlOwotCi0jZGVmaW5lIEk5MTVfVk1BX1BBR0VTX0JJQVMgMjQKLSNkZWZp bmUgSTkxNV9WTUFfUEFHRVNfQUNUSVZFIChCSVQoMjQpIHwgMSkKLQlhdG9taWNfdCBwYWdlc19j b3VudDsgLyogbnVtYmVyIG9mIGFjdGl2ZSBiaW5kcyB0byB0aGUgcGFnZXMgKi8KLQlzdHJ1Y3Qg bXV0ZXggcGFnZXNfbXV0ZXg7IC8qIHByb3RlY3QgYWNxdWlyZS9yZWxlYXNlIG9mIGJhY2tpbmcg cGFnZXMgKi8KLQotCS8qKgotCSAqIFN1cHBvcnQgZGlmZmVyZW50IEdHVFQgdmlld3MgaW50byB0 aGUgc2FtZSBvYmplY3QuCi0JICogVGhpcyBtZWFucyB0aGVyZSBjYW4gYmUgbXVsdGlwbGUgVk1B IG1hcHBpbmdzIHBlciBvYmplY3QgYW5kIHBlciBWTS4KLQkgKiBpOTE1X2dndHRfdmlld190eXBl IGlzIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aG9zZSBlbnRyaWVzLgotCSAqIFRoZSBk ZWZhdWx0IG9uZSBvZiB6ZXJvIChJOTE1X0dHVFRfVklFV19OT1JNQUwpIGlzIGRlZmF1bHQgYW5k IGFsc28KLQkgKiBhc3N1bWVkIGluIEdFTSBmdW5jdGlvbnMgd2hpY2ggdGFrZSBubyBnZ3R0IHZp ZXcgcGFyYW1ldGVyLgotCSAqLwotCXN0cnVjdCBpOTE1X2dndHRfdmlldyBnZ3R0X3ZpZXc7Ci0K LQkvKiogVGhpcyBvYmplY3QncyBwbGFjZSBvbiB0aGUgYWN0aXZlL2luYWN0aXZlIGxpc3RzICov Ci0Jc3RydWN0IGxpc3RfaGVhZCB2bV9saW5rOwotCi0Jc3RydWN0IGxpc3RfaGVhZCBvYmpfbGlu azsgLyogTGluayBpbiB0aGUgb2JqZWN0J3MgVk1BIGxpc3QgKi8KLQlzdHJ1Y3QgcmJfbm9kZSBv Ympfbm9kZTsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZSBvYmpfaGFzaDsKLQotCS8qKiBUaGlzIHZtYSdz IHBsYWNlIGluIHRoZSBleGVjYnVmIHJlc2VydmF0aW9uIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9o ZWFkIGV4ZWNfbGluazsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHJlbG9jX2xpbms7Ci0KLQkvKiogVGhp cyB2bWEncyBwbGFjZSBpbiB0aGUgZXZpY3Rpb24gbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQg ZXZpY3RfbGluazsKLQotCXN0cnVjdCBsaXN0X2hlYWQgY2xvc2VkX2xpbms7Ci0KLQkvKioKLQkg KiBVc2VkIGZvciBwZXJmb3JtaW5nIHJlbG9jYXRpb25zIGR1cmluZyBleGVjYnVmZmVyIGluc2Vy dGlvbi4KLQkgKi8KLQl1bnNpZ25lZCBpbnQgKmV4ZWNfZmxhZ3M7Ci0Jc3RydWN0IGhsaXN0X25v ZGUgZXhlY19ub2RlOwotCXUzMiBleGVjX2hhbmRsZTsKLX07CisjaW5jbHVkZSAiaTkxNV92bWFf dHlwZXMuaCIKIAogc3RydWN0IGk5MTVfdm1hICoKIGk5MTVfdm1hX2luc3RhbmNlKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pOTE1X3ZtYV90eXBlcy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV92bWFfdHlwZXMu aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmUwOTQyZWZkNTIzNgot LS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdm1hX3R5cGVzLmgK QEAgLTAsMCArMSwyOTQgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgKi8KKy8q CisgKiBDb3B5cmlnaHQgwqkgMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Np b24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFp bmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRh dGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUg d2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhl IHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUs IHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQg dG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0 byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhl IGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1 ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29w aWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICog VEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5Z IEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQg VE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxM CisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBD TEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElP TiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBP RiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIg REVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfX0k5MTVf Vk1BX1RZUEVTX0hfXworI2RlZmluZSBfX0k5MTVfVk1BX1RZUEVTX0hfXworCisjaW5jbHVkZSA8 bGludXgvcmJ0cmVlLmg+CisKKyNpbmNsdWRlIDxkcm0vZHJtX21tLmg+CisKKyNpbmNsdWRlICJn ZW0vaTkxNV9nZW1fb2JqZWN0X3R5cGVzLmgiCisKK2VudW0gaTkxNV9jYWNoZV9sZXZlbDsKKwor LyoqCisgKiBET0M6IEdsb2JhbCBHVFQgdmlld3MKKyAqCisgKiBCYWNrZ3JvdW5kIGFuZCBwcmV2 aW91cyBzdGF0ZQorICoKKyAqIEhpc3RvcmljYWxseSBvYmplY3RzIGNvdWxkIGV4aXN0cyAoYmUg Ym91bmQpIGluIGdsb2JhbCBHVFQgc3BhY2Ugb25seSBhcworICogc2luZ3VsYXIgaW5zdGFuY2Vz IHdpdGggYSB2aWV3IHJlcHJlc2VudGluZyBhbGwgb2YgdGhlIG9iamVjdCdzIGJhY2tpbmcgcGFn ZXMKKyAqIGluIGEgbGluZWFyIGZhc2hpb24uIFRoaXMgdmlldyB3aWxsIGJlIGNhbGxlZCBhIG5v cm1hbCB2aWV3LgorICoKKyAqIFRvIHN1cHBvcnQgbXVsdGlwbGUgdmlld3Mgb2YgdGhlIHNhbWUg b2JqZWN0LCB3aGVyZSB0aGUgbnVtYmVyIG9mIG1hcHBlZAorICogcGFnZXMgaXMgbm90IGVxdWFs IHRvIHRoZSBiYWNraW5nIHN0b3JlLCBvciB3aGVyZSB0aGUgbGF5b3V0IG9mIHRoZSBwYWdlcwor ICogaXMgbm90IGxpbmVhciwgY29uY2VwdCBvZiBhIEdHVFQgdmlldyB3YXMgYWRkZWQuCisgKgor ICogT25lIGV4YW1wbGUgb2YgYW4gYWx0ZXJuYXRpdmUgdmlldyBpcyBhIHN0ZXJlbyBkaXNwbGF5 IGRyaXZlbiBieSBhIHNpbmdsZQorICogaW1hZ2UuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBoYXZl IGEgZnJhbWVidWZmZXIgbG9va2luZyBsaWtlIHRoaXMKKyAqICgyeDIgcGFnZXMpOgorICoKKyAq ICAgIDEyCisgKiAgICAzNAorICoKKyAqIEFib3ZlIHdvdWxkIHJlcHJlc2VudCBhIG5vcm1hbCBH R1RUIHZpZXcgYXMgbm9ybWFsbHkgbWFwcGVkIGZvciBHUFUgb3IgQ1BVCisgKiByZW5kZXJpbmcu IEluIGNvbnRyYXN0LCBmZWQgdG8gdGhlIGRpc3BsYXkgZW5naW5lIHdvdWxkIGJlIGFuIGFsdGVy bmF0aXZlCisgKiB2aWV3IHdoaWNoIGNvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpczoKKyAq CisgKiAgIDEyMTIKKyAqICAgMzQzNAorICoKKyAqIEluIHRoaXMgZXhhbXBsZSBib3RoIHRoZSBz aXplIGFuZCBsYXlvdXQgb2YgcGFnZXMgaW4gdGhlIGFsdGVybmF0aXZlIHZpZXcgaXMKKyAqIGRp ZmZlcmVudCBmcm9tIHRoZSBub3JtYWwgdmlldy4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBhbmQg dXNhZ2UKKyAqCisgKiBHR1RUIHZpZXdzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBWTUFzIGFuZCBh cmUgZGlzdGluZ3Vpc2hlZCB2aWEgZW51bQorICogaTkxNV9nZ3R0X3ZpZXdfdHlwZSBhbmQgc3Ry dWN0IGk5MTVfZ2d0dF92aWV3LgorICoKKyAqIEEgbmV3IGZsYXZvdXIgb2YgY29yZSBHRU0gZnVu Y3Rpb25zIHdoaWNoIHdvcmsgd2l0aCBHR1RUIGJvdW5kIG9iamVjdHMgd2VyZQorICogYWRkZWQg d2l0aCB0aGUgX2dndHRfIGluZml4LCBhbmQgc29tZXRpbWVzIHdpdGggX3ZpZXcgcG9zdGZpeCB0 byBhdm9pZAorICogcmVuYW1pbmcgIGluIGxhcmdlIGFtb3VudHMgb2YgY29kZS4gVGhleSB0YWtl IHRoZSBzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcKKyAqIHBhcmFtZXRlciBlbmNhcHN1bGF0aW5nIGFs bCBtZXRhZGF0YSByZXF1aXJlZCB0byBpbXBsZW1lbnQgYSB2aWV3LgorICoKKyAqIEFzIGEgaGVs cGVyIGZvciBjYWxsZXJzIHdoaWNoIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIG5vcm1hbCB2 aWV3LAorICogZ2xvYmFsbHkgY29uc3QgaTkxNV9nZ3R0X3ZpZXdfbm9ybWFsIHNpbmdsZXRvbiBp bnN0YW5jZSBleGlzdHMuIEFsbCBvbGQgY29yZQorICogR0VNIEFQSSBmdW5jdGlvbnMsIHRoZSBv bmVzIG5vdCB0YWtpbmcgdGhlIHZpZXcgcGFyYW1ldGVyLCBhcmUgb3BlcmF0aW5nIG9uLAorICog b3Igd2l0aCB0aGUgbm9ybWFsIEdHVFQgdmlldy4KKyAqCisgKiBDb2RlIHdhbnRpbmcgdG8gYWRk IG9yIHVzZSBhIG5ldyBHR1RUIHZpZXcgbmVlZHMgdG86CisgKgorICogMS4gQWRkIGEgbmV3IGVu dW0gd2l0aCBhIHN1aXRhYmxlIG5hbWUuCisgKiAyLiBFeHRlbmQgdGhlIG1ldGFkYXRhIGluIHRo ZSBpOTE1X2dndHRfdmlldyBzdHJ1Y3R1cmUgaWYgcmVxdWlyZWQuCisgKiAzLiBBZGQgc3VwcG9y dCB0byBpOTE1X2dldF92bWFfcGFnZXMoKS4KKyAqCisgKiBOZXcgdmlld3MgYXJlIHJlcXVpcmVk IHRvIGJ1aWxkIGEgc2NhdHRlci1nYXRoZXIgdGFibGUgZnJvbSB3aXRoaW4gdGhlCisgKiBpOTE1 X2dldF92bWFfcGFnZXMgZnVuY3Rpb24uIFRoaXMgdGFibGUgaXMgc3RvcmVkIGluIHRoZSB2bWEu Z2d0dF92aWV3IGFuZAorICogZXhpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgYW4gVk1BLgorICoK KyAqIENvcmUgQVBJIGlzIGRlc2lnbmVkIHRvIGhhdmUgY29weSBzZW1hbnRpY3Mgd2hpY2ggbWVh bnMgdGhhdCBwYXNzZWQgaW4KKyAqIHN0cnVjdCBpOTE1X2dndHRfdmlldyBkb2VzIG5vdCBuZWVk IHRvIGJlIHBlcnNpc3RlbnQgKGxlZnQgYXJvdW5kIGFmdGVyCisgKiBjYWxsaW5nIHRoZSBjb3Jl IEFQSSBmdW5jdGlvbnMpLgorICoKKyAqLworCitzdHJ1Y3QgaW50ZWxfcmVtYXBwZWRfcGxhbmVf aW5mbyB7CisJLyogaW4gZ3R0IHBhZ2VzICovCisJdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQs IHN0cmlkZSwgb2Zmc2V0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGludGVsX3JlbWFwcGVkX2lu Zm8geworCXN0cnVjdCBpbnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOworCXVuc2ln bmVkIGludCB1bnVzZWRfbWJ6OworfSBfX3BhY2tlZDsKKworc3RydWN0IGludGVsX3JvdGF0aW9u X2luZm8geworCXN0cnVjdCBpbnRlbF9yZW1hcHBlZF9wbGFuZV9pbmZvIHBsYW5lWzJdOworfSBf X3BhY2tlZDsKKworc3RydWN0IGludGVsX3BhcnRpYWxfaW5mbyB7CisJdTY0IG9mZnNldDsKKwl1 bnNpZ25lZCBpbnQgc2l6ZTsKK30gX19wYWNrZWQ7CisKK2VudW0gaTkxNV9nZ3R0X3ZpZXdfdHlw ZSB7CisJSTkxNV9HR1RUX1ZJRVdfTk9STUFMID0gMCwKKwlJOTE1X0dHVFRfVklFV19ST1RBVEVE ID0gc2l6ZW9mKHN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvKSwKKwlJOTE1X0dHVFRfVklFV19Q QVJUSUFMID0gc2l6ZW9mKHN0cnVjdCBpbnRlbF9wYXJ0aWFsX2luZm8pLAorCUk5MTVfR0dUVF9W SUVXX1JFTUFQUEVEID0gc2l6ZW9mKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSwKK307CisK K3N0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRfaTkxNV9nZW1fZ3R0X3R5cGVzKHZvaWQpCit7CisJ QlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW50ZWxfcm90YXRpb25faW5mbykgIT0gOCpzaXpl b2YodW5zaWduZWQgaW50KSk7CisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW50ZWxfcGFy dGlhbF9pbmZvKSAhPSBzaXplb2YodTY0KSArIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwlCVUlM RF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvKSAhPSA5KnNpemVvZih1 bnNpZ25lZCBpbnQpKTsKKworCS8qIENoZWNrIHRoYXQgcm90YXRpb24vcmVtYXBwZWQgc2hhcmVz IG9mZnNldHMgZm9yIHNpbXBsaWNpdHkgKi8KKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0 IGludGVsX3JlbWFwcGVkX2luZm8sIHBsYW5lWzBdKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVj dCBpbnRlbF9yb3RhdGlvbl9pbmZvLCBwbGFuZVswXSkpOworCUJVSUxEX0JVR19PTihvZmZzZXRv ZmVuZChzdHJ1Y3QgaW50ZWxfcmVtYXBwZWRfaW5mbywgcGxhbmVbMV0pICE9CisJCSAgICAgb2Zm c2V0b2ZlbmQoc3RydWN0IGludGVsX3JvdGF0aW9uX2luZm8sIHBsYW5lWzFdKSk7CisKKwkvKiBB cyB3ZSBlbmNvZGUgdGhlIHNpemUgb2YgZWFjaCBicmFuY2ggaW5zaWRlIHRoZSB1bmlvbiBpbnRv IGl0cyB0eXBlLAorCSAqIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0aGF0IGVhY2ggYnJhbmNoIGhh cyBhIHVuaXF1ZSBzaXplLgorCSAqLworCXN3aXRjaCAoKGVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlw ZSkwKSB7CisJY2FzZSBJOTE1X0dHVFRfVklFV19OT1JNQUw6CisJY2FzZSBJOTE1X0dHVFRfVklF V19QQVJUSUFMOgorCWNhc2UgSTkxNV9HR1RUX1ZJRVdfUk9UQVRFRDoKKwljYXNlIEk5MTVfR0dU VF9WSUVXX1JFTUFQUEVEOgorCQkvKiBnY2MgY29tcGxhaW5zIGlmIHRoZXNlIGFyZSBpZGVudGlj YWwgY2FzZXMgKi8KKwkJYnJlYWs7CisJfQorfQorCitzdHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgewor CWVudW0gaTkxNV9nZ3R0X3ZpZXdfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJLyogTWVtYmVycyBu ZWVkIHRvIGNvbnRhaW4gbm8gaG9sZXMvcGFkZGluZyAqLworCQlzdHJ1Y3QgaW50ZWxfcGFydGlh bF9pbmZvIHBhcnRpYWw7CisJCXN0cnVjdCBpbnRlbF9yb3RhdGlvbl9pbmZvIHJvdGF0ZWQ7CisJ CXN0cnVjdCBpbnRlbF9yZW1hcHBlZF9pbmZvIHJlbWFwcGVkOworCX07Cit9OworCisvKioKKyAq IERPQzogVmlydHVhbCBNZW1vcnkgQWRkcmVzcworICoKKyAqIEEgVk1BIHJlcHJlc2VudHMgYSBH RU0gQk8gdGhhdCBpcyBib3VuZCBpbnRvIGFuIGFkZHJlc3Mgc3BhY2UuIFRoZXJlZm9yZSwgYQor ICogVk1BJ3MgcHJlc2VuY2UgY2Fubm90IGJlIGd1YXJhbnRlZWQgYmVmb3JlIGJpbmRpbmcsIG9y IGFmdGVyIHVuYmluZGluZyB0aGUKKyAqIG9iamVjdCBpbnRvL2Zyb20gdGhlIGFkZHJlc3Mgc3Bh Y2UuCisgKgorICogVG8gbWFrZSB0aGluZ3MgYXMgc2ltcGxlIGFzIHBvc3NpYmxlIChpZS4gbm8g cmVmY291bnRpbmcpLCBhIFZNQSdzIGxpZmV0aW1lCisgKiB3aWxsIGFsd2F5cyBiZSA8PSBhbiBv YmplY3RzIGxpZmV0aW1lLiBTbyBvYmplY3QgcmVmY291bnRpbmcgc2hvdWxkIGNvdmVyIHVzLgor ICovCitzdHJ1Y3QgaTkxNV92bWEgeworCXN0cnVjdCBkcm1fbW1fbm9kZSBub2RlOworCisJc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm07CisJY29uc3Qgc3RydWN0IGk5MTVfdm1hX29wcyAq b3BzOworCisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgZG1hX3Jl c3YgKnJlc3Y7IC8qKiBBbGlhcyBvZiBvYmotPnJlc3YgKi8KKworCXN0cnVjdCBzZ190YWJsZSAq cGFnZXM7CisJdm9pZCBfX2lvbWVtICppb21hcDsKKwl2b2lkICpwcml2YXRlOyAvKiBvd25lZCBi eSBjcmVhdG9yICovCisKKwlzdHJ1Y3QgaTkxNV9mZW5jZV9yZWcgKmZlbmNlOworCisJdTY0IHNp emU7CisJdTY0IGRpc3BsYXlfYWxpZ25tZW50OworCXN0cnVjdCBpOTE1X3BhZ2Vfc2l6ZXMgcGFn ZV9zaXplczsKKworCS8qIG1tYXAtb2Zmc2V0IGFzc29jaWF0ZWQgd2l0aCBmZW5jaW5nIGZvciB0 aGlzIHZtYSAqLworCXN0cnVjdCBpOTE1X21tYXBfb2Zmc2V0CSptbW87CisKKwl1MzIgZmVuY2Vf c2l6ZTsKKwl1MzIgZmVuY2VfYWxpZ25tZW50OworCisJLyoqCisJICogQ291bnQgb2YgdGhlIG51 bWJlciBvZiB0aW1lcyB0aGlzIHZtYSBoYXMgYmVlbiBvcGVuZWQgYnkgZGlmZmVyZW50CisJICog aGFuZGxlcyAoYnV0IHNhbWUgZmlsZSkgZm9yIGV4ZWNidWYsIGkuZS4gdGhlIG51bWJlciBvZiBh bGlhc2VzCisJICogdGhhdCBleGlzdCBpbiB0aGUgY3R4LT5oYW5kbGVfdm1hcyBMVVQgZm9yIHRo aXMgdm1hLgorCSAqLworCXN0cnVjdCBrcmVmIHJlZjsKKwlhdG9taWNfdCBvcGVuX2NvdW50Owor CWF0b21pY190IGZsYWdzOworCS8qKgorCSAqIEhvdyBtYW55IHVzZXJzIGhhdmUgcGlubmVkIHRo aXMgb2JqZWN0IGluIEdUVCBzcGFjZS4KKwkgKgorCSAqIFRoaXMgaXMgYSB0aWdodGx5IGJvdW5k LCBmYWlybHkgc21hbGwgbnVtYmVyIG9mIHVzZXJzLCBzbyB3ZQorCSAqIHN0dWZmIGluc2lkZSB0 aGUgZmxhZ3MgZmllbGQgc28gdGhhdCB3ZSBjYW4gYm90aCBjaGVjayBmb3Igb3ZlcmZsb3cKKwkg KiBhbmQgZGV0ZWN0IGEgbm8tb3AgaTkxNV92bWFfcGluKCkgaW4gYSBzaW5nbGUgY2hlY2ssIHdo aWxlIGFsc28KKwkgKiBwaW5uaW5nIHRoZSB2bWEuCisJICoKKwkgKiBUaGUgd29yc3QgY2FzZSBk aXNwbGF5IHNldHVwIHdvdWxkIGhhdmUgdGhlIHNhbWUgdm1hIHBpbm5lZCBmb3IKKwkgKiB1c2Ug b24gZWFjaCBwbGFuZSBvbiBlYWNoIGNydGMsIHdoaWxlIGFsc28gYnVpbGRpbmcgdGhlIG5leHQg YXRvbWljCisJICogc3RhdGUgYW5kIGhvbGRpbmcgYSBwaW4gZm9yIHRoZSBsZW5ndGggb2YgdGhl IGNsZWFudXAgcXVldWUuIEluIHRoZQorCSAqIGZ1dHVyZSwgdGhlIGZsaXAgcXVldWUgbWF5IGJl IGluY3JlYXNlZCBmcm9tIDEuCisJICogRXN0aW1hdGVkIHdvcnN0IGNhc2U6IDMgW3FsZW5dICog NCBbbWF4IGNydGNzXSAqIDcgW21heCBwbGFuZXNdID0gODQKKwkgKgorCSAqIEZvciBHRU0sIHRo ZSBudW1iZXIgb2YgY29uY3VycmVudCB1c2VycyBmb3IgcHdyaXRlL3ByZWFkIGlzCisJICogdW5i b3VuZGVkLiBGb3IgZXhlY2J1ZmZlciwgaXQgaXMgY3VycmVudGx5IG9uZSBidXQgd2lsbCBpbiBm dXR1cmUKKwkgKiBiZSBleHRlbmRlZCB0byBhbGxvdyBtdWx0aXBsZSBjbGllbnRzIHRvIHBpbiB2 bWEgY29uY3VycmVudGx5LgorCSAqCisJICogV2UgYWxzbyB1c2Ugc3ViYWxsb2NhdGVkIHBhZ2Vz LCB3aXRoIGVhY2ggc3ViYWxsb2NhdGlvbiBjbGFpbWluZworCSAqIGl0cyBvd24gcGluIG9uIHRo ZSBzaGFyZWQgdm1hLiBBdCBwcmVzZW50LCB0aGlzIGlzIGxpbWl0ZWQgdG8KKwkgKiBleGNsdXNp dmUgY2FjaGVsaW5lcyBvZiBhIHNpbmdsZSBwYWdlLCBzbyBhIG1heGltdW0gb2YgNjQgcG9zc2li bGUKKwkgKiB1c2Vycy4KKwkgKi8KKyNkZWZpbmUgSTkxNV9WTUFfUElOX01BU0sgMHgzZmYKKyNk ZWZpbmUgSTkxNV9WTUFfT1ZFUkZMT1cgMHgyMDAKKworCS8qKiBGbGFncyBhbmQgYWRkcmVzcyBz cGFjZSB0aGlzIFZNQSBpcyBib3VuZCB0byAqLworI2RlZmluZSBJOTE1X1ZNQV9HTE9CQUxfQklO RF9CSVQgMTAKKyNkZWZpbmUgSTkxNV9WTUFfTE9DQUxfQklORF9CSVQgIDExCisKKyNkZWZpbmUg STkxNV9WTUFfR0xPQkFMX0JJTkQJKChpbnQpQklUKEk5MTVfVk1BX0dMT0JBTF9CSU5EX0JJVCkp CisjZGVmaW5lIEk5MTVfVk1BX0xPQ0FMX0JJTkQJKChpbnQpQklUKEk5MTVfVk1BX0xPQ0FMX0JJ TkRfQklUKSkKKworI2RlZmluZSBJOTE1X1ZNQV9CSU5EX01BU0sgKEk5MTVfVk1BX0dMT0JBTF9C SU5EIHwgSTkxNV9WTUFfTE9DQUxfQklORCkKKworI2RlZmluZSBJOTE1X1ZNQV9BTExPQ19CSVQJ MTIKKyNkZWZpbmUgSTkxNV9WTUFfQUxMT0MJCSgoaW50KUJJVChJOTE1X1ZNQV9BTExPQ19CSVQp KQorCisjZGVmaW5lIEk5MTVfVk1BX0VSUk9SX0JJVAkxMworI2RlZmluZSBJOTE1X1ZNQV9FUlJP UgkJKChpbnQpQklUKEk5MTVfVk1BX0VSUk9SX0JJVCkpCisKKyNkZWZpbmUgSTkxNV9WTUFfR0dU VF9CSVQJMTQKKyNkZWZpbmUgSTkxNV9WTUFfQ0FOX0ZFTkNFX0JJVAkxNQorI2RlZmluZSBJOTE1 X1ZNQV9VU0VSRkFVTFRfQklUCTE2CisjZGVmaW5lIEk5MTVfVk1BX0dHVFRfV1JJVEVfQklUCTE3 CisKKyNkZWZpbmUgSTkxNV9WTUFfR0dUVAkJKChpbnQpQklUKEk5MTVfVk1BX0dHVFRfQklUKSkK KyNkZWZpbmUgSTkxNV9WTUFfQ0FOX0ZFTkNFCSgoaW50KUJJVChJOTE1X1ZNQV9DQU5fRkVOQ0Vf QklUKSkKKyNkZWZpbmUgSTkxNV9WTUFfVVNFUkZBVUxUCSgoaW50KUJJVChJOTE1X1ZNQV9VU0VS RkFVTFRfQklUKSkKKyNkZWZpbmUgSTkxNV9WTUFfR0dUVF9XUklURQkoKGludClCSVQoSTkxNV9W TUFfR0dUVF9XUklURV9CSVQpKQorCisJc3RydWN0IGk5MTVfYWN0aXZlIGFjdGl2ZTsKKworI2Rl ZmluZSBJOTE1X1ZNQV9QQUdFU19CSUFTIDI0CisjZGVmaW5lIEk5MTVfVk1BX1BBR0VTX0FDVElW RSAoQklUKDI0KSB8IDEpCisJYXRvbWljX3QgcGFnZXNfY291bnQ7IC8qIG51bWJlciBvZiBhY3Rp dmUgYmluZHMgdG8gdGhlIHBhZ2VzICovCisJc3RydWN0IG11dGV4IHBhZ2VzX211dGV4OyAvKiBw cm90ZWN0IGFjcXVpcmUvcmVsZWFzZSBvZiBiYWNraW5nIHBhZ2VzICovCisKKwkvKioKKwkgKiBT dXBwb3J0IGRpZmZlcmVudCBHR1RUIHZpZXdzIGludG8gdGhlIHNhbWUgb2JqZWN0LgorCSAqIFRo aXMgbWVhbnMgdGhlcmUgY2FuIGJlIG11bHRpcGxlIFZNQSBtYXBwaW5ncyBwZXIgb2JqZWN0IGFu ZCBwZXIgVk0uCisJICogaTkxNV9nZ3R0X3ZpZXdfdHlwZSBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNo IGJldHdlZW4gdGhvc2UgZW50cmllcy4KKwkgKiBUaGUgZGVmYXVsdCBvbmUgb2YgemVybyAoSTkx NV9HR1RUX1ZJRVdfTk9STUFMKSBpcyBkZWZhdWx0IGFuZCBhbHNvCisJICogYXNzdW1lZCBpbiBH RU0gZnVuY3Rpb25zIHdoaWNoIHRha2Ugbm8gZ2d0dCB2aWV3IHBhcmFtZXRlci4KKwkgKi8KKwlz dHJ1Y3QgaTkxNV9nZ3R0X3ZpZXcgZ2d0dF92aWV3OworCisJLyoqIFRoaXMgb2JqZWN0J3MgcGxh Y2Ugb24gdGhlIGFjdGl2ZS9pbmFjdGl2ZSBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgdm1f bGluazsKKworCXN0cnVjdCBsaXN0X2hlYWQgb2JqX2xpbms7IC8qIExpbmsgaW4gdGhlIG9iamVj dCdzIFZNQSBsaXN0ICovCisJc3RydWN0IHJiX25vZGUgb2JqX25vZGU7CisJc3RydWN0IGhsaXN0 X25vZGUgb2JqX2hhc2g7CisKKwkvKiogVGhpcyB2bWEncyBwbGFjZSBpbiB0aGUgZXhlY2J1ZiBy ZXNlcnZhdGlvbiBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBleGVjX2xpbms7CisJc3RydWN0 IGxpc3RfaGVhZCByZWxvY19saW5rOworCisJLyoqIFRoaXMgdm1hJ3MgcGxhY2UgaW4gdGhlIGV2 aWN0aW9uIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGV2aWN0X2xpbms7CisKKwlzdHJ1Y3Qg bGlzdF9oZWFkIGNsb3NlZF9saW5rOworCisJLyoqCisJICogVXNlZCBmb3IgcGVyZm9ybWluZyBy ZWxvY2F0aW9ucyBkdXJpbmcgZXhlY2J1ZmZlciBpbnNlcnRpb24uCisJICovCisJdW5zaWduZWQg aW50ICpleGVjX2ZsYWdzOworCXN0cnVjdCBobGlzdF9ub2RlIGV4ZWNfbm9kZTsKKwl1MzIgZXhl Y19oYW5kbGU7Cit9OworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5 MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX2d0dC5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRl c3RzL2k5MTVfZ2VtX2d0dC5jCmluZGV4IDgwY2RlNWJkYTkyMi4uYjM0MmJlZjVlN2M5IDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9nZW1fZ3R0LmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfZ2VtX2d0dC5jCkBAIC0zNCw2 ICszNCw3IEBACiAKICNpbmNsdWRlICJtb2NrX2RybS5oIgogI2luY2x1ZGUgIm1vY2tfZ2VtX2Rl dmljZS5oIgorI2luY2x1ZGUgIm1vY2tfZ3R0LmgiCiAjaW5jbHVkZSAiaWd0X2ZsdXNoX3Rlc3Qu aCIKIAogc3RhdGljIHZvaWQgY2xlYW51cF9mcmVlZF9vYmplY3RzKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICppOTE1KQpAQCAtMTUxLDcgKzE1Miw3IEBAIHN0YXRpYyBpbnQgaWd0X3BwZ3R0X2Fs bG9jKHZvaWQgKmFyZykKIAlpZiAoIUhBU19QUEdUVChkZXZfcHJpdikpCiAJCXJldHVybiAwOwog Ci0JcHBndHQgPSBfX3BwZ3R0X2NyZWF0ZShkZXZfcHJpdik7CisJcHBndHQgPSBpOTE1X3BwZ3R0 X2NyZWF0ZSgmZGV2X3ByaXYtPmd0KTsKIAlpZiAoSVNfRVJSKHBwZ3R0KSkKIAkJcmV0dXJuIFBU Ul9FUlIocHBndHQpOwogCkBAIC0yMDYsOCArMjA3LDcgQEAgc3RhdGljIGludCBpZ3RfcHBndHRf YWxsb2Modm9pZCAqYXJnKQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbG93bGV2ZWxf aG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJCSBzdHJ1Y3QgaTkxNV9hZGRy ZXNzX3NwYWNlICp2bSwKK3N0YXRpYyBpbnQgbG93bGV2ZWxfaG9sZShzdHJ1Y3QgaTkxNV9hZGRy ZXNzX3NwYWNlICp2bSwKIAkJCSB1NjQgaG9sZV9zdGFydCwgdTY0IGhvbGVfZW5kLAogCQkJIHVu c2lnbmVkIGxvbmcgZW5kX3RpbWUpCiB7CkBAIC0yNTYsNyArMjU2LDcgQEAgc3RhdGljIGludCBs b3dsZXZlbF9ob2xlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAogCQkgKiBtZW1vcnku IFdlIGV4cGVjdCB0byBoaXQgLUVOT01FTS4KIAkJICovCiAKLQkJb2JqID0gZmFrZV9kbWFfb2Jq ZWN0KGk5MTUsIEJJVF9VTEwoc2l6ZSkpOworCQlvYmogPSBmYWtlX2RtYV9vYmplY3Qodm0tPmk5 MTUsIEJJVF9VTEwoc2l6ZSkpOwogCQlpZiAoSVNfRVJSKG9iaikpIHsKIAkJCWtmcmVlKG9yZGVy KTsKIAkJCWJyZWFrOwpAQCAtMjkxLDcgKzI5MSw3IEBAIHN0YXRpYyBpbnQgbG93bGV2ZWxfaG9s ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJCW1vY2tfdm1hLT5ub2RlLnNpemUg PSBCSVRfVUxMKHNpemUpOwogCQkJbW9ja192bWEtPm5vZGUuc3RhcnQgPSBhZGRyOwogCi0JCQl3 aXRoX2ludGVsX3J1bnRpbWVfcG0oJmk5MTUtPnJ1bnRpbWVfcG0sIHdha2VyZWYpCisJCQl3aXRo X2ludGVsX3J1bnRpbWVfcG0odm0tPmd0LT51bmNvcmUtPnJwbSwgd2FrZXJlZikKIAkJCQl2bS0+ aW5zZXJ0X2VudHJpZXModm0sIG1vY2tfdm1hLAogCQkJCQkJICAgSTkxNV9DQUNIRV9OT05FLCAw KTsKIAkJfQpAQCAtMzAzLDcgKzMwMyw3IEBAIHN0YXRpYyBpbnQgbG93bGV2ZWxfaG9sZShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJCWludGVsX3dha2VyZWZfdCB3YWtlcmVmOwog CiAJCQlHRU1fQlVHX09OKGFkZHIgKyBCSVRfVUxMKHNpemUpID4gdm0tPnRvdGFsKTsKLQkJCXdp dGhfaW50ZWxfcnVudGltZV9wbSgmaTkxNS0+cnVudGltZV9wbSwgd2FrZXJlZikKKwkJCXdpdGhf aW50ZWxfcnVudGltZV9wbSh2bS0+Z3QtPnVuY29yZS0+cnBtLCB3YWtlcmVmKQogCQkJCXZtLT5j bGVhcl9yYW5nZSh2bSwgYWRkciwgQklUX1VMTChzaXplKSk7CiAJCX0KIApAQCAtMzEyLDcgKzMx Miw3IEBAIHN0YXRpYyBpbnQgbG93bGV2ZWxfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSwKIAogCQlrZnJlZShvcmRlcik7CiAKLQkJY2xlYW51cF9mcmVlZF9vYmplY3RzKGk5MTUp OworCQljbGVhbnVwX2ZyZWVkX29iamVjdHModm0tPmk5MTUpOwogCX0KIAogCWtmcmVlKG1vY2tf dm1hKTsKQEAgLTM0MCw4ICszNDAsNyBAQCBzdGF0aWMgdm9pZCBjbG9zZV9vYmplY3RfbGlzdChz dHJ1Y3QgbGlzdF9oZWFkICpvYmplY3RzLAogCX0KIH0KIAotc3RhdGljIGludCBmaWxsX2hvbGUo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCSAgICAgc3RydWN0IGk5MTVfYWRkcmVz c19zcGFjZSAqdm0sCitzdGF0aWMgaW50IGZpbGxfaG9sZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSwKIAkJICAgICB1NjQgaG9sZV9zdGFydCwgdTY0IGhvbGVfZW5kLAogCQkgICAgIHVu c2lnbmVkIGxvbmcgZW5kX3RpbWUpCiB7CkBAIC0zNzQsNyArMzczLDcgQEAgc3RhdGljIGludCBm aWxsX2hvbGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCiAJCQkJeyB9CiAJCQl9LCAq cDsKIAotCQkJb2JqID0gZmFrZV9kbWFfb2JqZWN0KGk5MTUsIGZ1bGxfc2l6ZSk7CisJCQlvYmog PSBmYWtlX2RtYV9vYmplY3Qodm0tPmk5MTUsIGZ1bGxfc2l6ZSk7CiAJCQlpZiAoSVNfRVJSKG9i aikpCiAJCQkJYnJlYWs7CiAKQEAgLTU0Miw3ICs1NDEsNyBAQCBzdGF0aWMgaW50IGZpbGxfaG9s ZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJfQogCiAJCWNsb3NlX29iamVjdF9s aXN0KCZvYmplY3RzLCB2bSk7Ci0JCWNsZWFudXBfZnJlZWRfb2JqZWN0cyhpOTE1KTsKKwkJY2xl YW51cF9mcmVlZF9vYmplY3RzKHZtLT5pOTE1KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTU1Miw4 ICs1NTEsNyBAQCBzdGF0aWMgaW50IGZpbGxfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSwKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHdhbGtfaG9sZShzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJICAgICBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2 bSwKK3N0YXRpYyBpbnQgd2Fsa19ob2xlKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAog CQkgICAgIHU2NCBob2xlX3N0YXJ0LCB1NjQgaG9sZV9lbmQsCiAJCSAgICAgdW5zaWduZWQgbG9u ZyBlbmRfdGltZSkKIHsKQEAgLTU3NSw3ICs1NzMsNyBAQCBzdGF0aWMgaW50IHdhbGtfaG9sZShz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJdTY0IGFkZHI7CiAJCWludCBlcnIgPSAw OwogCi0JCW9iaiA9IGZha2VfZG1hX29iamVjdChpOTE1LCBzaXplIDw8IFBBR0VfU0hJRlQpOwor CQlvYmogPSBmYWtlX2RtYV9vYmplY3Qodm0tPmk5MTUsIHNpemUgPDwgUEFHRV9TSElGVCk7CiAJ CWlmIChJU19FUlIob2JqKSkKIAkJCWJyZWFrOwogCkBAIC02MzAsMTQgKzYyOCwxMyBAQCBzdGF0 aWMgaW50IHdhbGtfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJaWYgKGVy cikKIAkJCXJldHVybiBlcnI7CiAKLQkJY2xlYW51cF9mcmVlZF9vYmplY3RzKGk5MTUpOworCQlj bGVhbnVwX2ZyZWVkX29iamVjdHModm0tPmk5MTUpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1z dGF0aWMgaW50IHBvdF9ob2xlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAotCQkgICAg c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCitzdGF0aWMgaW50IHBvdF9ob2xlKHN0cnVj dCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAogCQkgICAgdTY0IGhvbGVfc3RhcnQsIHU2NCBob2xl X2VuZCwKIAkJICAgIHVuc2lnbmVkIGxvbmcgZW5kX3RpbWUpCiB7CkBAIC02NTEsNyArNjQ4LDcg QEAgc3RhdGljIGludCBwb3RfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAlp ZiAoaTkxNV9pc19nZ3R0KHZtKSkKIAkJZmxhZ3MgfD0gUElOX0dMT0JBTDsKIAotCW9iaiA9IGk5 MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgMiAqIEk5MTVfR1RUX1BBR0VfU0la RSk7CisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbCh2bS0+aTkxNSwgMiAq IEk5MTVfR1RUX1BBR0VfU0laRSk7CiAJaWYgKElTX0VSUihvYmopKQogCQlyZXR1cm4gUFRSX0VS UihvYmopOwogCkBAIC03MTIsOCArNzA5LDcgQEAgc3RhdGljIGludCBwb3RfaG9sZShzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRy dW5rX2hvbGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCSAgICAgIHN0cnVjdCBp OTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorc3RhdGljIGludCBkcnVua19ob2xlKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLAogCQkgICAgICB1NjQgaG9sZV9zdGFydCwgdTY0IGhvbGVfZW5k LAogCQkgICAgICB1bnNpZ25lZCBsb25nIGVuZF90aW1lKQogewpAQCAtNzU4LDcgKzc1NCw3IEBA IHN0YXRpYyBpbnQgZHJ1bmtfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJ ICogbWVtb3J5LiBXZSBleHBlY3QgdG8gaGl0IC1FTk9NRU0uCiAJCSAqLwogCi0JCW9iaiA9IGZh a2VfZG1hX29iamVjdChpOTE1LCBCSVRfVUxMKHNpemUpKTsKKwkJb2JqID0gZmFrZV9kbWFfb2Jq ZWN0KHZtLT5pOTE1LCBCSVRfVUxMKHNpemUpKTsKIAkJaWYgKElTX0VSUihvYmopKSB7CiAJCQlr ZnJlZShvcmRlcik7CiAJCQlicmVhazsKQEAgLTgxNiwxNCArODEyLDEzIEBAIHN0YXRpYyBpbnQg ZHJ1bmtfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJaWYgKGVycikKIAkJ CXJldHVybiBlcnI7CiAKLQkJY2xlYW51cF9mcmVlZF9vYmplY3RzKGk5MTUpOworCQljbGVhbnVw X2ZyZWVkX29iamVjdHModm0tPmk5MTUpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMg aW50IF9fc2hyaW5rX2hvbGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCQkgc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCitzdGF0aWMgaW50IF9fc2hyaW5rX2hvbGUoc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCiAJCQkgdTY0IGhvbGVfc3RhcnQsIHU2NCBob2xl X2VuZCwKIAkJCSB1bnNpZ25lZCBsb25nIGVuZF90aW1lKQogewpAQCAtODQwLDcgKzgzNSw3IEBA IHN0YXRpYyBpbnQgX19zaHJpbmtfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwK IAkJdTY0IHNpemUgPSBCSVRfVUxMKG9yZGVyKyspOwogCiAJCXNpemUgPSBtaW4oc2l6ZSwgaG9s ZV9lbmQgLSBhZGRyKTsKLQkJb2JqID0gZmFrZV9kbWFfb2JqZWN0KGk5MTUsIHNpemUpOworCQlv YmogPSBmYWtlX2RtYV9vYmplY3Qodm0tPmk5MTUsIHNpemUpOwogCQlpZiAoSVNfRVJSKG9iaikp IHsKIAkJCWVyciA9IFBUUl9FUlIob2JqKTsKIAkJCWJyZWFrOwpAQCAtODk0LDEyICs4ODksMTEg QEAgc3RhdGljIGludCBfX3Nocmlua19ob2xlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 LAogCX0KIAogCWNsb3NlX29iamVjdF9saXN0KCZvYmplY3RzLCB2bSk7Ci0JY2xlYW51cF9mcmVl ZF9vYmplY3RzKGk5MTUpOworCWNsZWFudXBfZnJlZWRfb2JqZWN0cyh2bS0+aTkxNSk7CiAJcmV0 dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBzaHJpbmtfaG9sZShzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqaTkxNSwKLQkJICAgICAgIHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtLAorc3Rh dGljIGludCBzaHJpbmtfaG9sZShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwKIAkJICAg ICAgIHU2NCBob2xlX3N0YXJ0LCB1NjQgaG9sZV9lbmQsCiAJCSAgICAgICB1bnNpZ25lZCBsb25n IGVuZF90aW1lKQogewpAQCAtOTExLDcgKzkwNSw3IEBAIHN0YXRpYyBpbnQgc2hyaW5rX2hvbGUo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCiAKIAlmb3JfZWFjaF9wcmltZV9udW1iZXJf ZnJvbShwcmltZSwgMCwgVUxPTkdfTUFYIC0gMSkgewogCQl2bS0+ZmF1bHRfYXR0ci5pbnRlcnZh bCA9IHByaW1lOwotCQllcnIgPSBfX3Nocmlua19ob2xlKGk5MTUsIHZtLCBob2xlX3N0YXJ0LCBo b2xlX2VuZCwgZW5kX3RpbWUpOworCQllcnIgPSBfX3Nocmlua19ob2xlKHZtLCBob2xlX3N0YXJ0 LCBob2xlX2VuZCwgZW5kX3RpbWUpOwogCQlpZiAoZXJyKQogCQkJYnJlYWs7CiAJfQpAQCAtOTIx LDggKzkxNSw3IEBAIHN0YXRpYyBpbnQgc2hyaW5rX2hvbGUoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUsCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBzaHJpbmtfYm9vbShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJICAgICAgIHN0cnVjdCBpOTE1X2FkZHJlc3Nf c3BhY2UgKnZtLAorc3RhdGljIGludCBzaHJpbmtfYm9vbShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSwKIAkJICAgICAgIHU2NCBob2xlX3N0YXJ0LCB1NjQgaG9sZV9lbmQsCiAJCSAgICAg ICB1bnNpZ25lZCBsb25nIGVuZF90aW1lKQogewpAQCAtOTQ0LDcgKzkzNyw3IEBAIHN0YXRpYyBp bnQgc2hyaW5rX2Jvb20oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCiAJCXVuc2lnbmVk IGludCBzaXplID0gc2l6ZXNbaV07CiAJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwogCi0JCXB1cmdl ID0gZmFrZV9kbWFfb2JqZWN0KGk5MTUsIHNpemUpOworCQlwdXJnZSA9IGZha2VfZG1hX29iamVj dCh2bS0+aTkxNSwgc2l6ZSk7CiAJCWlmIChJU19FUlIocHVyZ2UpKQogCQkJcmV0dXJuIFBUUl9F UlIocHVyZ2UpOwogCkBAIC05NjEsNyArOTU0LDcgQEAgc3RhdGljIGludCBzaHJpbmtfYm9vbShz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJLyogU2hvdWxkIG5vdyBiZSByaXBlIGZv ciBwdXJnaW5nICovCiAJCWk5MTVfdm1hX3VucGluKHZtYSk7CiAKLQkJZXhwbG9kZSA9IGZha2Vf ZG1hX29iamVjdChpOTE1LCBzaXplKTsKKwkJZXhwbG9kZSA9IGZha2VfZG1hX29iamVjdCh2bS0+ aTkxNSwgc2l6ZSk7CiAJCWlmIChJU19FUlIoZXhwbG9kZSkpIHsKIAkJCWVyciA9IFBUUl9FUlIo ZXhwbG9kZSk7CiAJCQlnb3RvIGVycl9wdXJnZTsKQEAgLTk4Nyw3ICs5ODAsNyBAQCBzdGF0aWMg aW50IHNocmlua19ib29tKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAogCQlpOTE1X2dl bV9vYmplY3RfcHV0KGV4cGxvZGUpOwogCiAJCW1lbXNldCgmdm0tPmZhdWx0X2F0dHIsIDAsIHNp emVvZih2bS0+ZmF1bHRfYXR0cikpOwotCQljbGVhbnVwX2ZyZWVkX29iamVjdHMoaTkxNSk7CisJ CWNsZWFudXBfZnJlZWRfb2JqZWN0cyh2bS0+aTkxNSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0x MDAxLDggKzk5NCw3IEBAIHN0YXRpYyBpbnQgc2hyaW5rX2Jvb20oc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmk5MTUsCiB9CiAKIHN0YXRpYyBpbnQgZXhlcmNpc2VfcHBndHQoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkJICBpbnQgKCpmdW5jKShzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSwKLQkJCQkgICAgICBzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSwK KwkJCSAgaW50ICgqZnVuYykoc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0sCiAJCQkJICAg ICAgdTY0IGhvbGVfc3RhcnQsIHU2NCBob2xlX2VuZCwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25n IGVuZF90aW1lKSkKIHsKQEAgLTEwMTgsNyArMTAxMCw3IEBAIHN0YXRpYyBpbnQgZXhlcmNpc2Vf cHBndHQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCWlmIChJU19FUlIoZmls ZSkpCiAJCXJldHVybiBQVFJfRVJSKGZpbGUpOwogCi0JcHBndHQgPSBpOTE1X3BwZ3R0X2NyZWF0 ZShkZXZfcHJpdik7CisJcHBndHQgPSBpOTE1X3BwZ3R0X2NyZWF0ZSgmZGV2X3ByaXYtPmd0KTsK IAlpZiAoSVNfRVJSKHBwZ3R0KSkgewogCQllcnIgPSBQVFJfRVJSKHBwZ3R0KTsKIAkJZ290byBv dXRfZnJlZTsKQEAgLTEwMjYsNyArMTAxOCw3IEBAIHN0YXRpYyBpbnQgZXhlcmNpc2VfcHBndHQo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCUdFTV9CVUdfT04ob2Zmc2V0X2lu X3BhZ2UocHBndHQtPnZtLnRvdGFsKSk7CiAJR0VNX0JVR19PTighYXRvbWljX3JlYWQoJnBwZ3R0 LT52bS5vcGVuKSk7CiAKLQllcnIgPSBmdW5jKGRldl9wcml2LCAmcHBndHQtPnZtLCAwLCBwcGd0 dC0+dm0udG90YWwsIGVuZF90aW1lKTsKKwllcnIgPSBmdW5jKCZwcGd0dC0+dm0sIDAsIHBwZ3R0 LT52bS50b3RhbCwgZW5kX3RpbWUpOwogCiAJaTkxNV92bV9wdXQoJnBwZ3R0LT52bSk7CiAKQEAg LTEwODIsOCArMTA3NCw3IEBAIHN0YXRpYyBpbnQgc29ydF9ob2xlcyh2b2lkICpwcml2LCBzdHJ1 Y3QgbGlzdF9oZWFkICpBLCBzdHJ1Y3QgbGlzdF9oZWFkICpCKQogfQogCiBzdGF0aWMgaW50IGV4 ZXJjaXNlX2dndHQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCQkgaW50ICgqZnVu Yykoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCi0JCQkJICAgICBzdHJ1Y3QgaTkxNV9h ZGRyZXNzX3NwYWNlICp2bSwKKwkJCSBpbnQgKCpmdW5jKShzdHJ1Y3QgaTkxNV9hZGRyZXNzX3Nw YWNlICp2bSwKIAkJCQkgICAgIHU2NCBob2xlX3N0YXJ0LCB1NjQgaG9sZV9lbmQsCiAJCQkJICAg ICB1bnNpZ25lZCBsb25nIGVuZF90aW1lKSkKIHsKQEAgLTExMDUsNyArMTA5Niw3IEBAIHN0YXRp YyBpbnQgZXhlcmNpc2VfZ2d0dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKIAkJaWYg KGhvbGVfc3RhcnQgPj0gaG9sZV9lbmQpCiAJCQljb250aW51ZTsKIAotCQllcnIgPSBmdW5jKGk5 MTUsICZnZ3R0LT52bSwgaG9sZV9zdGFydCwgaG9sZV9lbmQsIGVuZF90aW1lKTsKKwkJZXJyID0g ZnVuYygmZ2d0dC0+dm0sIGhvbGVfc3RhcnQsIGhvbGVfZW5kLCBlbmRfdGltZSk7CiAJCWlmIChl cnIpCiAJCQlicmVhazsKIApAQCAtMTI1Miw4ICsxMjQzLDcgQEAgc3RhdGljIHZvaWQgdHJhY2tf dm1hX2JpbmQoc3RydWN0IGk5MTVfdm1hICp2bWEpCiB9CiAKIHN0YXRpYyBpbnQgZXhlcmNpc2Vf bW9jayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJCSBpbnQgKCpmdW5jKShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKLQkJCQkgICAgIHN0cnVjdCBpOTE1X2FkZHJlc3Nf c3BhY2UgKnZtLAorCQkJIGludCAoKmZ1bmMpKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZt LAogCQkJCSAgICAgdTY0IGhvbGVfc3RhcnQsIHU2NCBob2xlX2VuZCwKIAkJCQkgICAgIHVuc2ln bmVkIGxvbmcgZW5kX3RpbWUpKQogewpAQCAtMTI2OCw3ICsxMjU4LDcgQEAgc3RhdGljIGludCBl eGVyY2lzZV9tb2NrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAogCQlyZXR1cm4gLUVO T01FTTsKIAogCXZtID0gaTkxNV9nZW1fY29udGV4dF9nZXRfdm1fcmN1KGN0eCk7Ci0JZXJyID0g ZnVuYyhpOTE1LCB2bSwgMCwgbWluKHZtLT50b3RhbCwgbGltaXQpLCBlbmRfdGltZSk7CisJZXJy ID0gZnVuYyh2bSwgMCwgbWluKHZtLT50b3RhbCwgbGltaXQpLCBlbmRfdGltZSk7CiAJaTkxNV92 bV9wdXQodm0pOwogCiAJbW9ja19jb250ZXh0X2Nsb3NlKGN0eCk7CmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19ndHQuYyBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L3NlbGZ0ZXN0cy9tb2NrX2d0dC5jCmluZGV4IDIwYWMzODQ0ZWRlYy4uZWRjNWUzZGRhOGNh IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19ndHQuYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvbW9ja19ndHQuYwpAQCAtNTUsNiAr NTUsMTEgQEAgc3RhdGljIHZvaWQgbW9ja19jbGVhbnVwKHN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtKQogewogfQogCitzdGF0aWMgdm9pZCBtb2NrX2NsZWFyX3JhbmdlKHN0cnVjdCBpOTE1 X2FkZHJlc3Nfc3BhY2UgKnZtLAorCQkJICAgICB1NjQgc3RhcnQsIHU2NCBsZW5ndGgpCit7Cit9 CisKIHN0cnVjdCBpOTE1X3BwZ3R0ICptb2NrX3BwZ3R0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1LCBjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCBpOTE1X3BwZ3R0ICpwcGd0dDsK QEAgLTcwLDcgKzc1LDcgQEAgc3RydWN0IGk5MTVfcHBndHQgKm1vY2tfcHBndHQoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUsIGNvbnN0IGNoYXIgKm5hbWUpCiAKIAlpOTE1X2FkZHJlc3Nf c3BhY2VfaW5pdCgmcHBndHQtPnZtLCBWTV9DTEFTU19QUEdUVCk7CiAKLQlwcGd0dC0+dm0uY2xl YXJfcmFuZ2UgPSBub3BfY2xlYXJfcmFuZ2U7CisJcHBndHQtPnZtLmNsZWFyX3JhbmdlID0gbW9j a19jbGVhcl9yYW5nZTsKIAlwcGd0dC0+dm0uaW5zZXJ0X3BhZ2UgPSBtb2NrX2luc2VydF9wYWdl OwogCXBwZ3R0LT52bS5pbnNlcnRfZW50cmllcyA9IG1vY2tfaW5zZXJ0X2VudHJpZXM7CiAJcHBn dHQtPnZtLmNsZWFudXAgPSBtb2NrX2NsZWFudXA7CkBAIC0xMDcsNyArMTEyLDcgQEAgdm9pZCBt b2NrX2luaXRfZ2d0dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwgc3RydWN0IGk5MTVf Z2d0dCAqZ2d0dCkKIAlnZ3R0LT5tYXBwYWJsZV9lbmQgPSByZXNvdXJjZV9zaXplKCZnZ3R0LT5n bWFkcik7CiAJZ2d0dC0+dm0udG90YWwgPSA0MDk2ICogUEFHRV9TSVpFOwogCi0JZ2d0dC0+dm0u Y2xlYXJfcmFuZ2UgPSBub3BfY2xlYXJfcmFuZ2U7CisJZ2d0dC0+dm0uY2xlYXJfcmFuZ2UgPSBt b2NrX2NsZWFyX3JhbmdlOwogCWdndHQtPnZtLmluc2VydF9wYWdlID0gbW9ja19pbnNlcnRfcGFn ZTsKIAlnZ3R0LT52bS5pbnNlcnRfZW50cmllcyA9IG1vY2tfaW5zZXJ0X2VudHJpZXM7CiAJZ2d0 dC0+dm0uY2xlYW51cCA9IG1vY2tfY2xlYW51cDsKLS0gCjIuMjUuMC5yYzEKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxp c3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=