From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm0-x22a.google.com (mail-wm0-x22a.google.com [IPv6:2a00:1450:400c:c09::22a]) by gabe.freedesktop.org (Postfix) with ESMTPS id AD9C66E219 for ; Wed, 4 Apr 2018 15:27:00 +0000 (UTC) Received: by mail-wm0-x22a.google.com with SMTP id r82so44025288wme.0 for ; Wed, 04 Apr 2018 08:27:00 -0700 (PDT) From: Tvrtko Ursulin Date: Wed, 4 Apr 2018 16:26:49 +0100 Message-Id: <20180404152649.19382-1-tvrtko.ursulin@linux.intel.com> In-Reply-To: <20180404094818.4986-1-tvrtko.ursulin@linux.intel.com> References: <20180404094818.4986-1-tvrtko.ursulin@linux.intel.com> MIME-Version: 1.0 Subject: [igt-dev] [PATCH i-g-t v6] intel-gpu-top: Rewrite the tool to be safe to use List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: igt-dev@lists.freedesktop.org Cc: Tvrtko Ursulin , Eero Tamminen , Intel-gfx@lists.freedesktop.org List-ID: RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCmludGVsLWdw dS10b3AgaXMgYSBkYW5nZXJvdXMgdG9vbCB3aGljaCBjYW4gaGFuZyBtYWNoaW5lcyBkdWUgdW5z YWZlIG1taW8KcmVnaXN0ZXIgYWNjZXNzLiBUaGlzIHBhdGNoIHJld3JpdGVzIGl0IHRvIHVzZSBv bmx5IFBNVS4KCk9ubHkgb3ZlcmFsbCBjb21tYW5kIHN0cmVhbWVyIGJ1c3luZXNzIGFuZCBHUFUg Z2xvYmFsIGRhdGEgc3VjaCBhcyBwb3dlcgphbmQgZnJlcXVlbmNpZXMgYXJlIGluY2x1ZGVkIGlu IHRoaXMgbmV3IHZlcnNpb24uCgpGb3IgYWNjZXNzIHRvIG1vcmUgR1BVIGZ1bmN0aW9uYWwgdW5p dCBsZXZlbCBkYXRhLCBhbiBPQSBtZXRyaWMgYmFzZWQgdG9vbApsaWtlIGdwdS10b3Agc2hvdWxk IGJlIHVzZWQgaW5zdGVhZC4KCnYyOgogKiBTb3J0IGVuZ2luZXMgYnkgY2xhc3MgYW5kIGluc3Rh bmNlLgogKiBEbyBub3Qgd2FpdCBmb3Igb25lIHNhbXBsaW5nIHBlcmlvZCB0byBkaXNwbGF5IHNv bWV0aGluZyBvbiBzY3JlZW4uCiAqIE1vdmUgY29kZSBvdXQgb2YgdGhlIGFzc2VydHMuIChSaW5h dCBJYnJhZ2ltb3YpCiAqIENvbnRpbnVvdXNseSBhZGFwdCB0byB0ZXJtaW5hbCBzaXplLiAoUmlu YXQgSWJyYWdpbW92KQoKdjM6CiAqIENoYW5nZSBsYXlvdXQgYW5kIHByZWNpc2lvbiBvZiBzb21l IGZpZWxkLiAoQ2hyaXMgV2lsc29uKQogRWVybyBUYW1taW5lbjoKICogVXNlIG1vcmUgdXNlciBm cmllbmRseSBlbmdpbmUgbmFtZXMuCiAqIERvbid0IGVycm9yIG91dCBpZiBhIGNvdW50ZXIgaXMg bWlzc2luZy4KICogQWRkIElNQyByZWFkL3dyaXRlIGJhbmR3aWR0aC4KICogUmVwb3J0IG1pbmlt dW0gcmVxdWlyZWQga2VybmVsIHZlcnNpb24uCgp2NDoKICogUmVhbGx5IHN1cHBvcnQgNC4xNiBi eSBza2lwcGluZyBvZiBtaXNzaW5nIGVuZ2luZXMuCiAqIFNpbXBsZXIgYW5kIGxlc3MgaGFja3kg ZmxvYXQgcHJpbnRpbmcuCiAqIFByZXNlcnZlIGNvcHlyaWdodCBoZWFkZXIuIChBbnRvbmlvIEFy Z2Vuemlhbm8pCiAqIFNpbXBsaWZ5IGVuZ2luZXNfcHRyIG1hY3JvLiAoUmluYXQgSWJyYWdpbW92 KQoKdjU6CiAqIEdldCBSQVBMIHVuaXQgZnJvbSBzeXNmcy4KICogQ29uc29saWRhdGUgc3lzZnMg cGF0aHMgd2l0aCBhIG1hY3JvLgogKiBUaWR5IGVycm9yIGhhbmRsaW5nIGJ5IGNhcnJ5aW5nIG92 ZXIgYW5kIHJlcG9ydGluZyBlcnJuby4KICogQ2hlY2sgYWdhaW5zdCBjb25zb2xlIGhlaWdodCBv biBhbGwgcHJpbnRzLgogKiBNb3JlIHJlYWRhYmxlIG1pbmltdW0ga2VybmVsIHZlcnNpb24gbWVz c2FnZS4gKEVlcm8gVGFtbWluZW4pCiAqIENvbHVtbiBiYW5uZXIgZm9yIHBlciBlbmdpbmUgc3Rh dHMuIChFZXJvIFRhbW1pbmVuKQoKdjY6CiAqIE1hbiBwYWdlIHVwZGF0ZS4gKEVlcm8gVGFtbWlu ZW4pCgpTaWduZWQtb2ZmLWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwu Y29tPgpDYzogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+CkNjOiBMaW9u ZWwgTGFuZHdlcmxpbiA8bGlvbmVsLmcubGFuZHdlcmxpbkBpbnRlbC5jb20+CkNjOiBQZXRyaSBM YXR2YWxhIDxwZXRyaS5sYXR2YWxhQGludGVsLmNvbT4KQ2M6IEVlcm8gVGFtbWluZW4gPGVlcm8u dC50YW1taW5lbkBpbnRlbC5jb20+CkNjOiBSaW5hdCBJYnJhZ2ltb3YgPGlicmFnaW1vdnJpbmF0 QG1haWwucnU+ClJldmlld2VkLWJ5OiBMaW9uZWwgTGFuZHdlcmxpbiA8bGlvbmVsLmcubGFuZHdl cmxpbkBpbnRlbC5jb20+ICMgdjEKUmV2aWV3ZWQtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hy aXMtd2lsc29uLmNvLnVrPiAjIHYwLjUKLS0tCiBsaWIvaWd0X3BlcmYuYyAgICAgICAgfCAgICA2 ICsKIGxpYi9pZ3RfcGVyZi5oICAgICAgICB8ICAgIDEgKwogbWFuL2ludGVsX2dwdV90b3AucnN0 IHwgICA0MSArLQogdG9vbHMvTWFrZWZpbGUuYW0gICAgIHwgICAgMiArCiB0b29scy9pbnRlbF9n cHVfdG9wLmMgfCAxMjUwICsrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KIHRvb2xzL21lc29uLmJ1aWxkICAgICB8ICAgIDYgKy0KIDYgZmlsZXMgY2hhbmdl ZCwgNzE5IGluc2VydGlvbnMoKyksIDU4NyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9saWIv aWd0X3BlcmYuYyBiL2xpYi9pZ3RfcGVyZi5jCmluZGV4IDk5ZDgyZWE1MWM5Yi4uZTNkZWMyY2My OWM3IDEwMDY0NAotLS0gYS9saWIvaWd0X3BlcmYuYworKysgYi9saWIvaWd0X3BlcmYuYwpAQCAt NjksMyArNjksOSBAQCBpbnQgaWd0X3BlcmZfb3Blbih1aW50NjRfdCB0eXBlLCB1aW50NjRfdCBj b25maWcpCiAJcmV0dXJuIF9wZXJmX29wZW4odHlwZSwgY29uZmlnLCAtMSwKIAkJCSAgUEVSRl9G T1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEKTsKIH0KKworaW50IGlndF9wZXJmX29wZW5fZ3JvdXAo dWludDY0X3QgdHlwZSwgdWludDY0X3QgY29uZmlnLCBpbnQgZ3JvdXApCit7CisJcmV0dXJuIF9w ZXJmX29wZW4odHlwZSwgY29uZmlnLCBncm91cCwKKwkJCSAgUEVSRl9GT1JNQVRfVE9UQUxfVElN RV9FTkFCTEVEIHwgUEVSRl9GT1JNQVRfR1JPVVApOworfQpkaWZmIC0tZ2l0IGEvbGliL2lndF9w ZXJmLmggYi9saWIvaWd0X3BlcmYuaAppbmRleCA2MTRlYTVkMjNmYTYuLmUwMDcxOGY0NzY5YSAx MDA2NDQKLS0tIGEvbGliL2lndF9wZXJmLmgKKysrIGIvbGliL2lndF9wZXJmLmgKQEAgLTU1LDUg KzU1LDYgQEAgdWludDY0X3QgaTkxNV90eXBlX2lkKHZvaWQpOwogaW50IHBlcmZfaTkxNV9vcGVu KHVpbnQ2NF90IGNvbmZpZyk7CiBpbnQgcGVyZl9pOTE1X29wZW5fZ3JvdXAodWludDY0X3QgY29u ZmlnLCBpbnQgZ3JvdXApOwogaW50IGlndF9wZXJmX29wZW4odWludDY0X3QgdHlwZSwgdWludDY0 X3QgY29uZmlnKTsKK2ludCBpZ3RfcGVyZl9vcGVuX2dyb3VwKHVpbnQ2NF90IHR5cGUsIHVpbnQ2 NF90IGNvbmZpZywgaW50IGdyb3VwKTsKIAogI2VuZGlmIC8qIEk5MTVfUEVSRl9IICovCmRpZmYg LS1naXQgYS9tYW4vaW50ZWxfZ3B1X3RvcC5yc3QgYi9tYW4vaW50ZWxfZ3B1X3RvcC5yc3QKaW5k ZXggYTVmNzE3NWJiMWEwLi4xOWM3MTIzMDdkMjggMTAwNjQ0Ci0tLSBhL21hbi9pbnRlbF9ncHVf dG9wLnJzdAorKysgYi9tYW4vaW50ZWxfZ3B1X3RvcC5yc3QKQEAgLTcsOSArNyw5IEBAIERpc3Bs YXkgYSB0b3AtbGlrZSBzdW1tYXJ5IG9mIEludGVsIEdQVSB1c2FnZQogLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAuLiBpbmNsdWRlOjogZGVmcy5yc3QKIDpB dXRob3I6IElHVCBEZXZlbG9wZXJzIDxpZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZz4KLTpE YXRlOiAyMDE2LTAzLTAxCis6RGF0ZTogMjAxOC0wNC0wNAogOlZlcnNpb246IHxQQUNLQUdFX1NU UklOR3wKLTpDb3B5cmlnaHQ6IDIwMDksMjAxMSwyMDEyLDIwMTYgSW50ZWwgQ29ycG9yYXRpb24K KzpDb3B5cmlnaHQ6IDIwMDksMjAxMSwyMDEyLDIwMTYsMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgog Ok1hbnVhbCBzZWN0aW9uOiB8TUFOVUFMX1NFQ1RJT058CiA6TWFudWFsIGdyb3VwOiB8TUFOVUFM X0dST1VQfAogCkBAIC0yMSw0MiArMjEsMjUgQEAgU1lOT1BTSVMKIERFU0NSSVBUSU9OCiA9PT09 PT09PT09PQogCi0qKmludGVsX2dwdV90b3AqKiBpcyBhIHRvb2wgdG8gZGlzcGxheSB1c2FnZSBp bmZvcm1hdGlvbiBvZiBhbiBJbnRlbCBHUFUuIEl0Ci1yZXF1aXJlcyByb290IHByaXZpbGVnZSB0 byBtYXAgdGhlIGdyYXBoaWNzIGRldmljZS4KKyoqaW50ZWxfZ3B1X3RvcCoqIGlzIGEgdG9vbCB0 byBkaXNwbGF5IHVzYWdlIGluZm9ybWF0aW9uIG9uIEludGVsIEdQVSdzLgorCitUaGUgdG9vbCBn YXRoZXJzIGRhdGEgdXNpbmcgcGVyZiBwZXJmb3JtYW5jZSBjb3VudGVycyAoUE1VKSBleHBvc2Vk IGJ5IGk5MTUgYW5kIG90aGVyIHBsYXRmb3JtIGRyaXZlcnMgbGlrZSBSQVBMIChwb3dlcikgYW5k IFVuY29yZSBJTUMgKG1lbW9yeSBiYW5kd2lkdGgpLgogCiBPUFRJT05TCiA9PT09PT09CiAKLS1z IFNBTVBMRVMKLSAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBhY3F1aXJlIHBlciBzZWNvbmQuCi0K LS1vIEZJTEUKLSAgICBDb2xsZWN0IHVzYWdlIHN0YXRpc3RpY3MgdG8gRklMRS4gSWYgZmlsZSBp cyAiLSIsIHJ1biBub24taW50ZXJhY3RpdmVseQotICAgIGFuZCBvdXRwdXQgc3RhdGlzdGljcyB0 byBzdGRvdXQuCi0KLS1lIENPTU1BTkQKLSAgICBFeGVjdXRlIENPTU1BTkQgdG8gcHJvZmlsZSwg YW5kIGxlYXZlIHdoZW4gaXQgaXMgZmluaXNoZWQuIE5vdGUgdGhhdCB0aGUKLSAgICBlbnRpcmUg Y29tbWFuZCB3aXRoIGFsbCBwYXJhbWV0ZXJzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBvbmUgcGFy YW1ldGVyLgorLXMgPG1zPgorICAgIFJlZnJlc2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcy4KIAog LWgKLSAgICBTaG93IHVzYWdlIG5vdGVzLgorICAgIFNob3cgaGVscCB0ZXh0LgogCi1FWEFNUExF UwotPT09PT09PT0KLQotaW50ZWxfZ3B1X3RvcCAtbyAiY2Fpcm8tdHJhY2UtZ3ZpbS5sb2ciIC1z IDEwMCAtZSAiY2Fpcm8tcGVyZi10cmFjZSAvdG1wL2d2aW0iCi0gICAgUnVuIGNhaXJvLXBlcmYt dHJhY2Ugd2l0aCAvdG1wL2d2aW0gdHJhY2UsIG5vbi1pbnRlcmFjdGl2ZWx5LCBzYXZpbmcgdGhl Ci0gICAgc3RhdGlzdGljcyBpbnRvIGNhaXJvLXRyYWNlLWd2aW0ubG9nIGZpbGUsIGFuZCBjb2xs ZWN0aW5nIDEwMCBzYW1wbGVzIHBlcgotICAgIHNlY29uZC4KLQotTm90ZSB0aGF0IGlkbGUgdW5p dHMgYXJlIG5vdCBkaXNwbGF5ZWQsIHNvIGFuIGVudGlyZWx5IGlkbGUgR1BVIHdpbGwgb25seQot ZGlzcGxheSB0aGUgcmluZyBzdGF0dXMgYW5kIGhlYWRlci4KK0xJTUlUQVRJT05TCis9PT09PT09 PT09PQogCi1CVUdTCi09PT09CisqIE5vdCBhbGwgbWV0cmljcyBhcmUgc3VwcG9ydGVkIG9uIGFs bCBwbGF0Zm9ybXMuIFdoZXJlIGEgbWV0cmljIGlzIHVuc3VwcG9ydGVkIGl0J3MgdmFsdWUgd2ls bCBiZSByZXBsYWNlZCBieSBhIGRhc2hlZCBsaW5lLgogCi1Tb21lIEdQVXMgcmVwb3J0IHNvbWUg dW5pdHMgYXMgYnVzeSB3aGVuIHRoZXkgYXJlbid0LCBzdWNoIHRoYXQgZXZlbiB3aGVuIGlkbGUK LWFuZCBub3QgaHVuZywgaXQgd2lsbCBzaG93IHVwIGFzIDEwMCUgYnVzeS4KKyogTm9uLXJvb3Qg YWNjZXNzIHRvIHBlcmYgY291bnRlcnMgaXMgY29udHJvbGxlZCBieSB0aGUgKnBlcmZfZXZlbnRf cGFyYW5vaWQqIHN5c2N0bC4KIAogUkVQT1JUSU5HIEJVR1MKID09PT09PT09PT09PT09CmRpZmYg LS1naXQgYS90b29scy9NYWtlZmlsZS5hbSBiL3Rvb2xzL01ha2VmaWxlLmFtCmluZGV4IDA5YjZk YmNjM2VjZS4uYTBiMDE2ZGRkN2ZmIDEwMDY0NAotLS0gYS90b29scy9NYWtlZmlsZS5hbQorKysg Yi90b29scy9NYWtlZmlsZS5hbQpAQCAtMjgsNiArMjgsOCBAQCBpbnRlbF9hdWJkdW1wX2xhX0xE RkxBR1MgPSAtbW9kdWxlIC1hdm9pZC12ZXJzaW9uIC1uby11bmRlZmluZWQKIGludGVsX2F1YmR1 bXBfbGFfU09VUkNFUyA9IGF1YmR1bXAuYwogaW50ZWxfYXViZHVtcF9sYV9MSUJBREQgPSAkKHRv cF9idWlsZGRpcikvbGliL2xpYmludGVsX3Rvb2xzLmxhIC1sZGwKIAoraW50ZWxfZ3B1X3RvcF9M REFERCA9ICQodG9wX2J1aWxkZGlyKS9saWIvbGliaWd0X3BlcmYubGEKKwogYmluX1NDUklQVFMg PSBpbnRlbF9hdWJkdW1wCiBDTEVBTkZJTEVTID0gJChiaW5fU0NSSVBUUykKIApkaWZmIC0tZ2l0 IGEvdG9vbHMvaW50ZWxfZ3B1X3RvcC5jIGIvdG9vbHMvaW50ZWxfZ3B1X3RvcC5jCmluZGV4IDA5 OGU2Y2UzZmY4Ni4uYjkyM2MzY2ZiZTk3IDEwMDY0NAotLS0gYS90b29scy9pbnRlbF9ncHVfdG9w LmMKKysrIGIvdG9vbHMvaW50ZWxfZ3B1X3RvcC5jCkBAIC0xLDYgKzEsNSBAQAogLyoKLSAqIENv cHlyaWdodCDCqSAyMDA3IEludGVsIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgwqkgMjAxMSBJ bnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IMKpIDIwMDctMjAxOCBJbnRlbCBDb3Jwb3Jh dGlvbgogICoKICAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdl LCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5k IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLApAQCAtMjQs Njk1ICsyMyw4MzIgQEAKICAqIEF1dGhvcnM6CiAgKiAgICBFcmljIEFuaG9sdCA8ZXJpY0Bhbmhv bHQubmV0PgogICogICAgRXVnZW5pIERvZG9ub3YgPGV1Z2VuaS5kb2Rvbm92QGludGVsLmNvbT4K LSAqCiAgKi8KIAotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4K LSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRp by5oPgotI2luY2x1ZGUgPGVyci5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUg PHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMu aD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxh c3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZmRlZiBIQVZFX1RFUk1JT1NfSAotI2lu Y2x1ZGUgPHRlcm1pb3MuaD4KLSNlbmRpZgotI2luY2x1ZGUgImludGVsX2lvLmgiCi0jaW5jbHVk ZSAiaW5zdGRvbmUuaCIKLSNpbmNsdWRlICJpbnRlbF9yZWcuaCIKLSNpbmNsdWRlICJpbnRlbF9j aGlwc2V0LmgiCi0jaW5jbHVkZSAiZHJtdGVzdC5oIgotCi0jZGVmaW5lICBGT1JDRVdBS0UJICAg IDB4QTE4QwotI2RlZmluZSAgRk9SQ0VXQUtFX0FDSwkgICAgMHgxMzAwOTAKLQotI2RlZmluZSBT QU1QTEVTX1BFUl9TRUMgICAgICAgICAgICAgMTAwMDAKLSNkZWZpbmUgU0FNUExFU19UT19QRVJD RU5UX1JBVElPICAgIChTQU1QTEVTX1BFUl9TRUMgLyAxMDApCi0KLSNkZWZpbmUgTUFYX05VTV9U T1BfQklUUyAgICAgICAgICAgIDEwMAotCi0jZGVmaW5lIEhBU19TVEFUU19SRUdTKGRldmlkKQkJ SVNfOTY1KGRldmlkKQotCi1zdHJ1Y3QgdG9wX2JpdCB7Ci0Jc3RydWN0IGluc3Rkb25lX2JpdCAq Yml0OwotCWludCBjb3VudDsKLX0gdG9wX2JpdHNbTUFYX05VTV9UT1BfQklUU107Ci1zdHJ1Y3Qg dG9wX2JpdCAqdG9wX2JpdHNfc29ydGVkW01BWF9OVU1fVE9QX0JJVFNdOwotCi1zdGF0aWMgdWlu dDMyX3QgaW5zdGRvbmUsIGluc3Rkb25lMTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmJhcnNbXSA9 IHsKLQkiICIsCi0JIuKWjyIsCi0JIuKWjiIsCi0JIuKWjSIsCi0JIuKWjCIsCi0JIuKWiyIsCi0J IuKWiiIsCi0JIuKWiSIsCi0JIuKWiCIKLX07CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRl IDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgor I2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMv aW9jdGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRl IDxsb2NhbGUuaD4KKworI2luY2x1ZGUgImlndF9wZXJmLmgiCiAKLWVudW0gc3RhdHNfY291bnRz IHsKLQlJQV9WRVJUSUNFUywKLQlJQV9QUklNSVRJVkVTLAotCVZTX0lOVk9DQVRJT04sCi0JR1Nf SU5WT0NBVElPTiwKLQlHU19QUklNSVRJVkVTLAotCUNMX0lOVk9DQVRJT04sCi0JQ0xfUFJJTUlU SVZFUywKLQlQU19JTlZPQ0FUSU9OLAotCVBTX0RFUFRILAotCVNUQVRTX0NPVU5UCitzdHJ1Y3Qg cG11X3BhaXIgeworCXVpbnQ2NF90IGN1cjsKKwl1aW50NjRfdCBwcmV2OwogfTsKIAotY29uc3Qg dWludDMyX3Qgc3RhdHNfcmVnc1tTVEFUU19DT1VOVF0gPSB7Ci0JSUFfVkVSVElDRVNfQ09VTlRf UVcsCi0JSUFfUFJJTUlUSVZFU19DT1VOVF9RVywKLQlWU19JTlZPQ0FUSU9OX0NPVU5UX1FXLAot CUdTX0lOVk9DQVRJT05fQ09VTlRfUVcsCi0JR1NfUFJJTUlUSVZFU19DT1VOVF9RVywKLQlDTF9J TlZPQ0FUSU9OX0NPVU5UX1FXLAotCUNMX1BSSU1JVElWRVNfQ09VTlRfUVcsCi0JUFNfSU5WT0NB VElPTl9DT1VOVF9RVywKLQlQU19ERVBUSF9DT1VOVF9RVywKK3N0cnVjdCBwbXVfY291bnRlciB7 CisJYm9vbCBwcmVzZW50OworCXVpbnQ2NF90IGNvbmZpZzsKKwl1bnNpZ25lZCBpbnQgaWR4Owor CXN0cnVjdCBwbXVfcGFpciB2YWw7CiB9OwogCi1jb25zdCBjaGFyICpzdGF0c19yZWdfbmFtZXNb U1RBVFNfQ09VTlRdID0gewotCSJ2ZXJ0IGZldGNoIiwKLQkicHJpbSBmZXRjaCIsCi0JIlZTIGlu dm9jYXRpb25zIiwKLQkiR1MgaW52b2NhdGlvbnMiLAotCSJHUyBwcmltcyIsCi0JIkNMIGludm9j YXRpb25zIiwKLQkiQ0wgcHJpbXMiLAotCSJQUyBpbnZvY2F0aW9ucyIsCi0JIlBTIGRlcHRoIHBh c3MiLAorc3RydWN0IGVuZ2luZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpk aXNwbGF5X25hbWU7CisKKwl1bnNpZ25lZCBpbnQgY2xhc3M7CisJdW5zaWduZWQgaW50IGluc3Rh bmNlOworCisJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczsKKworCXN0cnVjdCBwbXVfY291bnRl ciBidXN5OworCXN0cnVjdCBwbXVfY291bnRlciB3YWl0OworCXN0cnVjdCBwbXVfY291bnRlciBz ZW1hOwogfTsKIAotdWludDY0X3Qgc3RhdHNbU1RBVFNfQ09VTlRdOwotdWludDY0X3QgbGFzdF9z dGF0c1tTVEFUU19DT1VOVF07CitzdHJ1Y3QgZW5naW5lcyB7CisJdW5zaWduZWQgaW50IG51bV9l bmdpbmVzOworCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7CisJRElSICpyb290OworCWludCBm ZDsKKwlzdHJ1Y3QgcG11X3BhaXIgdHM7CisKKwlpbnQgcmFwbF9mZDsKKwlkb3VibGUgcmFwbF9z Y2FsZTsKKwljb25zdCBjaGFyICpyYXBsX3VuaXQ7CisKKwlpbnQgaW1jX2ZkOworCWRvdWJsZSBp bWNfcmVhZHNfc2NhbGU7CisJY29uc3QgY2hhciAqaW1jX3JlYWRzX3VuaXQ7CisJZG91YmxlIGlt Y193cml0ZXNfc2NhbGU7CisJY29uc3QgY2hhciAqaW1jX3dyaXRlc191bml0OworCisJc3RydWN0 IHBtdV9jb3VudGVyIGZyZXFfcmVxOworCXN0cnVjdCBwbXVfY291bnRlciBmcmVxX2FjdDsKKwlz dHJ1Y3QgcG11X2NvdW50ZXIgaXJxOworCXN0cnVjdCBwbXVfY291bnRlciByYzY7CisJc3RydWN0 IHBtdV9jb3VudGVyIHJhcGw7CisJc3RydWN0IHBtdV9jb3VudGVyIGltY19yZWFkczsKKwlzdHJ1 Y3QgcG11X2NvdW50ZXIgaW1jX3dyaXRlczsKKworCXN0cnVjdCBlbmdpbmUgZW5naW5lOworfTsK IAotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWdldHRpbWUodm9pZCkKK3N0YXRpYyB1aW50NjRfdAor Z2V0X3BtdV9jb25maWcoaW50IGRpcmZkLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpj b3VudGVyKQogewotICAgIHN0cnVjdCB0aW1ldmFsIHQ7Ci0gICAgZ2V0dGltZW9mZGF5KCZ0LCBO VUxMKTsKLSAgICByZXR1cm4gKHQudHZfdXNlYyArICh0LnR2X3NlYyAqIDEwMDAwMDApKTsKLX0K KwljaGFyIGJ1ZlsxMjhdLCAqcDsKKwlpbnQgZmQsIHJldDsKIAotc3RhdGljIGludAotdG9wX2Jp dHNfc29ydChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotCXN0cnVjdCB0b3BfYml0 ICogY29uc3QgKmJpdF9hID0gYTsKLQlzdHJ1Y3QgdG9wX2JpdCAqIGNvbnN0ICpiaXRfYiA9IGI7 Ci0JaW50IGFfY291bnQgPSAoKmJpdF9hKS0+Y291bnQ7Ci0JaW50IGJfY291bnQgPSAoKmJpdF9i KS0+Y291bnQ7CisJcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLSVzIiwgbmFt ZSwgY291bnRlcik7CisJaWYgKHJldCA8IDAgfHwgcmV0ID09IHNpemVvZihidWYpKQorCQlyZXR1 cm4gLTE7CiAKLQlpZiAoYV9jb3VudCA8IGJfY291bnQpCi0JCXJldHVybiAxOwotCWVsc2UgaWYg KGFfY291bnQgPT0gYl9jb3VudCkKLQkJcmV0dXJuIDA7Ci0JZWxzZQorCWZkID0gb3BlbmF0KGRp cmZkLCBidWYsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQogCQlyZXR1cm4gLTE7Ci19CiAKLXN0 YXRpYyB2b2lkCi11cGRhdGVfaWRsZV9iaXQoc3RydWN0IHRvcF9iaXQgKnRvcF9iaXQpCi17Ci0J dWludDMyX3QgcmVnX3ZhbDsKKwlyZXQgPSByZWFkKGZkLCBidWYsIHNpemVvZihidWYpKTsKKwlj bG9zZShmZCk7CisJaWYgKHJldCA8PSAwKQorCQlyZXR1cm4gLTE7CiAKLQlpZiAodG9wX2JpdC0+ Yml0LT5yZWcgPT0gSU5TVERPTkVfMSkKLQkJcmVnX3ZhbCA9IGluc3Rkb25lMTsKLQllbHNlCi0J CXJlZ192YWwgPSBpbnN0ZG9uZTsKKwlwID0gaW5kZXgoYnVmLCAnMCcpOworCWlmICghcCkKKwkJ cmV0dXJuIC0xOwogCi0JaWYgKChyZWdfdmFsICYgdG9wX2JpdC0+Yml0LT5iaXQpID09IDApCi0J CXRvcF9iaXQtPmNvdW50Kys7CisJcmV0dXJuIHN0cnRvdWwocCwgTlVMTCwgMCk7CiB9CiAKLXN0 YXRpYyB2b2lkCi1wcmludF9jbG9jayhjb25zdCBjaGFyICpuYW1lLCBpbnQgY2xvY2spIHsKLQlp ZiAoY2xvY2sgPT0gLTEpCi0JCXByaW50ZigiJXMgY2xvY2s6IHVua25vd24iLCBuYW1lKTsKKyNk ZWZpbmUgZW5naW5lX3B0cihlbmdpbmVzLCBuKSAoJmVuZ2luZXMtPmVuZ2luZSArIChuKSkKKwor c3RhdGljIGNvbnN0IGNoYXIgKmNsYXNzX2Rpc3BsYXlfbmFtZSh1bnNpZ25lZCBpbnQgY2xhc3Mp Cit7CisJc3dpdGNoIChjbGFzcykgeworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfUkVOREVSOgor CQlyZXR1cm4gIlJlbmRlci8zRCI7CisJY2FzZSBJOTE1X0VOR0lORV9DTEFTU19DT1BZOgorCQly ZXR1cm4gIkJsaXR0ZXIiOworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU86CisJCXJldHVy biAiVmlkZW8iOworCWNhc2UgSTkxNV9FTkdJTkVfQ0xBU1NfVklERU9fRU5IQU5DRToKKwkJcmV0 dXJuICJWaWRlb0VuaGFuY2UiOworCWRlZmF1bHQ6CisJCXJldHVybiAiW3Vua25vd25dIjsKKwl9 Cit9CisKK3N0YXRpYyBpbnQgZW5naW5lX2NtcChjb25zdCB2b2lkICpfX2EsIGNvbnN0IHZvaWQg Kl9fYikKK3sKKwljb25zdCBzdHJ1Y3QgZW5naW5lICphID0gKHN0cnVjdCBlbmdpbmUgKilfX2E7 CisJY29uc3Qgc3RydWN0IGVuZ2luZSAqYiA9IChzdHJ1Y3QgZW5naW5lICopX19iOworCisJaWYg KGEtPmNsYXNzICE9IGItPmNsYXNzKQorCQlyZXR1cm4gYS0+Y2xhc3MgLSBiLT5jbGFzczsKIAll bHNlCi0JCXByaW50ZigiJXMgY2xvY2s6ICVkIE1oeiIsIG5hbWUsIGNsb2NrKTsKKwkJcmV0dXJu IGEtPmluc3RhbmNlIC0gYi0+aW5zdGFuY2U7CiB9CiAKLXN0YXRpYyBpbnQKLXByaW50X2Nsb2Nr X2luZm8oc3RydWN0IHBjaV9kZXZpY2UgKnBjaV9kZXYpCitzdGF0aWMgc3RydWN0IGVuZ2luZXMg KmRpc2NvdmVyX2VuZ2luZXModm9pZCkKIHsKLQl1aW50MzJfdCBkZXZpZCA9IHBjaV9kZXYtPmRl dmljZV9pZDsKLQl1aW50MTZfdCBnY2ZnYzsKKwljb25zdCBjaGFyICpzeXNmc19yb290ID0gIi9z eXMvZGV2aWNlcy9pOTE1L2V2ZW50cyI7CisJc3RydWN0IGVuZ2luZXMgKmVuZ2luZXM7CisJc3Ry dWN0IGRpcmVudCAqZGVudDsKKwlpbnQgcmV0ID0gMDsKKwlESVIgKmQ7CiAKLQlpZiAoSVNfR000 NShkZXZpZCkpIHsKLQkJaW50IGNvcmVfY2xvY2sgPSAtMTsKKwllbmdpbmVzID0gbWFsbG9jKHNp emVvZihzdHJ1Y3QgZW5naW5lcykpOworCWlmICghZW5naW5lcykKKwkJcmV0dXJuIE5VTEw7CiAK LQkJcGNpX2RldmljZV9jZmdfcmVhZF91MTYocGNpX2RldiwgJmdjZmdjLCBJOTE1X0dDRkdDKTsK KwltZW1zZXQoZW5naW5lcywgMCwgc2l6ZW9mKCplbmdpbmVzKSk7CiAKLQkJc3dpdGNoIChnY2Zn YyAmIDB4ZikgewotCQljYXNlIDg6Ci0JCQljb3JlX2Nsb2NrID0gMjY2OwotCQkJYnJlYWs7Ci0J CWNhc2UgOToKLQkJCWNvcmVfY2xvY2sgPSAzMjA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMToKLQkJ CWNvcmVfY2xvY2sgPSA0MDA7Ci0JCQlicmVhazsKLQkJY2FzZSAxMzoKLQkJCWNvcmVfY2xvY2sg PSA1MzM7Ci0JCQlicmVhazsKLQkJfQotCQlwcmludF9jbG9jaygiY29yZSIsIGNvcmVfY2xvY2sp OwotCX0gZWxzZSBpZiAoSVNfOTY1KGRldmlkKSAmJiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWlu dCByZW5kZXJfY2xvY2sgPSAtMSwgc2FtcGxlcl9jbG9jayA9IC0xOworCWVuZ2luZXMtPm51bV9l bmdpbmVzID0gMDsKIAotCQlwY2lfZGV2aWNlX2NmZ19yZWFkX3UxNihwY2lfZGV2LCAmZ2NmZ2Ms IEk5MTVfR0NGR0MpOworCWQgPSBvcGVuZGlyKHN5c2ZzX3Jvb3QpOworCWlmICghZCkKKwkJcmV0 dXJuIE5VTEw7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4ZikgewotCQljYXNlIDI6Ci0JCQlyZW5k ZXJfY2xvY2sgPSAyNTA7IHNhbXBsZXJfY2xvY2sgPSAyNjc7Ci0JCQlicmVhazsKLQkJY2FzZSAz OgotCQkJcmVuZGVyX2Nsb2NrID0gMzIwOyBzYW1wbGVyX2Nsb2NrID0gMzMzOwotCQkJYnJlYWs7 Ci0JCWNhc2UgNDoKLQkJCXJlbmRlcl9jbG9jayA9IDQwMDsgc2FtcGxlcl9jbG9jayA9IDQ0NDsK LQkJCWJyZWFrOwotCQljYXNlIDU6Ci0JCQlyZW5kZXJfY2xvY2sgPSA1MDA7IHNhbXBsZXJfY2xv Y2sgPSA1MzM7CisJd2hpbGUgKChkZW50ID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQljb25z dCBjaGFyICplbmRzd2l0aCA9ICItYnVzeSI7CisJCWNvbnN0IHVuc2lnbmVkIGludCBlbmRsZW4g PSBzdHJsZW4oZW5kc3dpdGgpOworCQlzdHJ1Y3QgZW5naW5lICplbmdpbmUgPQorCQkJCWVuZ2lu ZV9wdHIoZW5naW5lcywgZW5naW5lcy0+bnVtX2VuZ2luZXMpOworCQljaGFyIGJ1ZlsyNTZdOwor CisJCWlmIChkZW50LT5kX3R5cGUgIT0gRFRfUkVHKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0 cmxlbihkZW50LT5kX25hbWUpID49IHNpemVvZihidWYpKSB7CisJCQlyZXQgPSBFTkFNRVRPT0xP Tkc7CiAJCQlicmVhazsKIAkJfQogCi0JCXByaW50X2Nsb2NrKCJyZW5kZXIiLCByZW5kZXJfY2xv Y2spOwotCQlwcmludGYoIiAgIik7Ci0JCXByaW50X2Nsb2NrKCJzYW1wbGVyIiwgc2FtcGxlcl9j bG9jayk7Ci0JfSBlbHNlIGlmIChJU185NDUoZGV2aWQpICYmIElTX01PQklMRShkZXZpZCkpIHsK LQkJaW50IHJlbmRlcl9jbG9jayA9IC0xLCBkaXNwbGF5X2Nsb2NrID0gLTE7CisJCXN0cmNweShi dWYsIGRlbnQtPmRfbmFtZSk7CiAKLQkJcGNpX2RldmljZV9jZmdfcmVhZF91MTYocGNpX2Rldiwg JmdjZmdjLCBJOTE1X0dDRkdDKTsKKwkJLyogeHh4Ti1idXN5ICovCisJCWlmIChzdHJsZW4oYnVm KSA8IChlbmRsZW4gKyA0KSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RyY21wKCZidWZbc3RybGVu KGJ1ZikgLSBlbmRsZW5dLCBlbmRzd2l0aCkpCisJCQljb250aW51ZTsKIAotCQlzd2l0Y2ggKGdj ZmdjICYgMHg3KSB7Ci0JCWNhc2UgMDoKLQkJCXJlbmRlcl9jbG9jayA9IDE2NjsKLQkJCWJyZWFr OwotCQljYXNlIDE6Ci0JCQlyZW5kZXJfY2xvY2sgPSAyMDA7Ci0JCQlicmVhazsKLQkJY2FzZSAz OgotCQkJcmVuZGVyX2Nsb2NrID0gMjUwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNToKLQkJCXJlbmRl cl9jbG9jayA9IDQwMDsKKwkJbWVtc2V0KGVuZ2luZSwgMCwgc2l6ZW9mKCplbmdpbmUpKTsKKwor CQlidWZbc3RybGVuKGJ1ZikgLSBlbmRsZW5dID0gMDsKKwkJZW5naW5lLT5uYW1lID0gc3RyZHVw KGJ1Zik7CisJCWlmICghZW5naW5lLT5uYW1lKSB7CisJCQlyZXQgPSBlcnJubzsKIAkJCWJyZWFr OwogCQl9CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4NzApIHsKLQkJY2FzZSAwOgotCQkJZGlzcGxh eV9jbG9jayA9IDIwMDsKLQkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlkaXNwbGF5X2Nsb2NrID0g MzIwOworCQllbmdpbmUtPmJ1c3kuY29uZmlnID0gZ2V0X3BtdV9jb25maWcoZGlyZmQoZCksIGVu Z2luZS0+bmFtZSwKKwkJCQkJCSAgICAgImJ1c3kiKTsKKwkJaWYgKGVuZ2luZS0+YnVzeS5jb25m aWcgPT0gLTEpIHsKKwkJCXJldCA9IEVOT0VOVDsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChnY2Zn YyAmICgxIDw8IDcpKQotCQkgICAgZGlzcGxheV9jbG9jayA9IDEzMzsKIAotCQlwcmludF9jbG9j aygicmVuZGVyIiwgcmVuZGVyX2Nsb2NrKTsKLQkJcHJpbnRmKCIgICIpOwotCQlwcmludF9jbG9j aygiZGlzcGxheSIsIGRpc3BsYXlfY2xvY2spOwotCX0gZWxzZSBpZiAoSVNfOTE1KGRldmlkKSAm JiBJU19NT0JJTEUoZGV2aWQpKSB7Ci0JCWludCByZW5kZXJfY2xvY2sgPSAtMSwgZGlzcGxheV9j bG9jayA9IC0xOworCQllbmdpbmUtPmNsYXNzID0gKGVuZ2luZS0+YnVzeS5jb25maWcgJgorCQkJ CSAoX19JOTE1X1BNVV9PVEhFUigwKSAtIDEpKSA+PgorCQkJCUk5MTVfUE1VX0NMQVNTX1NISUZU OwogCi0JCXBjaV9kZXZpY2VfY2ZnX3JlYWRfdTE2KHBjaV9kZXYsICZnY2ZnYywgSTkxNV9HQ0ZH Qyk7CisJCWVuZ2luZS0+aW5zdGFuY2UgPSAoZW5naW5lLT5idXN5LmNvbmZpZyA+PgorCQkJCSAg ICBJOTE1X1BNVV9TQU1QTEVfQklUUykgJgorCQkJCSAgICAoKDEgPDwgSTkxNV9QTVVfU0FNUExF X0lOU1RBTkNFX0JJVFMpIC0gMSk7CiAKLQkJc3dpdGNoIChnY2ZnYyAmIDB4NykgewotCQljYXNl IDA6Ci0JCQlyZW5kZXJfY2xvY2sgPSAxNjA7Ci0JCQlicmVhazsKLQkJY2FzZSAxOgotCQkJcmVu ZGVyX2Nsb2NrID0gMTkwOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCXJlbmRlcl9jbG9jayA9 IDMzMzsKKwkJcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLyV1IiwKKwkJCSAg ICAgICBjbGFzc19kaXNwbGF5X25hbWUoZW5naW5lLT5jbGFzcyksCisJCQkgICAgICAgZW5naW5l LT5pbnN0YW5jZSk7CisJCWlmIChyZXQgPCAwIHx8IHJldCA9PSBzaXplb2YoYnVmKSkgeworCQkJ cmV0ID0gRU5PQlVGUzsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChnY2ZnYyAmICgxIDw8IDEzKSkK LQkJICAgIHJlbmRlcl9jbG9jayA9IDEzMzsKKwkJcmV0ID0gMDsKIAotCQlzd2l0Y2ggKGdjZmdj ICYgMHg3MCkgewotCQljYXNlIDA6Ci0JCQlkaXNwbGF5X2Nsb2NrID0gMTkwOworCQllbmdpbmUt PmRpc3BsYXlfbmFtZSA9IHN0cmR1cChidWYpOworCQlpZiAoIWVuZ2luZS0+ZGlzcGxheV9uYW1l KSB7CisJCQlyZXQgPSBlcnJubzsKIAkJCWJyZWFrOwotCQljYXNlIDQ6Ci0JCQlkaXNwbGF5X2Ns b2NrID0gMzMzOworCQl9CisKKwkJZW5naW5lcy0+bnVtX2VuZ2luZXMrKzsKKwkJZW5naW5lcyA9 IHJlYWxsb2MoZW5naW5lcywgc2l6ZW9mKHN0cnVjdCBlbmdpbmVzKSArCisJCQkJICBlbmdpbmVz LT5udW1fZW5naW5lcyAqIHNpemVvZihzdHJ1Y3QgZW5naW5lKSk7CisJCWlmICghZW5naW5lcykg eworCQkJcmV0ID0gZXJybm87CiAJCQlicmVhazsKIAkJfQotCQlpZiAoZ2NmZ2MgJiAoMSA8PCA3 KSkKLQkJICAgIGRpc3BsYXlfY2xvY2sgPSAxMzM7CisJfQorCisJaWYgKHJldCkgeworCQlmcmVl KGVuZ2luZXMpOworCQllcnJubyA9IHJldDsKIAotCQlwcmludF9jbG9jaygicmVuZGVyIiwgcmVu ZGVyX2Nsb2NrKTsKLQkJcHJpbnRmKCIgICIpOwotCQlwcmludF9jbG9jaygiZGlzcGxheSIsIGRp c3BsYXlfY2xvY2spOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKKwlxc29ydChlbmdpbmVfcHRyKGVu Z2luZXMsIDApLCBlbmdpbmVzLT5udW1fZW5naW5lcywKKwkgICAgICBzaXplb2Yoc3RydWN0IGVu Z2luZSksIGVuZ2luZV9jbXApOworCisJZW5naW5lcy0+cm9vdCA9IGQ7CiAKLQlwcmludGYoIlxu Iik7Ci0JcmV0dXJuIC0xOworCXJldHVybiBlbmdpbmVzOwogfQogCi0jZGVmaW5lIFNUQVRTX0xF TiAoMjApCi0jZGVmaW5lIFBFUkNFTlRBR0VfQkFSX0VORAkoNzkgLSBTVEFUU19MRU4pCitzdGF0 aWMgaW50CitmaWxlbmFtZV90b19idWYoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJ1Ziwg dW5zaWduZWQgaW50IGJ1ZnNpemUpCit7CisJaW50IGZkLCBlcnI7CisJc3NpemVfdCByZXQ7CiAK LXN0YXRpYyB2b2lkCi1wcmludF9wZXJjZW50YWdlX2JhcihmbG9hdCBwZXJjZW50LCBpbnQgY3Vy X2xpbmVfbGVuKQorCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDAp CisJCXJldHVybiAtMTsKKworCXJldCA9IHJlYWQoZmQsIGJ1ZiwgYnVmc2l6ZSAtIDEpOworCWVy ciA9IGVycm5vOworCWNsb3NlKGZkKTsKKwlpZiAocmV0IDwgMSkgeworCQllcnJubyA9IHJldCA8 IDAgPyBlcnIgOiBFTk9NU0c7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChyZXQgPiAxICYm IGJ1ZltyZXQgLSAxXSA9PSAnXG4nKQorCQlidWZbcmV0IC0gMV0gPSAnXDAnOworCWVsc2UKKwkJ YnVmW3JldF0gPSAnXDAnOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBmaWxl bmFtZV90b191NjQoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBiYXNlKQogewotCWludCBiYXJf YXZhaWxfbGVuID0gKFBFUkNFTlRBR0VfQkFSX0VORCAtIGN1cl9saW5lX2xlbiAtIDEpICogODsK LQlpbnQgYmFyX2xlbiA9IGJhcl9hdmFpbF9sZW4gKiAocGVyY2VudCArIC41KSAvIDEwMC4wOwot CWludCBpOworCWNoYXIgYnVmWzY0XSwgKmI7CiAKLQlmb3IgKGkgPSBiYXJfbGVuOyBpID49IDg7 IGkgLT0gOCkgewotCQlwcmludGYoIiVzIiwgYmFyc1s4XSk7Ci0JCWN1cl9saW5lX2xlbisrOwor CWlmIChmaWxlbmFtZV90b19idWYoZmlsZW5hbWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQlyZXR1 cm4gMDsKKworCS8qCisJICogSGFuZGxlIGJvdGggc2luZ2xlIGludGVnZXIgYW5kIGtleT12YWx1 ZSBmb3JtYXRzIGJ5IHNraXBwaW5nCisJICogbGVhZGluZyBub24tZGlnaXRzLgorCSAqLworCWIg PSBidWY7CisJd2hpbGUgKCpiICYmICFpc2RpZ2l0KCpiKSkKKwkJYisrOworCisJcmV0dXJuIHN0 cnRvdWxsKGIsIE5VTEwsIGJhc2UpOworfQorCitzdGF0aWMgZG91YmxlIGZpbGVuYW1lX3RvX2Rv dWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpvbGRsb2NhbGU7CisJY2hhciBi dWZbODBdOworCWRvdWJsZSB2OworCisJaWYgKGZpbGVuYW1lX3RvX2J1ZihmaWxlbmFtZSwgYnVm LCBzaXplb2YoYnVmKSkpCisJCXJldHVybiAwOworCisJb2xkbG9jYWxlID0gc2V0bG9jYWxlKExD X0FMTCwgIkMiKTsKKwl2ID0gc3RydG9kKGJ1ZiwgTlVMTCk7CisJc2V0bG9jYWxlKExDX0FMTCwg b2xkbG9jYWxlKTsKKworCXJldHVybiB2OworfQorCisjZGVmaW5lIFJBUExfUk9PVCAiL3N5cy9k ZXZpY2VzL3Bvd2VyLyIKKyNkZWZpbmUgUkFQTF9FVkVOVCAiL3N5cy9kZXZpY2VzL3Bvd2VyL2V2 ZW50cy8iCisKK3N0YXRpYyB1aW50NjRfdCByYXBsX3R5cGVfaWQodm9pZCkKK3sKKwlyZXR1cm4g ZmlsZW5hbWVfdG9fdTY0KFJBUExfUk9PVCAidHlwZSIsIDEwKTsKK30KKworc3RhdGljIHVpbnQ2 NF90IHJhcGxfZ3B1X3Bvd2VyKHZvaWQpCit7CisJcmV0dXJuIGZpbGVuYW1lX3RvX3U2NChSQVBM X0VWRU5UICJlbmVyZ3ktZ3B1IiwgMCk7Cit9CisKK3N0YXRpYyBkb3VibGUgcmFwbF9ncHVfcG93 ZXJfc2NhbGUodm9pZCkKK3sKKwlyZXR1cm4gZmlsZW5hbWVfdG9fZG91YmxlKFJBUExfRVZFTlQg ImVuZXJneS1ncHUuc2NhbGUiKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnJhcGxfZ3B1X3Bv d2VyX3VuaXQodm9pZCkKK3sKKwljaGFyIGJ1ZlszMl07CisKKwlpZiAoZmlsZW5hbWVfdG9fYnVm KFJBUExfRVZFTlQgImVuZXJneS1ncHUudW5pdCIsCisJCQkgICAgYnVmLCBzaXplb2YoYnVmKSkg PT0gMCkKKwkJaWYgKCFzdHJjbXAoYnVmLCAiSm91bGVzIikpCisJCQlyZXR1cm4gc3RyZHVwKCJX YXR0cyIpOworCQllbHNlCisJCQlyZXR1cm4gc3RyZHVwKGJ1Zik7CisJZWxzZQorCQlyZXR1cm4g TlVMTDsKK30KKworI2RlZmluZSBJTUNfUk9PVCAiL3N5cy9kZXZpY2VzL3VuY29yZV9pbWMvIgor I2RlZmluZSBJTUNfRVZFTlQgIi9zeXMvZGV2aWNlcy91bmNvcmVfaW1jL2V2ZW50cy8iCisKK3N0 YXRpYyB1aW50NjRfdCBpbWNfdHlwZV9pZCh2b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b191 NjQoSU1DX1JPT1QgInR5cGUiLCAxMCk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBpbWNfZGF0YV9y ZWFkcyh2b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b191NjQoSU1DX0VWRU5UICJkYXRhX3Jl YWRzIiwgMCk7Cit9CisKK3N0YXRpYyBkb3VibGUgaW1jX2RhdGFfcmVhZHNfc2NhbGUodm9pZCkK K3sKKwlyZXR1cm4gZmlsZW5hbWVfdG9fZG91YmxlKElNQ19FVkVOVCAiZGF0YV9yZWFkcy5zY2Fs ZSIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaW1jX2RhdGFfcmVhZHNfdW5pdCh2b2lkKQor eworCWNoYXIgYnVmWzMyXTsKKworCWlmIChmaWxlbmFtZV90b19idWYoSU1DX0VWRU5UICJkYXRh X3JlYWRzLnVuaXQiLCBidWYsIHNpemVvZihidWYpKSA9PSAwKQorCQlyZXR1cm4gc3RyZHVwKGJ1 Zik7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHVpbnQ2NF90IGltY19kYXRh X3dyaXRlcyh2b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b191NjQoSU1DX0VWRU5UICJkYXRh X3dyaXRlcyIsIDApOworfQorCitzdGF0aWMgZG91YmxlIGltY19kYXRhX3dyaXRlc19zY2FsZSh2 b2lkKQoreworCXJldHVybiBmaWxlbmFtZV90b19kb3VibGUoSU1DX0VWRU5UICJkYXRhX3dyaXRl cy5zY2FsZSIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaW1jX2RhdGFfd3JpdGVzX3VuaXQo dm9pZCkKK3sKKwljaGFyIGJ1ZlszMl07CisKKwlpZiAoZmlsZW5hbWVfdG9fYnVmKElNQ19FVkVO VCAiZGF0YV93cml0ZXMudW5pdCIsCisJCQkgICAgYnVmLCBzaXplb2YoYnVmKSkgPT0gMCkKKwkJ cmV0dXJuIHN0cmR1cChidWYpOworCWVsc2UKKwkJcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUg X29wZW5fcG11KGNudCwgcG11LCBmZCkgXAorKHsgXAorCWludCBmZF9fOyBcCitcCisJZmRfXyA9 IHBlcmZfaTkxNV9vcGVuX2dyb3VwKChwbXUpLT5jb25maWcsIChmZCkpOyBcCisJaWYgKGZkX18g Pj0gMCkgeyBcCisJCWlmICgoZmQpID09IC0xKSBcCisJCQkoZmQpID0gZmRfXzsgXAorCQkocG11 KS0+cHJlc2VudCA9IHRydWU7IFwKKwkJKHBtdSktPmlkeCA9IChjbnQpKys7IFwKKwl9IFwKK1wK KwlmZF9fOyBcCit9KQorCisjZGVmaW5lIF9vcGVuX2ltYyhjbnQsIHBtdSwgZmQpIFwKKyh7IFwK KwlpbnQgZmRfXzsgXAorXAorCWZkX18gPSBpZ3RfcGVyZl9vcGVuX2dyb3VwKGltY190eXBlX2lk KCksIChwbXUpLT5jb25maWcsIChmZCkpOyBcCisJaWYgKGZkX18gPj0gMCkgeyBcCisJCWlmICgo ZmQpID09IC0xKSBcCisJCQkoZmQpID0gZmRfXzsgXAorCQkocG11KS0+cHJlc2VudCA9IHRydWU7 IFwKKwkJKHBtdSktPmlkeCA9IChjbnQpKys7IFwKKwl9IFwKK1wKKwlmZF9fOyBcCit9KQorCitz dGF0aWMgaW50IHBtdV9pbml0KHN0cnVjdCBlbmdpbmVzICplbmdpbmVzKQoreworCXVuc2lnbmVk IGludCBpOworCWludCBmZDsKKworCWVuZ2luZXMtPmZkID0gLTE7CisJZW5naW5lcy0+bnVtX2Nv dW50ZXJzID0gMDsKKworCWVuZ2luZXMtPmlycS5jb25maWcgPSBJOTE1X1BNVV9JTlRFUlJVUFRT OworCWZkID0gX29wZW5fcG11KGVuZ2luZXMtPm51bV9jb3VudGVycywgJmVuZ2luZXMtPmlycSwg ZW5naW5lcy0+ZmQpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKworCWVuZ2luZXMtPmZy ZXFfcmVxLmNvbmZpZyA9IEk5MTVfUE1VX1JFUVVFU1RFRF9GUkVRVUVOQ1k7CisJX29wZW5fcG11 KGVuZ2luZXMtPm51bV9jb3VudGVycywgJmVuZ2luZXMtPmZyZXFfcmVxLCBlbmdpbmVzLT5mZCk7 CisKKwllbmdpbmVzLT5mcmVxX2FjdC5jb25maWcgPSBJOTE1X1BNVV9BQ1RVQUxfRlJFUVVFTkNZ OworCV9vcGVuX3BtdShlbmdpbmVzLT5udW1fY291bnRlcnMsICZlbmdpbmVzLT5mcmVxX2FjdCwg ZW5naW5lcy0+ZmQpOworCisJZW5naW5lcy0+cmM2LmNvbmZpZyA9IEk5MTVfUE1VX1JDNl9SRVNJ REVOQ1k7CisJX29wZW5fcG11KGVuZ2luZXMtPm51bV9jb3VudGVycywgJmVuZ2luZXMtPnJjNiwg ZW5naW5lcy0+ZmQpOworCisJZm9yIChpID0gMDsgaSA8IGVuZ2luZXMtPm51bV9lbmdpbmVzOyBp KyspIHsKKwkJc3RydWN0IGVuZ2luZSAqZW5naW5lID0gZW5naW5lX3B0cihlbmdpbmVzLCBpKTsK KwkJc3RydWN0IHsKKwkJCXN0cnVjdCBwbXVfY291bnRlciAqcG11OworCQkJY29uc3QgY2hhciAq Y291bnRlcjsKKwkJfSAqY250LCBjb3VudGVyc1tdID0geworCQkJeyAucG11ID0gJmVuZ2luZS0+ YnVzeSwgLmNvdW50ZXIgPSAiYnVzeSIgfSwKKwkJCXsgLnBtdSA9ICZlbmdpbmUtPndhaXQsIC5j b3VudGVyID0gIndhaXQiIH0sCisJCQl7IC5wbXUgPSAmZW5naW5lLT5zZW1hLCAuY291bnRlciA9 ICJzZW1hIiB9LAorCQkJeyAucG11ID0gTlVMTCwgLmNvdW50ZXIgPSBOVUxMIH0sCisJCX07CisK KwkJZm9yIChjbnQgPSBjb3VudGVyczsgY250LT5wbXU7IGNudCsrKSB7CisJCQlpZiAoIWNudC0+ cG11LT5jb25maWcpCisJCQkJY250LT5wbXUtPmNvbmZpZyA9CisJCQkJCWdldF9wbXVfY29uZmln KGRpcmZkKGVuZ2luZXMtPnJvb3QpLAorCQkJCQkJICAgICAgIGVuZ2luZS0+bmFtZSwKKwkJCQkJ CSAgICAgICBjbnQtPmNvdW50ZXIpOworCQkJZmQgPSBfb3Blbl9wbXUoZW5naW5lcy0+bnVtX2Nv dW50ZXJzLCBjbnQtPnBtdSwKKwkJCQkgICAgICAgZW5naW5lcy0+ZmQpOworCQkJaWYgKGZkID49 IDApCisJCQkJZW5naW5lLT5udW1fY291bnRlcnMrKzsKKwkJfQogCX0KLQlpZiAoaSkgewotCQlw cmludGYoIiVzIiwgYmFyc1tpXSk7Ci0JCWN1cl9saW5lX2xlbisrOworCisJZW5naW5lcy0+cmFw bF9mZCA9IC0xOworCWlmIChyYXBsX3R5cGVfaWQoKSkgeworCQllbmdpbmVzLT5yYXBsX3NjYWxl ID0gcmFwbF9ncHVfcG93ZXJfc2NhbGUoKTsKKwkJZW5naW5lcy0+cmFwbF91bml0ID0gcmFwbF9n cHVfcG93ZXJfdW5pdCgpOworCQlpZiAoIWVuZ2luZXMtPnJhcGxfdW5pdCkKKwkJCXJldHVybiAt MTsKKworCQllbmdpbmVzLT5yYXBsLmNvbmZpZyA9IHJhcGxfZ3B1X3Bvd2VyKCk7CisJCWlmICgh ZW5naW5lcy0+cmFwbC5jb25maWcpCisJCQlyZXR1cm4gLTE7CisKKwkJZW5naW5lcy0+cmFwbF9m ZCA9IGlndF9wZXJmX29wZW4ocmFwbF90eXBlX2lkKCksCisJCQkJCQkgZW5naW5lcy0+cmFwbC5j b25maWcpOworCQlpZiAoZW5naW5lcy0+cmFwbF9mZCA8IDApCisJCQlyZXR1cm4gLTE7CisKKwkJ ZW5naW5lcy0+cmFwbC5wcmVzZW50ID0gdHJ1ZTsKIAl9CiAKLQkvKiBOQjogV2UgY2FuJ3QgdXNl IGEgZmllbGQgd2lkdGggd2l0aCB1dGY4IHNvIHdlIG1hbnVhbGx5Ci0JKiBndWFyYW50ZWUgYSBm aWVsZCB3aXRoIG9mIDQ1IGNoYXJzIGZvciBhbnkgYmFyLiAqLwotCXByaW50ZigiJSpzIiwgUEVS Q0VOVEFHRV9CQVJfRU5EIC0gY3VyX2xpbmVfbGVuLCAiIik7Ci19CisJZW5naW5lcy0+aW1jX2Zk ID0gLTE7CisJaWYgKGltY190eXBlX2lkKCkpIHsKKwkJdW5zaWduZWQgaW50IG51bSA9IDA7CiAK LXN0cnVjdCByaW5nIHsKLQljb25zdCBjaGFyICpuYW1lOwotCXVpbnQzMl90IG1taW87Ci0JaW50 IGhlYWQsIHRhaWwsIHNpemU7Ci0JdWludDY0X3QgZnVsbDsKLQlpbnQgaWRsZTsKLX07CisJCWVu Z2luZXMtPmltY19yZWFkc19zY2FsZSA9IGltY19kYXRhX3JlYWRzX3NjYWxlKCk7CisJCWVuZ2lu ZXMtPmltY193cml0ZXNfc2NhbGUgPSBpbWNfZGF0YV93cml0ZXNfc2NhbGUoKTsKKworCQllbmdp bmVzLT5pbWNfcmVhZHNfdW5pdCA9IGltY19kYXRhX3JlYWRzX3VuaXQoKTsKKwkJaWYgKCFlbmdp bmVzLT5pbWNfcmVhZHNfdW5pdCkKKwkJCXJldHVybiAtMTsKKworCQllbmdpbmVzLT5pbWNfd3Jp dGVzX3VuaXQgPSBpbWNfZGF0YV93cml0ZXNfdW5pdCgpOworCQlpZiAoIWVuZ2luZXMtPmltY193 cml0ZXNfdW5pdCkKKwkJCXJldHVybiAtMTsKKworCQllbmdpbmVzLT5pbWNfcmVhZHMuY29uZmln ID0gaW1jX2RhdGFfcmVhZHMoKTsKKwkJaWYgKCFlbmdpbmVzLT5pbWNfcmVhZHMuY29uZmlnKQor CQkJcmV0dXJuIC0xOworCisJCWVuZ2luZXMtPmltY193cml0ZXMuY29uZmlnID0gaW1jX2RhdGFf d3JpdGVzKCk7CisJCWlmICghZW5naW5lcy0+aW1jX3dyaXRlcy5jb25maWcpCisJCQlyZXR1cm4g LTE7CisKKwkJZmQgPSBfb3Blbl9pbWMobnVtLCAmZW5naW5lcy0+aW1jX3JlYWRzLCBlbmdpbmVz LT5pbWNfZmQpOworCQlpZiAoZmQgPCAwKQorCQkJcmV0dXJuIC0xOworCQlmZCA9IF9vcGVuX2lt YyhudW0sICZlbmdpbmVzLT5pbWNfd3JpdGVzLCBlbmdpbmVzLT5pbWNfZmQpOworCQlpZiAoZmQg PCAwKQorCQkJcmV0dXJuIC0xOworCisJCWVuZ2luZXMtPmltY19yZWFkcy5wcmVzZW50ID0gdHJ1 ZTsKKwkJZW5naW5lcy0+aW1jX3dyaXRlcy5wcmVzZW50ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4g MDsKK30KIAotc3RhdGljIHVpbnQzMl90IHJpbmdfcmVhZChzdHJ1Y3QgcmluZyAqcmluZywgdWlu dDMyX3QgcmVnKQorc3RhdGljIHVpbnQ2NF90IHBtdV9yZWFkX211bHRpKGludCBmZCwgdW5zaWdu ZWQgaW50IG51bSwgdWludDY0X3QgKnZhbCkKIHsKLQlyZXR1cm4gSU5SRUcocmluZy0+bW1pbyAr IHJlZyk7CisJdWludDY0X3QgYnVmWzIgKyBudW1dOworCXVuc2lnbmVkIGludCBpOworCXNzaXpl X3QgbGVuOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCisJbGVuID0gcmVhZChm ZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJYXNzZXJ0KGxlbiA9PSBzaXplb2YoYnVmKSk7CisKKwlm b3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisJCXZhbFtpXSA9IGJ1ZlsyICsgaV07CisKKwlyZXR1 cm4gYnVmWzFdOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX2luaXQoc3RydWN0IHJpbmcgKnJpbmcp CitzdGF0aWMgZG91YmxlIF9fcG11X2NhbGMoc3RydWN0IHBtdV9wYWlyICpwLCBkb3VibGUgZCwg ZG91YmxlIHQsIGRvdWJsZSBzKQogewotCXJpbmctPnNpemUgPSAoKChyaW5nX3JlYWQocmluZywg UklOR19MRU4pICYgUklOR19OUl9QQUdFUykgPj4gMTIpICsgMSkgKiA0MDk2OworCWRvdWJsZSB2 OworCisJdiA9IHAtPmN1ciAtIHAtPnByZXY7CisJdiAvPSBkOworCXYgLz0gdDsKKwl2ICo9IHM7 CisKKwlpZiAocyA9PSAxMDAuMCAmJiB2ID4gMTAwLjApCisJCXYgPSAxMDAuMDsKKworCXJldHVy biB2OwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3Jlc2V0KHN0cnVjdCByaW5nICpyaW5nKQorc3Rh dGljIHZvaWQgZmlsbF9zdHIoY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmc3osIGNoYXIgYywg dW5zaWduZWQgaW50IG51bSkKIHsKLQlyaW5nLT5pZGxlID0gcmluZy0+ZnVsbCA9IDA7CisJdW5z aWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtICYmIGkgPCAoYnVmc3ogLSAxKTsg aSsrKQorCQkqYnVmKysgPSBjOworCisJKmJ1ZiA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdf c2FtcGxlKHN0cnVjdCByaW5nICpyaW5nKQorc3RhdGljIHZvaWQgcG11X2NhbGMoc3RydWN0IHBt dV9jb3VudGVyICpjbnQsCisJCSAgICAgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmc3osCisJ CSAgICAgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCB3aWR0aF9kZWMsCisJCSAgICAgZG91 YmxlIGQsIGRvdWJsZSB0LCBkb3VibGUgcykKIHsKLQlpbnQgZnVsbDsKKwlkb3VibGUgdmFsOwor CWludCBsZW47CisKKwlhc3NlcnQoYnVmc3ogPj0gKHdpZHRoICsgd2lkdGhfZGVjICsgMSkpOwor CisJaWYgKCFjbnQtPnByZXNlbnQpIHsKKwkJZmlsbF9zdHIoYnVmLCBidWZzeiwgJy0nLCB3aWR0 aCArIHdpZHRoX2RlYyk7CisJCXJldHVybjsKKwl9CiAKLQlpZiAoIXJpbmctPnNpemUpCisJdmFs ID0gX19wbXVfY2FsYygmY250LT52YWwsIGQsIHQsIHMpOworCisJbGVuID0gc25wcmludGYoYnVm LCBidWZzeiwgIiUqLipmIiwgd2lkdGggKyB3aWR0aF9kZWMsIHdpZHRoX2RlYywgdmFsKTsKKwlp ZiAobGVuIDwgMCB8fCBsZW4gPT0gYnVmc3opIHsKKwkJZmlsbF9zdHIoYnVmLCBidWZzeiwgJ1gn LCB3aWR0aCArIHdpZHRoX2RlYyk7CiAJCXJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB1aW50NjRf dCBfX3BtdV9yZWFkX3NpbmdsZShpbnQgZmQsIHVpbnQ2NF90ICp0cykKK3sKKwl1aW50NjRfdCBk YXRhWzJdID0geyB9OworCXNzaXplX3QgbGVuOwogCi0JcmluZy0+aGVhZCA9IHJpbmdfcmVhZChy aW5nLCBSSU5HX0hFQUQpICYgSEVBRF9BRERSOwotCXJpbmctPnRhaWwgPSByaW5nX3JlYWQocmlu ZywgUklOR19UQUlMKSAmIFRBSUxfQUREUjsKKwlsZW4gPSByZWFkKGZkLCBkYXRhLCBzaXplb2Yo ZGF0YSkpOworCWFzc2VydChsZW4gPT0gc2l6ZW9mKGRhdGEpKTsKIAotCWlmIChyaW5nLT50YWls ID09IHJpbmctPmhlYWQpCi0JCXJpbmctPmlkbGUrKzsKKwlpZiAodHMpCisJCSp0cyA9IGRhdGFb MV07CiAKLQlmdWxsID0gcmluZy0+dGFpbCAtIHJpbmctPmhlYWQ7Ci0JaWYgKGZ1bGwgPCAwKQot CQlmdWxsICs9IHJpbmctPnNpemU7Ci0JcmluZy0+ZnVsbCArPSBmdWxsOworCXJldHVybiBkYXRh WzBdOwogfQogCi1zdGF0aWMgdm9pZCByaW5nX3ByaW50X2hlYWRlcihGSUxFICpvdXQsIHN0cnVj dCByaW5nICpyaW5nKQorc3RhdGljIHVpbnQ2NF90IHBtdV9yZWFkX3NpbmdsZShpbnQgZmQpCiB7 Ci0gICAgZnByaW50ZihvdXQsICIlLjZzJSVcdG9wc1x0IiwKLSAgICAgICAgICAgIHJpbmctPm5h bWUKLSAgICAgICAgICApOworCXJldHVybiBfX3BtdV9yZWFkX3NpbmdsZShmZCwgTlVMTCk7CiB9 CiAKLXN0YXRpYyB2b2lkIHJpbmdfcHJpbnQoc3RydWN0IHJpbmcgKnJpbmcsIHVuc2lnbmVkIGxv bmcgc2FtcGxlc19wZXJfc2VjKQorc3RhdGljIHZvaWQgX191cGRhdGVfc2FtcGxlKHN0cnVjdCBw bXVfY291bnRlciAqY291bnRlciwgdWludDY0X3QgdmFsKQogewotCWludCBwZXJjZW50X2J1c3ks IGxlbjsKKwljb3VudGVyLT52YWwucHJldiA9IGNvdW50ZXItPnZhbC5jdXI7CisJY291bnRlci0+ dmFsLmN1ciA9IHZhbDsKK30KIAotCWlmICghcmluZy0+c2l6ZSkKLQkJcmV0dXJuOworc3RhdGlj IHZvaWQgdXBkYXRlX3NhbXBsZShzdHJ1Y3QgcG11X2NvdW50ZXIgKmNvdW50ZXIsIHVpbnQ2NF90 ICp2YWwpCit7CisJaWYgKGNvdW50ZXItPnByZXNlbnQpCisJCV9fdXBkYXRlX3NhbXBsZShjb3Vu dGVyLCB2YWxbY291bnRlci0+aWR4XSk7Cit9CisKK3N0YXRpYyB2b2lkIHBtdV9zYW1wbGUoc3Ry dWN0IGVuZ2luZXMgKmVuZ2luZXMpCit7CisJY29uc3QgaW50IG51bV92YWwgPSBlbmdpbmVzLT5u dW1fY291bnRlcnM7CisJdWludDY0X3QgdmFsWzIgKyBudW1fdmFsXTsKKwl1bnNpZ25lZCBpbnQg aTsKKworCWVuZ2luZXMtPnRzLnByZXYgPSBlbmdpbmVzLT50cy5jdXI7CisKKwlpZiAoZW5naW5l cy0+cmFwbF9mZCA+PSAwKQorCQlfX3VwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPnJhcGwsCisJCQkJ cG11X3JlYWRfc2luZ2xlKGVuZ2luZXMtPnJhcGxfZmQpKTsKKworCWlmIChlbmdpbmVzLT5pbWNf ZmQgPj0gMCkgeworCQlwbXVfcmVhZF9tdWx0aShlbmdpbmVzLT5pbWNfZmQsIDIsIHZhbCk7CisJ CXVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmltY19yZWFkcywgdmFsKTsKKwkJdXBkYXRlX3NhbXBs ZSgmZW5naW5lcy0+aW1jX3dyaXRlcywgdmFsKTsKKwl9CiAKLQlwZXJjZW50X2J1c3kgPSAxMDAg LSAxMDAgKiByaW5nLT5pZGxlIC8gc2FtcGxlc19wZXJfc2VjOworCWVuZ2luZXMtPnRzLmN1ciA9 IHBtdV9yZWFkX211bHRpKGVuZ2luZXMtPmZkLCBudW1fdmFsLCB2YWwpOwogCi0JbGVuID0gcHJp bnRmKCIlMjVzIGJ1c3k6ICUzZCUlOiAiLCByaW5nLT5uYW1lLCBwZXJjZW50X2J1c3kpOwotCXBy aW50X3BlcmNlbnRhZ2VfYmFyIChwZXJjZW50X2J1c3ksIGxlbik7Ci0JcHJpbnRmKCIlMjRzIHNw YWNlOiAlZC8lZFxuIiwKLQkJICAgcmluZy0+bmFtZSwKLQkJICAgKGludCkocmluZy0+ZnVsbCAv IHNhbXBsZXNfcGVyX3NlYyksCi0JCSAgIHJpbmctPnNpemUpOworCXVwZGF0ZV9zYW1wbGUoJmVu Z2luZXMtPmZyZXFfcmVxLCB2YWwpOworCXVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmZyZXFfYWN0 LCB2YWwpOworCXVwZGF0ZV9zYW1wbGUoJmVuZ2luZXMtPmlycSwgdmFsKTsKKwl1cGRhdGVfc2Ft cGxlKCZlbmdpbmVzLT5yYzYsIHZhbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW5naW5lcy0+bnVt X2VuZ2luZXM7IGkrKykgeworCQlzdHJ1Y3QgZW5naW5lICplbmdpbmUgPSBlbmdpbmVfcHRyKGVu Z2luZXMsIGkpOworCisJCXVwZGF0ZV9zYW1wbGUoJmVuZ2luZS0+YnVzeSwgdmFsKTsKKwkJdXBk YXRlX3NhbXBsZSgmZW5naW5lLT5zZW1hLCB2YWwpOworCQl1cGRhdGVfc2FtcGxlKCZlbmdpbmUt PndhaXQsIHZhbCk7CisJfQogfQogCi1zdGF0aWMgdm9pZCByaW5nX2xvZyhzdHJ1Y3QgcmluZyAq cmluZywgdW5zaWduZWQgbG9uZyBzYW1wbGVzX3Blcl9zZWMsCi0JCUZJTEUgKm91dHB1dCkKK3N0 YXRpYyBjb25zdCBjaGFyICpiYXJzW10gPSB7ICIgIiwgIuKWjyIsICLilo4iLCAi4paNIiwgIuKW jCIsICLilosiLCAi4paKIiwgIuKWiSIsICLilogiIH07CisKK3N0YXRpYyB2b2lkCitwcmludF9w ZXJjZW50YWdlX2Jhcihkb3VibGUgcGVyY2VudCwgaW50IG1heF9sZW4pCiB7Ci0JaWYgKHJpbmct PnNpemUpCi0JCWZwcmludGYob3V0cHV0LCAiJTNkXHQlZFx0IiwKLQkJCShpbnQpKDEwMCAtIDEw MCAqIHJpbmctPmlkbGUgLyBzYW1wbGVzX3Blcl9zZWMpLAotCQkJKGludCkocmluZy0+ZnVsbCAv IHNhbXBsZXNfcGVyX3NlYykpOwotCWVsc2UKLQkJZnByaW50ZihvdXRwdXQsICItMVx0LTFcdCIp OworCWludCBiYXJfbGVuID0gcGVyY2VudCAqICg4ICogKG1heF9sZW4gLSAyKSkgLyAxMDAuMDsK KwlpbnQgaTsKKworCXB1dGNoYXIoJ3wnKTsKKworCWZvciAoaSA9IGJhcl9sZW47IGkgPj0gODsg aSAtPSA4KQorCQlwcmludGYoIiVzIiwgYmFyc1s4XSk7CisJaWYgKGkpCisJCXByaW50ZigiJXMi LCBiYXJzW2ldKTsKKworCWZvciAoaSA9IDA7IGkgPCAobWF4X2xlbiAtIDIgLSAoYmFyX2xlbiAr IDcpIC8gOCk7IGkrKykKKwkJcHV0Y2hhcignICcpOworCisJcHV0Y2hhcignfCcpOwogfQogCisj ZGVmaW5lIERFRkFVTFRfUEVSSU9EX01TICgxMDAwKQorCiBzdGF0aWMgdm9pZAogdXNhZ2UoY29u c3QgY2hhciAqYXBwbmFtZSkKIHsKIAlwcmludGYoImludGVsX2dwdV90b3AgLSBEaXNwbGF5IGEg dG9wLWxpa2Ugc3VtbWFyeSBvZiBJbnRlbCBHUFUgdXNhZ2VcbiIKLQkJCSJcbiIKLQkJCSJ1c2Fn ZTogJXMgW3BhcmFtZXRlcnNdXG4iCi0JCQkiXG4iCi0JCQkiVGhlIGZvbGxvd2luZyBwYXJhbWV0 ZXJzIGFwcGx5OlxuIgotCQkJIlstcyA8c2FtcGxlcz5dICAgICAgIHNhbXBsZXMgcGVyIHNlY29u ZHMgKGRlZmF1bHQgJWQpXG4iCi0JCQkiWy1lIDxjb21tYW5kPl0gICAgICAgY29tbWFuZCB0byBw cm9maWxlXG4iCi0JCQkiWy1vIDxmaWxlPl0gICAgICAgICAgb3V0cHV0IHN0YXRpc3RpY3MgdG8g ZmlsZS4gSWYgZmlsZSBpcyAnLScsIgotCQkJIiAgICAgICAgICAgICAgICAgICAgIHJ1biBpbiBi YXRjaCBtb2RlIGFuZCBvdXRwdXQgc3RhdGlzdGljcyB0byBzdGRpbyBvbmx5IFxuIgotCQkJIlst aF0gICAgICAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIHNjcmVlblxuIgotCQkJIlxuIiwKLQkJ CWFwcG5hbWUsCi0JCQlTQU1QTEVTX1BFUl9TRUMKLQkJICApOwotCXJldHVybjsKKwkJIlxuIgor CQkiVXNhZ2U6ICVzIFtwYXJhbWV0ZXJzXVxuIgorCQkiXG4iCisJCSJcdFRoZSBmb2xsb3dpbmcg cGFyYW1ldGVycyBhcmUgb3B0aW9uYWw6XG5cbiIKKwkJIlx0Wy1zIDxtcz5dICAgICAgIFJlZnJl c2ggcGVyaW9kIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdCAldW1zKS5cbiIKKwkJIlx0Wy1oXSAg ICAgICAgICAgIFNob3cgdGhpcyBoZWxwIHRleHQuXG4iCisJCSJcbiIsCisJCWFwcG5hbWUsIERF RkFVTFRfUEVSSU9EX01TKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQog ewotCXVpbnQzMl90IGRldmlkOwotCXN0cnVjdCBwY2lfZGV2aWNlICpwY2lfZGV2OwotCXN0cnVj dCByaW5nIHJlbmRlcl9yaW5nID0gewotCQkubmFtZSA9ICJyZW5kZXIiLAotCQkubW1pbyA9IDB4 MjAzMCwKLQl9LCBic2RfcmluZyA9IHsKLQkJLm5hbWUgPSAiYml0c3RyZWFtIiwKLQkJLm1taW8g PSAweDQwMzAsCi0JfSwgYnNkNl9yaW5nID0gewotCQkubmFtZSA9ICJiaXRzdHJlYW0iLAotCQku bW1pbyA9IDB4MTIwMzAsCi0JfSwgYmx0X3JpbmcgPSB7Ci0JCS5uYW1lID0gImJsaXR0ZXIiLAot CQkubW1pbyA9IDB4MjIwMzAsCi0JfTsKLQlpbnQgaSwgY2g7Ci0JaW50IHNhbXBsZXNfcGVyX3Nl YyA9IFNBTVBMRVNfUEVSX1NFQzsKLQlGSUxFICpvdXRwdXQgPSBOVUxMOwotCWRvdWJsZSBlbGFw c2VkX3RpbWU9MDsKLQlpbnQgcHJpbnRfaGVhZGVycz0xOwotCXBpZF90IGNoaWxkX3BpZD0tMTsK LQlpbnQgY2hpbGRfc3RhdDsKLQljaGFyICpjbWQ9TlVMTDsKLQlpbnQgaW50ZXJhY3RpdmU9MTsK LQotCS8qIFBhcnNlIG9wdGlvbnM/ICovCi0Jd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2 LCAiczpvOmU6aCIpKSAhPSAtMSkgeworCXVuc2lnbmVkIGludCBwZXJpb2RfdXMgPSBERUZBVUxU X1BFUklPRF9NUyAqIDEwMDA7CisJaW50IGNvbl93ID0gLTEsIGNvbl9oID0gLTE7CisJc3RydWN0 IGVuZ2luZXMgKmVuZ2luZXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJldCwgY2g7CisKKwkv KiBQYXJzZSBvcHRpb25zICovCisJd2hpbGUgKChjaCA9IGdldG9wdChhcmdjLCBhcmd2LCAiczpo IikpICE9IC0xKSB7CiAJCXN3aXRjaCAoY2gpIHsKLQkJY2FzZSAnZSc6IGNtZCA9IHN0cmR1cChv cHRhcmcpOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ3MnOiBzYW1wbGVzX3Blcl9zZWMgPSBhdG9pKG9w dGFyZyk7Ci0JCQlpZiAoc2FtcGxlc19wZXJfc2VjIDwgMTAwKSB7Ci0JCQkJZnByaW50ZihzdGRl cnIsICJFcnJvcjogc2FtcGxlcyBwZXIgc2Vjb25kIG11c3QgYmUgPj0gMTAwXG4iKTsKLQkJCQll eGl0KDEpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgJ28nOgotCQkJaWYgKCFzdHJjbXAob3B0 YXJnLCAiLSIpKSB7Ci0JCQkJLyogUnVubmluZyBpbiBub24taW50ZXJhY3RpdmUgbW9kZSAqLwot CQkJCWludGVyYWN0aXZlID0gMDsKLQkJCQlvdXRwdXQgPSBzdGRvdXQ7Ci0JCQl9Ci0JCQllbHNl Ci0JCQkJb3V0cHV0ID0gZm9wZW4ob3B0YXJnLCAidyIpOwotCQkJaWYgKCFvdXRwdXQpCi0JCQl7 Ci0JCQkJcGVycm9yKCJmb3BlbiIpOwotCQkJCWV4aXQoMSk7Ci0JCQl9CisJCWNhc2UgJ3MnOgor CQkJcGVyaW9kX3VzID0gYXRvaShvcHRhcmcpICogMTAwMDsKIAkJCWJyZWFrOwogCQljYXNlICdo JzoKIAkJCXVzYWdlKGFyZ3ZbMF0pOwogCQkJZXhpdCgwKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0 OgotCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGZsYWcgJWMhXG4iLCAoY2hhcilvcHRvcHQp OworCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9wdGlvbiAlYyFcbiIsIChjaGFyKW9wdG9w dCk7CiAJCQl1c2FnZShhcmd2WzBdKTsKIAkJCWV4aXQoMSk7Ci0JCQlicmVhazsKIAkJfQogCX0K IAotCXBjaV9kZXYgPSBpbnRlbF9nZXRfcGNpX2RldmljZSgpOwotCWRldmlkID0gcGNpX2Rldi0+ ZGV2aWNlX2lkOwotCWludGVsX21taW9fdXNlX3BjaV9iYXIocGNpX2Rldik7Ci0JaW5pdF9pbnN0 ZG9uZV9kZWZpbml0aW9ucyhkZXZpZCk7Ci0KLQkvKiBEbyB3ZSBoYXZlIGEgY29tbWFuZCB0byBy dW4/ICovCi0JaWYgKGNtZCAhPSBOVUxMKSB7Ci0JCWlmIChvdXRwdXQpIHsKLQkJCWZwcmludGYo b3V0cHV0LCAiIyBQcm9maWxpbmc6ICVzXG4iLCBjbWQpOwotCQkJZmZsdXNoKG91dHB1dCk7Ci0J CX0KLQkJY2hpbGRfcGlkID0gZm9yaygpOwotCQlpZiAoY2hpbGRfcGlkIDwgMCkgewotCQkJcGVy cm9yKCJmb3JrIik7Ci0JCQlleGl0KDEpOwotCQl9Ci0JCWVsc2UgaWYgKGNoaWxkX3BpZCA9PSAw KSB7Ci0JCQlpbnQgcmVzOwotCQkJcmVzID0gc3lzdGVtKGNtZCk7Ci0JCQlpZiAocmVzIDwgMCkK LQkJCQlwZXJyb3IoInJ1bm5pbmcgY29tbWFuZCIpOwotCQkJaWYgKG91dHB1dCkgewotCQkJCWZm bHVzaChvdXRwdXQpOwotCQkJCWZwcmludGYob3V0cHV0LCAiIyAlcyBleGl0ZWQgd2l0aCBzdGF0 dXMgJWRcbiIsIGNtZCwgcmVzKTsKLQkJCQlmZmx1c2gob3V0cHV0KTsKLQkJCX0KLQkJCWZyZWUo Y21kKTsKLQkJCWV4aXQoMCk7Ci0JCX0gZWxzZSB7Ci0JCQlmcmVlKGNtZCk7Ci0JCX0KKwllbmdp bmVzID0gZGlzY292ZXJfZW5naW5lcygpOworCWlmICghZW5naW5lcykgeworCQlmcHJpbnRmKHN0 ZGVyciwKKwkJCSJGYWlsZWQgdG8gZGV0ZWN0IGVuZ2luZXMhICglcylcbihLZXJuZWwgNC4xNiBv ciBuZXdlciBpcyByZXF1aXJlZCBmb3IgaTkxNSBQTVUgc3VwcG9ydC4pXG4iLAorCQkJc3RyZXJy b3IoZXJybm8pKTsKKwkJcmV0dXJuIDE7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG51bV9pbnN0 ZG9uZV9iaXRzOyBpKyspIHsKLQkJdG9wX2JpdHNbaV0uYml0ID0gJmluc3Rkb25lX2JpdHNbaV07 Ci0JCXRvcF9iaXRzW2ldLmNvdW50ID0gMDsKLQkJdG9wX2JpdHNfc29ydGVkW2ldID0gJnRvcF9i aXRzW2ldOworCXJldCA9IHBtdV9pbml0KGVuZ2luZXMpOworCWlmIChyZXQpIHsKKwkJZnByaW50 ZihzdGRlcnIsCisJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgUE1VISAoJXMpXG4iLCBzdHJlcnJv cihlcnJubykpOworCQlyZXR1cm4gMTsKIAl9CiAKLQkvKiBHcmFiIGFjY2VzcyB0byB0aGUgcmVn aXN0ZXJzICovCi0JaW50ZWxfcmVnaXN0ZXJfYWNjZXNzX2luaXQocGNpX2RldiwgMCwgLTEpOwor CXBtdV9zYW1wbGUoZW5naW5lcyk7CiAKLQlyaW5nX2luaXQoJnJlbmRlcl9yaW5nKTsKLQlpZiAo SVNfR0VONChkZXZpZCkgfHwgSVNfR0VONShkZXZpZCkpCi0JCXJpbmdfaW5pdCgmYnNkX3Jpbmcp OwotCWlmIChJU19HRU42KGRldmlkKSB8fCBJU19HRU43KGRldmlkKSkgewotCQlyaW5nX2luaXQo JmJzZDZfcmluZyk7Ci0JCXJpbmdfaW5pdCgmYmx0X3JpbmcpOwotCX0KKwlmb3IgKDs7KSB7CisJ CWRvdWJsZSB0OworI2RlZmluZSBCVUZTWiAxNgorCQljaGFyIGZyZXFbQlVGU1pdOworCQljaGFy IGZhY3RbQlVGU1pdOworCQljaGFyIGlycVtCVUZTWl07CisJCWNoYXIgcmM2W0JVRlNaXTsKKwkJ Y2hhciBwb3dlcltCVUZTWl07CisJCWNoYXIgcmVhZHNbQlVGU1pdOworCQljaGFyIHdyaXRlc1tC VUZTWl07CisJCXN0cnVjdCB3aW5zaXplIHdzOworCQlpbnQgbGluZXMgPSAwOwogCi0JLyogSW5p dGlhbGl6ZSBHUFUgc3RhdHMgKi8KLQlpZiAoSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCWZv ciAoaSA9IDA7IGkgPCBTVEFUU19DT1VOVDsgaSsrKSB7Ci0JCQl1aW50MzJfdCBzdGF0c19oaWdo LCBzdGF0c19sb3csIHN0YXRzX2hpZ2hfMjsKKwkJLyogVXBkYXRlIHRlcm1pbmFsIHNpemUuICov CisJCWlmIChpb2N0bCgwLCBUSU9DR1dJTlNaLCAmd3MpICE9IC0xKSB7CisJCQljb25fdyA9IHdz LndzX2NvbDsKKwkJCWNvbl9oID0gd3Mud3Nfcm93OworCQl9CiAKLQkJCWRvIHsKLQkJCQlzdGF0 c19oaWdoID0gSU5SRUcoc3RhdHNfcmVnc1tpXSArIDQpOwotCQkJCXN0YXRzX2xvdyA9IElOUkVH KHN0YXRzX3JlZ3NbaV0pOwotCQkJCXN0YXRzX2hpZ2hfMiA9IElOUkVHKHN0YXRzX3JlZ3NbaV0g KyA0KTsKLQkJCX0gd2hpbGUgKHN0YXRzX2hpZ2ggIT0gc3RhdHNfaGlnaF8yKTsKKwkJcG11X3Nh bXBsZShlbmdpbmVzKTsKKwkJdCA9IChkb3VibGUpKGVuZ2luZXMtPnRzLmN1ciAtIGVuZ2luZXMt PnRzLnByZXYpIC8gMWU5OwogCi0JCQlsYXN0X3N0YXRzW2ldID0gKHVpbnQ2NF90KXN0YXRzX2hp Z2ggPDwgMzIgfAotCQkJCXN0YXRzX2xvdzsKLQkJfQotCX0KKwkJcHJpbnRmKCJcMDMzW0hcMDMz W0oiKTsKIAotCWZvciAoOzspIHsKLQkJaW50IGo7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyB0MSwg dGksIHRmLCB0MjsKLQkJdW5zaWduZWQgbG9uZyBsb25nIGRlZl9zbGVlcCA9IDEwMDAwMDAgLyBz YW1wbGVzX3Blcl9zZWM7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBsYXN0X3NhbXBsZXNfcGVyX3Nl YyA9IHNhbXBsZXNfcGVyX3NlYzsKLQkJdW5zaWduZWQgc2hvcnQgaW50IG1heF9saW5lczsKLQkJ c3RydWN0IHdpbnNpemUgd3M7Ci0JCWNoYXIgY2xlYXJfc2NyZWVuW10gPSB7MHgxYiwgJ1snLCAn SCcsCi0JCQkJICAgICAgIDB4MWIsICdbJywgJ0onLAotCQkJCSAgICAgICAweDB9OwotCQlpbnQg cGVyY2VudDsKLQkJaW50IGxlbjsKLQotCQl0MSA9IGdldHRpbWUoKTsKLQotCQlyaW5nX3Jlc2V0 KCZyZW5kZXJfcmluZyk7Ci0JCXJpbmdfcmVzZXQoJmJzZF9yaW5nKTsKLQkJcmluZ19yZXNldCgm YnNkNl9yaW5nKTsKLQkJcmluZ19yZXNldCgmYmx0X3JpbmcpOwotCi0JCWZvciAoaSA9IDA7IGkg PCBzYW1wbGVzX3Blcl9zZWM7IGkrKykgewotCQkJbG9uZyBsb25nIGludGVydmFsOwotCQkJdGkg PSBnZXR0aW1lKCk7Ci0JCQlpZiAoSVNfOTY1KGRldmlkKSkgewotCQkJCWluc3Rkb25lID0gSU5S RUcoSU5TVERPTkVfSTk2NSk7Ci0JCQkJaW5zdGRvbmUxID0gSU5SRUcoSU5TVERPTkVfMSk7Ci0J CQl9IGVsc2UKLQkJCQlpbnN0ZG9uZSA9IElOUkVHKElOU1RET05FKTsKLQotCQkJZm9yIChqID0g MDsgaiA8IG51bV9pbnN0ZG9uZV9iaXRzOyBqKyspCi0JCQkJdXBkYXRlX2lkbGVfYml0KCZ0b3Bf Yml0c1tqXSk7Ci0KLQkJCXJpbmdfc2FtcGxlKCZyZW5kZXJfcmluZyk7Ci0JCQlyaW5nX3NhbXBs ZSgmYnNkX3JpbmcpOwotCQkJcmluZ19zYW1wbGUoJmJzZDZfcmluZyk7Ci0JCQlyaW5nX3NhbXBs ZSgmYmx0X3JpbmcpOwotCi0JCQl0ZiA9IGdldHRpbWUoKTsKLQkJCWlmICh0ZiAtIHQxID49IDEw MDAwMDApIHsKLQkJCQkvKiBXZSBhcmUgb3V0IG9mIHN5bmMsIGJhaWwgb3V0ICovCi0JCQkJbGFz dF9zYW1wbGVzX3Blcl9zZWMgPSBpKzE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnRlcnZhbCA9 IGRlZl9zbGVlcCAtICh0ZiAtIHRpKTsKLQkJCWlmIChpbnRlcnZhbCA+IDApCi0JCQkJdXNsZWVw KGludGVydmFsKTsKLQkJfQorCQlwbXVfY2FsYygmZW5naW5lcy0+ZnJlcV9yZXEsIGZyZXEsIEJV RlNaLCA0LCAwLCAxLjAsIHQsIDEpOworCQlwbXVfY2FsYygmZW5naW5lcy0+ZnJlcV9hY3QsIGZh Y3QsIEJVRlNaLCA0LCAwLCAxLjAsIHQsIDEpOworCQlwbXVfY2FsYygmZW5naW5lcy0+aXJxLCBp cnEsIEJVRlNaLCA4LCAwLCAxLjAsIHQsIDEpOworCQlwbXVfY2FsYygmZW5naW5lcy0+cmM2LCBy YzYsIEJVRlNaLCAzLCAwLCAxZTksIHQsIDEwMCk7CisJCXBtdV9jYWxjKCZlbmdpbmVzLT5yYXBs LCBwb3dlciwgQlVGU1osIDQsIDIsIDEuMCwgdCwKKwkJCSBlbmdpbmVzLT5yYXBsX3NjYWxlKTsK KwkJcG11X2NhbGMoJmVuZ2luZXMtPmltY19yZWFkcywgcmVhZHMsIEJVRlNaLCA2LCAwLCAxLjAs IHQsCisJCQkgZW5naW5lcy0+aW1jX3JlYWRzX3NjYWxlKTsKKwkJcG11X2NhbGMoJmVuZ2luZXMt PmltY193cml0ZXMsIHdyaXRlcywgQlVGU1osIDYsIDAsIDEuMCwgdCwKKwkJCSBlbmdpbmVzLT5p bWNfd3JpdGVzX3NjYWxlKTsKIAotCQlpZiAoSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCQlm b3IgKGkgPSAwOyBpIDwgU1RBVFNfQ09VTlQ7IGkrKykgewotCQkJCXVpbnQzMl90IHN0YXRzX2hp Z2gsIHN0YXRzX2xvdywgc3RhdHNfaGlnaF8yOworCQlpZiAobGluZXMrKyA8IGNvbl9oKQorCQkJ cHJpbnRmKCJpbnRlbC1ncHUtdG9wIC0gJXMvJXMgTUh6OyAgJXMlJSBSQzY7ICVzICVzOyAlcyBp cnFzL3NcbiIsCisJCQkgICAgICAgZmFjdCwgZnJlcSwgcmM2LCBwb3dlciwgZW5naW5lcy0+cmFw bF91bml0LCBpcnEpOwogCi0JCQkJZG8gewotCQkJCQlzdGF0c19oaWdoID0gSU5SRUcoc3RhdHNf cmVnc1tpXSArIDQpOwotCQkJCQlzdGF0c19sb3cgPSBJTlJFRyhzdGF0c19yZWdzW2ldKTsKLQkJ CQkJc3RhdHNfaGlnaF8yID0gSU5SRUcoc3RhdHNfcmVnc1tpXSArIDQpOwotCQkJCX0gd2hpbGUg KHN0YXRzX2hpZ2ggIT0gc3RhdHNfaGlnaF8yKTsKKwkJaWYgKGxpbmVzKysgPCBjb25faCkKKwkJ CXByaW50ZigiXG4iKTsKIAotCQkJCXN0YXRzW2ldID0gKHVpbnQ2NF90KXN0YXRzX2hpZ2ggPDwg MzIgfAotCQkJCQlzdGF0c19sb3c7Ci0JCQl9Ci0JCX0KKwkJaWYgKGVuZ2luZXMtPmltY19mZCkg eworCQkJaWYgKGxpbmVzKysgPCBjb25faCkKKwkJCQlwcmludGYoIiAgICAgIElNQyByZWFkczog ICAlcyAlcy9zXG4iLAorCQkJCSAgICAgICByZWFkcywgZW5naW5lcy0+aW1jX3JlYWRzX3VuaXQp OworCisJCQlpZiAobGluZXMrKyA8IGNvbl9oKQorCQkJCXByaW50ZigiICAgICBJTUMgd3JpdGVz OiAgICVzICVzL3NcbiIsCisJCQkJICAgICAgIHdyaXRlcywgZW5naW5lcy0+aW1jX3dyaXRlc191 bml0KTsKIAotCQlxc29ydCh0b3BfYml0c19zb3J0ZWQsIG51bV9pbnN0ZG9uZV9iaXRzLAotCQkg ICAgICBzaXplb2Yoc3RydWN0IHRvcF9iaXQgKiksIHRvcF9iaXRzX3NvcnQpOwotCi0JCS8qIExp bWl0IHRoZSBudW1iZXIgb2YgbGluZXMgcHJpbnRlZCB0byB0aGUgdGVybWluYWwgaGVpZ2h0IHNv IHRoZQotCQkgKiBtb3N0IGltcG9ydGFudCBpbmZvIChhdCB0aGUgdG9wKSB3aWxsIHN0YXkgb24g c2NyZWVuLiAqLwotCQltYXhfbGluZXMgPSAtMTsKLQkJaWYgKGlvY3RsKDAsIFRJT0NHV0lOU1os ICZ3cykgIT0gLTEpCi0JCQltYXhfbGluZXMgPSB3cy53c19yb3cgLSA2OyAvKiBleGNsdWRlIGhl YWRlciBsaW5lcyAqLwotCQlpZiAobWF4X2xpbmVzID49IG51bV9pbnN0ZG9uZV9iaXRzKQotCQkJ bWF4X2xpbmVzID0gbnVtX2luc3Rkb25lX2JpdHM7Ci0KLQkJdDIgPSBnZXR0aW1lKCk7Ci0JCWVs YXBzZWRfdGltZSArPSAodDIgLSB0MSkgLyAxMDAwMDAwLjA7Ci0KLQkJaWYgKGludGVyYWN0aXZl KSB7Ci0JCQlwcmludGYoIiVzIiwgY2xlYXJfc2NyZWVuKTsKLQkJCXByaW50X2Nsb2NrX2luZm8o cGNpX2Rldik7Ci0KLQkJCXJpbmdfcHJpbnQoJnJlbmRlcl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVy X3NlYyk7Ci0JCQlyaW5nX3ByaW50KCZic2RfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwot CQkJcmluZ19wcmludCgmYnNkNl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3NlYyk7Ci0JCQlyaW5n X3ByaW50KCZibHRfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMpOwotCi0JCQlwcmludGYoIlxu JTMwcyAgJXNcbiIsICJ0YXNrIiwgInBlcmNlbnQgYnVzeSIpOwotCQkJZm9yIChpID0gMDsgaSA8 IG1heF9saW5lczsgaSsrKSB7Ci0JCQkJaWYgKHRvcF9iaXRzX3NvcnRlZFtpXS0+Y291bnQgPiAw KSB7Ci0JCQkJCXBlcmNlbnQgPSAodG9wX2JpdHNfc29ydGVkW2ldLT5jb3VudCAqIDEwMCkgLwot CQkJCQkJbGFzdF9zYW1wbGVzX3Blcl9zZWM7Ci0JCQkJCWxlbiA9IHByaW50ZigiJTMwczogJTNk JSU6ICIsCi0JCQkJCQkJIHRvcF9iaXRzX3NvcnRlZFtpXS0+Yml0LT5uYW1lLAotCQkJCQkJCSBw ZXJjZW50KTsKLQkJCQkJcHJpbnRfcGVyY2VudGFnZV9iYXIgKHBlcmNlbnQsIGxlbik7Ci0JCQkJ fSBlbHNlIHsKLQkJCQkJcHJpbnRmKCIlKnMiLCBQRVJDRU5UQUdFX0JBUl9FTkQsICIiKTsKLQkJ CQl9Ci0KLQkJCQlpZiAoaSA8IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdTKGRldmlkKSkg ewotCQkJCQlwcmludGYoIiUxM3M6ICVsbHUgKCVsbGQvc2VjKSIsCi0JCQkJCQkgICBzdGF0c19y ZWdfbmFtZXNbaV0sCi0JCQkJCQkgICAobG9uZyBsb25nKXN0YXRzW2ldLAotCQkJCQkJICAgKGxv bmcgbG9uZykoc3RhdHNbaV0gLSBsYXN0X3N0YXRzW2ldKSk7Ci0JCQkJCWxhc3Rfc3RhdHNbaV0g PSBzdGF0c1tpXTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIXRvcF9iaXRzX3NvcnRlZFtpXS0+ Y291bnQpCi0JCQkJCQlicmVhazsKLQkJCQl9CisJCQlpZiAoKytsaW5lcyA8IGNvbl9oKQogCQkJ CXByaW50ZigiXG4iKTsKLQkJCX0KIAkJfQotCQlpZiAob3V0cHV0KSB7Ci0JCQkvKiBQcmludCBo ZWFkZXJzIGZvciBjb2x1bW5zIGF0IGZpcnN0IHJ1biAqLwotCQkJaWYgKHByaW50X2hlYWRlcnMp IHsKLQkJCQlmcHJpbnRmKG91dHB1dCwgIiMgdGltZVx0Iik7Ci0JCQkJcmluZ19wcmludF9oZWFk ZXIob3V0cHV0LCAmcmVuZGVyX3JpbmcpOwotCQkJCXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwg JmJzZF9yaW5nKTsKLQkJCQlyaW5nX3ByaW50X2hlYWRlcihvdXRwdXQsICZic2Q2X3JpbmcpOwot CQkJCXJpbmdfcHJpbnRfaGVhZGVyKG91dHB1dCwgJmJsdF9yaW5nKTsKLQkJCQlmb3IgKGkgPSAw OyBpIDwgTUFYX05VTV9UT1BfQklUUzsgaSsrKSB7Ci0JCQkJCWlmIChpIDwgU1RBVFNfQ09VTlQg JiYgSEFTX1NUQVRTX1JFR1MoZGV2aWQpKSB7Ci0JCQkJCQlmcHJpbnRmKG91dHB1dCwgIiUuNnNc dCIsCi0JCQkJCQkJICAgc3RhdHNfcmVnX25hbWVzW2ldCi0JCQkJCQkJICAgKTsKLQkJCQkJfQot CQkJCQlpZiAoIXRvcF9iaXRzW2ldLmNvdW50KQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJ CWZwcmludGYob3V0cHV0LCAiXG4iKTsKLQkJCQlwcmludF9oZWFkZXJzID0gMDsKLQkJCX0KIAot CQkJLyogUHJpbnQgc3RhdGlzdGljcyAqLwotCQkJZnByaW50ZihvdXRwdXQsICIlLjJmXHQiLCBl bGFwc2VkX3RpbWUpOwotCQkJcmluZ19sb2coJnJlbmRlcl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVy X3NlYywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZic2RfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9z ZWMsIG91dHB1dCk7Ci0JCQlyaW5nX2xvZygmYnNkNl9yaW5nLCBsYXN0X3NhbXBsZXNfcGVyX3Nl Yywgb3V0cHV0KTsKLQkJCXJpbmdfbG9nKCZibHRfcmluZywgbGFzdF9zYW1wbGVzX3Blcl9zZWMs IG91dHB1dCk7Ci0KLQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX1RPUF9CSVRTOyBpKyspIHsK LQkJCQlpZiAoaSA8IFNUQVRTX0NPVU5UICYmIEhBU19TVEFUU19SRUdTKGRldmlkKSkgewotCQkJ CQlmcHJpbnRmKG91dHB1dCwgIiUiUFJJdTY0Ilx0IiwKLQkJCQkJCSAgIHN0YXRzW2ldIC0gbGFz dF9zdGF0c1tpXSk7Ci0JCQkJCWxhc3Rfc3RhdHNbaV0gPSBzdGF0c1tpXTsKLQkJCQl9Ci0JCQkJ CWlmICghdG9wX2JpdHNbaV0uY291bnQpCi0JCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZwcmlu dGYob3V0cHV0LCAiXG4iKTsKLQkJCWZmbHVzaChvdXRwdXQpOwotCQl9CisJCWZvciAoaSA9IDA7 IGkgPCBlbmdpbmVzLT5udW1fZW5naW5lczsgaSsrKSB7CisJCQlzdHJ1Y3QgZW5naW5lICplbmdp bmUgPSBlbmdpbmVfcHRyKGVuZ2luZXMsIGkpOwogCi0JCWZvciAoaSA9IDA7IGkgPCBudW1faW5z dGRvbmVfYml0czsgaSsrKSB7Ci0JCQl0b3BfYml0c19zb3J0ZWRbaV0tPmNvdW50ID0gMDsKKwkJ CWlmIChlbmdpbmUtPm51bV9jb3VudGVycyAmJiBsaW5lcyA8IGNvbl9oKSB7CisJCQkJY29uc3Qg Y2hhciAqYSA9ICIgICAgICAgICAgRU5HSU5FICAgICAgQlVTWSAiOworCQkJCWNvbnN0IGNoYXIg KmIgPSAiIE1JX1NFTUEgTUlfV0FJVCI7CiAKLQkJCWlmIChpIDwgU1RBVFNfQ09VTlQpCi0JCQkJ bGFzdF9zdGF0c1tpXSA9IHN0YXRzW2ldOworCQkJCXByaW50ZigiXDAzM1s3bSVzJSpzJXNcMDMz WzBtXG4iLAorCQkJCSAgICAgICBhLAorCQkJCSAgICAgICAoaW50KShjb25fdyAtIDEgLSBzdHJs ZW4oYSkgLSBzdHJsZW4oYikpLAorCQkJCSAgICAgICAiICIsIGIpOworCQkJCWxpbmVzKys7CisJ CQkJYnJlYWs7CisJCQl9CiAJCX0KIAotCQkvKiBDaGVjayBpZiBjaGlsZCBoYXMgZ29uZSAqLwot CQlpZiAoY2hpbGRfcGlkID4gMCkgewotCQkJaW50IHJlczsKLQkJCWlmICgocmVzID0gd2FpdHBp ZChjaGlsZF9waWQsICZjaGlsZF9zdGF0LCBXTk9IQU5HKSkgPT0gLTEpIHsKLQkJCQlwZXJyb3Io IndhaXRwaWQiKTsKLQkJCQlleGl0KDEpOwotCQkJfQotCQkJaWYgKHJlcyA9PSAwKQorCQlmb3Ig KGkgPSAwOyBpIDwgZW5naW5lcy0+bnVtX2VuZ2luZXMgJiYgbGluZXMgPCBjb25faDsgaSsrKSB7 CisJCQlzdHJ1Y3QgZW5naW5lICplbmdpbmUgPSBlbmdpbmVfcHRyKGVuZ2luZXMsIGkpOworCQkJ dW5zaWduZWQgaW50IG1heF93ID0gY29uX3cgLSAxOworCQkJdW5zaWduZWQgaW50IGxlbjsKKwkJ CWNoYXIgc2VtYVtCVUZTWl07CisJCQljaGFyIHdhaXRbQlVGU1pdOworCQkJY2hhciBidXN5W0JV RlNaXTsKKwkJCWNoYXIgYnVmWzEyOF07CisJCQlkb3VibGUgdmFsOworCisJCQlpZiAoIWVuZ2lu ZS0+bnVtX2NvdW50ZXJzKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKFdJRkVYSVRFRChjaGlsZF9z dGF0KSkKLQkJCQlicmVhazsKKworCQkJcG11X2NhbGMoJmVuZ2luZS0+c2VtYSwgc2VtYSwgQlVG U1osIDMsIDAsIDFlOSwgdCwgMTAwKTsKKwkJCXBtdV9jYWxjKCZlbmdpbmUtPndhaXQsIHdhaXQs IEJVRlNaLCAzLCAwLCAxZTksIHQsIDEwMCk7CisJCQlsZW4gPSBzbnByaW50ZihidWYsIHNpemVv ZihidWYpLCAiICAgICVzJSUgICAgJXMlJSIsCisJCQkJICAgICAgIHNlbWEsIHdhaXQpOworCisJ CQlwbXVfY2FsYygmZW5naW5lLT5idXN5LCBidXN5LCBCVUZTWiwgNiwgMiwgMWU5LCB0LAorCQkJ CSAxMDApOworCQkJbGVuICs9IHByaW50ZigiJTE2cyAlcyUlICIsIGVuZ2luZS0+ZGlzcGxheV9u YW1lLCBidXN5KTsKKworCQkJdmFsID0gX19wbXVfY2FsYygmZW5naW5lLT5idXN5LnZhbCwgMWU5 LCB0LCAxMDApOworCQkJcHJpbnRfcGVyY2VudGFnZV9iYXIodmFsLCBtYXhfdyAtIGxlbik7CisK KwkJCXByaW50ZigiJXNcbiIsIGJ1Zik7CisKKwkJCWxpbmVzKys7CiAJCX0KLQl9CiAKLQlmY2xv c2Uob3V0cHV0KTsKKwkJaWYgKGxpbmVzKysgPCBjb25faCkKKwkJCXByaW50ZigiXG4iKTsKKwor CQl1c2xlZXAocGVyaW9kX3VzKTsKKwl9CiAKLQlpbnRlbF9yZWdpc3Rlcl9hY2Nlc3NfZmluaSgp OwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVzb24uYnVpbGQgYi90b29scy9t ZXNvbi5idWlsZAppbmRleCBiZDJkMzEzZDUxNTYuLmE5MThlZWIwYmVmMSAxMDA2NDQKLS0tIGEv dG9vbHMvbWVzb24uYnVpbGQKKysrIGIvdG9vbHMvbWVzb24uYnVpbGQKQEAgLTIzLDcgKzIzLDYg QEAgdG9vbHNfcHJvZ3MgPSBbCiAJJ2ludGVsX2dwdV9mcmVxdWVuY3knLAogCSdpbnRlbF9maXJt d2FyZV9kZWNvZGUnLAogCSdpbnRlbF9ncHVfdGltZScsCi0JJ2ludGVsX2dwdV90b3AnLAogCSdp bnRlbF9ndHQnLAogCSdpbnRlbF9ndWNfbG9nZ2VyJywKIAknaW50ZWxfaW5mb2ZyYW1lcycsCkBA IC0xMTcsNiArMTE2LDExIEBAIHNoYXJlZF9saWJyYXJ5KCdpbnRlbF9hdWJkdW1wJywgJ2F1YmR1 bXAuYycsCiAJICAgICAgIG5hbWVfcHJlZml4IDogJycsCiAJICAgICAgIGluc3RhbGwgOiB0cnVl KQogCitleGVjdXRhYmxlKCdpbnRlbF9ncHVfdG9wJywgJ2ludGVsX2dwdV90b3AuYycsCisJICAg aW5zdGFsbCA6IHRydWUsCisJICAgaW5zdGFsbF9ycGF0aCA6IHJwYXRoZGlyLAorCSAgIGRlcGVu ZGVuY2llcyA6IHRvb2xfZGVwcyArIFsgbGliX2lndF9wZXJmIF0pCisKIGNvbmZfZGF0YSA9IGNv bmZpZ3VyYXRpb25fZGF0YSgpCiBjb25mX2RhdGEuc2V0KCdwcmVmaXgnLCBwcmVmaXgpCiBjb25m X2RhdGEuc2V0KCdleGVjX3ByZWZpeCcsICcke3ByZWZpeH0nKQotLSAKMi4xNC4xCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwppZ3QtZGV2IG1haWxpbmcg bGlzdAppZ3QtZGV2QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lndC1kZXYK