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=-12.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,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 2CA74C4741F for ; Thu, 29 Oct 2020 21:28:59 +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 B4AB920731 for ; Thu, 29 Oct 2020 21:28:58 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B4AB920731 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id E5D6B6E90A; Thu, 29 Oct 2020 21:28:54 +0000 (UTC) Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id A63B66E908 for ; Thu, 29 Oct 2020 21:28:51 +0000 (UTC) IronPort-SDR: mQp02PRrtT5Rp42HVI50YJNcaI6Etg7WMCFrRLnRToVjZxT4gFiKaIahY1vrtnJ+3NL4sSgNly T/Meo/6ROZpg== X-IronPort-AV: E=McAfee;i="6000,8403,9789"; a="230151673" X-IronPort-AV: E=Sophos;i="5.77,430,1596524400"; d="scan'208";a="230151673" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Oct 2020 14:28:51 -0700 IronPort-SDR: mhfn68PYjbPzrzYyJqadl7XHAsvUmqSIzG8QdNtaCuTu0GHwQaS+lb9GmSABYDMDyWVO3z4W9V xxZjhre3FAPg== X-IronPort-AV: E=Sophos;i="5.77,430,1596524400"; d="scan'208";a="469282843" Received: from nschweme-mobl.amr.corp.intel.com (HELO achrisan-DESK2.amr.corp.intel.com) ([10.254.34.96]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-SHA; 29 Oct 2020 14:28:50 -0700 From: Anitha Chrisanthus To: dri-devel@lists.freedesktop.org, anitha.chrisanthus@intel.com Subject: [PATCH v10 4/6] drm/kmb: Add support for KeemBay Display Date: Thu, 29 Oct 2020 14:27:55 -0700 Message-Id: <1604006877-20092-5-git-send-email-anitha.chrisanthus@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1604006877-20092-1-git-send-email-anitha.chrisanthus@intel.com> References: <1604006877-20092-1-git-send-email-anitha.chrisanthus@intel.com> MIME-Version: 1.0 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: edmund.j.dea@intel.com, sam@ravnborg.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" VGhpcyBpcyBhIGJhc2ljIEtNUyBhdG9taWMgbW9kZXNldHRpbmcgZGlzcGxheSBkcml2ZXIgZm9y IEtlZW1CYXkgZmFtaWx5IG9mClNPQ3MuIERyaXZlciBoYXMgbm8gMkQgb3IgM0QgZ3JhcGhpY3Mu IEl0IGNhbGxzIGludG8gdGhlIEFEViBicmlkZ2UKZHJpdmVyIGF0IHRoZSBjb25uZWN0b3IgbGV2 ZWwuCgpTaW5nbGUgQ1JUQyB3aXRoIExDRCBjb250cm9sbGVyLT5taXBpIERTSS0+QURWIGJyaWRn ZQoKT25seSAxMDgwcCByZXNvbHV0aW9uIGFuZCBzaW5nbGUgcGxhbmUgaXMgc3VwcG9ydGVkIGF0 IHRoaXMgdGltZS4KCnYyOiBtb3ZlZCBleHRlcm4gdG8gLmgsIHJlbW92ZWQgbGljZW5zZSB0ZXh0 CiAgICB1c2UgZHJtX2Rldl9pbml0LCB1cGNsYXNzZWQgZGV2X3ByaXZhdGUsIHJlbW92ZWQgSEFW RV9JUlEuKFNhbSkKCnYzOiBTcXVhc2hlZCBhbGwgNTkgY29tbWl0cyB0byBvbmUKCnY0OiByZXZp ZXcgY2hhbmdlcyBmcm9tIFNhbSBSYXZuYm9yZwoJcmVuYW1lZCBkZXZfcCB0byBrbWIKCW1vdmVk IGNsb2NrcyB1bmRlciBrbWJfY2xvY2ssIGNvbnNvbGlkYXRlZCBjbGsgaW5pdGlhbGl6YXRpb25z Cgl1c2UgZHJtbSBmdW5jdGlvbnMKCXVzZSBEUk1fR0VNX0NNQV9EUklWRVJfT1BTX1ZNQVAKCnY1 OiBjb3JyZWN0ZWQgc3BlbGxpbmdzCnY2OiBjb3JyZWN0ZWQgY2hlY2twYXRjaCB3YXJuaW5ncwp2 NzogcmV2aWV3IGNoYW5nZXMgU2FtIFJhdm5ib3JnIGFuZCBUaG9tYXMgWmltbWVybWFuCglyZW1v dmVkIGttYl9jcnRjLmgga21iX2NydGNfY2xlYW51cCAoVGhvbWFzKQoJcmVuYW1lZCBtb2RlX3Nl dCwga21iX2xvYWQsIGlubGluZWQgdW5sb2FkIChUaG9tYXMpCgltb3ZlZCByZW1haW5pbmcgbG9n Z2luZyB0byBkcm1fKihUaG9tYXMpCglyZS1vcmdlZCBkcml2ZXIgaW5pdGlhbGl6YXRpb24gKFRo b21hcykKCW1vdmVkIHBsYW5lX3N0YXR1cyB0byBkcm1fcHJpdmF0ZSAoU2FtKQoJcmVtb3ZlZCB1 bm5lY2Vzc2FyeSBsb2dzIGFuZCBkZWZpbmVzIGFuZCBpZmRlZiBjb2RlcyAoU2FtKQoJY2FsbCBo ZWxwZXJfY2hlY2sgaW4gcGxhbmVfYXRvbWljX2NoZWNrIChTYW0pCglyZW5hbWVkIHNldCB0byBn ZXQgZm9yIGJwcCBhbmQgZm9ybWF0IGZ1bmN0aW9ucyhTYW0pCgl1c2UgZHJtIGhlbHBlciBmdW5j dGlvbnMgZm9yIHJlc2V0LCBkdXBsaWNhdGUvZGVzdHJveSBzdGF0ZSBpbnN0ZWFkCglvZiBrbWIg ZnVuY3Rpb25zIChTYW0pCglyZW1vdmVkIGttYl9wcml2IGZyb20ga21iX3BsYW5lIGFuZCByZW1v dmVkIGttYl9wbGFuZV9zdGF0ZSAoU2FtKQp2ODogZ2V0IGNsa19wbGwwIGZyb20gZGlzcGxheSBu b2RlIGluIGR0CnY5OiBtb3ZlZCBjc2NfY29lZl9sY2QgdG8gcGxhbmUuYyAoRGFuaWVsIFZldHRl cikKICAgIGNhbGwgZHJtX2F0b21pY19oZWxwZXJfc2h1dGRvd24gaW4gcmVtb3ZlIChEYW5pZWwg VikKICAgIHVzZSBkcm1fY3J0Y19oYW5kbGVfdmJsYW5rIChEYW5pZWwgVikKICAgIHJlbmFtZWQg a21iX2RzaV9od19pbml0IHRvIGttYl9kc2lfbW9kZV9zZXQgKERhbmllbCBWKQogICAgY29tcGxp bWVudGFyeSBjaGFuZ2VzIHRvIGRldmljZSB0cmVlIGNoYW5nZXMgKFJvYikKdjEwOiBjYWxsIGRy bV9jcnRjX2FybV92YmxhbmtfZXZlbnQgaW4gYXRvbWljX2ZsdXNoIChEYW5pZWwgVikKICAgICBt b3ZlZCBnbG9iYWwgdmFycyB0byBrbWJfcHJpdmF0ZSBhbmQgYWRkZWQgbG9ja3MgKERhbmllbCBW KQogICAgIGNoYW5nZXMgaW4gZHJpdmVyIHRvIGFjY29tbW9kYXRlIGNoYW5nZXMgaW4gRFQgdG8g c2VwYXJhdGUgRFNJCiAgICAgZW50cmllcyAoU2FtIFIpCiAgICAgcmV2aWV3IGNoYW5nZXMgdG8g c2VwYXJhdGUgbWlwaSBEU0kgKFNhbSBSKQoKU2lnbmVkLW9mZi1ieTogQW5pdGhhIENocmlzYW50 aHVzIDxhbml0aGEuY2hyaXNhbnRodXNAaW50ZWwuY29tPgpDYzogU2FtIFJhdm5ib3JnIDxzYW1A cmF2bmJvcmcub3JnPgpDYzogVGhvbWFzIFppbW1lcm1hbm4gPHR6aW1tZXJtYW5uQHN1c2UuZGU+ CkNjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWxAZmZ3bGwuY2g+Ci0tLQogZHJpdmVycy9ncHUvZHJt L2ttYi9rbWJfY3J0Yy5jICB8IDIzMiArKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0v a21iL2ttYl9kcnYuYyAgIHwgNjAzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKIGRyaXZlcnMvZ3B1L2RybS9rbWIva21iX2Rydi5oICAgfCAxMDkgKysrKysrKysKIGRy aXZlcnMvZ3B1L2RybS9rbWIva21iX3BsYW5lLmMgfCA0OTAgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9rbWIva21iX3BsYW5lLmggfCAgOTkgKysrKysr KwogNSBmaWxlcyBjaGFuZ2VkLCAxNTMzIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0va21iL2ttYl9jcnRjLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2dwdS9kcm0va21iL2ttYl9kcnYuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1 L2RybS9rbWIva21iX2Rydi5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2tt Yi9rbWJfcGxhbmUuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9rbWIva21i X3BsYW5lLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0va21iL2ttYl9jcnRjLmMgYi9k cml2ZXJzL2dwdS9kcm0va21iL2ttYl9jcnRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uNmFjZTY0ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9rbWIv a21iX2NydGMuYwpAQCAtMCwwICsxLDIzMiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6 IEdQTC0yLjAtb25seQorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE4LTIwMjAgSW50ZWwgQ29ycG9y YXRpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKKyNpbmNsdWRlIDxkcm0vZHJt X2F0b21pYy5oPgorI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgorI2luY2x1ZGUg PGRybS9kcm1fY3J0Yy5oPgorI2luY2x1ZGUgPGRybS9kcm1fY3J0Y19oZWxwZXIuaD4KKyNpbmNs dWRlIDxkcm0vZHJtX3ByaW50Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV92YmxhbmsuaD4KKyNpbmNs dWRlIDxkcm0vZHJtX21vZGVzZXRfaGVscGVyX3Z0YWJsZXMuaD4KKworI2luY2x1ZGUgImttYl9k cnYuaCIKKyNpbmNsdWRlICJrbWJfZHNpLmgiCisjaW5jbHVkZSAia21iX3BsYW5lLmgiCisjaW5j bHVkZSAia21iX3JlZ3MuaCIKKworc3RydWN0IGttYl9jcnRjX3RpbWluZyB7CisJdTMyIHZmcm9u dF9wb3JjaDsKKwl1MzIgdmJhY2tfcG9yY2g7CisJdTMyIHZzeW5jX2xlbjsKKwl1MzIgaGZyb250 X3BvcmNoOworCXUzMiBoYmFja19wb3JjaDsKKwl1MzIgaHN5bmNfbGVuOworfTsKKworc3RhdGlj IGludCBrbWJfY3J0Y19lbmFibGVfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlz dHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBrbWJfZHJtX3ByaXZh dGUgKmttYiA9IHRvX2ttYihkZXYpOworCisJLyogQ2xlYXIgaW50ZXJydXB0ICovCisJa21iX3dy aXRlX2xjZChrbWIsIExDRF9JTlRfQ0xFQVIsIExDRF9JTlRfVkVSVF9DT01QKTsKKwkvKiBTZXQg d2hpY2ggaW50ZXJ2YWwgdG8gZ2VuZXJhdGUgdmVydGljYWwgaW50ZXJydXB0ICovCisJa21iX3dy aXRlX2xjZChrbWIsIExDRF9WU1RBVFVTX0NPTVBBUkUsCisJCSAgICAgIExDRF9WU1RBVFVTX0NP TVBBUkVfVlNZTkMpOworCS8qIEVuYWJsZSB2ZXJ0aWNhbCBpbnRlcnJ1cHQgKi8KKwlrbWJfc2V0 X2JpdG1hc2tfbGNkKGttYiwgTENEX0lOVF9FTkFCTEUsCisJCQkgICAgTENEX0lOVF9WRVJUX0NP TVApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrbWJfY3J0Y19kaXNhYmxlX3ZibGFu ayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNy dGMtPmRldjsKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRlICprbWIgPSB0b19rbWIoZGV2KTsKKwor CS8qIENsZWFyIGludGVycnVwdCAqLworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfSU5UX0NMRUFS LCBMQ0RfSU5UX1ZFUlRfQ09NUCk7CisJLyogRGlzYWJsZSB2ZXJ0aWNhbCBpbnRlcnJ1cHQgKi8K KwlrbWJfY2xyX2JpdG1hc2tfbGNkKGttYiwgTENEX0lOVF9FTkFCTEUsCisJCQkgICAgTENEX0lO VF9WRVJUX0NPTVApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIGtt Yl9jcnRjX2Z1bmNzID0geworCS5kZXN0cm95ID0gZHJtX2NydGNfY2xlYW51cCwKKwkuc2V0X2Nv bmZpZyA9IGRybV9hdG9taWNfaGVscGVyX3NldF9jb25maWcsCisJLnBhZ2VfZmxpcCA9IGRybV9h dG9taWNfaGVscGVyX3BhZ2VfZmxpcCwKKwkucmVzZXQgPSBkcm1fYXRvbWljX2hlbHBlcl9jcnRj X3Jlc2V0LAorCS5hdG9taWNfZHVwbGljYXRlX3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY3J0 Y19kdXBsaWNhdGVfc3RhdGUsCisJLmF0b21pY19kZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19o ZWxwZXJfY3J0Y19kZXN0cm95X3N0YXRlLAorCS5lbmFibGVfdmJsYW5rID0ga21iX2NydGNfZW5h YmxlX3ZibGFuaywKKwkuZGlzYWJsZV92YmxhbmsgPSBrbWJfY3J0Y19kaXNhYmxlX3ZibGFuaywK K307CisKK3N0YXRpYyB2b2lkIGNvbm5lY3RfbGNkX3RvX21pcGkoc3RydWN0IGttYl9kcm1fcHJp dmF0ZSAqa21iKQoreworCS8qIERJU0FCTEUgTUlQSS0+Q0lGIENPTk5FQ1RJT04gKi8KKwlrbWJf d3JpdGVfbXNzY2FtKGttYiwgTVNTX01JUElfQ0lGX0NGRywgMCk7CisKKwkvKiBFTkFCTEUgTENE LT5NSVBJIENPTk5FQ1RJT04gKi8KKwlrbWJfd3JpdGVfbXNzY2FtKGttYiwgTVNTX0xDRF9NSVBJ X0NGRywgMSk7CisKKwkvKiBESVNBQkxFIExDRC0+Q0lGIExPT1BCQUNLICovCisJa21iX3dyaXRl X21zc2NhbShrbWIsIE1TU19MT09QQkFDS19DRkcsIDApOworfQorCitzdGF0aWMgdm9pZCBrbWJf Y3J0Y19zZXRfbW9kZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZp Y2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbSA9ICZjcnRj LT5zdGF0ZS0+YWRqdXN0ZWRfbW9kZTsKKwlzdHJ1Y3Qga21iX2NydGNfdGltaW5nIHZtOworCWlu dCB2c3luY19zdGFydF9vZmZzZXQ7CisJaW50IHZzeW5jX2VuZF9vZmZzZXQ7CisJc3RydWN0IGtt Yl9kcm1fcHJpdmF0ZSAqa21iID0gdG9fa21iKGRldik7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7 CisKKwkvKiBJbml0aWFsaXplIG1pcGkgKi8KKwlrbWJfZHNpX21vZGVfc2V0KGttYi0+a21iX2Rz aSwgbSwga21iLT5zeXNfY2xrX21oeik7CisJY29ubmVjdF9sY2RfdG9fbWlwaShrbWIpOworCWRy bV9pbmZvKGRldiwKKwkJICJ2ZnA9ICVkIHZicD0gJWQgdnN5Y19sZW49JWQgaGZwPSVkIGhicD0l ZCBoc3luY19sZW49JWRcbiIsCisJCSBtLT5jcnRjX3ZzeW5jX3N0YXJ0IC0gbS0+Y3J0Y192ZGlz cGxheSwKKwkJIG0tPmNydGNfdnRvdGFsIC0gbS0+Y3J0Y192c3luY19lbmQsCisJCSBtLT5jcnRj X3ZzeW5jX2VuZCAtIG0tPmNydGNfdnN5bmNfc3RhcnQsCisJCSBtLT5jcnRjX2hzeW5jX3N0YXJ0 IC0gbS0+Y3J0Y19oZGlzcGxheSwKKwkJIG0tPmNydGNfaHRvdGFsIC0gbS0+Y3J0Y19oc3luY19l bmQsCisJCSBtLT5jcnRjX2hzeW5jX2VuZCAtIG0tPmNydGNfaHN5bmNfc3RhcnQpOworCXZhbCA9 IGttYl9yZWFkX2xjZChrbWIsIExDRF9JTlRfRU5BQkxFKTsKKwlrbWJfY2xyX2JpdG1hc2tfbGNk KGttYiwgTENEX0lOVF9FTkFCTEUsIHZhbCk7CisJa21iX3NldF9iaXRtYXNrX2xjZChrbWIsIExD RF9JTlRfQ0xFQVIsIH4weDApOworCXZtLnZmcm9udF9wb3JjaCA9IDI7CisJdm0udmJhY2tfcG9y Y2ggPSAyOworCXZtLnZzeW5jX2xlbiA9IDg7CisJdm0uaGZyb250X3BvcmNoID0gMDsKKwl2bS5o YmFja19wb3JjaCA9IDA7CisJdm0uaHN5bmNfbGVuID0gMjg7CisKKwl2c3luY19zdGFydF9vZmZz ZXQgPSAgbS0+Y3J0Y192c3luY19zdGFydCAtICBtLT5jcnRjX2hzeW5jX3N0YXJ0OworCXZzeW5j X2VuZF9vZmZzZXQgPSAgbS0+Y3J0Y192c3luY19lbmQgLSBtLT5jcnRjX2hzeW5jX2VuZDsKKwor CWRybV9kYmcoZGV2LCAiJXMgOiAlZGFjdGl2ZSBoZWlnaHQ9ICVkIHZicD0lZCB2ZnA9JWQgdnN5 bmMtdz0lZCBoLWFjdGl2ZT0lZCBoLWJwPSVkIGgtZnA9JWQgaHlzbmMtbD0lZCIsCisJCV9fZnVu Y19fLCBfX0xJTkVfXywKKwkJCW0tPmNydGNfdmRpc3BsYXksIHZtLnZiYWNrX3BvcmNoLCB2bS52 ZnJvbnRfcG9yY2gsCisJCQl2bS52c3luY19sZW4sIG0tPmNydGNfaGRpc3BsYXksIHZtLmhiYWNr X3BvcmNoLAorCQkJdm0uaGZyb250X3BvcmNoLCB2bS5oc3luY19sZW4pOworCWttYl93cml0ZV9s Y2Qoa21iLCBMQ0RfVl9BQ1RJVkVIRUlHSFQsCisJCSAgICAgIG0tPmNydGNfdmRpc3BsYXkgLSAx KTsKKwlrbWJfd3JpdGVfbGNkKGttYiwgTENEX1ZfQkFDS1BPUkNILCB2bS52YmFja19wb3JjaCk7 CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9WX0ZST05UUE9SQ0gsIHZtLnZmcm9udF9wb3JjaCk7 CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9WU1lOQ19XSURUSCwgdm0udnN5bmNfbGVuIC0gMSk7 CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9IX0FDVElWRVdJRFRILAorCQkgICAgICBtLT5jcnRj X2hkaXNwbGF5IC0gMSk7CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9IX0JBQ0tQT1JDSCwgdm0u aGJhY2tfcG9yY2gpOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfSF9GUk9OVFBPUkNILCB2bS5o ZnJvbnRfcG9yY2gpOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfSFNZTkNfV0lEVEgsIHZtLmhz eW5jX2xlbiAtIDEpOworCS8qIFRoaXMgaXMgaGFyZGNvZGVkIGFzIDAgaW4gdGhlIE15cmlhZHgg Y29kZSAqLworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfVlNZTkNfU1RBUlQsIDApOworCWttYl93 cml0ZV9sY2Qoa21iLCBMQ0RfVlNZTkNfRU5ELCAwKTsKKwkvKiBCYWNrIGdyb3VuZCBjb2xvciAq LworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfQkdfQ09MT1VSX0xTLCAweDQpOworCWlmIChtLT5m bGFncyA9PSBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgeworCQlrbWJfd3JpdGVfbGNkKGttYiwK KwkJCSAgICAgIExDRF9WU1lOQ19XSURUSF9FVkVOLCB2bS52c3luY19sZW4gLSAxKTsKKwkJa21i X3dyaXRlX2xjZChrbWIsCisJCQkgICAgICBMQ0RfVl9CQUNLUE9SQ0hfRVZFTiwgdm0udmJhY2tf cG9yY2gpOworCQlrbWJfd3JpdGVfbGNkKGttYiwKKwkJCSAgICAgIExDRF9WX0ZST05UUE9SQ0hf RVZFTiwgdm0udmZyb250X3BvcmNoKTsKKwkJa21iX3dyaXRlX2xjZChrbWIsIExDRF9WX0FDVElW RUhFSUdIVF9FVkVOLAorCQkJICAgICAgbS0+Y3J0Y192ZGlzcGxheSAtIDEpOworCQkvKiBUaGlz IGlzIGhhcmRjb2RlZCBhcyAxMCBpbiB0aGUgTXlyaWFkeCBjb2RlICovCisJCWttYl93cml0ZV9s Y2Qoa21iLCBMQ0RfVlNZTkNfU1RBUlRfRVZFTiwgMTApOworCQlrbWJfd3JpdGVfbGNkKGttYiwg TENEX1ZTWU5DX0VORF9FVkVOLCAxMCk7CisJfQorCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfVElN SU5HX0dFTl9UUklHLCAxKTsKKwlrbWJfc2V0X2JpdG1hc2tfbGNkKGttYiwgTENEX0NPTlRST0ws IExDRF9DVFJMX0VOQUJMRSk7CisJa21iX3NldF9iaXRtYXNrX2xjZChrbWIsIExDRF9JTlRfRU5B QkxFLCB2YWwpOworfQorCitzdGF0aWMgdm9pZCBrbWJfY3J0Y19hdG9taWNfZW5hYmxlKHN0cnVj dCBkcm1fY3J0YyAqY3J0YywKKwkJCQkgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUp Cit7CisJc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqa21iID0gY3J0Y190b19rbWJfcHJpdihjcnRj KTsKKworCWNsa19wcmVwYXJlX2VuYWJsZShrbWItPmttYl9jbGsuY2xrX2xjZCk7CisJa21iX2Ny dGNfc2V0X21vZGUoY3J0Yyk7CisJZHJtX2NydGNfdmJsYW5rX29uKGNydGMpOworfQorCitzdGF0 aWMgdm9pZCBrbWJfY3J0Y19hdG9taWNfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJ CQkJICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3Qga21iX2Ry bV9wcml2YXRlICprbWIgPSBjcnRjX3RvX2ttYl9wcml2KGNydGMpOworCXN0cnVjdCBkcm1fY3J0 Y19zdGF0ZSAqb2xkX3N0YXRlID0gZHJtX2F0b21pY19nZXRfb2xkX2NydGNfc3RhdGUoc3RhdGUs IGNydGMpOworCisJLyogZHVlIHRvIGh3IGxpbWl0YXRpb25zLCBwbGFuZXMgbmVlZCB0byBiZSBv ZmYgd2hlbiBjcnRjIGlzIG9mZiAqLworCWRybV9hdG9taWNfaGVscGVyX2Rpc2FibGVfcGxhbmVz X29uX2NydGMob2xkX3N0YXRlLCBmYWxzZSk7CisKKwlkcm1fY3J0Y192Ymxhbmtfb2ZmKGNydGMp OworCWNsa19kaXNhYmxlX3VucHJlcGFyZShrbWItPmttYl9jbGsuY2xrX2xjZCk7Cit9CisKK3N0 YXRpYyB2b2lkIGttYl9jcnRjX2F0b21pY19iZWdpbihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJ CQkJICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1fZGV2aWNl ICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqa21iID0gdG9fa21i KGRldik7CisKKwlrbWJfY2xyX2JpdG1hc2tfbGNkKGttYiwgTENEX0lOVF9FTkFCTEUsCisJCQkg ICAgTENEX0lOVF9WRVJUX0NPTVApOworfQorCitzdGF0aWMgdm9pZCBrbWJfY3J0Y19hdG9taWNf Zmx1c2goc3RydWN0IGRybV9jcnRjICpjcnRjLAorCQkJCSAgc3RydWN0IGRybV9jcnRjX3N0YXRl ICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVj dCBrbWJfZHJtX3ByaXZhdGUgKmttYiA9IHRvX2ttYihkZXYpOworCisJa21iX3NldF9iaXRtYXNr X2xjZChrbWIsIExDRF9JTlRfRU5BQkxFLAorCQkJICAgIExDRF9JTlRfVkVSVF9DT01QKTsKKwor CXNwaW5fbG9ja19pcnEoJmNydGMtPmRldi0+ZXZlbnRfbG9jayk7CisJaWYgKGNydGMtPnN0YXRl LT5ldmVudCkgeworCQlpZiAoZHJtX2NydGNfdmJsYW5rX2dldChjcnRjKSA9PSAwKQorCQkJZHJt X2NydGNfYXJtX3ZibGFua19ldmVudChjcnRjLCBjcnRjLT5zdGF0ZS0+ZXZlbnQpOworCQllbHNl CisJCQlkcm1fY3J0Y19zZW5kX3ZibGFua19ldmVudChjcnRjLCBjcnRjLT5zdGF0ZS0+ZXZlbnQp OworCX0KKwljcnRjLT5zdGF0ZS0+ZXZlbnQgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycSgmY3J0 Yy0+ZGV2LT5ldmVudF9sb2NrKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19o ZWxwZXJfZnVuY3Mga21iX2NydGNfaGVscGVyX2Z1bmNzID0geworCS5hdG9taWNfYmVnaW4gPSBr bWJfY3J0Y19hdG9taWNfYmVnaW4sCisJLmF0b21pY19lbmFibGUgPSBrbWJfY3J0Y19hdG9taWNf ZW5hYmxlLAorCS5hdG9taWNfZGlzYWJsZSA9IGttYl9jcnRjX2F0b21pY19kaXNhYmxlLAorCS5h dG9taWNfZmx1c2ggPSBrbWJfY3J0Y19hdG9taWNfZmx1c2gsCit9OworCitpbnQga21iX3NldHVw X2NydGMoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKK3sKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRl ICprbWIgPSB0b19rbWIoZHJtKTsKKwlzdHJ1Y3Qga21iX3BsYW5lICpwcmltYXJ5OworCWludCBy ZXQ7CisKKwlwcmltYXJ5ID0ga21iX3BsYW5lX2luaXQoZHJtKTsKKwlpZiAoSVNfRVJSKHByaW1h cnkpKQorCQlyZXR1cm4gUFRSX0VSUihwcmltYXJ5KTsKKworCXJldCA9IGRybV9jcnRjX2luaXRf d2l0aF9wbGFuZXMoZHJtLCAma21iLT5jcnRjLCAmcHJpbWFyeS0+YmFzZV9wbGFuZSwKKwkJCQkJ TlVMTCwgJmttYl9jcnRjX2Z1bmNzLCBOVUxMKTsKKwlpZiAocmV0KSB7CisJCWttYl9wbGFuZV9k ZXN0cm95KCZwcmltYXJ5LT5iYXNlX3BsYW5lKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkcm1f Y3J0Y19oZWxwZXJfYWRkKCZrbWItPmNydGMsICZrbWJfY3J0Y19oZWxwZXJfZnVuY3MpOworCXJl dHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2ttYi9rbWJfZHJ2LmMgYi9k cml2ZXJzL2dwdS9kcm0va21iL2ttYl9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5iMWI4ODdmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2ttYi9r bWJfZHJ2LmMKQEAgLTAsMCArMSw2MDMgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wLW9ubHkKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOC0yMDIwIEludGVsIENvcnBvcmF0 aW9uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVs ZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dyYXBoLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxh dGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9yZXNlcnZlZF9tZW0uaD4KKyNpbmNsdWRlIDxs aW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisK KyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2Ry di5oPgorI2luY2x1ZGUgPGRybS9kcm1fZ2VtX2NtYV9oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0v ZHJtX2dlbV9mcmFtZWJ1ZmZlcl9oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2lycS5oPgor I2luY2x1ZGUgPGRybS9kcm1fcHJvYmVfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV92Ymxh bmsuaD4KKworI2luY2x1ZGUgImttYl9kcnYuaCIKKyNpbmNsdWRlICJrbWJfZHNpLmgiCisjaW5j bHVkZSAia21iX3JlZ3MuaCIKKworaW50IGttYl9kaXNwbGF5X2Nsa19lbmFibGUoc3RydWN0IGtt Yl9kcm1fcHJpdmF0ZSAqa21iKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gY2xrX3ByZXBh cmVfZW5hYmxlKGttYi0+a21iX2Nsay5jbGtfbGNkKTsKKwlpZiAocmV0KSB7CisJCWRybV9lcnIo JmttYi0+ZHJtLCAiRmFpbGVkIHRvIGVuYWJsZSBMQ0QgY2xvY2s6ICVkXG4iLCByZXQpOworCQly ZXR1cm4gcmV0OworCX0KKwlEUk1fSU5GTygiU1VDQ0VTUyA6IGVuYWJsZWQgTENEIE1JUEkgY2xv Y2tzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGttYl9pbml0aWFsaXplX2Nsb2NrcyhzdHJ1 Y3Qga21iX2RybV9wcml2YXRlICprbWIsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0 ID0gMDsKKworCWttYi0+a21iX2Nsay5jbGtfbGNkID0gZGV2bV9jbGtfZ2V0KGRldiwgImNsa19s Y2QiKTsKKwlpZiAoSVNfRVJSKGttYi0+a21iX2Nsay5jbGtfbGNkKSkgeworCQlkcm1fZXJyKCZr bWItPmRybSwgImNsa19nZXQoKSBmYWlsZWQgY2xrX2xjZFxuIik7CisJCXJldHVybiBQVFJfRVJS KGttYi0+a21iX2Nsay5jbGtfbGNkKTsKKwl9CisKKwlrbWItPmttYl9jbGsuY2xrX3BsbDAgPSBk ZXZtX2Nsa19nZXQoZGV2LCAiY2xrX3BsbDAiKTsKKwlpZiAoSVNfRVJSKGttYi0+a21iX2Nsay5j bGtfcGxsMCkpIHsKKwkJZHJtX2Vycigma21iLT5kcm0sICJjbGtfZ2V0KCkgZmFpbGVkIGNsa19w bGwwICIpOworCQlyZXR1cm4gUFRSX0VSUihrbWItPmttYl9jbGsuY2xrX3BsbDApOworCX0KKwlr bWItPnN5c19jbGtfbWh6ID0gY2xrX2dldF9yYXRlKGttYi0+a21iX2Nsay5jbGtfcGxsMCkgLyAx MDAwMDAwOworCWRybV9pbmZvKCZrbWItPmRybSwgInN5c3RlbSBjbGsgPSAlZCBNaHoiLCBrbWIt PnN5c19jbGtfbWh6KTsKKworCXJldCA9ICBrbWJfZHNpX2Nsa19pbml0KGttYi0+a21iX2RzaSk7 CisKKwkvKiBTZXQgTENEIGNsb2NrIHRvIDIwMCBNaHogKi8KKwljbGtfc2V0X3JhdGUoa21iLT5r bWJfY2xrLmNsa19sY2QsIEtNQl9MQ0RfREVGQVVMVF9DTEspOworCWlmIChjbGtfZ2V0X3JhdGUo a21iLT5rbWJfY2xrLmNsa19sY2QpICE9IEtNQl9MQ0RfREVGQVVMVF9DTEspIHsKKwkJZHJtX2Vy cigma21iLT5kcm0sICJmYWlsZWQgdG8gc2V0IHRvIGNsa19sY2QgdG8gJWRcbiIsCisJCQlLTUJf TENEX0RFRkFVTFRfQ0xLKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkcm1fZGJnKCZrbWItPmRybSwg ImNsa19sY2QgPSAlbGRcbiIsIGNsa19nZXRfcmF0ZShrbWItPmttYl9jbGsuY2xrX2xjZCkpOwor CisJcmV0ID0ga21iX2Rpc3BsYXlfY2xrX2VuYWJsZShrbWIpOworCWlmIChyZXQpCisJCXJldHVy biByZXQ7CisKKwkvKiBFbmFibGUgTVNTX0NBTV9DTEtfQ1RSTCBmb3IgTUlQSSBUWCBhbmQgTENE ICovCisJa21iX3NldF9iaXRtYXNrX21zc2NhbShrbWIsIE1TU19DQU1fQ0xLX0NUUkwsIDB4MWZm Zik7CisJa21iX3NldF9iaXRtYXNrX21zc2NhbShrbWIsIE1TU19DQU1fUlNUTl9DVFJMLCAweGZm ZmZmZmZmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQga21iX2Rpc3BsYXlfY2xrX2Rp c2FibGUoc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqa21iKQoreworCWNsa19kaXNhYmxlX3VucHJl cGFyZShrbWItPmttYl9jbGsuY2xrX2xjZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKmtt Yl9tYXBfbW1pbyhzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLAorCQkJCSAgc3RydWN0IHBsYXRmb3Jt X2RldmljZSAqcGRldiwKKwkJCQkgIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHJlc291cmNlICpy ZXM7CisJdm9pZCBfX2lvbWVtICptZW07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2Vf YnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBuYW1lKTsKKwlpZiAoIXJlcykgeworCQlkcm1f ZXJyKGRybSwgImZhaWxlZCB0byBnZXQgcmVzb3VyY2UgZm9yICVzIiwgbmFtZSk7CisJCXJldHVy biBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwltZW0gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZHJt LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihtZW0pKQorCQlkcm1fZXJyKGRybSwgImZhaWxlZCB0 byBpb3JlbWFwICVzIHJlZ2lzdGVycyIsIG5hbWUpOworCXJldHVybiBtZW07Cit9CisKK3N0YXRp YyBpbnQga21iX2h3X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRybSwgdW5zaWduZWQgbG9uZyBm bGFncykKK3sKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRlICprbWIgPSB0b19rbWIoZHJtKTsKKwlz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRybS0+ZGV2 KTsKKwlpbnQgaXJxX2xjZDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIE1hcCBMQ0QgTU1JTyByZWdp c3RlcnMgKi8KKwlrbWItPmxjZF9tbWlvID0ga21iX21hcF9tbWlvKGRybSwgcGRldiwgImxjZCIp OworCWlmIChJU19FUlIoa21iLT5sY2RfbW1pbykpIHsKKwkJZHJtX2Vycigma21iLT5kcm0sICJm YWlsZWQgdG8gbWFwIExDRCByZWdpc3RlcnNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisK KwkvKiBUaGlzIGlzIG9ubHkgZm9yIE1JUElfVFhfTVNTX0xDRF9NSVBJX0NGRyBhbmQKKwkgKiBN U1NfQ0FNX0NMS19DVFJMIHJlZ2lzdGVyCisJICovCisJa21iLT5tc3NjYW1fbW1pbyA9IGttYl9t YXBfbW1pbyhkcm0sIHBkZXYsICJtc3NjYW0iKTsKKwlpZiAoSVNfRVJSKGttYi0+bXNzY2FtX21t aW8pKSB7CisJCWRybV9lcnIoJmttYi0+ZHJtLCAiZmFpbGVkIHRvIG1hcCBNU1NDQU0gcmVnaXN0 ZXJzXG4iKTsKKwkJaW91bm1hcChrbWItPmxjZF9tbWlvKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJ fQorCisJLyogTWFwIE1JUEkgTU1JTyByZWdpc3RlcnMgKi8KKwlyZXQgPSBrbWJfZHNpX21hcF9t bWlvKGttYi0+a21iX2RzaSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEVuYWJs ZSBkaXNwbGF5IGNsb2NrcyAqLworCWttYl9pbml0aWFsaXplX2Nsb2NrcyhrbWIsICZwZGV2LT5k ZXYpOworCisJLyogUmVnaXN0ZXIgaXJxcyBoZXJlIC0gc2VjdGlvbiAxNy4zIGluIGRhdGFib29r CisJICogbGlzdHMgTENEIGF0IDc5IGFuZCA4MiBmb3IgTUlQSSB1bmRlciBNU1MgQ1BVIC0KKwkg KiBmaXJtd2FyZSBoYXMgcmVkaXJlY3RlZCA3OSB0byBBNTMgSVJRIDMzCisJICovCisKKwkvKiBB bGxvY2F0ZSBMQ0QgaW50ZXJydXB0IHJlc291cmNlcyAqLworCWlycV9sY2QgPSBwbGF0Zm9ybV9n ZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnFfbGNkIDwgMCkgeworCQlkcm1fZXJyKCZrbWItPmRy bSwgImlycV9sY2Qgbm90IGZvdW5kIik7CisJCWdvdG8gc2V0dXBfZmFpbDsKKwl9CisKKwkvKiBH ZXQgdGhlIG9wdGlvbmFsIGZyYW1lYnVmZmVyIG1lbW9yeSByZXNvdXJjZSAqLworCXJldCA9IG9m X3Jlc2VydmVkX21lbV9kZXZpY2VfaW5pdChkcm0tPmRldik7CisJaWYgKHJldCAmJiByZXQgIT0g LUVOT0RFVikKKwkJcmV0dXJuIHJldDsKKworCXNwaW5fbG9ja19pbml0KCZrbWItPmlycV9sb2Nr KTsKKworCWttYi0+aXJxX2xjZCA9IGlycV9sY2Q7CisKKwlyZXR1cm4gMDsKKworIHNldHVwX2Zh aWw6CisJb2ZfcmVzZXJ2ZWRfbWVtX2RldmljZV9yZWxlYXNlKGRybS0+ZGV2KTsKKworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIGtt Yl9tb2RlX2NvbmZpZ19mdW5jcyA9IHsKKwkuZmJfY3JlYXRlID0gZHJtX2dlbV9mYl9jcmVhdGUs CisJLmF0b21pY19jaGVjayA9IGRybV9hdG9taWNfaGVscGVyX2NoZWNrLAorCS5hdG9taWNfY29t bWl0ID0gZHJtX2F0b21pY19oZWxwZXJfY29tbWl0LAorfTsKKworc3RhdGljIGludCBrbWJfc2V0 dXBfbW9kZV9jb25maWcoc3RydWN0IGRybV9kZXZpY2UgKmRybSkKK3sKKwlpbnQgcmV0OworCXN0 cnVjdCBrbWJfZHJtX3ByaXZhdGUgKmttYiA9IHRvX2ttYihkcm0pOworCisJcmV0ID0gZHJtbV9t b2RlX2NvbmZpZ19pbml0KGRybSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlkcm0tPm1v ZGVfY29uZmlnLm1pbl93aWR0aCA9IEtNQl9NSU5fV0lEVEg7CisJZHJtLT5tb2RlX2NvbmZpZy5t aW5faGVpZ2h0ID0gS01CX01JTl9IRUlHSFQ7CisJZHJtLT5tb2RlX2NvbmZpZy5tYXhfd2lkdGgg PSBLTUJfTUFYX1dJRFRIOworCWRybS0+bW9kZV9jb25maWcubWF4X2hlaWdodCA9IEtNQl9NQVhf SEVJR0hUOworCWRybS0+bW9kZV9jb25maWcuZnVuY3MgPSAma21iX21vZGVfY29uZmlnX2Z1bmNz OworCisJcmV0ID0ga21iX3NldHVwX2NydGMoZHJtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkcm1f ZXJyKGRybSwgImZhaWxlZCB0byBjcmVhdGUgY3J0Y1xuIik7CisJCXJldHVybiByZXQ7CisJfQor CXJldCA9IGttYl9kc2lfZW5jb2Rlcl9pbml0KGRybSwga21iLT5rbWJfZHNpKTsKKwkvKiBTZXQg dGhlIENSVEMncyBwb3J0IHNvIHRoYXQgdGhlIGVuY29kZXIgY29tcG9uZW50IGNhbiBmaW5kIGl0 ICovCisJa21iLT5jcnRjLnBvcnQgPSBvZl9ncmFwaF9nZXRfcG9ydF9ieV9pZChkcm0tPmRldi0+ b2Zfbm9kZSwgMCk7CisJcmV0ID0gZHJtX3ZibGFua19pbml0KGRybSwgZHJtLT5tb2RlX2NvbmZp Zy5udW1fY3J0Yyk7CisJaWYgKHJldCA8IDApIHsKKwkJZHJtX2Vycihkcm0sICJmYWlsZWQgdG8g aW5pdGlhbGl6ZSB2YmxhbmtcbiIpOworCQlwbV9ydW50aW1lX2Rpc2FibGUoZHJtLT5kZXYpOwor CQlyZXR1cm4gcmV0OworCX0KKworCWRybV9tb2RlX2NvbmZpZ19yZXNldChkcm0pOworCXJldHVy biAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFuZGxlX2xjZF9pcnEoc3RydWN0IGRybV9k ZXZpY2UgKmRldikKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXR1cywgdmFsLCB2YWwxOworCWludCBw bGFuZV9pZCwgZG1hMF9zdGF0ZSwgZG1hMV9zdGF0ZTsKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRl ICprbWIgPSB0b19rbWIoZGV2KTsKKworCXN0YXR1cyA9IGttYl9yZWFkX2xjZChrbWIsIExDRF9J TlRfU1RBVFVTKTsKKworCXNwaW5fbG9jaygma21iLT5pcnFfbG9jayk7CisJaWYgKHN0YXR1cyAm IExDRF9JTlRfRU9GKSB7CisJCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfSU5UX0NMRUFSLCBMQ0Rf SU5UX0VPRik7CisKKwkJLyogV2hlbiBkaXNhYmxpbmcvZW5hYmxpbmcgTENEIGxheWVycywgdGhl IGNoYW5nZSB0YWtlcyBlZmZlY3QKKwkJICogaW1tZWRpYXRlbHkgYW5kIGRvZXMgbm90IHdhaXQg Zm9yIEVPRiAoZW5kIG9mIGZyYW1lKS4KKwkJICogV2hlbiBrbWJfcGxhbmVfYXRvbWljX2Rpc2Fi bGUgaXMgY2FsbGVkLCBtYXJrIHRoZSBwbGFuZSBhcworCQkgKiBkaXNhYmxlZCBidXQgYWN0dWFs bHkgZGlzYWJsZSB0aGUgcGxhbmUgd2hlbiBFT0YgaXJxIGlzCisJCSAqIGJlaW5nIGhhbmRsZWQu CisJCSAqLworCQlmb3IgKHBsYW5lX2lkID0gTEFZRVJfMDsKKwkJCQlwbGFuZV9pZCA8IEtNQl9N QVhfUExBTkVTOyBwbGFuZV9pZCsrKSB7CisJCQlpZiAoa21iLT5wbGFuZV9zdGF0dXNbcGxhbmVf aWRdLmRpc2FibGUpIHsKKwkJCQlrbWJfY2xyX2JpdG1hc2tfbGNkKGttYiwKKwkJCQkJCSAgICBM Q0RfTEFZRVJuX0RNQV9DRkcKKwkJCQkJCSAgICAocGxhbmVfaWQpLAorCQkJCQkJICAgIExDRF9E TUFfTEFZRVJfRU5BQkxFKTsKKworCQkJCWttYl9jbHJfYml0bWFza19sY2Qoa21iLCBMQ0RfQ09O VFJPTCwKKwkJCQkJCSAgICBrbWItPnBsYW5lX3N0YXR1c1twbGFuZV9pZF0uY3RybCk7CisKKwkJ CQlrbWItPnBsYW5lX3N0YXR1c1twbGFuZV9pZF0uZGlzYWJsZSA9IGZhbHNlOworCQkJfQorCQl9 CisJCWlmIChrbWItPmttYl91bmRlcl9mbG93KSB7CisJCQkvKiBETUEgUmVjb3ZlcnkgYWZ0ZXIg dW5kZXJmbG93ICovCisJCQlkbWEwX3N0YXRlID0gKGttYi0+bGF5ZXJfbm8gPT0gMCkgPworCQkJ ICAgIExDRF9WSURFTzBfRE1BMF9TVEFURSA6IExDRF9WSURFTzFfRE1BMF9TVEFURTsKKwkJCWRt YTFfc3RhdGUgPSAoa21iLT5sYXllcl9ubyA9PSAwKSA/CisJCQkgICAgTENEX1ZJREVPMF9ETUEx X1NUQVRFIDogTENEX1ZJREVPMV9ETUExX1NUQVRFOworCisJCQlkbyB7CisJCQkJa21iX3dyaXRl X2xjZChrbWIsIExDRF9GSUZPX0ZMVVNILCAxKTsKKwkJCQl2YWwgPSBrbWJfcmVhZF9sY2Qoa21i LCBkbWEwX3N0YXRlKQorCQkJCSAgICAmIExDRF9ETUFfU1RBVEVfQUNUSVZFOworCQkJCXZhbDEg PSBrbWJfcmVhZF9sY2Qoa21iLCBkbWExX3N0YXRlKQorCQkJCSAgICAmIExDRF9ETUFfU1RBVEVf QUNUSVZFOworCQkJfSB3aGlsZSAoKHZhbCB8fCB2YWwxKSk7CisJCQkvKiBkaXNhYmxlIGRtYSAq LworCQkJa21iX2Nscl9iaXRtYXNrX2xjZChrbWIsCisJCQkJCSAgICBMQ0RfTEFZRVJuX0RNQV9D Rkcoa21iLT5sYXllcl9ubyksCisJCQkJCSAgICBMQ0RfRE1BX0xBWUVSX0VOQUJMRSk7CisJCQlr bWJfd3JpdGVfbGNkKGttYiwgTENEX0ZJRk9fRkxVU0gsIDEpOworCQkJa21iLT5rbWJfZmx1c2hf ZG9uZSA9IDE7CisJCQlrbWItPmttYl91bmRlcl9mbG93ID0gMDsKKwkJfQorCX0KKworCWlmIChz dGF0dXMgJiBMQ0RfSU5UX0xJTkVfQ01QKSB7CisJCS8qIGNsZWFyIGxpbmUgY29tcGFyZSBpbnRl cnJ1cHQgKi8KKwkJa21iX3dyaXRlX2xjZChrbWIsIExDRF9JTlRfQ0xFQVIsIExDRF9JTlRfTElO RV9DTVApOworCX0KKworCWlmIChzdGF0dXMgJiBMQ0RfSU5UX1ZFUlRfQ09NUCkgeworCQkvKiBS ZWFkIFZTVEFUVVMgKi8KKwkJdmFsID0ga21iX3JlYWRfbGNkKGttYiwgTENEX1ZTVEFUVVMpOwor CQl2YWwgPSAodmFsICYgTENEX1ZTVEFUVVNfVkVSVElDQUxfU1RBVFVTX01BU0spOworCQlzd2l0 Y2ggKHZhbCkgeworCQljYXNlIExDRF9WU1RBVFVTX0NPTVBBUkVfVlNZTkM6CisJCQkvKiBDbGVh ciB2ZXJ0aWNhbCBjb21wYXJlIGludGVycnVwdCAqLworCQkJa21iX3dyaXRlX2xjZChrbWIsIExD RF9JTlRfQ0xFQVIsIExDRF9JTlRfVkVSVF9DT01QKTsKKwkJCWlmIChrbWItPmttYl9mbHVzaF9k b25lKSB7CisJCQkJa21iX3NldF9iaXRtYXNrX2xjZChrbWIsCisJCQkJCQkgICAgTENEX0xBWUVS bl9ETUFfQ0ZHCisJCQkJCQkgICAgKGttYi0+bGF5ZXJfbm8pLAorCQkJCQkJICAgIExDRF9ETUFf TEFZRVJfRU5BQkxFKTsKKwkJCQlrbWItPmttYl9mbHVzaF9kb25lID0gMDsKKwkJCX0KKwkJCWRy bV9jcnRjX2hhbmRsZV92YmxhbmsoJmttYi0+Y3J0Yyk7CisJCQlicmVhazsKKwkJY2FzZSBMQ0Rf VlNUQVRVU19DT01QQVJFX0JBQ0tQT1JDSDoKKwkJY2FzZSBMQ0RfVlNUQVRVU19DT01QQVJFX0FD VElWRToKKwkJY2FzZSBMQ0RfVlNUQVRVU19DT01QQVJFX0ZST05UX1BPUkNIOgorCQkJa21iX3dy aXRlX2xjZChrbWIsIExDRF9JTlRfQ0xFQVIsIExDRF9JTlRfVkVSVF9DT01QKTsKKwkJCWJyZWFr OworCQl9CisJfQorCWlmIChzdGF0dXMgJiBMQ0RfSU5UX0RNQV9FUlIpIHsKKwkJdmFsID0KKwkJ ICAgIChzdGF0dXMgJiBMQ0RfSU5UX0RNQV9FUlIgJgorCQkgICAgIGttYl9yZWFkX2xjZChrbWIs IExDRF9JTlRfRU5BQkxFKSk7CisJCS8qIExBWUVSMCAtIFZMMCAqLworCQlpZiAodmFsICYgKExB WUVSMF9ETUFfRklGT19VTkRFUkZMT1cgfAorCQkJICAgTEFZRVIwX0RNQV9DQl9GSUZPX1VOREVS RkxPVyB8CisJCQkgICBMQVlFUjBfRE1BX0NSX0ZJRk9fVU5ERVJGTE9XKSkgeworCQkJa21iLT5r bWJfdW5kZXJfZmxvdysrOworCQkJZHJtX2luZm8oJmttYi0+ZHJtLAorCQkJCSAiIUxBWUVSMDpW TDAgRE1BIFVOREVSRkxPVyB2YWwgPSAweCVseCx1bmRlcl9mbG93PSVkIiwKKwkJCSAgICAgdmFs LCBrbWItPmttYl91bmRlcl9mbG93KTsKKwkJCS8qIGRpc2FibGUgdW5kZXJmbG93IGludGVycnVw dCAqLworCQkJa21iX2Nscl9iaXRtYXNrX2xjZChrbWIsIExDRF9JTlRfRU5BQkxFLAorCQkJCQkg ICAgTEFZRVIwX0RNQV9GSUZPX1VOREVSRkxPVyB8CisJCQkJCSAgICBMQVlFUjBfRE1BX0NCX0ZJ Rk9fVU5ERVJGTE9XIHwKKwkJCQkJICAgIExBWUVSMF9ETUFfQ1JfRklGT19VTkRFUkZMT1cpOwor CQkJa21iX3NldF9iaXRtYXNrX2xjZChrbWIsIExDRF9JTlRfQ0xFQVIsCisJCQkJCSAgICBMQVlF UjBfRE1BX0NCX0ZJRk9fVU5ERVJGTE9XIHwKKwkJCQkJICAgIExBWUVSMF9ETUFfRklGT19VTkRF UkZMT1cgfAorCQkJCQkgICAgTEFZRVIwX0RNQV9DUl9GSUZPX1VOREVSRkxPVyk7CisJCQkvKiBk aXNhYmxlIGF1dG8gcmVzdGFydCBtb2RlICovCisJCQlrbWJfY2xyX2JpdG1hc2tfbGNkKGttYiwg TENEX0xBWUVSbl9ETUFfQ0ZHKDApLAorCQkJCQkgICAgTENEX0RNQV9MQVlFUl9DT05UX1BJTkdf UE9OR19VUERBVEUpOworCisJCQlrbWItPmxheWVyX25vID0gMDsKKwkJfQorCisJCWlmICh2YWwg JiBMQVlFUjBfRE1BX0ZJRk9fT1ZFUkZMT1cpCisJCQlkcm1fZGJnKCZrbWItPmRybSwKKwkJCQki TEFZRVIwOlZMMCBETUEgT1ZFUkZMT1cgdmFsID0gMHglbHgiLCB2YWwpOworCQlpZiAodmFsICYg TEFZRVIwX0RNQV9DQl9GSUZPX09WRVJGTE9XKQorCQkJZHJtX2RiZygma21iLT5kcm0sCisJCQkJ IkxBWUVSMDpWTDAgRE1BIENCIE9WRVJGTE9XIHZhbCA9IDB4JWx4IiwgdmFsKTsKKwkJaWYgKHZh bCAmIExBWUVSMF9ETUFfQ1JfRklGT19PVkVSRkxPVykKKwkJCWRybV9kYmcoJmttYi0+ZHJtLAor CQkJCSJMQVlFUjA6VkwwIERNQSBDUiBPVkVSRkxPVyB2YWwgPSAweCVseCIsIHZhbCk7CisKKwkJ LyogTEFZRVIxIC0gVkwxICovCisJCWlmICh2YWwgJiAoTEFZRVIxX0RNQV9GSUZPX1VOREVSRkxP VyB8CisJCQkgICBMQVlFUjFfRE1BX0NCX0ZJRk9fVU5ERVJGTE9XIHwKKwkJCSAgIExBWUVSMV9E TUFfQ1JfRklGT19VTkRFUkZMT1cpKSB7CisJCQlrbWItPmttYl91bmRlcl9mbG93Kys7CisJCQlk cm1faW5mbygma21iLT5kcm0sCisJCQkJICIhTEFZRVIxOlZMMSBETUEgVU5ERVJGTE9XIHZhbCA9 IDB4JWx4LCB1bmRlcl9mbG93PSVkIiwKKwkJCSAgICAgdmFsLCBrbWItPmttYl91bmRlcl9mbG93 KTsKKwkJCS8qIGRpc2FibGUgdW5kZXJmbG93IGludGVycnVwdCAqLworCQkJa21iX2Nscl9iaXRt YXNrX2xjZChrbWIsIExDRF9JTlRfRU5BQkxFLAorCQkJCQkgICAgTEFZRVIxX0RNQV9GSUZPX1VO REVSRkxPVyB8CisJCQkJCSAgICBMQVlFUjFfRE1BX0NCX0ZJRk9fVU5ERVJGTE9XIHwKKwkJCQkJ ICAgIExBWUVSMV9ETUFfQ1JfRklGT19VTkRFUkZMT1cpOworCQkJa21iX3NldF9iaXRtYXNrX2xj ZChrbWIsIExDRF9JTlRfQ0xFQVIsCisJCQkJCSAgICBMQVlFUjFfRE1BX0NCX0ZJRk9fVU5ERVJG TE9XIHwKKwkJCQkJICAgIExBWUVSMV9ETUFfRklGT19VTkRFUkZMT1cgfAorCQkJCQkgICAgTEFZ RVIxX0RNQV9DUl9GSUZPX1VOREVSRkxPVyk7CisJCQkvKiBkaXNhYmxlIGF1dG8gcmVzdGFydCBt b2RlICovCisJCQlrbWJfY2xyX2JpdG1hc2tfbGNkKGttYiwgTENEX0xBWUVSbl9ETUFfQ0ZHKDEp LAorCQkJCQkgICAgTENEX0RNQV9MQVlFUl9DT05UX1BJTkdfUE9OR19VUERBVEUpOworCQkJa21i LT5sYXllcl9ubyA9IDE7CisJCX0KKworCQkvKiBMQVlFUjEgLSBWTDEgKi8KKwkJaWYgKHZhbCAm IExBWUVSMV9ETUFfRklGT19PVkVSRkxPVykKKwkJCWRybV9kYmcoJmttYi0+ZHJtLAorCQkJCSJM QVlFUjE6VkwxIERNQSBPVkVSRkxPVyB2YWwgPSAweCVseCIsIHZhbCk7CisJCWlmICh2YWwgJiBM QVlFUjFfRE1BX0NCX0ZJRk9fT1ZFUkZMT1cpCisJCQlkcm1fZGJnKCZrbWItPmRybSwKKwkJCQki TEFZRVIxOlZMMSBETUEgQ0IgT1ZFUkZMT1cgdmFsID0gMHglbHgiLCB2YWwpOworCQlpZiAodmFs ICYgTEFZRVIxX0RNQV9DUl9GSUZPX09WRVJGTE9XKQorCQkJZHJtX2RiZygma21iLT5kcm0sCisJ CQkJIkxBWUVSMTpWTDEgRE1BIENSIE9WRVJGTE9XIHZhbCA9IDB4JWx4IiwgdmFsKTsKKworCQkv KiBMQVlFUjIgLSBHTDAgKi8KKwkJaWYgKHZhbCAmIExBWUVSMl9ETUFfRklGT19VTkRFUkZMT1cp CisJCQlkcm1fZGJnKCZrbWItPmRybSwKKwkJCQkiTEFZRVIyOkdMMCBETUEgVU5ERVJGTE9XIHZh bCA9IDB4JWx4IiwgdmFsKTsKKwkJaWYgKHZhbCAmIExBWUVSMl9ETUFfRklGT19PVkVSRkxPVykK KwkJCWRybV9kYmcoJmttYi0+ZHJtLAorCQkJCSJMQVlFUjI6R0wwIERNQSBPVkVSRkxPVyB2YWwg PSAweCVseCIsIHZhbCk7CisKKwkJLyogTEFZRVIzIC0gR0wxICovCisJCWlmICh2YWwgJiBMQVlF UjNfRE1BX0ZJRk9fVU5ERVJGTE9XKQorCQkJZHJtX2RiZygma21iLT5kcm0sCisJCQkJIkxBWUVS MzpHTDEgRE1BIFVOREVSRkxPVyB2YWwgPSAweCVseCIsIHZhbCk7CisJCWlmICh2YWwgJiBMQVlF UjNfRE1BX0ZJRk9fVU5ERVJGTE9XKQorCQkJZHJtX2RiZygma21iLT5kcm0sCisJCQkJIkxBWUVS MzpHTDEgRE1BIE9WRVJGTE9XIHZhbCA9IDB4JWx4IiwgdmFsKTsKKwl9CisKKwlzcGluX3VubG9j aygma21iLT5pcnFfbG9jayk7CisKKwlpZiAoc3RhdHVzICYgTENEX0lOVF9MQVlFUikgeworCQkv KiBDbGVhciBsYXllciBpbnRlcnJ1cHRzICovCisJCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfSU5U X0NMRUFSLCBMQ0RfSU5UX0xBWUVSKTsKKwl9CisKKwkvKiBDbGVhciBhbGwgaW50ZXJydXB0cyAq LworCWttYl9zZXRfYml0bWFza19sY2Qoa21iLCBMQ0RfSU5UX0NMRUFSLCAxKTsKKwlyZXR1cm4g SVJRX0hBTkRMRUQ7Cit9CisKKy8qIElSUSBoYW5kbGVyICovCitzdGF0aWMgaXJxcmV0dXJuX3Qg a21iX2lzcihpbnQgaXJxLCB2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9 IChzdHJ1Y3QgZHJtX2RldmljZSAqKWFyZzsKKworCWhhbmRsZV9sY2RfaXJxKGRldik7CisJcmV0 dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBrbWJfaXJxX3Jlc2V0KHN0cnVjdCBk cm1fZGV2aWNlICpkcm0pCit7CisJa21iX3dyaXRlX2xjZCh0b19rbWIoZHJtKSwgTENEX0lOVF9D TEVBUiwgMHhGRkZGKTsKKwlrbWJfd3JpdGVfbGNkKHRvX2ttYihkcm0pLCBMQ0RfSU5UX0VOQUJM RSwgMCk7Cit9CisKK0RFRklORV9EUk1fR0VNX0NNQV9GT1BTKGZvcHMpOworCitzdGF0aWMgc3Ry dWN0IGRybV9kcml2ZXIga21iX2RyaXZlciA9IHsKKwkuZHJpdmVyX2ZlYXR1cmVzID0gRFJJVkVS X0dFTSB8CisJICAgIERSSVZFUl9NT0RFU0VUIHwgRFJJVkVSX0FUT01JQywKKwkuaXJxX2hhbmRs ZXIgPSBrbWJfaXNyLAorCS5pcnFfcHJlaW5zdGFsbCA9IGttYl9pcnFfcmVzZXQsCisJLmlycV91 bmluc3RhbGwgPSBrbWJfaXJxX3Jlc2V0LAorCS8qIEdFTSBPcGVyYXRpb25zICovCisJLmZvcHMg PSAmZm9wcywKKwlEUk1fR0VNX0NNQV9EUklWRVJfT1BTX1ZNQVAsCisJLm5hbWUgPSAia21iLWRy bSIsCisJLmRlc2MgPSAiS0VFTUJBWSBESVNQTEFZIERSSVZFUiAiLAorCS5kYXRlID0gIjIwMjAx MDA4IiwKKwkubWFqb3IgPSAxLAorCS5taW5vciA9IDAsCit9OworCitzdGF0aWMgaW50IGttYl9y ZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpk ZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRh dGEoZGV2KTsKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRlICprbWIgPSB0b19rbWIoZHJtKTsKKwor CWRybV9kZXZfdW5yZWdpc3Rlcihkcm0pOworCWRybV9rbXNfaGVscGVyX3BvbGxfZmluaShkcm0p OworCW9mX25vZGVfcHV0KGttYi0+Y3J0Yy5wb3J0KTsKKwlrbWItPmNydGMucG9ydCA9IE5VTEw7 CisJcG1fcnVudGltZV9nZXRfc3luYyhkcm0tPmRldik7CisJZHJtX2lycV91bmluc3RhbGwoZHJt KTsKKwlwbV9ydW50aW1lX3B1dF9zeW5jKGRybS0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUo ZHJtLT5kZXYpOworCisJb2ZfcmVzZXJ2ZWRfbWVtX2RldmljZV9yZWxlYXNlKGRybS0+ZGV2KTsK KworCS8qIFJlbGVhc2UgY2xrcyAqLworCWttYl9kaXNwbGF5X2Nsa19kaXNhYmxlKGttYik7CisK KwlkZXZfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKKworCS8qIFVucmVnaXN0ZXIgRFNJIGhvc3Qg Ki8KKwlrbWJfZHNpX2hvc3RfdW5yZWdpc3RlcihrbWItPmttYl9kc2kpOworCWRybV9hdG9taWNf aGVscGVyX3NodXRkb3duKGRybSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga21iX3By b2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2 ID0gZ2V0X2RldmljZSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRlICprbWI7 CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRldmljZV9ub2RlICpkc2lfaW47CisJc3RydWN0IGRl dmljZV9ub2RlICpkc2lfbm9kZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lfcGRldjsK KworCS8qIFRoZSBicmlkZ2UgKEFEViA3NTM1KSB3aWxsIHJldHVybiAtRVBST0JFX0RFRkVSIHVu dGlsIGl0CisJICogaGFzIGEgbWlwaV9kc2lfaG9zdCB0byByZWdpc3RlciBpdHMgZGV2aWNlIHRv LiBTbywgd2UKKwkgKiBmaXJzdCByZWdpc3RlciB0aGUgRFNJIGhvc3QgZHVyaW5nIHByb2JlIHRp bWUsIGFuZCB0aGVuIHJldHVybgorCSAqIC1FUFJPQkVfREVGRVIgdW50aWwgdGhlIGJyaWRnZSBp cyBsb2FkZWQuIFByb2JlIHdpbGwgYmUgY2FsbGVkIGFnYWluCisJICogIGFuZCB0aGVuIHRoZSBy ZXN0IG9mIHRoZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gY2FuIHByb2NlZWQKKwkgKiAgYWZ0ZXJ3 YXJkcyBhbmQgdGhlIGJyaWRnZSBjYW4gYmUgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkLgorCSAqLwor CWRzaV9pbiA9IG9mX2dyYXBoX2dldF9lbmRwb2ludF9ieV9yZWdzKGRldi0+b2Zfbm9kZSwgMCwg MCk7CisJaWYgKCFkc2lfaW4pIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gZ2V0IGRzaV9pbiBu b2RlIGluZm8gZnJvbSBEVCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZHNpX25vZGUgPSBv Zl9ncmFwaF9nZXRfcmVtb3RlX3BvcnRfcGFyZW50KGRzaV9pbik7CisJaWYgKCFkc2lfbm9kZSkg eworCQlvZl9ub2RlX3B1dChkc2lfaW4pOworCQlEUk1fRVJST1IoIkZhaWxlZCB0byBnZXQgZHNp IG5vZGUgZnJvbSBEVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRzaV9wZGV2ID0g b2ZfZmluZF9kZXZpY2VfYnlfbm9kZShkc2lfbm9kZSk7CisJaWYgKCFkc2lfcGRldikgeworCQlv Zl9ub2RlX3B1dChkc2lfaW4pOworCQlvZl9ub2RlX3B1dChkc2lfbm9kZSk7CisJCURSTV9FUlJP UigiRmFpbGVkIHRvIGdldCBkc2kgcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5W QUw7CisJfQorCisJb2Zfbm9kZV9wdXQoZHNpX2luKTsKKwlvZl9ub2RlX3B1dChkc2lfbm9kZSk7 CisJcmV0ID0ga21iX2RzaV9ob3N0X2JyaWRnZV9pbml0KGdldF9kZXZpY2UoJmRzaV9wZGV2LT5k ZXYpKTsKKworCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikgeworCQlyZXR1cm4gLUVQUk9CRV9E RUZFUjsKKwl9IGVsc2UgaWYgKHJldCkgeworCQlEUk1fRVJST1IoInByb2JlIGZhaWxlZCB0byBp bml0aWFsaXplIERTSSBob3N0IGJyaWRnZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyog Q3JlYXRlIERSTSBkZXZpY2UgKi8KKwlrbWIgPSBkZXZtX2RybV9kZXZfYWxsb2MoZGV2LCAma21i X2RyaXZlciwKKwkJCQkgc3RydWN0IGttYl9kcm1fcHJpdmF0ZSwgZHJtKTsKKwlpZiAoSVNfRVJS KGttYikpCisJCXJldHVybiBQVFJfRVJSKGttYik7CisKKwlkZXZfc2V0X2RydmRhdGEoZGV2LCAm a21iLT5kcm0pOworCisJLyogSW5pdGlhbGl6ZSBNSVBJIERTSSAqLworCWttYi0+a21iX2RzaSA9 IGttYl9kc2lfaW5pdChkc2lfcGRldik7CisJaWYgKElTX0VSUihrbWItPmttYl9kc2kpKSB7CisJ CWRybV9lcnIoJmttYi0+ZHJtLCAiZmFpbGVkIHRvIGluaXRpYWxpemUgRFNJXG4iKTsKKwkJcmV0 ID0gUFRSX0VSUihrbWItPmttYl9kc2kpOworCQlnb3RvIGVycl9mcmVlMTsKKwl9CisKKwlrbWIt PmttYl9kc2ktPmRldiA9ICZkc2lfcGRldi0+ZGV2OworCWttYi0+a21iX2RzaS0+cGRldiA9IGRz aV9wZGV2OworCXJldCA9IGttYl9od19pbml0KCZrbWItPmRybSwgMCk7CisJaWYgKHJldCkKKwkJ Z290byBlcnJfZnJlZTE7CisKKwlyZXQgPSBrbWJfc2V0dXBfbW9kZV9jb25maWcoJmttYi0+ZHJt KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJcmV0ID0gZHJtX2lycV9pbnN0YWxs KCZrbWItPmRybSwga21iLT5pcnFfbGNkKTsKKwlpZiAocmV0IDwgMCkgeworCQlkcm1fZXJyKCZr bWItPmRybSwgImZhaWxlZCB0byBpbnN0YWxsIElSUSBoYW5kbGVyXG4iKTsKKwkJZ290byBlcnJf aXJxOworCX0KKworCWRybV9rbXNfaGVscGVyX3BvbGxfaW5pdCgma21iLT5kcm0pOworCisJLyog UmVnaXN0ZXIgZ3JhcGhpY3MgZGV2aWNlIHdpdGggdGhlIGtlcm5lbCAqLworCXJldCA9IGRybV9k ZXZfcmVnaXN0ZXIoJmttYi0+ZHJtLCAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZWdpc3Rl cjsKKworCXJldHVybiAwOworCisgZXJyX3JlZ2lzdGVyOgorCWRybV9rbXNfaGVscGVyX3BvbGxf ZmluaSgma21iLT5kcm0pOworIGVycl9pcnE6CisJcG1fcnVudGltZV9kaXNhYmxlKGttYi0+ZHJt LmRldik7CisgZXJyX2ZyZWU6CisJZHJtX2NydGNfY2xlYW51cCgma21iLT5jcnRjKTsKKwlkcm1f bW9kZV9jb25maWdfY2xlYW51cCgma21iLT5kcm0pOworIGVycl9mcmVlMToKKwlkZXZfc2V0X2Ry dmRhdGEoZGV2LCBOVUxMKTsKKwlrbWJfZHNpX2hvc3RfdW5yZWdpc3RlcihrbWItPmttYl9kc2kp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQg a21iX29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gImludGVsLGtlZW1iYXktZGlzcGxh eSJ9LAorCXt9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwga21iX29mX21hdGNoKTsK Kworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBrbWJfcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNl ICpkZXYpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYp OworCXN0cnVjdCBrbWJfZHJtX3ByaXZhdGUgKmttYiA9IGRybSA/IHRvX2ttYihkcm0pIDogTlVM TDsKKworCWRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZShkcm0pOworCisJa21iLT5zdGF0ZSA9 IGRybV9hdG9taWNfaGVscGVyX3N1c3BlbmQoZHJtKTsKKwlpZiAoSVNfRVJSKGttYi0+c3RhdGUp KSB7CisJCWRybV9rbXNfaGVscGVyX3BvbGxfZW5hYmxlKGRybSk7CisJCXJldHVybiBQVFJfRVJS KGttYi0+c3RhdGUpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVf dW51c2VkIGttYl9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkcm1f ZGV2aWNlICpkcm0gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qga21iX2RybV9wcml2 YXRlICprbWIgPSBkcm0gPyB0b19rbWIoZHJtKSA6IE5VTEw7CisKKwlpZiAoIWttYikKKwkJcmV0 dXJuIDA7CisKKwlkcm1fYXRvbWljX2hlbHBlcl9yZXN1bWUoZHJtLCBrbWItPnN0YXRlKTsKKwlk cm1fa21zX2hlbHBlcl9wb2xsX2VuYWJsZShkcm0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBTSU1QTEVfREVWX1BNX09QUyhrbWJfcG1fb3BzLCBrbWJfcG1fc3VzcGVuZCwga21iX3BtX3Jl c3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGttYl9wbGF0Zm9ybV9kcml2 ZXIgPSB7CisJLnByb2JlID0ga21iX3Byb2JlLAorCS5yZW1vdmUgPSBrbWJfcmVtb3ZlLAorCS5k cml2ZXIgPSB7CisJCS5uYW1lID0gImttYi1kcm0iLAorCQkucG0gPSAma21iX3BtX29wcywKKwkJ Lm9mX21hdGNoX3RhYmxlID0ga21iX29mX21hdGNoLAorCX0sCit9OworCittb2R1bGVfcGxhdGZv cm1fZHJpdmVyKGttYl9wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJJbnRlbCBD b3Jwb3JhdGlvbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJLZWVtYmF5IERpc3BsYXkgZHJpdmVy Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0va21iL2ttYl9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9rbWIva21iX2Rydi5oCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNGZmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL2dwdS9kcm0va21iL2ttYl9kcnYuaApAQCAtMCwwICsxLDEwOSBAQAorLyogU1BEWC1M aWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQorICoKKyAqIENvcHlyaWdodCDCqSAyMDE4 LTIwMjAgSW50ZWwgQ29ycG9yYXRpb24KKyAqLworCisjaWZuZGVmIF9fS01CX0RSVl9IX18KKyNk ZWZpbmUgX19LTUJfRFJWX0hfXworCisjaW5jbHVkZSA8ZHJtL2RybV9kZXZpY2UuaD4KKworI2lu Y2x1ZGUgImttYl9wbGFuZS5oIgorI2luY2x1ZGUgImttYl9yZWdzLmgiCisKKyNkZWZpbmUgS01C X01BWF9XSURUSAkJCTE5MjAgLypNYXggd2lkdGggaW4gcGl4ZWxzICovCisjZGVmaW5lIEtNQl9N QVhfSEVJR0hUCQkJMTA4MCAvKk1heCBoZWlnaHQgaW4gcGl4ZWxzICovCisjZGVmaW5lIEtNQl9N SU5fV0lEVEggICAgICAgICAgICAgICAgICAgMTkyMCAvKk1heCB3aWR0aCBpbiBwaXhlbHMgKi8K KyNkZWZpbmUgS01CX01JTl9IRUlHSFQgICAgICAgICAgICAgICAgICAxMDgwIC8qTWF4IGhlaWdo dCBpbiBwaXhlbHMgKi8KKyNkZWZpbmUgS01CX0xDRF9ERUZBVUxUX0NMSwkJMjAwMDAwMDAwCisj ZGVmaW5lIEtNQl9TWVNfQ0xLX01IWgkJCTUwMAorCisjZGVmaW5lIElDQU1fTU1JTwkJMHgzYjEw MDAwMAorI2RlZmluZSBJQ0FNX0xDRF9PRkZTRVQJCTB4MTA4MAorI2RlZmluZSBJQ0FNX01NSU9f U0laRQkJMHgyMDAwCisKK3N0cnVjdCBrbWJfZHNpOworCitzdHJ1Y3Qga21iX2Nsb2NrIHsKKwlz dHJ1Y3QgY2xrICpjbGtfbGNkOworCXN0cnVjdCBjbGsgKmNsa19wbGwwOworfTsKKworc3RydWN0 IGttYl9kcm1fcHJpdmF0ZSB7CisJc3RydWN0IGRybV9kZXZpY2UJCWRybTsKKwlzdHJ1Y3Qga21i X2RzaQkJCSprbWJfZHNpOworCXZvaWQgX19pb21lbQkJCSpsY2RfbW1pbzsKKwl2b2lkIF9faW9t ZW0JCQkqbXNzY2FtX21taW87CisJc3RydWN0IGttYl9jbG9jawkJa21iX2NsazsKKwlzdHJ1Y3Qg ZHJtX2NydGMJCQljcnRjOworCXN0cnVjdCBrbWJfcGxhbmUJCSpwbGFuZTsKKwlzdHJ1Y3QgZHJt X2F0b21pY19zdGF0ZQkJKnN0YXRlOworCXNwaW5sb2NrX3QJCQlpcnFfbG9jazsKKwlpbnQJCQkJ aXJxX2xjZDsKKwlpbnQJCQkJc3lzX2Nsa19taHo7CisJc3RydWN0IGxheWVyX3N0YXR1cwkJcGxh bmVfc3RhdHVzW0tNQl9NQVhfUExBTkVTXTsKKwlpbnQJCQkJa21iX3VuZGVyX2Zsb3c7CisJaW50 CQkJCWttYl9mbHVzaF9kb25lOworCWludAkJCQlsYXllcl9ubzsKK307CisKK3N0YXRpYyBpbmxp bmUgc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqdG9fa21iKGNvbnN0IHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrbWJfZHJtX3ByaXZh dGUsIGRybSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqY3J0 Y190b19rbWJfcHJpdihjb25zdCBzdHJ1Y3QgZHJtX2NydGMgKngpCit7CisJcmV0dXJuIGNvbnRh aW5lcl9vZih4LCBzdHJ1Y3Qga21iX2RybV9wcml2YXRlLCBjcnRjKTsKK30KKworc3RhdGljIGlu bGluZSB2b2lkIGttYl93cml0ZV9sY2Qoc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqZGV2X3AsCisJ CQkJIHVuc2lnbmVkIGludCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIChkZXZf cC0+bGNkX21taW8gKyByZWcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGttYl93cml0ZV9t c3NjYW0oc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqZGV2X3AsCisJCQkJICAgIHVuc2lnbmVkIGlu dCByZWcsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIChkZXZfcC0+bXNzY2FtX21taW8g KyByZWcpKTsKK30KKworc3RhdGljIGlubGluZSB1MzIga21iX3JlYWRfbXNzY2FtKHN0cnVjdCBr bWJfZHJtX3ByaXZhdGUgKmRldl9wLAorCQkJCSAgdW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1 cm4gcmVhZGwoZGV2X3AtPm1zc2NhbV9tbWlvICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2 b2lkIGttYl9zZXRfYml0bWFza19tc3NjYW0oc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqZGV2X3As CisJCQkJCSAgdW5zaWduZWQgaW50IHJlZywgdTMyIG1hc2spCit7CisJdTMyIHJlZ192YWwgPSBr bWJfcmVhZF9tc3NjYW0oZGV2X3AsIHJlZyk7CisKKwlrbWJfd3JpdGVfbXNzY2FtKGRldl9wLCBy ZWcsIChyZWdfdmFsIHwgbWFzaykpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBrbWJfcmVhZF9s Y2Qoc3RydWN0IGttYl9kcm1fcHJpdmF0ZSAqZGV2X3AsIHVuc2lnbmVkIGludCByZWcpCit7CisJ cmV0dXJuIHJlYWRsKGRldl9wLT5sY2RfbW1pbyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUg dm9pZCBrbWJfc2V0X2JpdG1hc2tfbGNkKHN0cnVjdCBrbWJfZHJtX3ByaXZhdGUgKmRldl9wLAor CQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVnLCB1MzIgbWFzaykKK3sKKwl1MzIgcmVnX3ZhbCA9 IGttYl9yZWFkX2xjZChkZXZfcCwgcmVnKTsKKworCWttYl93cml0ZV9sY2QoZGV2X3AsIHJlZywg KHJlZ192YWwgfCBtYXNrKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWJfY2xyX2JpdG1h c2tfbGNkKHN0cnVjdCBrbWJfZHJtX3ByaXZhdGUgKmRldl9wLAorCQkJCSAgICAgICB1bnNpZ25l ZCBpbnQgcmVnLCB1MzIgbWFzaykKK3sKKwl1MzIgcmVnX3ZhbCA9IGttYl9yZWFkX2xjZChkZXZf cCwgcmVnKTsKKworCWttYl93cml0ZV9sY2QoZGV2X3AsIHJlZywgKHJlZ192YWwgJiAofm1hc2sp KSk7Cit9CisKK2ludCBrbWJfc2V0dXBfY3J0YyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKK3Zv aWQga21iX3NldF9zY2Fub3V0KHN0cnVjdCBrbWJfZHJtX3ByaXZhdGUgKmxjZCk7CisjZW5kaWYg LyogX19LTUJfRFJWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2ttYi9rbWJf cGxhbmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9rbWIva21iX3BsYW5lLmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3ZDliNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9rbWIva21iX3BsYW5lLmMKQEAgLTAsMCArMSw0OTAgQEAKKy8vIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxOC0yMDIw IEludGVsIENvcnBvcmF0aW9uCisgKi8KKworI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljLmg+Cisj aW5jbHVkZSA8ZHJtL2RybV9hdG9taWNfaGVscGVyLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jcnRj Lmg+CisjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1f ZmJfY21hX2hlbHBlci5oPgorI2luY2x1ZGUgPGRybS9kcm1fZmJfaGVscGVyLmg+CisjaW5jbHVk ZSA8ZHJtL2RybV9mb3VyY2MuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX2dlbV9jbWFfaGVscGVyLmg+ CisjaW5jbHVkZSA8ZHJtL2RybV9tYW5hZ2VkLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9wbGFuZV9o ZWxwZXIuaD4KKworI2luY2x1ZGUgImttYl9kcnYuaCIKKyNpbmNsdWRlICJrbWJfcGxhbmUuaCIK KyNpbmNsdWRlICJrbWJfcmVncy5oIgorCitjb25zdCB1MzIgbGF5ZXJfaXJxc1tdID0geworCUxD RF9JTlRfVkwwLAorCUxDRF9JTlRfVkwxLAorCUxDRF9JTlRfR0wwLAorCUxDRF9JTlRfR0wxCit9 OworCisvKiBDb252ZXJzaW9uICh5dXYtPnJnYikgbWF0cml4IGZyb20gbXlyaWFkeCAqLworc3Rh dGljIGNvbnN0IHUzMiBjc2NfY29lZl9sY2RbXSA9IHsKKwkxMDI0LCAwLCAxNDM2LAorCTEwMjQs IC0zNTIsIC03MzEsCisJMTAyNCwgMTgxNCwgMCwKKwktMTc5LCAxMjUsIC0yMjYKK307CisKK3N0 YXRpYyB1bnNpZ25lZCBpbnQgY2hlY2tfcGl4ZWxfZm9ybWF0KHN0cnVjdCBkcm1fcGxhbmUgKnBs YW5lLCB1MzIgZm9ybWF0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBsYW5lLT5m b3JtYXRfY291bnQ7IGkrKykgeworCQlpZiAocGxhbmUtPmZvcm1hdF90eXBlc1tpXSA9PSBmb3Jt YXQpCisJCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQg a21iX3BsYW5lX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKKwkJCQkgIHN0 cnVjdCBkcm1fcGxhbmVfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIg KmZiOworCWludCByZXQ7CisJc3RydWN0IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOworCWJv b2wgY2FuX3Bvc2l0aW9uOworCisJZmIgPSBzdGF0ZS0+ZmI7CisJaWYgKCFmYiB8fCAhc3RhdGUt PmNydGMpCisJCXJldHVybiAwOworCisJcmV0ID0gY2hlY2tfcGl4ZWxfZm9ybWF0KHBsYW5lLCBm Yi0+Zm9ybWF0LT5mb3JtYXQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoc3Rh dGUtPmNydGNfdyA+IEtNQl9NQVhfV0lEVEggfHwgc3RhdGUtPmNydGNfaCA+IEtNQl9NQVhfSEVJ R0hUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhdGUtPmNydGNfdyA8IEtNQl9NSU5fV0lE VEggfHwgc3RhdGUtPmNydGNfaCA8IEtNQl9NSU5fSEVJR0hUKQorCQlyZXR1cm4gLUVJTlZBTDsK KwljYW5fcG9zaXRpb24gPSAocGxhbmUtPnR5cGUgPT0gRFJNX1BMQU5FX1RZUEVfT1ZFUkxBWSk7 CisJY3J0Y19zdGF0ZSA9CisJCWRybV9hdG9taWNfZ2V0X2V4aXN0aW5nX2NydGNfc3RhdGUoc3Rh dGUtPnN0YXRlLCBzdGF0ZS0+Y3J0Yyk7CisJcmV0dXJuIGRybV9hdG9taWNfaGVscGVyX2NoZWNr X3BsYW5lX3N0YXRlKHN0YXRlLCBjcnRjX3N0YXRlLAorCQkJCQkJIERSTV9QTEFORV9IRUxQRVJf Tk9fU0NBTElORywKKwkJCQkJCSBEUk1fUExBTkVfSEVMUEVSX05PX1NDQUxJTkcsCisJCQkJCQkg Y2FuX3Bvc2l0aW9uLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQga21iX3BsYW5lX2F0b21pY19k aXNhYmxlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAorCQkJCSAgICAgc3RydWN0IGRybV9wbGFu ZV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGttYl9wbGFuZSAqa21iX3BsYW5lID0gdG9fa21i X3BsYW5lKHBsYW5lKTsKKwlpbnQgcGxhbmVfaWQgPSBrbWJfcGxhbmUtPmlkOworCXN0cnVjdCBr bWJfZHJtX3ByaXZhdGUgKmttYjsKKworCWttYiA9IHRvX2ttYihwbGFuZS0+ZGV2KTsKKworCXN3 aXRjaCAocGxhbmVfaWQpIHsKKwljYXNlIExBWUVSXzA6CisJCWttYi0+cGxhbmVfc3RhdHVzW3Bs YW5lX2lkXS5jdHJsID0gTENEX0NUUkxfVkwxX0VOQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBMQVlF Ul8xOgorCQlrbWItPnBsYW5lX3N0YXR1c1twbGFuZV9pZF0uY3RybCA9IExDRF9DVFJMX1ZMMl9F TkFCTEU7CisJCWJyZWFrOworCWNhc2UgTEFZRVJfMjoKKwkJa21iLT5wbGFuZV9zdGF0dXNbcGxh bmVfaWRdLmN0cmwgPSBMQ0RfQ1RSTF9HTDFfRU5BQkxFOworCQlicmVhazsKKwljYXNlIExBWUVS XzM6CisJCWttYi0+cGxhbmVfc3RhdHVzW3BsYW5lX2lkXS5jdHJsID0gTENEX0NUUkxfR0wyX0VO QUJMRTsKKwkJYnJlYWs7CisJfQorCisJa21iLT5wbGFuZV9zdGF0dXNbcGxhbmVfaWRdLmRpc2Fi bGUgPSB0cnVlOworfQorCit1bnNpZ25lZCBpbnQgZ2V0X3BpeGVsX2Zvcm1hdCh1MzIgZm9ybWF0 KQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJc3dpdGNoIChmb3JtYXQpIHsKKwkJLyog cGxhbmFyIGZvcm1hdHMgKi8KKwljYXNlIERSTV9GT1JNQVRfWVVWNDQ0OgorCQl2YWwgPSBMQ0Rf TEFZRVJfRk9STUFUX1lDQkNSNDQ0UExBTiB8IExDRF9MQVlFUl9QTEFOQVJfU1RPUkFHRTsKKwkJ YnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1lWVTQ0NDoKKwkJdmFsID0gTENEX0xBWUVSX0ZPUk1B VF9ZQ0JDUjQ0NFBMQU4gfCBMQ0RfTEFZRVJfUExBTkFSX1NUT1JBR0UKKwkJICAgIHwgTENEX0xB WUVSX0NSQ0JfT1JERVI7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9ZVVY0MjI6CisJCXZh bCA9IExDRF9MQVlFUl9GT1JNQVRfWUNCQ1I0MjJQTEFOIHwgTENEX0xBWUVSX1BMQU5BUl9TVE9S QUdFOworCQlicmVhazsKKwljYXNlIERSTV9GT1JNQVRfWVZVNDIyOgorCQl2YWwgPSBMQ0RfTEFZ RVJfRk9STUFUX1lDQkNSNDIyUExBTiB8IExDRF9MQVlFUl9QTEFOQVJfU1RPUkFHRQorCQkgICAg fCBMQ0RfTEFZRVJfQ1JDQl9PUkRFUjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1lVVjQy MDoKKwkJdmFsID0gTENEX0xBWUVSX0ZPUk1BVF9ZQ0JDUjQyMFBMQU4gfCBMQ0RfTEFZRVJfUExB TkFSX1NUT1JBR0U7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9ZVlU0MjA6CisJCXZhbCA9 IExDRF9MQVlFUl9GT1JNQVRfWUNCQ1I0MjBQTEFOIHwgTENEX0xBWUVSX1BMQU5BUl9TVE9SQUdF CisJCSAgICB8IExDRF9MQVlFUl9DUkNCX09SREVSOworCQlicmVhazsKKwljYXNlIERSTV9GT1JN QVRfTlYxMjoKKwkJdmFsID0gTENEX0xBWUVSX0ZPUk1BVF9OVjEyIHwgTENEX0xBWUVSX1BMQU5B Ul9TVE9SQUdFOworCQlicmVhazsKKwljYXNlIERSTV9GT1JNQVRfTlYyMToKKwkJdmFsID0gTENE X0xBWUVSX0ZPUk1BVF9OVjEyIHwgTENEX0xBWUVSX1BMQU5BUl9TVE9SQUdFCisJCSAgICB8IExD RF9MQVlFUl9DUkNCX09SREVSOworCQlicmVhazsKKwkJLyogcGFja2VkIGZvcm1hdHMgKi8KKwkJ LyogbG9va3MgaHcgcmVxdWlyZXMgQiAmIEcgdG8gYmUgc3dhcHBlZCB3aGVuIFJHQiAqLworCWNh c2UgRFJNX0ZPUk1BVF9SR0IzMzI6CisJCXZhbCA9IExDRF9MQVlFUl9GT1JNQVRfUkdCMzMyIHwg TENEX0xBWUVSX0JHUl9PUkRFUjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1hCR1I0NDQ0 OgorCQl2YWwgPSBMQ0RfTEFZRVJfRk9STUFUX1JHQlg0NDQ0OworCQlicmVhazsKKwljYXNlIERS TV9GT1JNQVRfQVJHQjQ0NDQ6CisJCXZhbCA9IExDRF9MQVlFUl9GT1JNQVRfUkdCQTQ0NDQgfCBM Q0RfTEFZRVJfQkdSX09SREVSOworCQlicmVhazsKKwljYXNlIERSTV9GT1JNQVRfQUJHUjQ0NDQ6 CisJCXZhbCA9IExDRF9MQVlFUl9GT1JNQVRfUkdCQTQ0NDQ7CisJCWJyZWFrOworCWNhc2UgRFJN X0ZPUk1BVF9YUkdCMTU1NToKKwkJdmFsID0gTENEX0xBWUVSX0ZPUk1BVF9YUkdCMTU1NSB8IExD RF9MQVlFUl9CR1JfT1JERVI7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9YQkdSMTU1NToK KwkJdmFsID0gTENEX0xBWUVSX0ZPUk1BVF9YUkdCMTU1NTsKKwkJYnJlYWs7CisJY2FzZSBEUk1f Rk9STUFUX0FSR0IxNTU1OgorCQl2YWwgPSBMQ0RfTEFZRVJfRk9STUFUX1JHQkExNTU1IHwgTENE X0xBWUVSX0JHUl9PUkRFUjsKKwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX0FCR1IxNTU1Ogor CQl2YWwgPSBMQ0RfTEFZRVJfRk9STUFUX1JHQkExNTU1OworCQlicmVhazsKKwljYXNlIERSTV9G T1JNQVRfUkdCNTY1OgorCQl2YWwgPSBMQ0RfTEFZRVJfRk9STUFUX1JHQjU2NSB8IExDRF9MQVlF Ul9CR1JfT1JERVI7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9CR1I1NjU6CisJCXZhbCA9 IExDRF9MQVlFUl9GT1JNQVRfUkdCNTY1OworCQlicmVhazsKKwljYXNlIERSTV9GT1JNQVRfUkdC ODg4OgorCQl2YWwgPSBMQ0RfTEFZRVJfRk9STUFUX1JHQjg4OCB8IExDRF9MQVlFUl9CR1JfT1JE RVI7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9CR1I4ODg6CisJCXZhbCA9IExDRF9MQVlF Ul9GT1JNQVRfUkdCODg4OworCQlicmVhazsKKwljYXNlIERSTV9GT1JNQVRfWFJHQjg4ODg6CisJ CXZhbCA9IExDRF9MQVlFUl9GT1JNQVRfUkdCWDg4ODggfCBMQ0RfTEFZRVJfQkdSX09SREVSOwor CQlicmVhazsKKwljYXNlIERSTV9GT1JNQVRfWEJHUjg4ODg6CisJCXZhbCA9IExDRF9MQVlFUl9G T1JNQVRfUkdCWDg4ODg7CisJCWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9BUkdCODg4ODoKKwkJ dmFsID0gTENEX0xBWUVSX0ZPUk1BVF9SR0JBODg4OCB8IExDRF9MQVlFUl9CR1JfT1JERVI7CisJ CWJyZWFrOworCWNhc2UgRFJNX0ZPUk1BVF9BQkdSODg4ODoKKwkJdmFsID0gTENEX0xBWUVSX0ZP Uk1BVF9SR0JBODg4ODsKKwkJYnJlYWs7CisJfQorCURSTV9JTkZPX09OQ0UoIiVzIDogJWQgZm9y bWF0PTB4JXggdmFsPTB4JXhcbiIsCisJCSAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywgZm9ybWF0 LCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3Vuc2lnbmVkIGludCBnZXRfYml0c19wZXJfcGl4 ZWwoY29uc3Qgc3RydWN0IGRybV9mb3JtYXRfaW5mbyAqZm9ybWF0KQoreworCXUzMiBicHAgPSAw OworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJaWYgKGZvcm1hdC0+bnVtX3BsYW5lcyA+IDEp IHsKKwkJdmFsID0gTENEX0xBWUVSXzhCUFA7CisJCXJldHVybiB2YWw7CisJfQorCisJYnBwICs9 IDggKiBmb3JtYXQtPmNwcFswXTsKKworCXN3aXRjaCAoYnBwKSB7CisJY2FzZSA4OgorCQl2YWwg PSBMQ0RfTEFZRVJfOEJQUDsKKwkJYnJlYWs7CisJY2FzZSAxNjoKKwkJdmFsID0gTENEX0xBWUVS XzE2QlBQOworCQlicmVhazsKKwljYXNlIDI0OgorCQl2YWwgPSBMQ0RfTEFZRVJfMjRCUFA7CisJ CWJyZWFrOworCWNhc2UgMzI6CisJCXZhbCA9IExDRF9MQVlFUl8zMkJQUDsKKwkJYnJlYWs7CisJ fQorCisJRFJNX0RFQlVHKCJicHA9JWQgdmFsPTB4JXhcbiIsIGJwcCwgdmFsKTsKKwlyZXR1cm4g dmFsOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfY3NjKHN0cnVjdCBrbWJfZHJtX3ByaXZhdGUg KmttYiwgaW50IHBsYW5lX2lkKQoreworCS8qIFlVViB0byBSR0IgY29udmVyc2lvbiB1c2luZyB0 aGUgZml4ZWQgbWF0cml4IGNzY19jb2VmX2xjZCAqLworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0Rf TEFZRVJuX0NTQ19DT0VGRjExKHBsYW5lX2lkKSwgY3NjX2NvZWZfbGNkWzBdKTsKKwlrbWJfd3Jp dGVfbGNkKGttYiwgTENEX0xBWUVSbl9DU0NfQ09FRkYxMihwbGFuZV9pZCksIGNzY19jb2VmX2xj ZFsxXSk7CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9MQVlFUm5fQ1NDX0NPRUZGMTMocGxhbmVf aWQpLCBjc2NfY29lZl9sY2RbMl0pOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfTEFZRVJuX0NT Q19DT0VGRjIxKHBsYW5lX2lkKSwgY3NjX2NvZWZfbGNkWzNdKTsKKwlrbWJfd3JpdGVfbGNkKGtt YiwgTENEX0xBWUVSbl9DU0NfQ09FRkYyMihwbGFuZV9pZCksIGNzY19jb2VmX2xjZFs0XSk7CisJ a21iX3dyaXRlX2xjZChrbWIsIExDRF9MQVlFUm5fQ1NDX0NPRUZGMjMocGxhbmVfaWQpLCBjc2Nf Y29lZl9sY2RbNV0pOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfTEFZRVJuX0NTQ19DT0VGRjMx KHBsYW5lX2lkKSwgY3NjX2NvZWZfbGNkWzZdKTsKKwlrbWJfd3JpdGVfbGNkKGttYiwgTENEX0xB WUVSbl9DU0NfQ09FRkYzMihwbGFuZV9pZCksIGNzY19jb2VmX2xjZFs3XSk7CisJa21iX3dyaXRl X2xjZChrbWIsIExDRF9MQVlFUm5fQ1NDX0NPRUZGMzMocGxhbmVfaWQpLCBjc2NfY29lZl9sY2Rb OF0pOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfTEFZRVJuX0NTQ19PRkYxKHBsYW5lX2lkKSwg Y3NjX2NvZWZfbGNkWzldKTsKKwlrbWJfd3JpdGVfbGNkKGttYiwgTENEX0xBWUVSbl9DU0NfT0ZG MihwbGFuZV9pZCksIGNzY19jb2VmX2xjZFsxMF0pOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0Rf TEFZRVJuX0NTQ19PRkYzKHBsYW5lX2lkKSwgY3NjX2NvZWZfbGNkWzExXSk7Cit9CisKK3N0YXRp YyB2b2lkIGttYl9wbGFuZV9hdG9taWNfdXBkYXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAor CQkJCSAgICBzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2Zy YW1lYnVmZmVyICpmYjsKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRlICprbWI7CisJdW5zaWduZWQg aW50IHdpZHRoOworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJdW5zaWduZWQgaW50IGRtYV9sZW47 CisJc3RydWN0IGttYl9wbGFuZSAqa21iX3BsYW5lOworCXVuc2lnbmVkIGludCBkbWFfY2ZnOwor CXVuc2lnbmVkIGludCBjdHJsID0gMCwgdmFsID0gMCwgb3V0X2Zvcm1hdCA9IDA7CisJdW5zaWdu ZWQgaW50IHNyY193LCBzcmNfaCwgY3J0Y194LCBjcnRjX3k7CisJdW5zaWduZWQgY2hhciBwbGFu ZV9pZDsKKwlpbnQgbnVtX3BsYW5lczsKKwlzdGF0aWMgZG1hX2FkZHJfdCBhZGRyW01BWF9TVUJf UExBTkVTXTsKKworCWlmICghcGxhbmUgfHwgIXBsYW5lLT5zdGF0ZSB8fCAhc3RhdGUpCisJCXJl dHVybjsKKworCWZiID0gcGxhbmUtPnN0YXRlLT5mYjsKKwlpZiAoIWZiKQorCQlyZXR1cm47CisJ bnVtX3BsYW5lcyA9IGZiLT5mb3JtYXQtPm51bV9wbGFuZXM7CisJa21iX3BsYW5lID0gdG9fa21i X3BsYW5lKHBsYW5lKTsKKwlwbGFuZV9pZCA9IGttYl9wbGFuZS0+aWQ7CisKKwlrbWIgPSB0b19r bWIocGxhbmUtPmRldik7CisKKwlzcGluX2xvY2tfaXJxKCZrbWItPmlycV9sb2NrKTsKKwlpZiAo a21iLT5rbWJfdW5kZXJfZmxvdyB8fCBrbWItPmttYl9mbHVzaF9kb25lKSB7CisJCXNwaW5fdW5s b2NrX2lycSgma21iLT5pcnFfbG9jayk7CisJCWRybV9kYmcoJmttYi0+ZHJtLCAicGxhbmVfdXBk YXRlOnVuZGVyZmxvdyEhISEgcmV0dXJuaW5nIik7CisJCXJldHVybjsKKwl9CisJc3Bpbl91bmxv Y2tfaXJxKCZrbWItPmlycV9sb2NrKTsKKworCXNyY193ID0gKHBsYW5lLT5zdGF0ZS0+c3JjX3cg Pj4gMTYpOworCXNyY19oID0gcGxhbmUtPnN0YXRlLT5zcmNfaCA+PiAxNjsKKwljcnRjX3ggPSBw bGFuZS0+c3RhdGUtPmNydGNfeDsKKwljcnRjX3kgPSBwbGFuZS0+c3RhdGUtPmNydGNfeTsKKwor CWRybV9kYmcoJmttYi0+ZHJtLAorCQkic3JjX3c9JWQgc3JjX2g9JWQsIGZiLT5mb3JtYXQtPmZv cm1hdD0weCV4IGZiLT5mbGFncz0weCV4XG4iLAorCQkgIHNyY193LCBzcmNfaCwgZmItPmZvcm1h dC0+Zm9ybWF0LCBmYi0+ZmxhZ3MpOworCisJd2lkdGggPSBmYi0+d2lkdGg7CisJaGVpZ2h0ID0g ZmItPmhlaWdodDsKKwlkbWFfbGVuID0gKHdpZHRoICogaGVpZ2h0ICogZmItPmZvcm1hdC0+Y3Bw WzBdKTsKKwlkcm1fZGJnKCZrbWItPmRybSwgImRtYV9sZW49JWQgIiwgZG1hX2xlbik7CisJa21i X3dyaXRlX2xjZChrbWIsIExDRF9MQVlFUm5fRE1BX0xFTihwbGFuZV9pZCksIGRtYV9sZW4pOwor CWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfTEFZRVJuX0RNQV9MRU5fU0hBRE9XKHBsYW5lX2lkKSwg ZG1hX2xlbik7CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9MQVlFUm5fRE1BX0xJTkVfVlNUUklE RShwbGFuZV9pZCksCisJCSAgICAgIGZiLT5waXRjaGVzWzBdKTsKKwlrbWJfd3JpdGVfbGNkKGtt YiwgTENEX0xBWUVSbl9ETUFfTElORV9XSURUSChwbGFuZV9pZCksCisJCSAgICAgICh3aWR0aCAq IGZiLT5mb3JtYXQtPmNwcFswXSkpOworCisJYWRkcltZX1BMQU5FXSA9IGRybV9mYl9jbWFfZ2V0 X2dlbV9hZGRyKGZiLCBwbGFuZS0+c3RhdGUsIDApOworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0Rf TEFZRVJuX0RNQV9TVEFSVF9BRERSKHBsYW5lX2lkKSwKKwkJICAgICAgYWRkcltZX1BMQU5FXSAr IGZiLT5vZmZzZXRzWzBdKTsKKwl2YWwgPSBnZXRfcGl4ZWxfZm9ybWF0KGZiLT5mb3JtYXQtPmZv cm1hdCk7CisJdmFsIHw9IGdldF9iaXRzX3Blcl9waXhlbChmYi0+Zm9ybWF0KTsKKwkvKiBQcm9n cmFtIENiL0NyIGZvciBwbGFuYXIgZm9ybWF0cyAqLworCWlmIChudW1fcGxhbmVzID4gMSkgewor CQlrbWJfd3JpdGVfbGNkKGttYiwgTENEX0xBWUVSbl9ETUFfQ0JfTElORV9WU1RSSURFKHBsYW5l X2lkKSwKKwkJCSAgICAgIHdpZHRoICogZmItPmZvcm1hdC0+Y3BwWzBdKTsKKwkJa21iX3dyaXRl X2xjZChrbWIsIExDRF9MQVlFUm5fRE1BX0NCX0xJTkVfV0lEVEgocGxhbmVfaWQpLAorCQkJICAg ICAgKHdpZHRoICogZmItPmZvcm1hdC0+Y3BwWzBdKSk7CisKKwkJYWRkcltVX1BMQU5FXSA9IGRy bV9mYl9jbWFfZ2V0X2dlbV9hZGRyKGZiLCBwbGFuZS0+c3RhdGUsCisJCQkJCQkJVV9QTEFORSk7 CisJCS8qIGNoZWNrIGlmIENiL0NyIGlzIHN3YXBwZWQqLworCQlpZiAobnVtX3BsYW5lcyA9PSAz ICYmICh2YWwgJiBMQ0RfTEFZRVJfQ1JDQl9PUkRFUikpCisJCQlrbWJfd3JpdGVfbGNkKGttYiwK KwkJCQkgICAgICBMQ0RfTEFZRVJuX0RNQV9TVEFSVF9DUl9BRFIocGxhbmVfaWQpLAorCQkJCQlh ZGRyW1VfUExBTkVdKTsKKwkJZWxzZQorCQkJa21iX3dyaXRlX2xjZChrbWIsCisJCQkJICAgICAg TENEX0xBWUVSbl9ETUFfU1RBUlRfQ0JfQURSKHBsYW5lX2lkKSwKKwkJCQkJYWRkcltVX1BMQU5F XSk7CisKKwkJaWYgKG51bV9wbGFuZXMgPT0gMykgeworCQkJa21iX3dyaXRlX2xjZChrbWIsCisJ CQkJICAgICAgTENEX0xBWUVSbl9ETUFfQ1JfTElORV9WU1RSSURFKHBsYW5lX2lkKSwKKwkJCQkg ICAgICAoKHdpZHRoKSAqIGZiLT5mb3JtYXQtPmNwcFswXSkpOworCisJCQlrbWJfd3JpdGVfbGNk KGttYiwKKwkJCQkgICAgICBMQ0RfTEFZRVJuX0RNQV9DUl9MSU5FX1dJRFRIKHBsYW5lX2lkKSwK KwkJCQkgICAgICAoKHdpZHRoKSAqIGZiLT5mb3JtYXQtPmNwcFswXSkpOworCisJCQlhZGRyW1Zf UExBTkVdID0gZHJtX2ZiX2NtYV9nZXRfZ2VtX2FkZHIoZmIsCisJCQkJCQkJCXBsYW5lLT5zdGF0 ZSwKKwkJCQkJCQkJVl9QTEFORSk7CisKKwkJCS8qIGNoZWNrIGlmIENiL0NyIGlzIHN3YXBwZWQq LworCQkJaWYgKHZhbCAmIExDRF9MQVlFUl9DUkNCX09SREVSKQorCQkJCWttYl93cml0ZV9sY2Qo a21iLAorCQkJCQkgICAgICBMQ0RfTEFZRVJuX0RNQV9TVEFSVF9DQl9BRFIocGxhbmVfaWQpLAor CQkJCQkgICAgICBhZGRyW1ZfUExBTkVdKTsKKwkJCWVsc2UKKwkJCQlrbWJfd3JpdGVfbGNkKGtt YiwKKwkJCQkJICAgICAgTENEX0xBWUVSbl9ETUFfU1RBUlRfQ1JfQURSKHBsYW5lX2lkKSwKKwkJ CQkJICAgICAgYWRkcltWX1BMQU5FXSk7CisJCX0KKwl9CisKKwlrbWJfd3JpdGVfbGNkKGttYiwg TENEX0xBWUVSbl9XSURUSChwbGFuZV9pZCksIHNyY193IC0gMSk7CisJa21iX3dyaXRlX2xjZChr bWIsIExDRF9MQVlFUm5fSEVJR0hUKHBsYW5lX2lkKSwgc3JjX2ggLSAxKTsKKwlrbWJfd3JpdGVf bGNkKGttYiwgTENEX0xBWUVSbl9DT0xfU1RBUlQocGxhbmVfaWQpLCBjcnRjX3gpOworCWttYl93 cml0ZV9sY2Qoa21iLCBMQ0RfTEFZRVJuX1JPV19TVEFSVChwbGFuZV9pZCksIGNydGNfeSk7CisK Kwl2YWwgfD0gTENEX0xBWUVSX0ZJRk9fMTAwOworCisJaWYgKHZhbCAmIExDRF9MQVlFUl9QTEFO QVJfU1RPUkFHRSkgeworCQl2YWwgfD0gTENEX0xBWUVSX0NTQ19FTjsKKworCQkvKiBFbmFibGUg Q1NDIGlmIGlucHV0IGlzIHBsYW5hciBhbmQgb3V0cHV0IGlzIFJHQiAqLworCQljb25maWdfY3Nj KGttYiwgcGxhbmVfaWQpOworCX0KKworCWttYl93cml0ZV9sY2Qoa21iLCBMQ0RfTEFZRVJuX0NG RyhwbGFuZV9pZCksIHZhbCk7CisKKwlzd2l0Y2ggKHBsYW5lX2lkKSB7CisJY2FzZSBMQVlFUl8w OgorCQljdHJsID0gTENEX0NUUkxfVkwxX0VOQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBMQVlFUl8x OgorCQljdHJsID0gTENEX0NUUkxfVkwyX0VOQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBMQVlFUl8y OgorCQljdHJsID0gTENEX0NUUkxfR0wxX0VOQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBMQVlFUl8z OgorCQljdHJsID0gTENEX0NUUkxfR0wyX0VOQUJMRTsKKwkJYnJlYWs7CisJfQorCisJY3RybCB8 PSBMQ0RfQ1RSTF9QUk9HUkVTU0lWRSB8IExDRF9DVFJMX1RJTV9HRU5fRU5BQkxFCisJICAgIHwg TENEX0NUUkxfQ09OVElOVU9VUyB8IExDRF9DVFJMX09VVFBVVF9FTkFCTEVEOworCisJLyogTENE IGlzIGNvbm5lY3RlZCB0byBNSVBJIG9uIGttYgorCSAqIFRoZXJlZm9yZSB0aGlzIGJpdCBpcyBy ZXF1aXJlZCBmb3IgRFNJIFR4CisJICovCisJY3RybCB8PSBMQ0RfQ1RSTF9WSFNZTkNfSURMRV9M Vkw7CisKKwlrbWJfc2V0X2JpdG1hc2tfbGNkKGttYiwgTENEX0NPTlRST0wsIGN0cmwpOworCisJ LyogRklYTUUgbm8gZG9jIG9uIGhvdyB0byBzZXQgb3V0cHV0IGZvcm1hdCx0aGVzZSB2YWx1ZXMg YXJlCisJICogdGFrZW4gZnJvbSB0aGUgTXlyaWFkeCB0ZXN0cworCSAqLworCW91dF9mb3JtYXQg fD0gTENEX09VVEZfRk9STUFUX1JHQjg4ODsKKworCS8qIExlYXZlIFJHQiBvcmRlcixjb252ZXJz aW9uIG1vZGUgYW5kIGNsaXAgbW9kZSB0byBkZWZhdWx0ICovCisJLyogZG8gbm90IGludGVybGVh dmUgUkdCIGNoYW5uZWxzIGZvciBtaXBpIFR4IGNvbXBhdGliaWxpdHkgKi8KKwlvdXRfZm9ybWF0 IHw9IExDRF9PVVRGX01JUElfUkdCX01PREU7CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9PVVRf Rk9STUFUX0NGRywgb3V0X2Zvcm1hdCk7CisKKwlkbWFfY2ZnID0gTENEX0RNQV9MQVlFUl9FTkFC TEUgfCBMQ0RfRE1BX0xBWUVSX1ZTVFJJREVfRU4gfAorCSAgICBMQ0RfRE1BX0xBWUVSX0NPTlRf VVBEQVRFIHwgTENEX0RNQV9MQVlFUl9BWElfQlVSU1RfMTY7CisKKwkvKiBFbmFibGUgRE1BICov CisJa21iX3dyaXRlX2xjZChrbWIsIExDRF9MQVlFUm5fRE1BX0NGRyhwbGFuZV9pZCksIGRtYV9j ZmcpOworCWRybV9kYmcoJmttYi0+ZHJtLCAiZG1hX2NmZz0weCV4IExDRF9ETUFfQ0ZHPTB4JXhc biIsIGRtYV9jZmcsCisJCWttYl9yZWFkX2xjZChrbWIsIExDRF9MQVlFUm5fRE1BX0NGRyhwbGFu ZV9pZCkpKTsKKworCWttYl9zZXRfYml0bWFza19sY2Qoa21iLCBMQ0RfSU5UX0NMRUFSLCBMQ0Rf SU5UX0VPRiB8CisJCQlMQ0RfSU5UX0RNQV9FUlIpOworCWttYl9zZXRfYml0bWFza19sY2Qoa21i LCBMQ0RfSU5UX0VOQUJMRSwgTENEX0lOVF9FT0YgfAorCQkJTENEX0lOVF9ETUFfRVJSKTsKK30K Kworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVfaGVscGVyX2Z1bmNzIGttYl9wbGFuZV9o ZWxwZXJfZnVuY3MgPSB7CisJLmF0b21pY19jaGVjayA9IGttYl9wbGFuZV9hdG9taWNfY2hlY2ss CisJLmF0b21pY191cGRhdGUgPSBrbWJfcGxhbmVfYXRvbWljX3VwZGF0ZSwKKwkuYXRvbWljX2Rp c2FibGUgPSBrbWJfcGxhbmVfYXRvbWljX2Rpc2FibGUKK307CisKK3ZvaWQga21iX3BsYW5lX2Rl c3Ryb3koc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJc3RydWN0IGttYl9wbGFuZSAqa21i X3BsYW5lID0gdG9fa21iX3BsYW5lKHBsYW5lKTsKKworCWRybV9wbGFuZV9jbGVhbnVwKHBsYW5l KTsKKwlrZnJlZShrbWJfcGxhbmUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9wbGFu ZV9mdW5jcyBrbWJfcGxhbmVfZnVuY3MgPSB7CisJLnVwZGF0ZV9wbGFuZSA9IGRybV9hdG9taWNf aGVscGVyX3VwZGF0ZV9wbGFuZSwKKwkuZGlzYWJsZV9wbGFuZSA9IGRybV9hdG9taWNfaGVscGVy X2Rpc2FibGVfcGxhbmUsCisJLmRlc3Ryb3kgPSBrbWJfcGxhbmVfZGVzdHJveSwKKwkucmVzZXQg PSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9yZXNldCwKKwkuYXRvbWljX2R1cGxpY2F0ZV9zdGF0 ZSA9IGRybV9hdG9taWNfaGVscGVyX3BsYW5lX2R1cGxpY2F0ZV9zdGF0ZSwKKwkuYXRvbWljX2Rl c3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9wbGFuZV9kZXN0cm95X3N0YXRlLAorfTsK Kworc3RydWN0IGttYl9wbGFuZSAqa21iX3BsYW5lX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRy bSkKK3sKKwlzdHJ1Y3Qga21iX2RybV9wcml2YXRlICprbWIgPSB0b19rbWIoZHJtKTsKKwlzdHJ1 Y3Qga21iX3BsYW5lICpwbGFuZSA9IE5VTEw7CisJc3RydWN0IGttYl9wbGFuZSAqcHJpbWFyeSA9 IE5VTEw7CisJaW50IGkgPSAwOworCWludCByZXQgPSAwOworCWVudW0gZHJtX3BsYW5lX3R5cGUg cGxhbmVfdHlwZTsKKwljb25zdCB1MzIgKnBsYW5lX2Zvcm1hdHM7CisJaW50IG51bV9wbGFuZV9m b3JtYXRzOworCisJZm9yIChpID0gMDsgaSA8IEtNQl9NQVhfUExBTkVTOyBpKyspIHsKKwkJcGxh bmUgPSBkcm1tX2t6YWxsb2MoZHJtLCBzaXplb2YoKnBsYW5lKSwgR0ZQX0tFUk5FTCk7CisKKwkJ aWYgKCFwbGFuZSkgeworCQkJZHJtX2Vycihkcm0sICJGYWlsZWQgdG8gYWxsb2NhdGUgcGxhbmVc biIpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCX0KKworCQlwbGFuZV90eXBlID0g KGkgPT0gMCkgPyBEUk1fUExBTkVfVFlQRV9QUklNQVJZIDoKKwkJICAgIERSTV9QTEFORV9UWVBF X09WRVJMQVk7CisJCWlmIChpIDwgMikgeworCQkJcGxhbmVfZm9ybWF0cyA9IGttYl9mb3JtYXRz X3Y7CisJCQludW1fcGxhbmVfZm9ybWF0cyA9IEFSUkFZX1NJWkUoa21iX2Zvcm1hdHNfdik7CisJ CX0gZWxzZSB7CisJCQlwbGFuZV9mb3JtYXRzID0ga21iX2Zvcm1hdHNfZzsKKwkJCW51bV9wbGFu ZV9mb3JtYXRzID0gQVJSQVlfU0laRShrbWJfZm9ybWF0c19nKTsKKwkJfQorCisJCXJldCA9IGRy bV91bml2ZXJzYWxfcGxhbmVfaW5pdChkcm0sICZwbGFuZS0+YmFzZV9wbGFuZSwKKwkJCQkJICAg ICAgIFBPU1NJQkxFX0NSVENTLCAma21iX3BsYW5lX2Z1bmNzLAorCQkJCQkgICAgICAgcGxhbmVf Zm9ybWF0cywgbnVtX3BsYW5lX2Zvcm1hdHMsCisJCQkJCSAgICAgICBOVUxMLCBwbGFuZV90eXBl LCAicGxhbmUgJWQiLCBpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRybV9lcnIoZHJtLCAiZHJt X3VuaXZlcnNhbF9wbGFuZV9pbml0IGZhaWxlZCAocmV0PSVkKSIsCisJCQkJcmV0KTsKKwkJCWdv dG8gY2xlYW51cDsKKwkJfQorCQlkcm1fZGJnKGRybSwgIiVzIDogJWQgaT0lZCB0eXBlPSVkIiwK KwkJCV9fZnVuY19fLCBfX0xJTkVfXywKKwkJCSAgaSwgcGxhbmVfdHlwZSk7CisJCWRybV9wbGFu ZV9oZWxwZXJfYWRkKCZwbGFuZS0+YmFzZV9wbGFuZSwKKwkJCQkgICAgICZrbWJfcGxhbmVfaGVs cGVyX2Z1bmNzKTsKKwkJaWYgKHBsYW5lX3R5cGUgPT0gRFJNX1BMQU5FX1RZUEVfUFJJTUFSWSkg eworCQkJcHJpbWFyeSA9IHBsYW5lOworCQkJa21iLT5wbGFuZSA9IHBsYW5lOworCQl9CisJCWRy bV9kYmcoZHJtLCAiJXMgOiAlZCBwcmltYXJ5PSVwXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJ CQkmcHJpbWFyeS0+YmFzZV9wbGFuZSk7CisJCXBsYW5lLT5pZCA9IGk7CisJfQorCisJcmV0dXJu IHByaW1hcnk7CitjbGVhbnVwOgorCWRybW1fa2ZyZWUoZHJtLCBwbGFuZSk7CisJcmV0dXJuIEVS Ul9QVFIocmV0KTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9rbWIva21iX3BsYW5l LmggYi9kcml2ZXJzL2dwdS9kcm0va21iL2ttYl9wbGFuZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLjE3NTAxMTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9k cm0va21iL2ttYl9wbGFuZS5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wLW9ubHkKKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxOC0yMDIwIEludGVs IENvcnBvcmF0aW9uCisgKi8KKworI2lmbmRlZiBfX0tNQl9QTEFORV9IX18KKyNkZWZpbmUgX19L TUJfUExBTkVfSF9fCisKKyNpbmNsdWRlIDxkcm0vZHJtX2ZvdXJjYy5oPgorI2luY2x1ZGUgPGRy bS9kcm1fcGxhbmUuaD4KKworI2RlZmluZSBMQ0RfSU5UX1ZMMF9FUlIgKChMQVlFUjBfRE1BX0ZJ Rk9fVU5ERVJGTE9XKSB8IFwKKwkJCShMQVlFUjBfRE1BX0ZJRk9fT1ZFUkZMT1cpIHwgXAorCQkJ KExBWUVSMF9ETUFfQ0JfRklGT19PVkVSRkxPVykgfCBcCisJCQkoTEFZRVIwX0RNQV9DQl9GSUZP X1VOREVSRkxPVykgfCBcCisJCQkoTEFZRVIwX0RNQV9DUl9GSUZPX09WRVJGTE9XKSB8IFwKKwkJ CShMQVlFUjBfRE1BX0NSX0ZJRk9fVU5ERVJGTE9XKSkKKworI2RlZmluZSBMQ0RfSU5UX1ZMMV9F UlIgKChMQVlFUjFfRE1BX0ZJRk9fVU5ERVJGTE9XKSB8IFwKKwkJCShMQVlFUjFfRE1BX0ZJRk9f T1ZFUkZMT1cpIHwgXAorCQkJKExBWUVSMV9ETUFfQ0JfRklGT19PVkVSRkxPVykgfCBcCisJCQko TEFZRVIxX0RNQV9DQl9GSUZPX1VOREVSRkxPVykgfCBcCisJCQkoTEFZRVIxX0RNQV9DUl9GSUZP X09WRVJGTE9XKSB8IFwKKwkJCShMQVlFUjFfRE1BX0NSX0ZJRk9fVU5ERVJGTE9XKSkKKworI2Rl ZmluZSBMQ0RfSU5UX0dMMF9FUlIgKExBWUVSMl9ETUFfRklGT19PVkVSRkxPVyB8IExBWUVSMl9E TUFfRklGT19VTkRFUkZMT1cpCisjZGVmaW5lIExDRF9JTlRfR0wxX0VSUiAoTEFZRVIzX0RNQV9G SUZPX09WRVJGTE9XIHwgTEFZRVIzX0RNQV9GSUZPX1VOREVSRkxPVykKKyNkZWZpbmUgTENEX0lO VF9WTDAgKExBWUVSMF9ETUFfRE9ORSB8IExBWUVSMF9ETUFfSURMRSB8IExDRF9JTlRfVkwwX0VS UikKKyNkZWZpbmUgTENEX0lOVF9WTDEgKExBWUVSMV9ETUFfRE9ORSB8IExBWUVSMV9ETUFfSURM RSB8IExDRF9JTlRfVkwxX0VSUikKKyNkZWZpbmUgTENEX0lOVF9HTDAgKExBWUVSMl9ETUFfRE9O RSB8IExBWUVSMl9ETUFfSURMRSB8IExDRF9JTlRfR0wwX0VSUikKKyNkZWZpbmUgTENEX0lOVF9H TDEgKExBWUVSM19ETUFfRE9ORSB8IExBWUVSM19ETUFfSURMRSB8IExDRF9JTlRfR0wxX0VSUikK KyNkZWZpbmUgTENEX0lOVF9ETUFfRVJSIChMQ0RfSU5UX1ZMMF9FUlIgfCBMQ0RfSU5UX1ZMMV9F UlIgXAorCQl8IExDRF9JTlRfR0wwX0VSUiB8IExDRF9JTlRfR0wxX0VSUikKKworI2RlZmluZSBQ T1NTSUJMRV9DUlRDUyAxCisjZGVmaW5lIHRvX2ttYl9wbGFuZSh4KSBjb250YWluZXJfb2YoeCwg c3RydWN0IGttYl9wbGFuZSwgYmFzZV9wbGFuZSkKKworZW51bSBsYXllcl9pZCB7CisJTEFZRVJf MCwKKwlMQVlFUl8xLAorCUxBWUVSXzIsCisJTEFZRVJfMywKKwkvKiBLTUJfTUFYX1BMQU5FUyAq LworfTsKKworI2RlZmluZSBLTUJfTUFYX1BMQU5FUyAxCisKK2VudW0gc3ViX3BsYW5lX2lkIHsK KwlZX1BMQU5FLAorCVVfUExBTkUsCisJVl9QTEFORSwKKwlNQVhfU1VCX1BMQU5FUywKK307CisK K3N0cnVjdCBrbWJfcGxhbmUgeworCXN0cnVjdCBkcm1fcGxhbmUgYmFzZV9wbGFuZTsKKwl1bnNp Z25lZCBjaGFyIGlkOworfTsKKworLyogR3JhcGhpY3MgbGF5ZXIgKGxheWVycyAyICYgMykgZm9y bWF0cywgb25seSBwYWNrZWQgZm9ybWF0cyAgYXJlIHN1cHBvcnRlZCAqLworc3RhdGljIGNvbnN0 IHUzMiBrbWJfZm9ybWF0c19nW10gPSB7CisJRFJNX0ZPUk1BVF9SR0IzMzIsCisJRFJNX0ZPUk1B VF9YUkdCNDQ0NCwgRFJNX0ZPUk1BVF9YQkdSNDQ0NCwKKwlEUk1fRk9STUFUX0FSR0I0NDQ0LCBE Uk1fRk9STUFUX0FCR1I0NDQ0LAorCURSTV9GT1JNQVRfWFJHQjE1NTUsIERSTV9GT1JNQVRfWEJH UjE1NTUsCisJRFJNX0ZPUk1BVF9BUkdCMTU1NSwgRFJNX0ZPUk1BVF9BQkdSMTU1NSwKKwlEUk1f Rk9STUFUX1JHQjU2NSwgRFJNX0ZPUk1BVF9CR1I1NjUsCisJRFJNX0ZPUk1BVF9SR0I4ODgsIERS TV9GT1JNQVRfQkdSODg4LAorCURSTV9GT1JNQVRfWFJHQjg4ODgsIERSTV9GT1JNQVRfWEJHUjg4 ODgsCisJRFJNX0ZPUk1BVF9BUkdCODg4OCwgRFJNX0ZPUk1BVF9BQkdSODg4OCwKK307CisKKy8q IFZpZGVvIGxheWVyICggMCAmIDEpIGZvcm1hdHMsIHBhY2tlZCBhbmQgcGxhbmFyIGZvcm1hdHMg YXJlIHN1cHBvcnRlZCAqLworc3RhdGljIGNvbnN0IHUzMiBrbWJfZm9ybWF0c192W10gPSB7CisJ LyogcGFja2VkIGZvcm1hdHMgKi8KKwlEUk1fRk9STUFUX1JHQjMzMiwKKwlEUk1fRk9STUFUX1hS R0I0NDQ0LCBEUk1fRk9STUFUX1hCR1I0NDQ0LAorCURSTV9GT1JNQVRfQVJHQjQ0NDQsIERSTV9G T1JNQVRfQUJHUjQ0NDQsCisJRFJNX0ZPUk1BVF9YUkdCMTU1NSwgRFJNX0ZPUk1BVF9YQkdSMTU1 NSwKKwlEUk1fRk9STUFUX0FSR0IxNTU1LCBEUk1fRk9STUFUX0FCR1IxNTU1LAorCURSTV9GT1JN QVRfUkdCNTY1LCBEUk1fRk9STUFUX0JHUjU2NSwKKwlEUk1fRk9STUFUX1JHQjg4OCwgRFJNX0ZP Uk1BVF9CR1I4ODgsCisJRFJNX0ZPUk1BVF9YUkdCODg4OCwgRFJNX0ZPUk1BVF9YQkdSODg4OCwK KwlEUk1fRk9STUFUX0FSR0I4ODg4LCBEUk1fRk9STUFUX0FCR1I4ODg4LAorCS8qcGxhbmFyIGZv cm1hdHMgKi8KKwlEUk1fRk9STUFUX1lVVjQyMCwgRFJNX0ZPUk1BVF9ZVlU0MjAsCisJRFJNX0ZP Uk1BVF9ZVVY0MjIsIERSTV9GT1JNQVRfWVZVNDIyLAorCURSTV9GT1JNQVRfWVVWNDQ0LCBEUk1f Rk9STUFUX1lWVTQ0NCwKKwlEUk1fRk9STUFUX05WMTIsIERSTV9GT1JNQVRfTlYyMSwKK307CisK K3N0cnVjdCBsYXllcl9zdGF0dXMgeworCWJvb2wgZGlzYWJsZTsKKwl1MzIgY3RybDsKK307CisK K3N0cnVjdCBrbWJfcGxhbmUgKmttYl9wbGFuZV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkcm0p Owordm9pZCBrbWJfcGxhbmVfZGVzdHJveShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSk7CisjZW5k aWYgLyogX19LTUJfUExBTkVfSF9fICovCi0tIAoyLjcuNAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==