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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 87BA3C04A6A for ; Sun, 9 Jul 2023 15:43:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=rr4+dhYxkL04wzzGfmrTsA1a/E4hfkNJCQlIKPyJ8iI=; b=QUxO1p25qrx/o0 GxzNpfRHtg0ofwnLuzzyF5PH9zDuCCTV3kIXaISmb4wa3kyoHPULd0frgoLF5LyW0J8YXWdlfKHV4 0wRNKDJrVEHz6Px95jIXzWBz/HhRzVdORyPVUCkqXQTX9N7GJkTXUGkEFHMP0HanCvw/WYvtgt+de 3qCmPD8vgF0NkA4CZPVtdJDFwhxJNHMKqV//tseyAX6MON0N+38PFCetqrUyKDf+t8407ibeZfVi9 VzgQUXDVYDHgUBP1N+Gq55xcfRoQJGEPdS8+hAhtYkklrEVVx8ITtYUVx95spYLUT7az5i4focumV 0rvB60XkanaO+oCAuQsg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qIWYw-009MQO-0u; Sun, 09 Jul 2023 15:43:02 +0000 Received: from gloria.sntech.de ([185.11.138.130]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qIWYo-009MOh-2Z for linux-riscv@lists.infradead.org; Sun, 09 Jul 2023 15:43:01 +0000 Received: from i53875a50.versanet.de ([83.135.90.80] helo=phil.fritz.box) by gloria.sntech.de with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qIWYh-0002yG-MP; Sun, 09 Jul 2023 17:42:47 +0200 From: Heiko Stuebner To: palmer@dabbelt.com, paul.walmsley@sifive.com Cc: aou@eecs.berkeley.edu, heiko@sntech.de, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org, christoph.muellner@vrull.eu, ebiggers@kernel.org, Heiko Stuebner Subject: [PATCH v6 3/3] RISC-V: crypto: add accelerated GCM GHASH implementation Date: Sun, 9 Jul 2023 17:42:43 +0200 Message-Id: <20230709154243.1582671-4-heiko@sntech.de> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230709154243.1582671-1-heiko@sntech.de> References: <20230709154243.1582671-1-heiko@sntech.de> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230709_084255_429105_7ACF70AB X-CRM114-Status: GOOD ( 33.31 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org RnJvbTogSGVpa28gU3R1ZWJuZXIgPGhlaWtvLnN0dWVibmVyQHZydWxsLmV1PgoKV2l0aCBkaWZm ZXJlbnQgc2V0cyBvZiBhdmFpbGFibGUgZXh0ZW5zaW9ucyBhIG51bWJlciBvZiBkaWZmZXJlbnQK aW1wbGVtZW50YXRpb24gdmFyaWFudHMgYXJlIHBvc3NpYmxlLiBRdWl0ZSBhIG51bWJlciBvZiB0 aGVtIGFyZSBhbHJlYWR5CmltcGxlbWVudGVkIGluIG9wZW5TU0wgb3IgYXJlIGluIHRoZSBwcm9j ZXNzIG9mIGJlaW5nIGltcGxlbWVudGVkLCBzbyBwaWNrCnRoZSByZWxldmFudCBvcGVuU1NMIGNv ZGVuIGFuZCBhZGQgc3VpdGFibGUgZ2x1ZSBjb2RlIHNpbWlsYXIgdG8gYXJtNjQgYW5kCnBvd2Vy cGMgdG8gdXNlIGl0IGZvciBrZXJuZWwtc3BlY2lmaWMgY3J5cHRvZ3JhcGh5LgoKVGhlIHByaW9y aXRpemF0aW9uIG9mIHRoZSBhbGdvcml0aG1zIGZvbGxvd3MgdGhlIGlmZGVmIGNoYWluIGZvciB0 aGUKYXNzZW1ibHkgY2FsbGJhY2tzIGRvbmUgaW4gb3BlbnNzbCBidXQgaGVyZSBhbGdvcml0aG1z IHdpbGwgZ2V0IHJlZ2lzdGVyZWQKc2VwYXJhdGVseSBzbyB0aGF0IGFsbCBvZiB0aGVtIGNhbiBi ZSBwYXJ0IG9mIHRoZSBjcnlwdG8gc2VsZnRlc3RzLgoKVGhlIGNyeXB0byBzdWJzeXN0ZW0gd2ls bCBzZWxlY3QgdGhlIG1vc3QgcGVyZm9ybWFudCBvZiBhbGwgcmVnaXN0ZXJlZAphbGdvcml0aG1z IG9uIHRoZSBydW5uaW5nIHN5c3RlbSBidXQgd2lsbCBzZWxmdGVzdCBhbGwgcmVnaXN0ZXJlZCBv bmVzLgoKSW4gYSBmaXJzdCBzdGVwIHRoaXMgYWRkcyBzY2FsYXIgdmFyaWFudHMgdXNpbmcgdGhl IFpiYywgWmJiIGFuZApwb3NzaWJsZSBaYmtiIChiaXRtYW5pcCBjcnlwdG8gZXh0ZW5zaW9uKSBh bmQgdGhlIHBlcmwgaW1wbGVtZW50YXRpb24Kc3RlbXMgZnJvbSBvcGVuU1NMIHB1bGwgcmVxdWVz dCBvbgogICAgaHR0cHM6Ly9naXRodWIuY29tL29wZW5zc2wvb3BlbnNzbC9wdWxsLzIwMDc4CgpD by1kZXZlbG9wZWQtYnk6IENocmlzdG9waCBNw7xsbG5lciA8Y2hyaXN0b3BoLm11ZWxsbmVyQHZy dWxsLmV1PgpTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggTcO8bGxuZXIgPGNocmlzdG9waC5tdWVs bG5lckB2cnVsbC5ldT4KU2lnbmVkLW9mZi1ieTogSGVpa28gU3R1ZWJuZXIgPGhlaWtvLnN0dWVi bmVyQHZydWxsLmV1PgotLS0KIGFyY2gvcmlzY3YvY3J5cHRvL0tjb25maWcgICAgICAgICAgICAg IHwgIDEzICsKIGFyY2gvcmlzY3YvY3J5cHRvL01ha2VmaWxlICAgICAgICAgICAgIHwgIDE0ICsK IGFyY2gvcmlzY3YvY3J5cHRvL2doYXNoLXJpc2N2NjQtZ2x1ZS5jIHwgMjkxICsrKysrKysrKysr KysrKysrCiBhcmNoL3Jpc2N2L2NyeXB0by9naGFzaC1yaXNjdjY0LXpiYy5wbCB8IDQzMCArKysr KysrKysrKysrKysrKysrKysrKysrCiBhcmNoL3Jpc2N2L2NyeXB0by9yaXNjdi5wbSAgICAgICAg ICAgICB8IDI2MSArKysrKysrKysrKysrKysKIDUgZmlsZXMgY2hhbmdlZCwgMTAwOSBpbnNlcnRp b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9jcnlwdG8vZ2hhc2gtcmlzY3Y2 NC1nbHVlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2L2NyeXB0by9naGFzaC1yaXNj djY0LXpiYy5wbAogY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvcmlzY3YvY3J5cHRvL3Jpc2N2LnBt CgpkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9jcnlwdG8vS2NvbmZpZyBiL2FyY2gvcmlzY3YvY3J5 cHRvL0tjb25maWcKaW5kZXggMTBkNjBlZGMwMTEwLi5jZDIyMzc5MjNlNjggMTAwNjQ0Ci0tLSBh L2FyY2gvcmlzY3YvY3J5cHRvL0tjb25maWcKKysrIGIvYXJjaC9yaXNjdi9jcnlwdG8vS2NvbmZp ZwpAQCAtMiw0ICsyLDE3IEBACiAKIG1lbnUgIkFjY2VsZXJhdGVkIENyeXB0b2dyYXBoaWMgQWxn b3JpdGhtcyBmb3IgQ1BVIChyaXNjdikiCiAKK2NvbmZpZyBDUllQVE9fR0hBU0hfUklTQ1Y2NAor CXRyaXN0YXRlICJIYXNoIGZ1bmN0aW9uczogR0hBU0giCisJZGVwZW5kcyBvbiA2NEJJVCAmJiBS SVNDVl9JU0FfWkJDCisJc2VsZWN0IENSWVBUT19IQVNICisJc2VsZWN0IENSWVBUT19MSUJfR0Yx MjhNVUwKKwloZWxwCisJICBHQ00gR0hBU0ggZnVuY3Rpb24gKE5JU1QgU1A4MDAtMzhEKQorCisJ ICBBcmNoaXRlY3R1cmU6IHJpc2N2NjQgdXNpbmcgb25lIG9mOgorCSAgLSBaYmMgZXh0ZW5zaW9u CisJICAtIFpiYyArIFpiYiBleHRlbnNpb25zCisJICAtIFpiYyArIFpia2IgZXh0ZW5zaW9ucwor CiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmlsZSBiL2FyY2gv cmlzY3YvY3J5cHRvL01ha2VmaWxlCmluZGV4IGIzYjYzMzJjOWY2ZC4uMGExNTg5MTllOWRhIDEw MDY0NAotLS0gYS9hcmNoL3Jpc2N2L2NyeXB0by9NYWtlZmlsZQorKysgYi9hcmNoL3Jpc2N2L2Ny eXB0by9NYWtlZmlsZQpAQCAtMiwzICsyLDE3IEBACiAjCiAjIGxpbnV4L2FyY2gvcmlzY3YvY3J5 cHRvL01ha2VmaWxlCiAjCisKK29iai0kKENPTkZJR19DUllQVE9fR0hBU0hfUklTQ1Y2NCkgKz0g Z2hhc2gtcmlzY3Y2NC5vCitnaGFzaC1yaXNjdjY0LXkgOj0gZ2hhc2gtcmlzY3Y2NC1nbHVlLm8K K2lmZGVmIENPTkZJR19SSVNDVl9JU0FfWkJDCitnaGFzaC1yaXNjdjY0LXkgKz0gZ2hhc2gtcmlz Y3Y2NC16YmMubworZW5kaWYKKworcXVpZXRfY21kX3Blcmxhc20gPSBQRVJMQVNNICRACisgICAg ICBjbWRfcGVybGFzbSA9ICQoUEVSTCkgJCg8KSB2b2lkICQoQCkKKworJChvYmopL2doYXNoLXJp c2N2NjQtemJjLlM6ICQoc3JjKS9naGFzaC1yaXNjdjY0LXpiYy5wbAorCSQoY2FsbCBjbWQscGVy bGFzbSkKKworY2xlYW4tZmlsZXMgKz0gZ2hhc2gtcmlzY3Y2NC16YmMuUwpkaWZmIC0tZ2l0IGEv YXJjaC9yaXNjdi9jcnlwdG8vZ2hhc2gtcmlzY3Y2NC1nbHVlLmMgYi9hcmNoL3Jpc2N2L2NyeXB0 by9naGFzaC1yaXNjdjY0LWdsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMDAuLjY5NWJlZDZjNTRjYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcmlzY3YvY3J5cHRv L2doYXNoLXJpc2N2NjQtZ2x1ZS5jCkBAIC0wLDAgKzEsMjkxIEBACisvLyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIFJJU0MtViBvcHRpbWl6ZWQgR0hBU0ggcm91dGlu ZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjMgVlJVTEwgR21iSAorICogQXV0aG9yOiBIZWlr byBTdHVlYm5lciA8aGVpa28uc3R1ZWJuZXJAdnJ1bGwuZXU+CisgKi8KKworI2luY2x1ZGUgPGxp bnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5 cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3NpbWQuaD4K KyNpbmNsdWRlIDxjcnlwdG8vZ2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFz aC5oPgorI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9zaW1kLmg+CisKK3N0cnVjdCByaXNjdjY0 X2doYXNoX2N0eCB7CisJdm9pZCAoKmdoYXNoX2Z1bmMpKHU2NCBYaVsyXSwgY29uc3QgdTEyOCBI dGFibGVbMTZdLAorCQkJICAgY29uc3QgdTggKmlucCwgc2l6ZV90IGxlbik7CisKKwkvKiBrZXkg dXNlZCBieSB2ZWN0b3IgYXNtICovCisJdTEyOCBodGFibGVbMTZdOworfTsKKworc3RydWN0IHJp c2N2NjRfZ2hhc2hfZGVzY19jdHggeworCXU2NCBzaGFzaFsyXTsKKwl1OCBidWZmZXJbR0hBU0hf RElHRVNUX1NJWkVdOworCWludCBieXRlczsKK307CisKK3N0YXRpYyBpbnQgcmlzY3Y2NF9naGFz aF9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQoreworCXN0cnVjdCByaXNjdjY0X2doYXNo X2Rlc2NfY3R4ICpkY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwlkY3R4LT5ieXRlcyA9 IDA7CisJbWVtc2V0KGRjdHgtPnNoYXNoLCAwLCBHSEFTSF9ESUdFU1RfU0laRSk7CisJcmV0dXJu IDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUklTQ1ZfSVNBX1pCQworCit2b2lkIGdjbV9pbml0X3J2 NjRpX3piYyh1MTI4IEh0YWJsZVsxNl0sIGNvbnN0IHU2NCBYaVsyXSk7Cit2b2lkIGdjbV9pbml0 X3J2NjRpX3piY19femJiKHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdTY0IFhpWzJdKTsKK3ZvaWQg Z2NtX2luaXRfcnY2NGlfemJjX196YmtiKHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdTY0IFhpWzJd KTsKKworLyogWmJjIChvcHRpb25hbCB3aXRoIHpia2IgaW1wcm92ZW1lbnRzKSAqLwordm9pZCBn Y21fZ2hhc2hfcnY2NGlfemJjKHU2NCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLAorCQkJ IGNvbnN0IHU4ICppbnAsIHNpemVfdCBsZW4pOwordm9pZCBnY21fZ2hhc2hfcnY2NGlfemJjX196 YmtiKHU2NCBYaVsyXSwgY29uc3QgdTEyOCBIdGFibGVbMTZdLAorCQkJICAgICAgIGNvbnN0IHU4 ICppbnAsIHNpemVfdCBsZW4pOworCisKK3N0YXRpYyBpbnQgcmlzY3Y2NF96YmNfZ2hhc2hfc2V0 a2V5X3piYyhzdHJ1Y3QgY3J5cHRvX3NoYXNoICp0Zm0sCisJCQkJCSAgIGNvbnN0IHU4ICprZXks CisJCQkJCSAgIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJc3RydWN0IHJpc2N2NjRfZ2hhc2hf Y3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fc2hhc2hfdGZtKHRmbSkpOworCWNvbnN0 IHU2NCBrWzJdID0geyBjcHVfdG9fYmU2NCgoKGNvbnN0IHU2NCAqKWtleSlbMF0pLAorCQkJICAg Y3B1X3RvX2JlNjQoKChjb25zdCB1NjQgKilrZXkpWzFdKSB9OworCisJaWYgKGtleWxlbiAhPSBH SEFTSF9CTE9DS19TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWdjbV9pbml0X3J2NjRpX3pi YyhjdHgtPmh0YWJsZSwgayk7CisKKwljdHgtPmdoYXNoX2Z1bmMgPSBnY21fZ2hhc2hfcnY2NGlf emJjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmlzY3Y2NF96YmNfZ2hhc2hfc2V0 a2V5X3piY19femJiKHN0cnVjdCBjcnlwdG9fc2hhc2ggKnRmbSwKKwkJCQkJICAgY29uc3QgdTgg KmtleSwKKwkJCQkJICAgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlzdHJ1Y3QgcmlzY3Y2NF9n aGFzaF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19zaGFzaF90Zm0odGZtKSk7CisJ Y29uc3QgdTY0IGtbMl0gPSB7IGNwdV90b19iZTY0KCgoY29uc3QgdTY0ICopa2V5KVswXSksCisJ CQkgICBjcHVfdG9fYmU2NCgoKGNvbnN0IHU2NCAqKWtleSlbMV0pIH07CisKKwlpZiAoa2V5bGVu ICE9IEdIQVNIX0JMT0NLX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJZ2NtX2luaXRfcnY2 NGlfemJjX196YmIoY3R4LT5odGFibGUsIGspOworCisJY3R4LT5naGFzaF9mdW5jID0gZ2NtX2do YXNoX3J2NjRpX3piYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJpc2N2NjRfemJj X2doYXNoX3NldGtleV96YmNfX3pia2Ioc3RydWN0IGNyeXB0b19zaGFzaCAqdGZtLAorCQkJCQkg ICBjb25zdCB1OCAqa2V5LAorCQkJCQkgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVj dCByaXNjdjY0X2doYXNoX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX3NoYXNoX3Rm bSh0Zm0pKTsKKwljb25zdCB1NjQga1syXSA9IHsgY3B1X3RvX2JlNjQoKChjb25zdCB1NjQgKilr ZXkpWzBdKSwKKwkJCSAgIGNwdV90b19iZTY0KCgoY29uc3QgdTY0ICopa2V5KVsxXSkgfTsKKwor CWlmIChrZXlsZW4gIT0gR0hBU0hfQkxPQ0tfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwln Y21faW5pdF9ydjY0aV96YmNfX3pia2IoY3R4LT5odGFibGUsIGspOworCisJY3R4LT5naGFzaF9m dW5jID0gZ2NtX2doYXNoX3J2NjRpX3piY19femJrYjsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IHJpc2N2NjRfemJjX2doYXNoX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywK KwkJCSAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzcmNsZW4pCit7CisJdW5zaWduZWQg aW50IGxlbjsKKwlzdHJ1Y3QgcmlzY3Y2NF9naGFzaF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4 KGNyeXB0b19zaGFzaF90Zm0oZGVzYy0+dGZtKSk7CisJc3RydWN0IHJpc2N2NjRfZ2hhc2hfZGVz Y19jdHggKmRjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCWlmIChkY3R4LT5ieXRlcykg eworCQlpZiAoZGN0eC0+Ynl0ZXMgKyBzcmNsZW4gPCBHSEFTSF9ESUdFU1RfU0laRSkgeworCQkJ bWVtY3B5KGRjdHgtPmJ1ZmZlciArIGRjdHgtPmJ5dGVzLCBzcmMsCisJCQkJc3JjbGVuKTsKKwkJ CWRjdHgtPmJ5dGVzICs9IHNyY2xlbjsKKwkJCXJldHVybiAwOworCQl9CisJCW1lbWNweShkY3R4 LT5idWZmZXIgKyBkY3R4LT5ieXRlcywgc3JjLAorCQkJR0hBU0hfRElHRVNUX1NJWkUgLSBkY3R4 LT5ieXRlcyk7CisKKwkJY3R4LT5naGFzaF9mdW5jKGRjdHgtPnNoYXNoLCBjdHgtPmh0YWJsZSwK KwkJCQlkY3R4LT5idWZmZXIsIEdIQVNIX0RJR0VTVF9TSVpFKTsKKworCQlzcmMgKz0gR0hBU0hf RElHRVNUX1NJWkUgLSBkY3R4LT5ieXRlczsKKwkJc3JjbGVuIC09IEdIQVNIX0RJR0VTVF9TSVpF IC0gZGN0eC0+Ynl0ZXM7CisJCWRjdHgtPmJ5dGVzID0gMDsKKwl9CisJbGVuID0gc3JjbGVuICYg fihHSEFTSF9ESUdFU1RfU0laRSAtIDEpOworCisJaWYgKGxlbikgeworCQljdHgtPmdoYXNoX2Z1 bmMoZGN0eC0+c2hhc2gsIGN0eC0+aHRhYmxlLAorCQkJCXNyYywgbGVuKTsKKwkJc3JjICs9IGxl bjsKKwkJc3JjbGVuIC09IGxlbjsKKwl9CisKKwlpZiAoc3JjbGVuKSB7CisJCW1lbWNweShkY3R4 LT5idWZmZXIsIHNyYywgc3JjbGVuKTsKKwkJZGN0eC0+Ynl0ZXMgPSBzcmNsZW47CisJfQorCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IHJpc2N2NjRfemJjX2doYXNoX2ZpbmFsKHN0cnVjdCBz aGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQoreworCWludCBpOworCXN0cnVjdCByaXNjdjY0X2do YXNoX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX3NoYXNoX3RmbShkZXNjLT50Zm0p KTsKKwlzdHJ1Y3QgcmlzY3Y2NF9naGFzaF9kZXNjX2N0eCAqZGN0eCA9IHNoYXNoX2Rlc2NfY3R4 KGRlc2MpOworCisJaWYgKGRjdHgtPmJ5dGVzKSB7CisJCWZvciAoaSA9IGRjdHgtPmJ5dGVzOyBp IDwgR0hBU0hfRElHRVNUX1NJWkU7IGkrKykKKwkJCWRjdHgtPmJ1ZmZlcltpXSA9IDA7CisJCWN0 eC0+Z2hhc2hfZnVuYyhkY3R4LT5zaGFzaCwgY3R4LT5odGFibGUsCisJCQkJZGN0eC0+YnVmZmVy LCBHSEFTSF9ESUdFU1RfU0laRSk7CisJCWRjdHgtPmJ5dGVzID0gMDsKKwl9CisJbWVtY3B5KG91 dCwgZGN0eC0+c2hhc2gsIEdIQVNIX0RJR0VTVF9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKworc3Ry dWN0IHNoYXNoX2FsZyByaXNjdjY0X3piY19naGFzaF9hbGcgPSB7CisJLmRpZ2VzdHNpemUgPSBH SEFTSF9ESUdFU1RfU0laRSwKKwkuaW5pdCA9IHJpc2N2NjRfZ2hhc2hfaW5pdCwKKwkudXBkYXRl ID0gcmlzY3Y2NF96YmNfZ2hhc2hfdXBkYXRlLAorCS5maW5hbCA9IHJpc2N2NjRfemJjX2doYXNo X2ZpbmFsLAorCS5zZXRrZXkgPSByaXNjdjY0X3piY19naGFzaF9zZXRrZXlfemJjLAorCS5kZXNj c2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmlzY3Y2NF9naGFzaF9kZXNjX2N0eCkKKwkJICAgICsgc2l6 ZW9mKHN0cnVjdCBnaGFzaF9kZXNjX2N0eCksCisJLmJhc2UgPSB7CisJCSAuY3JhX25hbWUgPSAi Z2hhc2giLAorCQkgLmNyYV9kcml2ZXJfbmFtZSA9ICJyaXNjdjY0X3piY19naGFzaCIsCisJCSAu Y3JhX3ByaW9yaXR5ID0gMjUwLAorCQkgLmNyYV9ibG9ja3NpemUgPSBHSEFTSF9CTE9DS19TSVpF LAorCQkgLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCByaXNjdjY0X2doYXNoX2N0eCksCisJ CSAuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdHJ1Y3Qgc2hhc2hfYWxn IHJpc2N2NjRfemJjX3piYl9naGFzaF9hbGcgPSB7CisJLmRpZ2VzdHNpemUgPSBHSEFTSF9ESUdF U1RfU0laRSwKKwkuaW5pdCA9IHJpc2N2NjRfZ2hhc2hfaW5pdCwKKwkudXBkYXRlID0gcmlzY3Y2 NF96YmNfZ2hhc2hfdXBkYXRlLAorCS5maW5hbCA9IHJpc2N2NjRfemJjX2doYXNoX2ZpbmFsLAor CS5zZXRrZXkgPSByaXNjdjY0X3piY19naGFzaF9zZXRrZXlfemJjX196YmIsCisJLmRlc2NzaXpl ID0gc2l6ZW9mKHN0cnVjdCByaXNjdjY0X2doYXNoX2Rlc2NfY3R4KQorCQkgICAgKyBzaXplb2Yo c3RydWN0IGdoYXNoX2Rlc2NfY3R4KSwKKwkuYmFzZSA9IHsKKwkJIC5jcmFfbmFtZSA9ICJnaGFz aCIsCisJCSAuY3JhX2RyaXZlcl9uYW1lID0gInJpc2N2NjRfemJjX3piYl9naGFzaCIsCisJCSAu Y3JhX3ByaW9yaXR5ID0gMjUxLAorCQkgLmNyYV9ibG9ja3NpemUgPSBHSEFTSF9CTE9DS19TSVpF LAorCQkgLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCByaXNjdjY0X2doYXNoX2N0eCksCisJ CSAuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdHJ1Y3Qgc2hhc2hfYWxn IHJpc2N2NjRfemJjX3pia2JfZ2hhc2hfYWxnID0geworCS5kaWdlc3RzaXplID0gR0hBU0hfRElH RVNUX1NJWkUsCisJLmluaXQgPSByaXNjdjY0X2doYXNoX2luaXQsCisJLnVwZGF0ZSA9IHJpc2N2 NjRfemJjX2doYXNoX3VwZGF0ZSwKKwkuZmluYWwgPSByaXNjdjY0X3piY19naGFzaF9maW5hbCwK Kwkuc2V0a2V5ID0gcmlzY3Y2NF96YmNfZ2hhc2hfc2V0a2V5X3piY19femJrYiwKKwkuZGVzY3Np emUgPSBzaXplb2Yoc3RydWN0IHJpc2N2NjRfZ2hhc2hfZGVzY19jdHgpCisJCSAgICArIHNpemVv ZihzdHJ1Y3QgZ2hhc2hfZGVzY19jdHgpLAorCS5iYXNlID0geworCQkgLmNyYV9uYW1lID0gImdo YXNoIiwKKwkJIC5jcmFfZHJpdmVyX25hbWUgPSAicmlzY3Y2NF96YmNfemJrYl9naGFzaCIsCisJ CSAuY3JhX3ByaW9yaXR5ID0gMjUyLAorCQkgLmNyYV9ibG9ja3NpemUgPSBHSEFTSF9CTE9DS19T SVpFLAorCQkgLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCByaXNjdjY0X2doYXNoX2N0eCks CisJCSAuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCisjZW5kaWYgLyogQ09O RklHX1JJU0NWX0lTQV9aQkMgKi8KKworI2RlZmluZSBSSVNDVjY0X0RFRklORURfR0hBU0hFUwkJ MworCitzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyAqcmlzY3Y2NF9naGFzaGVzW1JJU0NWNjRfREVG SU5FRF9HSEFTSEVTXTsKK3N0YXRpYyBpbnQgbnVtX3Jpc2N2NjRfZ2hhc2hlczsKKworc3RhdGlj IGludCBfX2luaXQgcmlzY3Y2NF9naGFzaF9yZWdpc3RlcihzdHJ1Y3Qgc2hhc2hfYWxnICpnaGFz aCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKGdoYXNoKTsK KwlpZiAocmV0IDwgMCkgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSBudW1fcmlzY3Y2NF9naGFz aGVzIC0gMTsgaSA+PSAwIDsgaS0tKQorCQkJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2gocmlzY3Y2 NF9naGFzaGVzW2ldKTsKKworCQludW1fcmlzY3Y2NF9naGFzaGVzID0gMDsKKworCQlyZXR1cm4g cmV0OworCX0KKworCXByX2RlYnVnKCJSZWdpc3RlcmVkIFJJU0MtViBnaGFzaCAlc1xuIiwgZ2hh c2gtPmJhc2UuY3JhX2RyaXZlcl9uYW1lKTsKKwlyaXNjdjY0X2doYXNoZXNbbnVtX3Jpc2N2NjRf Z2hhc2hlc10gPSBnaGFzaDsKKwludW1fcmlzY3Y2NF9naGFzaGVzKys7CisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbnQgX19pbml0IHJpc2N2NjRfZ2hhc2hfbW9kX2luaXQodm9pZCkKK3sKKwlp bnQgcmV0ID0gMDsKKworI2lmZGVmIENPTkZJR19SSVNDVl9JU0FfWkJDCisJaWYgKHJpc2N2X2lz YV9leHRlbnNpb25fYXZhaWxhYmxlKE5VTEwsIFpCQykpIHsKKwkJcmV0ID0gcmlzY3Y2NF9naGFz aF9yZWdpc3RlcigmcmlzY3Y2NF96YmNfZ2hhc2hfYWxnKTsKKwkJaWYgKHJldCA8IDApCisJCQly ZXR1cm4gcmV0OworCisJCWlmIChyaXNjdl9pc2FfZXh0ZW5zaW9uX2F2YWlsYWJsZShOVUxMLCBa QkIpKSB7CisJCQlyZXQgPSByaXNjdjY0X2doYXNoX3JlZ2lzdGVyKCZyaXNjdjY0X3piY196YmJf Z2hhc2hfYWxnKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKworCQlp ZiAocmlzY3ZfaXNhX2V4dGVuc2lvbl9hdmFpbGFibGUoTlVMTCwgWkJLQikpIHsKKwkJCXJldCA9 IHJpc2N2NjRfZ2hhc2hfcmVnaXN0ZXIoJnJpc2N2NjRfemJjX3pia2JfZ2hhc2hfYWxnKTsKKwkJ CWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisjZW5kaWYKKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmlzY3Y2NF9naGFzaF9tb2RfZmluaSh2b2lk KQoreworCWludCBpOworCisJZm9yIChpID0gbnVtX3Jpc2N2NjRfZ2hhc2hlcyAtIDE7IGkgPj0g MCA7IGktLSkKKwkJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2gocmlzY3Y2NF9naGFzaGVzW2ldKTsK KworCW51bV9yaXNjdjY0X2doYXNoZXMgPSAwOworfQorCittb2R1bGVfaW5pdChyaXNjdjY0X2do YXNoX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHJpc2N2NjRfZ2hhc2hfbW9kX2ZpbmkpOworCitN T0RVTEVfREVTQ1JJUFRJT04oIkdTTSBHSEFTSCAoYWNjZWxlcmF0ZWQpIik7CitNT0RVTEVfQVVU SE9SKCJIZWlrbyBTdHVlYm5lciA8aGVpa28uc3R1ZWJuZXJAdnJ1bGwuZXU+Iik7CitNT0RVTEVf TElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfQ1JZUFRPKCJnaGFzaCIpOwpkaWZmIC0tZ2l0 IGEvYXJjaC9yaXNjdi9jcnlwdG8vZ2hhc2gtcmlzY3Y2NC16YmMucGwgYi9hcmNoL3Jpc2N2L2Ny eXB0by9naGFzaC1yaXNjdjY0LXpiYy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMDAuLjI4M2EwNjg1YWQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcmlzY3YvY3J5 cHRvL2doYXNoLXJpc2N2NjQtemJjLnBsCkBAIC0wLDAgKzEsNDMwIEBACisjISAvdXNyL2Jpbi9l bnYgcGVybAorIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMCBPUiBCU0QtMi1D bGF1c2UKKyMKKyMgVGhpcyBmaWxlIGlzIGR1YWwtbGljZW5zZWQsIG1lYW5pbmcgdGhhdCB5b3Ug Y2FuIHVzZSBpdCB1bmRlciB5b3VyCisjIGNob2ljZSBvZiBlaXRoZXIgb2YgdGhlIGZvbGxvd2lu ZyB0d28gbGljZW5zZXM6CisjCisjIENvcHlyaWdodCAyMDIyIFRoZSBPcGVuU1NMIFByb2plY3Qg QXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFw YWNoZSBMaWNlbnNlIDIuMCAodGhlICJMaWNlbnNlIikuIFlvdSBjYW4gb2J0YWluCisjIGEgY29w eSBpbiB0aGUgZmlsZSBMSUNFTlNFIGluIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9yIGF0Cisj IGh0dHBzOi8vd3d3Lm9wZW5zc2wub3JnL3NvdXJjZS9saWNlbnNlLmh0bWwKKyMKKyMgb3IKKyMK KyMgQ29weXJpZ2h0IChjKSAyMDIzLCBDaHJpc3RvcGggTcO8bGxuZXIgPGNocmlzdG9waC5tdWVs bG5lckB2cnVsbC5ldT4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRp b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisj IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg Y29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlz dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlz dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp Z2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp bmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0 ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FS RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor IyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO RywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09O VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws CisjIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ TkcsIEJVVCBOT1QKKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lO RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0Yg TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU CisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB WSBPVVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5p bmdzOworCit1c2UgRmluZEJpbiBxdygkQmluKTsKK3VzZSBsaWIgIiRCaW4iOwordXNlIGxpYiAi JEJpbi8uLi8uLi9wZXJsYXNtIjsKK3VzZSByaXNjdjsKKworIyAkb3V0cHV0IGlzIHRoZSBsYXN0 IGFyZ3VtZW50IGlmIGl0IGxvb2tzIGxpa2UgYSBmaWxlIChpdCBoYXMgYW4gZXh0ZW5zaW9uKQor IyAkZmxhdm91ciBpcyB0aGUgZmlyc3QgYXJndW1lbnQgaWYgaXQgZG9lc24ndCBsb29rIGxpa2Ug YSBmaWxlCitteSAkb3V0cHV0ID0gJCNBUkdWID49IDAgJiYgJEFSR1ZbJCNBUkdWXSA9fiBtfFwu XHcrJHwgPyBwb3AgOiB1bmRlZjsKK215ICRmbGF2b3VyID0gJCNBUkdWID49IDAgJiYgJEFSR1Zb MF0gIX4gbXxcLnwgPyBzaGlmdCA6IHVuZGVmOworCiskb3V0cHV0IGFuZCBvcGVuIFNURE9VVCwi PiRvdXRwdXQiOworCitteSAkY29kZT08PF9fXzsKKy50ZXh0CitfX18KKworIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMKKyMgdm9pZCBnY21faW5pdF9ydjY0aV96YmModTEyOCBIdGFibGVbMTZdLCBj b25zdCB1NjQgSFsyXSk7CisjIHZvaWQgZ2NtX2luaXRfcnY2NGlfemJjX196YmIodTEyOCBIdGFi bGVbMTZdLCBjb25zdCB1NjQgSFsyXSk7CisjIHZvaWQgZ2NtX2luaXRfcnY2NGlfemJjX196Ymti KHUxMjggSHRhYmxlWzE2XSwgY29uc3QgdTY0IEhbMl0pOworIworIyBpbnB1dDogIEg6IDEyOC1i aXQgSCAtIHNlY3JldCBwYXJhbWV0ZXIgRShLLCAwXjEyOCkKKyMgb3V0cHV0OiBIdGFibGU6IFBy ZXByb2Nlc3NlZCBrZXkgZGF0YSBmb3IgZ2NtX2dtdWx0X3J2NjRpX3piYyogYW5kCisjICAgICAg ICAgICAgICAgICBnY21fZ2hhc2hfcnY2NGlfemJjKgorIworIyBBbGwgY2FsbGVycyBvZiB0aGlz IGZ1bmN0aW9uIHJldmVydCB0aGUgYnl0ZS1vcmRlciB1bmNvbmRpdGlvbmFsbHkKKyMgb24gbGl0 dGxlLWVuZGlhbiBtYWNoaW5lcy4gU28gd2UgbmVlZCB0byByZXZlcnQgdGhlIGJ5dGUtb3JkZXIg YmFjay4KKyMgQWRkaXRpb25hbGx5IHdlIHJldmVyc2UgdGhlIGJpdHMgb2YgZWFjaCBieXRlLgor Cit7CitteSAoJEh0YWJsZSwkSCwkVkFMMCwkVkFMMSwkVE1QMCwkVE1QMSwkVE1QMikgPSAoImEw IiwiYTEiLCJhMiIsImEzIiwidDAiLCJ0MSIsInQyIik7CisKKyRjb2RlIC49IDw8X19fOworLnAy YWxpZ24gMworLmdsb2JsIGdjbV9pbml0X3J2NjRpX3piYworLnR5cGUgZ2NtX2luaXRfcnY2NGlf emJjLFxAZnVuY3Rpb24KK2djbV9pbml0X3J2NjRpX3piYzoKKyAgICBsZCAgICAgICRWQUwwLDAo JEgpCisgICAgbGQgICAgICAkVkFMMSw4KCRIKQorICAgIEB7W2JyZXY4X3J2NjRpICAgJFZBTDAs ICRUTVAwLCAkVE1QMSwgJFRNUDJdfQorICAgIEB7W2JyZXY4X3J2NjRpICAgJFZBTDEsICRUTVAw LCAkVE1QMSwgJFRNUDJdfQorICAgIEB7W3NkX3JldjhfcnY2NGkgJFZBTDAsICRIdGFibGUsIDAs ICRUTVAwXX0KKyAgICBAe1tzZF9yZXY4X3J2NjRpICRWQUwxLCAkSHRhYmxlLCA4LCAkVE1QMF19 CisgICAgcmV0Cisuc2l6ZSBnY21faW5pdF9ydjY0aV96YmMsLi1nY21faW5pdF9ydjY0aV96YmMK K19fXworfQorCit7CitteSAoJEh0YWJsZSwkSCwkVkFMMCwkVkFMMSwkVE1QMCwkVE1QMSwkVE1Q MikgPSAoImEwIiwiYTEiLCJhMiIsImEzIiwidDAiLCJ0MSIsInQyIik7CisKKyRjb2RlIC49IDw8 X19fOworLnAyYWxpZ24gMworLmdsb2JsIGdjbV9pbml0X3J2NjRpX3piY19femJiCisudHlwZSBn Y21faW5pdF9ydjY0aV96YmNfX3piYixcQGZ1bmN0aW9uCitnY21faW5pdF9ydjY0aV96YmNfX3pi YjoKKyAgICBsZCAgICAgICRWQUwwLDAoJEgpCisgICAgbGQgICAgICAkVkFMMSw4KCRIKQorICAg IEB7W2JyZXY4X3J2NjRpICRWQUwwLCAkVE1QMCwgJFRNUDEsICRUTVAyXX0KKyAgICBAe1ticmV2 OF9ydjY0aSAkVkFMMSwgJFRNUDAsICRUTVAxLCAkVE1QMl19CisgICAgQHtbcmV2OCAkVkFMMCwg JFZBTDBdfQorICAgIEB7W3JldjggJFZBTDEsICRWQUwxXX0KKyAgICBzZCAgICAgICRWQUwwLDAo JEh0YWJsZSkKKyAgICBzZCAgICAgICRWQUwxLDgoJEh0YWJsZSkKKyAgICByZXQKKy5zaXplIGdj bV9pbml0X3J2NjRpX3piY19femJiLC4tZ2NtX2luaXRfcnY2NGlfemJjX196YmIKK19fXworfQor Cit7CitteSAoJEh0YWJsZSwkSCwkVE1QMCwkVE1QMSkgPSAoImEwIiwiYTEiLCJ0MCIsInQxIik7 CisKKyRjb2RlIC49IDw8X19fOworLnAyYWxpZ24gMworLmdsb2JsIGdjbV9pbml0X3J2NjRpX3pi Y19femJrYgorLnR5cGUgZ2NtX2luaXRfcnY2NGlfemJjX196YmtiLFxAZnVuY3Rpb24KK2djbV9p bml0X3J2NjRpX3piY19femJrYjoKKyAgICBsZCAgICAgICRUTVAwLDAoJEgpCisgICAgbGQgICAg ICAkVE1QMSw4KCRIKQorICAgIEB7W2JyZXY4ICRUTVAwLCAkVE1QMF19CisgICAgQHtbYnJldjgg JFRNUDEsICRUTVAxXX0KKyAgICBAe1tyZXY4ICRUTVAwLCAkVE1QMF19CisgICAgQHtbcmV2OCAk VE1QMSwgJFRNUDFdfQorICAgIHNkICAgICAgJFRNUDAsMCgkSHRhYmxlKQorICAgIHNkICAgICAg JFRNUDEsOCgkSHRhYmxlKQorICAgIHJldAorLnNpemUgZ2NtX2luaXRfcnY2NGlfemJjX196Ymti LC4tZ2NtX2luaXRfcnY2NGlfemJjX196YmtiCitfX18KK30KKworIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKKyMgdm9pZCBnY21fZ211bHRfcnY2NGlfemJjKHU2NCBYaVsyXSwgY29uc3QgdTEyOCBI dGFibGVbMTZdKTsKKyMgdm9pZCBnY21fZ211bHRfcnY2NGlfemJjX196YmtiKHU2NCBYaVsyXSwg Y29uc3QgdTEyOCBIdGFibGVbMTZdKTsKKyMKKyMgaW5wdXQ6ICBYaTogY3VycmVudCBoYXNoIHZh bHVlCisjICAgICAgICAgSHRhYmxlOiBjb3B5IG9mIEgKKyMgb3V0cHV0OiBYaTogbmV4dCBoYXNo IHZhbHVlIFhpCisjCisjIENvbXB1dGUgR01VTFQgKFhpKkggbW9kIGYpIHVzaW5nIHRoZSBaYmMg KGNsbXVsKSBhbmQgWmJiIChiYXNpYyBiaXQgbWFuaXApCisjIGV4dGVuc2lvbnMuIFVzaW5nIHRo ZSBuby1LYXJhdHN1YmEgYXBwcm9hY2ggYW5kIGNsbXVsIGZvciB0aGUgZmluYWwgcmVkdWN0aW9u LgorIyBUaGlzIHJlc3VsdHMgaW4gYW4gaW1wbGVtZW50YXRpb24gd2l0aCBtaW5pbWl6ZWQgbnVt YmVyIG9mIGluc3RydWN0aW9ucy4KKyMgSFcgd2l0aCBjbG11bCBsYXRlbmNpZXMgaGlnaGVyIHRo YW4gMiBjeWNsZXMgbWlnaHQgb2JzZXJ2ZSBhIHBlcmZvcm1hbmNlCisjIGltcHJvdmVtZW50IHdp dGggS2FyYXRzdWJhLiBIVyB3aXRoIGNsbXVsIGxhdGVuY2llcyBoaWdoZXIgdGhhbiA2IGN5Y2xl cworIyBtaWdodCBvYnNlcnZlIGEgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgd2l0aCBhZGRpdGlv bmFsbHkgY29udmVydGluZyB0aGUKKyMgcmVkdWN0aW9uIHRvIHNoaWZ0Jnhvci4gRm9yIGEgZnVs bCBkaXNjdXNzaW9uIG9mIHRoaXMgZXN0aW1hdGVzIHNlZQorIyBodHRwczovL2dpdGh1Yi5jb20v cmlzY3YvcmlzY3YtY3J5cHRvL2Jsb2IvbWFzdGVyL2RvYy9zdXBwL2djbS1tb2RlLWNtdWwuYWRv YworeworbXkgKCRYaSwkSHRhYmxlLCR4MCwkeDEsJHkwLCR5MSkgPSAoImEwIiwiYTEiLCJhNCIs ImE1IiwiYTYiLCJhNyIpOworbXkgKCR6MCwkejEsJHoyLCR6MywkdDAsJHQxLCRwb2x5bW9kKSA9 ICgidDAiLCJ0MSIsInQyIiwidDMiLCJ0NCIsInQ1IiwidDYiKTsKKworJGNvZGUgLj0gPDxfX187 CisucDJhbGlnbiAzCisuZ2xvYmwgZ2NtX2dtdWx0X3J2NjRpX3piYworLnR5cGUgZ2NtX2dtdWx0 X3J2NjRpX3piYyxcQGZ1bmN0aW9uCitnY21fZ211bHRfcnY2NGlfemJjOgorICAgICMgTG9hZCBY aSBhbmQgYml0LXJldmVyc2UgaXQKKyAgICBsZCAgICAgICAgJHgwLCAwKCRYaSkKKyAgICBsZCAg ICAgICAgJHgxLCA4KCRYaSkKKyAgICBAe1ticmV2OF9ydjY0aSAkeDAsICR6MCwgJHoxLCAkejJd fQorICAgIEB7W2JyZXY4X3J2NjRpICR4MSwgJHowLCAkejEsICR6Ml19CisKKyAgICAjIExvYWQg dGhlIGtleSAoYWxyZWFkeSBiaXQtcmV2ZXJzZWQpCisgICAgbGQgICAgICAgICR5MCwgMCgkSHRh YmxlKQorICAgIGxkICAgICAgICAkeTEsIDgoJEh0YWJsZSkKKworICAgICMgTG9hZCB0aGUgcmVk dWN0aW9uIGNvbnN0YW50CisgICAgbGEgICAgICAgICRwb2x5bW9kLCBMcG9seW1vZAorICAgIGxi dSAgICAgICAkcG9seW1vZCwgMCgkcG9seW1vZCkKKworICAgICMgTXVsdGlwbGljYXRpb24gKHdp dGhvdXQgS2FyYXRzdWJhKQorICAgIEB7W2NsbXVsaCAkejMsICR4MSwgJHkxXX0KKyAgICBAe1tj bG11bCAgJHoyLCAkeDEsICR5MV19CisgICAgQHtbY2xtdWxoICR0MSwgJHgwLCAkeTFdfQorICAg IEB7W2NsbXVsICAkejEsICR4MCwgJHkxXX0KKyAgICB4b3IgICAgICAgJHoyLCAkejIsICR0MQor ICAgIEB7W2NsbXVsaCAkdDEsICR4MSwgJHkwXX0KKyAgICBAe1tjbG11bCAgJHQwLCAkeDEsICR5 MF19CisgICAgeG9yICAgICAgICR6MiwgJHoyLCAkdDEKKyAgICB4b3IgICAgICAgJHoxLCAkejEs ICR0MAorICAgIEB7W2NsbXVsaCAkdDEsICR4MCwgJHkwXX0KKyAgICBAe1tjbG11bCAgJHowLCAk eDAsICR5MF19CisgICAgeG9yICAgICAgICR6MSwgJHoxLCAkdDEKKworICAgICMgUmVkdWN0aW9u IHdpdGggY2xtdWwKKyAgICBAe1tjbG11bGggJHQxLCAkejMsICRwb2x5bW9kXX0KKyAgICBAe1tj bG11bCAgJHQwLCAkejMsICRwb2x5bW9kXX0KKyAgICB4b3IgICAgICAgJHoyLCAkejIsICR0MQor ICAgIHhvciAgICAgICAkejEsICR6MSwgJHQwCisgICAgQHtbY2xtdWxoICR0MSwgJHoyLCAkcG9s eW1vZF19CisgICAgQHtbY2xtdWwgICR0MCwgJHoyLCAkcG9seW1vZF19CisgICAgeG9yICAgICAg ICR4MSwgJHoxLCAkdDEKKyAgICB4b3IgICAgICAgJHgwLCAkejAsICR0MAorCisgICAgIyBCaXQt cmV2ZXJzZSBYaSBiYWNrIGFuZCBzdG9yZSBpdAorICAgIEB7W2JyZXY4X3J2NjRpICR4MCwgJHow LCAkejEsICR6Ml19CisgICAgQHtbYnJldjhfcnY2NGkgJHgxLCAkejAsICR6MSwgJHoyXX0KKyAg ICBzZCAgICAgICAgJHgwLCAwKCRYaSkKKyAgICBzZCAgICAgICAgJHgxLCA4KCRYaSkKKyAgICBy ZXQKKy5zaXplIGdjbV9nbXVsdF9ydjY0aV96YmMsLi1nY21fZ211bHRfcnY2NGlfemJjCitfX18K K30KKworeworbXkgKCRYaSwkSHRhYmxlLCR4MCwkeDEsJHkwLCR5MSkgPSAoImEwIiwiYTEiLCJh NCIsImE1IiwiYTYiLCJhNyIpOworbXkgKCR6MCwkejEsJHoyLCR6MywkdDAsJHQxLCRwb2x5bW9k KSA9ICgidDAiLCJ0MSIsInQyIiwidDMiLCJ0NCIsInQ1IiwidDYiKTsKKworJGNvZGUgLj0gPDxf X187CisucDJhbGlnbiAzCisuZ2xvYmwgZ2NtX2dtdWx0X3J2NjRpX3piY19femJrYgorLnR5cGUg Z2NtX2dtdWx0X3J2NjRpX3piY19femJrYixcQGZ1bmN0aW9uCitnY21fZ211bHRfcnY2NGlfemJj X196YmtiOgorICAgICMgTG9hZCBYaSBhbmQgYml0LXJldmVyc2UgaXQKKyAgICBsZCAgICAgICAg JHgwLCAwKCRYaSkKKyAgICBsZCAgICAgICAgJHgxLCA4KCRYaSkKKyAgICBAe1ticmV2OCAgJHgw LCAkeDBdfQorICAgIEB7W2JyZXY4ICAkeDEsICR4MV19CisKKyAgICAjIExvYWQgdGhlIGtleSAo YWxyZWFkeSBiaXQtcmV2ZXJzZWQpCisgICAgbGQgICAgICAgICR5MCwgMCgkSHRhYmxlKQorICAg IGxkICAgICAgICAkeTEsIDgoJEh0YWJsZSkKKworICAgICMgTG9hZCB0aGUgcmVkdWN0aW9uIGNv bnN0YW50CisgICAgbGEgICAgICAgICRwb2x5bW9kLCBMcG9seW1vZAorICAgIGxidSAgICAgICAk cG9seW1vZCwgMCgkcG9seW1vZCkKKworICAgICMgTXVsdGlwbGljYXRpb24gKHdpdGhvdXQgS2Fy YXRzdWJhKQorICAgIEB7W2NsbXVsaCAkejMsICR4MSwgJHkxXX0KKyAgICBAe1tjbG11bCAgJHoy LCAkeDEsICR5MV19CisgICAgQHtbY2xtdWxoICR0MSwgJHgwLCAkeTFdfQorICAgIEB7W2NsbXVs ICAkejEsICR4MCwgJHkxXX0KKyAgICB4b3IgICAgICAgJHoyLCAkejIsICR0MQorICAgIEB7W2Ns bXVsaCAkdDEsICR4MSwgJHkwXX0KKyAgICBAe1tjbG11bCAgJHQwLCAkeDEsICR5MF19CisgICAg eG9yICAgICAgICR6MiwgJHoyLCAkdDEKKyAgICB4b3IgICAgICAgJHoxLCAkejEsICR0MAorICAg IEB7W2NsbXVsaCAkdDEsICR4MCwgJHkwXX0KKyAgICBAe1tjbG11bCAgJHowLCAkeDAsICR5MF19 CisgICAgeG9yICAgICAgICR6MSwgJHoxLCAkdDEKKworICAgICMgUmVkdWN0aW9uIHdpdGggY2xt dWwKKyAgICBAe1tjbG11bGggJHQxLCAkejMsICRwb2x5bW9kXX0KKyAgICBAe1tjbG11bCAgJHQw LCAkejMsICRwb2x5bW9kXX0KKyAgICB4b3IgICAgICAgJHoyLCAkejIsICR0MQorICAgIHhvciAg ICAgICAkejEsICR6MSwgJHQwCisgICAgQHtbY2xtdWxoICR0MSwgJHoyLCAkcG9seW1vZF19Cisg ICAgQHtbY2xtdWwgICR0MCwgJHoyLCAkcG9seW1vZF19CisgICAgeG9yICAgICAgICR4MSwgJHox LCAkdDEKKyAgICB4b3IgICAgICAgJHgwLCAkejAsICR0MAorCisgICAgIyBCaXQtcmV2ZXJzZSBY aSBiYWNrIGFuZCBzdG9yZSBpdAorICAgIEB7W2JyZXY4ICAkeDAsICR4MF19CisgICAgQHtbYnJl djggICR4MSwgJHgxXX0KKyAgICBzZCAgICAgICAgJHgwLCAwKCRYaSkKKyAgICBzZCAgICAgICAg JHgxLCA4KCRYaSkKKyAgICByZXQKKy5zaXplIGdjbV9nbXVsdF9ydjY0aV96YmNfX3pia2IsLi1n Y21fZ211bHRfcnY2NGlfemJjX196YmtiCitfX18KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKKyMgdm9pZCBnY21fZ2hhc2hfcnY2NGlfemJjKHU2NCBYaVsyXSwgY29uc3QgdTEyOCBIdGFi bGVbMTZdLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmlucCwgc2l6ZV90 IGxlbik7CisjIHZvaWQgZ2NtX2doYXNoX3J2NjRpX3piY19femJrYih1NjQgWGlbMl0sIGNvbnN0 IHUxMjggSHRhYmxlWzE2XSwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0 IHU4ICppbnAsIHNpemVfdCBsZW4pOworIworIyBpbnB1dDogIFhpOiBjdXJyZW50IGhhc2ggdmFs dWUKKyMgICAgICAgICBIdGFibGU6IGNvcHkgb2YgSAorIyAgICAgICAgIGlucDogcG9pbnRlciB0 byBpbnB1dCBkYXRhCisjICAgICAgICAgbGVuOiBsZW5ndGggb2YgaW5wdXQgZGF0YSBpbiBieXRl cyAobXVsdGlwbGUgb2YgYmxvY2sgc2l6ZSkKKyMgb3V0cHV0OiBYaTogWGkrMSAobmV4dCBoYXNo IHZhbHVlIFhpKQoreworbXkgKCRYaSwkSHRhYmxlLCRpbnAsJGxlbiwkeDAsJHgxLCR5MCwkeTEp ID0gKCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUiLCJhNiIsImE3Iik7CitteSAoJHowLCR6 MSwkejIsJHozLCR0MCwkdDEsJHBvbHltb2QpID0gKCJ0MCIsInQxIiwidDIiLCJ0MyIsInQ0Iiwi dDUiLCJ0NiIpOworCiskY29kZSAuPSA8PF9fXzsKKy5wMmFsaWduIDMKKy5nbG9ibCBnY21fZ2hh c2hfcnY2NGlfemJjCisudHlwZSBnY21fZ2hhc2hfcnY2NGlfemJjLFxAZnVuY3Rpb24KK2djbV9n aGFzaF9ydjY0aV96YmM6CisgICAgIyBMb2FkIFhpIGFuZCBiaXQtcmV2ZXJzZSBpdAorICAgIGxk ICAgICAgICAkeDAsIDAoJFhpKQorICAgIGxkICAgICAgICAkeDEsIDgoJFhpKQorICAgIEB7W2Jy ZXY4X3J2NjRpICR4MCwgJHowLCAkejEsICR6Ml19CisgICAgQHtbYnJldjhfcnY2NGkgJHgxLCAk ejAsICR6MSwgJHoyXX0KKworICAgICMgTG9hZCB0aGUga2V5IChhbHJlYWR5IGJpdC1yZXZlcnNl ZCkKKyAgICBsZCAgICAgICAgJHkwLCAwKCRIdGFibGUpCisgICAgbGQgICAgICAgICR5MSwgOCgk SHRhYmxlKQorCisgICAgIyBMb2FkIHRoZSByZWR1Y3Rpb24gY29uc3RhbnQKKyAgICBsYSAgICAg ICAgJHBvbHltb2QsIExwb2x5bW9kCisgICAgbGJ1ICAgICAgICRwb2x5bW9kLCAwKCRwb2x5bW9k KQorCitMc3RlcDoKKyAgICAjIExvYWQgdGhlIGlucHV0IGRhdGEsIGJpdC1yZXZlcnNlIHRoZW0s IGFuZCBYT1IgdGhlbSB3aXRoIFhpCisgICAgbGQgICAgICAgICR0MCwgMCgkaW5wKQorICAgIGxk ICAgICAgICAkdDEsIDgoJGlucCkKKyAgICBhZGQgICAgICAgJGlucCwgJGlucCwgMTYKKyAgICBh ZGQgICAgICAgJGxlbiwgJGxlbiwgLTE2CisgICAgQHtbYnJldjhfcnY2NGkgJHQwLCAkejAsICR6 MSwgJHoyXX0KKyAgICBAe1ticmV2OF9ydjY0aSAkdDEsICR6MCwgJHoxLCAkejJdfQorICAgIHhv ciAgICAgICAkeDAsICR4MCwgJHQwCisgICAgeG9yICAgICAgICR4MSwgJHgxLCAkdDEKKworICAg ICMgTXVsdGlwbGljYXRpb24gKHdpdGhvdXQgS2FyYXRzdWJhKQorICAgIEB7W2NsbXVsaCAkejMs ICR4MSwgJHkxXX0KKyAgICBAe1tjbG11bCAgJHoyLCAkeDEsICR5MV19CisgICAgQHtbY2xtdWxo ICR0MSwgJHgwLCAkeTFdfQorICAgIEB7W2NsbXVsICAkejEsICR4MCwgJHkxXX0KKyAgICB4b3Ig ICAgICAgJHoyLCAkejIsICR0MQorICAgIEB7W2NsbXVsaCAkdDEsICR4MSwgJHkwXX0KKyAgICBA e1tjbG11bCAgJHQwLCAkeDEsICR5MF19CisgICAgeG9yICAgICAgICR6MiwgJHoyLCAkdDEKKyAg ICB4b3IgICAgICAgJHoxLCAkejEsICR0MAorICAgIEB7W2NsbXVsaCAkdDEsICR4MCwgJHkwXX0K KyAgICBAe1tjbG11bCAgJHowLCAkeDAsICR5MF19CisgICAgeG9yICAgICAgICR6MSwgJHoxLCAk dDEKKworICAgICMgUmVkdWN0aW9uIHdpdGggY2xtdWwKKyAgICBAe1tjbG11bGggJHQxLCAkejMs ICRwb2x5bW9kXX0KKyAgICBAe1tjbG11bCAgJHQwLCAkejMsICRwb2x5bW9kXX0KKyAgICB4b3Ig ICAgICAgJHoyLCAkejIsICR0MQorICAgIHhvciAgICAgICAkejEsICR6MSwgJHQwCisgICAgQHtb Y2xtdWxoICR0MSwgJHoyLCAkcG9seW1vZF19CisgICAgQHtbY2xtdWwgICR0MCwgJHoyLCAkcG9s eW1vZF19CisgICAgeG9yICAgICAgICR4MSwgJHoxLCAkdDEKKyAgICB4b3IgICAgICAgJHgwLCAk ejAsICR0MAorCisgICAgIyBJdGVyYXRlIG92ZXIgYWxsIGJsb2NrcworICAgIGJuZXogICAgICAk bGVuLCBMc3RlcAorCisgICAgIyBCaXQtcmV2ZXJzZSBmaW5hbCBYaSBiYWNrIGFuZCBzdG9yZSBp dAorICAgIEB7W2JyZXY4X3J2NjRpICR4MCwgJHowLCAkejEsICR6Ml19CisgICAgQHtbYnJldjhf cnY2NGkgJHgxLCAkejAsICR6MSwgJHoyXX0KKyAgICBzZCAgICAgICAgJHgwLCAwKCRYaSkKKyAg ICBzZCAgICAgICAgJHgxLCA4KCRYaSkKKyAgICByZXQKKy5zaXplIGdjbV9naGFzaF9ydjY0aV96 YmMsLi1nY21fZ2hhc2hfcnY2NGlfemJjCitfX18KK30KKworeworbXkgKCRYaSwkSHRhYmxlLCRp bnAsJGxlbiwkeDAsJHgxLCR5MCwkeTEpID0gKCJhMCIsImExIiwiYTIiLCJhMyIsImE0IiwiYTUi LCJhNiIsImE3Iik7CitteSAoJHowLCR6MSwkejIsJHozLCR0MCwkdDEsJHBvbHltb2QpID0gKCJ0 MCIsInQxIiwidDIiLCJ0MyIsInQ0IiwidDUiLCJ0NiIpOworCiskY29kZSAuPSA8PF9fXzsKKy5w MmFsaWduIDMKKy5nbG9ibCBnY21fZ2hhc2hfcnY2NGlfemJjX196YmtiCisudHlwZSBnY21fZ2hh c2hfcnY2NGlfemJjX196YmtiLFxAZnVuY3Rpb24KK2djbV9naGFzaF9ydjY0aV96YmNfX3pia2I6 CisgICAgIyBMb2FkIFhpIGFuZCBiaXQtcmV2ZXJzZSBpdAorICAgIGxkICAgICAgICAkeDAsIDAo JFhpKQorICAgIGxkICAgICAgICAkeDEsIDgoJFhpKQorICAgIEB7W2JyZXY4ICAkeDAsICR4MF19 CisgICAgQHtbYnJldjggICR4MSwgJHgxXX0KKworICAgICMgTG9hZCB0aGUga2V5IChhbHJlYWR5 IGJpdC1yZXZlcnNlZCkKKyAgICBsZCAgICAgICAgJHkwLCAwKCRIdGFibGUpCisgICAgbGQgICAg ICAgICR5MSwgOCgkSHRhYmxlKQorCisgICAgIyBMb2FkIHRoZSByZWR1Y3Rpb24gY29uc3RhbnQK KyAgICBsYSAgICAgICAgJHBvbHltb2QsIExwb2x5bW9kCisgICAgbGJ1ICAgICAgICRwb2x5bW9k LCAwKCRwb2x5bW9kKQorCitMc3RlcF96a2JrOgorICAgICMgTG9hZCB0aGUgaW5wdXQgZGF0YSwg Yml0LXJldmVyc2UgdGhlbSwgYW5kIFhPUiB0aGVtIHdpdGggWGkKKyAgICBsZCAgICAgICAgJHQw LCAwKCRpbnApCisgICAgbGQgICAgICAgICR0MSwgOCgkaW5wKQorICAgIGFkZCAgICAgICAkaW5w LCAkaW5wLCAxNgorICAgIGFkZCAgICAgICAkbGVuLCAkbGVuLCAtMTYKKyAgICBAe1ticmV2OCAg JHQwLCAkdDBdfQorICAgIEB7W2JyZXY4ICAkdDEsICR0MV19CisgICAgeG9yICAgICAgICR4MCwg JHgwLCAkdDAKKyAgICB4b3IgICAgICAgJHgxLCAkeDEsICR0MQorCisgICAgIyBNdWx0aXBsaWNh dGlvbiAod2l0aG91dCBLYXJhdHN1YmEpCisgICAgQHtbY2xtdWxoICR6MywgJHgxLCAkeTFdfQor ICAgIEB7W2NsbXVsICAkejIsICR4MSwgJHkxXX0KKyAgICBAe1tjbG11bGggJHQxLCAkeDAsICR5 MV19CisgICAgQHtbY2xtdWwgICR6MSwgJHgwLCAkeTFdfQorICAgIHhvciAgICAgICAkejIsICR6 MiwgJHQxCisgICAgQHtbY2xtdWxoICR0MSwgJHgxLCAkeTBdfQorICAgIEB7W2NsbXVsICAkdDAs ICR4MSwgJHkwXX0KKyAgICB4b3IgICAgICAgJHoyLCAkejIsICR0MQorICAgIHhvciAgICAgICAk ejEsICR6MSwgJHQwCisgICAgQHtbY2xtdWxoICR0MSwgJHgwLCAkeTBdfQorICAgIEB7W2NsbXVs ICAkejAsICR4MCwgJHkwXX0KKyAgICB4b3IgICAgICAgJHoxLCAkejEsICR0MQorCisgICAgIyBS ZWR1Y3Rpb24gd2l0aCBjbG11bAorICAgIEB7W2NsbXVsaCAkdDEsICR6MywgJHBvbHltb2RdfQor ICAgIEB7W2NsbXVsICAkdDAsICR6MywgJHBvbHltb2RdfQorICAgIHhvciAgICAgICAkejIsICR6 MiwgJHQxCisgICAgeG9yICAgICAgICR6MSwgJHoxLCAkdDAKKyAgICBAe1tjbG11bGggJHQxLCAk ejIsICRwb2x5bW9kXX0KKyAgICBAe1tjbG11bCAgJHQwLCAkejIsICRwb2x5bW9kXX0KKyAgICB4 b3IgICAgICAgJHgxLCAkejEsICR0MQorICAgIHhvciAgICAgICAkeDAsICR6MCwgJHQwCisKKyAg ICAjIEl0ZXJhdGUgb3ZlciBhbGwgYmxvY2tzCisgICAgYm5leiAgICAgICRsZW4sIExzdGVwX3pr YmsKKworICAgICMgQml0LXJldmVyc2UgZmluYWwgWGkgYmFjayBhbmQgc3RvcmUgaXQKKyAgICBA e1ticmV2OCAgJHgwLCAkeDBdfQorICAgIEB7W2JyZXY4ICAkeDEsICR4MV19CisgICAgc2QgJHgw LCAgMCgkWGkpCisgICAgc2QgJHgxLCAgOCgkWGkpCisgICAgcmV0Cisuc2l6ZSBnY21fZ2hhc2hf cnY2NGlfemJjX196YmtiLC4tZ2NtX2doYXNoX3J2NjRpX3piY19femJrYgorX19fCit9CisKKyRj b2RlIC49IDw8X19fOworLnAyYWxpZ24gMworTGJyZXY4X2NvbnN0OgorICAgIC5kd29yZCAgMHhB QUFBQUFBQUFBQUFBQUFBCisgICAgLmR3b3JkICAweENDQ0NDQ0NDQ0NDQ0NDQ0MKKyAgICAuZHdv cmQgIDB4RjBGMEYwRjBGMEYwRjBGMAorLnNpemUgTGJyZXY4X2NvbnN0LC4tTGJyZXY4X2NvbnN0 CisKK0xwb2x5bW9kOgorICAgIC5ieXRlIDB4ODcKKy5zaXplIExwb2x5bW9kLC4tTHBvbHltb2QK K19fXworCitwcmludCAkY29kZTsKKworY2xvc2UgU1RET1VUIG9yIGRpZSAiZXJyb3IgY2xvc2lu ZyBTVERPVVQ6ICQhIjsKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvY3J5cHRvL3Jpc2N2LnBtIGIv YXJjaC9yaXNjdi9jcnlwdG8vcmlzY3YucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAwMDAwLi5hNDRlZGM2OGQxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jpc2N2L2Ny eXB0by9yaXNjdi5wbQpAQCAtMCwwICsxLDI2MSBAQAorIyEgL3Vzci9iaW4vZW52IHBlcmwKKyMg U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgT1IgQlNELTItQ2xhdXNlCisjCisj IFRoaXMgZmlsZSBpcyBkdWFsLWxpY2Vuc2VkLCBtZWFuaW5nIHRoYXQgeW91IGNhbiB1c2UgaXQg dW5kZXIgeW91cgorIyBjaG9pY2Ugb2YgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgdHdvIGxpY2Vu c2VzOgorIworIyBDb3B5cmlnaHQgMjAyMyBUaGUgT3BlblNTTCBQcm9qZWN0IEF1dGhvcnMuIEFs bCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5z ZSAyLjAgKHRoZSAiTGljZW5zZSIpLiBZb3UgY2FuIG9idGFpbgorIyBhIGNvcHkgaW4gdGhlIGZp bGUgTElDRU5TRSBpbiB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBvciBhdAorIyBodHRwczovL3d3 dy5vcGVuc3NsLm9yZy9zb3VyY2UvbGljZW5zZS5odG1sCisjCisjIG9yCisjCisjIENvcHlyaWdo dCAoYykgMjAyMywgQ2hyaXN0b3BoIE3DvGxsbmVyIDxjaHJpc3RvcGgubXVlbGxuZXJAdnJ1bGwu ZXU+CisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRp b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK KyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0 YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMg aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt ZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92 aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklE RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyMgIkFTIElTIiBB TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK KyMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg QU5EIEZJVE5FU1MgRk9SCisjIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJ TiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorIyBTUEVDSUFM LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U CisjIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD RVM7IExPU1MgT0YgVVNFLAorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyMgVEhFT1JZIE9GIExJQUJJTElUWSwg V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorIyAoSU5DTFVE SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI RSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ TElUWSBPRiBTVUNIIERBTUFHRS4KKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKworIyBT ZXQgJGhhdmVfc3RhY2t0cmFjZSB0byAxIGlmIHdlIGhhdmUgRGV2ZWw6OlN0YWNrVHJhY2UKK215 ICRoYXZlX3N0YWNrdHJhY2UgPSAwOworaWYgKGV2YWwge3JlcXVpcmUgRGV2ZWw6OlN0YWNrVHJh Y2U7MTt9KSB7CisgICAgJGhhdmVfc3RhY2t0cmFjZSA9IDE7Cit9CisKK215IEByZWdzID0gbWFw KCJ4JF8iLCgwLi4zMSkpOworIyBNYXBwaW5nIGZyb20gdGhlIFJJU0MtViBwc0FCSSBBQkkgbW5l bW9uaWMgbmFtZXMgdG8gdGhlIHJlZ2lzdGVyIG51bWJlci4KK215IEByZWdhbGlhc2VzID0gKCd6 ZXJvJywncmEnLCdzcCcsJ2dwJywndHAnLCd0MCcsJ3QxJywndDInLCdzMCcsJ3MxJywKKyAgICBt YXAoImEkXyIsKDAuLjcpKSwKKyAgICBtYXAoInMkXyIsKDIuLjExKSksCisgICAgbWFwKCJ0JF8i LCgzLi42KSkKKyk7CisKK215ICVyZWdsb29rdXA7CitAcmVnbG9va3Vwe0ByZWdzfSA9IEByZWdz OworQHJlZ2xvb2t1cHtAcmVnYWxpYXNlc30gPSBAcmVnczsKKworIyBUYWtlcyBhIHJlZ2lzdGVy IG5hbWUsIHBvc3NpYmx5IGFuIGFsaWFzLCBhbmQgY29udmVydHMgaXQgdG8gYSByZWdpc3RlciBp bmRleAorIyBmcm9tIDAgdG8gMzEKK3N1YiByZWFkX3JlZyB7CisgICAgbXkgJHJlZyA9IGxjIHNo aWZ0OworICAgIGlmICghZXhpc3RzKCRyZWdsb29rdXB7JHJlZ30pKSB7CisgICAgICAgIG15ICR0 cmFjZSA9ICIiOworICAgICAgICBpZiAoJGhhdmVfc3RhY2t0cmFjZSkgeworICAgICAgICAgICAg JHRyYWNlID0gRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldy0+YXNfc3RyaW5nOworICAgICAgICB9Cisg ICAgICAgIGRpZSgiVW5rbm93biByZWdpc3RlciAiLiRyZWcuIlxuIi4kdHJhY2UpOworICAgIH0K KyAgICBteSAkcmVnc3RyID0gJHJlZ2xvb2t1cHskcmVnfTsKKyAgICBpZiAoISgkcmVnc3RyID1+ IC9eeChbMC05XSspJC8pKSB7CisgICAgICAgIG15ICR0cmFjZSA9ICIiOworICAgICAgICBpZiAo JGhhdmVfc3RhY2t0cmFjZSkgeworICAgICAgICAgICAgJHRyYWNlID0gRGV2ZWw6OlN0YWNrVHJh Y2UtPm5ldy0+YXNfc3RyaW5nOworICAgICAgICB9CisgICAgICAgIGRpZSgiQ291bGQgbm90IHBy b2Nlc3MgcmVnaXN0ZXIgIi4kcmVnLiJcbiIuJHRyYWNlKTsKKyAgICB9CisgICAgcmV0dXJuICQx OworfQorCisjIEhlbHBlciBmdW5jdGlvbnMKKworc3ViIGJyZXY4X3J2NjRpIHsKKyAgICAjIGJy ZXY4IHdpdGhvdXQgYGJyZXY4YCBpbnN0cnVjdGlvbiAob25seSBpbiBaYmtiKQorICAgICMgQml0 LXJldmVyc2VzIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgbmVlZHMgdHdvIHNjcmF0Y2ggcmVnaXN0 ZXJzCisgICAgbXkgJHZhbCA9IHNoaWZ0OworICAgIG15ICR0MCA9IHNoaWZ0OworICAgIG15ICR0 MSA9IHNoaWZ0OworICAgIG15ICRicmV2OF9jb25zdCA9IHNoaWZ0OworICAgIG15ICRzZXEgPSA8 PF9fXzsKKyAgICAgICAgbGEgICAgICAkYnJldjhfY29uc3QsIExicmV2OF9jb25zdAorCisgICAg ICAgIGxkICAgICAgJHQwLCAwKCRicmV2OF9jb25zdCkgICMgMHhBQUFBQUFBQUFBQUFBQUFBCisg ICAgICAgIHNsbGkgICAgJHQxLCAkdmFsLCAxCisgICAgICAgIGFuZCAgICAgJHQxLCAkdDEsICR0 MAorICAgICAgICBhbmQgICAgICR2YWwsICR2YWwsICR0MAorICAgICAgICBzcmxpICAgICR2YWws ICR2YWwsIDEKKyAgICAgICAgb3IgICAgICAkdmFsLCAkdDEsICR2YWwKKworICAgICAgICBsZCAg ICAgICR0MCwgOCgkYnJldjhfY29uc3QpICAjIDB4Q0NDQ0NDQ0NDQ0NDQ0NDQworICAgICAgICBz bGxpICAgICR0MSwgJHZhbCwgMgorICAgICAgICBhbmQgICAgICR0MSwgJHQxLCAkdDAKKyAgICAg ICAgYW5kICAgICAkdmFsLCAkdmFsLCAkdDAKKyAgICAgICAgc3JsaSAgICAkdmFsLCAkdmFsLCAy CisgICAgICAgIG9yICAgICAgJHZhbCwgJHQxLCAkdmFsCisKKyAgICAgICAgbGQgICAgICAkdDAs IDE2KCRicmV2OF9jb25zdCkgIyAweEYwRjBGMEYwRjBGMEYwRjAKKyAgICAgICAgc2xsaSAgICAk dDEsICR2YWwsIDQKKyAgICAgICAgYW5kICAgICAkdDEsICR0MSwgJHQwCisgICAgICAgIGFuZCAg ICAgJHZhbCwgJHZhbCwgJHQwCisgICAgICAgIHNybGkgICAgJHZhbCwgJHZhbCwgNAorICAgICAg ICBvciAgICAgICR2YWwsICR0MSwgJHZhbAorX19fCisgICAgcmV0dXJuICRzZXE7Cit9CisKK3N1 YiBzZF9yZXY4X3J2NjRpIHsKKyAgICAjIHJldjggd2l0aG91dCBgcmV2OGAgaW5zdHJ1Y3Rpb24g KG9ubHkgaW4gWmJiIG9yIFpia2IpCisgICAgIyBTdG9yZXMgdGhlIGdpdmVuIHZhbHVlIGJ5dGUt cmV2ZXJzZWQgYW5kIG5lZWRzIG9uZSBzY3JhdGNoIHJlZ2lzdGVyCisgICAgbXkgJHZhbCA9IHNo aWZ0OworICAgIG15ICRhZGRyID0gc2hpZnQ7CisgICAgbXkgJG9mZiA9IHNoaWZ0OworICAgIG15 ICR0bXAgPSBzaGlmdDsKKyAgICBteSAkb2ZmMCA9ICgkb2ZmICsgMCk7CisgICAgbXkgJG9mZjEg PSAoJG9mZiArIDEpOworICAgIG15ICRvZmYyID0gKCRvZmYgKyAyKTsKKyAgICBteSAkb2ZmMyA9 ICgkb2ZmICsgMyk7CisgICAgbXkgJG9mZjQgPSAoJG9mZiArIDQpOworICAgIG15ICRvZmY1ID0g KCRvZmYgKyA1KTsKKyAgICBteSAkb2ZmNiA9ICgkb2ZmICsgNik7CisgICAgbXkgJG9mZjcgPSAo JG9mZiArIDcpOworICAgIG15ICRzZXEgPSA8PF9fXzsKKyAgICAgICAgc2IgICAgICAkdmFsLCAk b2ZmNygkYWRkcikKKyAgICAgICAgc3JsaSAgICAkdG1wLCAkdmFsLCA4CisgICAgICAgIHNiICAg ICAgJHRtcCwgJG9mZjYoJGFkZHIpCisgICAgICAgIHNybGkgICAgJHRtcCwgJHZhbCwgMTYKKyAg ICAgICAgc2IgICAgICAkdG1wLCAkb2ZmNSgkYWRkcikKKyAgICAgICAgc3JsaSAgICAkdG1wLCAk dmFsLCAyNAorICAgICAgICBzYiAgICAgICR0bXAsICRvZmY0KCRhZGRyKQorICAgICAgICBzcmxp ICAgICR0bXAsICR2YWwsIDMyCisgICAgICAgIHNiICAgICAgJHRtcCwgJG9mZjMoJGFkZHIpCisg ICAgICAgIHNybGkgICAgJHRtcCwgJHZhbCwgNDAKKyAgICAgICAgc2IgICAgICAkdG1wLCAkb2Zm MigkYWRkcikKKyAgICAgICAgc3JsaSAgICAkdG1wLCAkdmFsLCA0OAorICAgICAgICBzYiAgICAg ICR0bXAsICRvZmYxKCRhZGRyKQorICAgICAgICBzcmxpICAgICR0bXAsICR2YWwsIDU2CisgICAg ICAgIHNiICAgICAgJHRtcCwgJG9mZjAoJGFkZHIpCitfX18KKyAgICByZXR1cm4gJHNlcTsKK30K KworIyBTY2FsYXIgY3J5cHRvIGluc3RydWN0aW9ucworCitzdWIgYWVzNjRkcyB7CisgICAgIyBF bmNvZGluZyBmb3IgYWVzNjRkcyByZCwgcnMxLCByczIgaW5zdHJ1Y3Rpb24gb24gUlY2NAorICAg ICMgICAgICAgICAgICAgICAgWFhYWFhYWF8gcnMyIF8gcnMxIF9YWFhfIHJkICBfWFhYWFhYWAor ICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAxMTEwMV8wMDAwMF8wMDAwMF8wMDBfMDAwMDBfMDExMDAx MTsKKyAgICBteSAkcmQgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcg c2hpZnQ7CisgICAgbXkgJHJzMiA9IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQg Ii4oJHRlbXBsYXRlIHwgKCRyczIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCRyZCA8PCA3KSk7 Cit9CisKK3N1YiBhZXM2NGRzbSB7CisgICAgIyBFbmNvZGluZyBmb3IgYWVzNjRkc20gcmQsIHJz MSwgcnMyIGluc3RydWN0aW9uIG9uIFJWNjQKKyAgICAjICAgICAgICAgICAgICAgIFhYWFhYWFhf IHJzMiBfIHJzMSBfWFhYXyByZCAgX1hYWFhYWFgKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAwMTEx MTFfMDAwMDBfMDAwMDBfMDAwXzAwMDAwXzAxMTAwMTE7CisgICAgbXkgJHJkID0gcmVhZF9yZWcg c2hpZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRyczIgPSByZWFk X3JlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkcnMyIDw8IDIw KSB8ICgkcnMxIDw8IDE1KSB8ICgkcmQgPDwgNykpOworfQorCitzdWIgYWVzNjRlcyB7CisgICAg IyBFbmNvZGluZyBmb3IgYWVzNjRlcyByZCwgcnMxLCByczIgaW5zdHJ1Y3Rpb24gb24gUlY2NAor ICAgICMgICAgICAgICAgICAgICAgWFhYWFhYWF8gcnMyIF8gcnMxIF9YWFhfIHJkICBfWFhYWFhY WAorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAxMTAwMV8wMDAwMF8wMDAwMF8wMDBfMDAwMDBfMDEx MDAxMTsKKyAgICBteSAkcmQgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9y ZWcgc2hpZnQ7CisgICAgbXkgJHJzMiA9IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndv cmQgIi4oJHRlbXBsYXRlIHwgKCRyczIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCRyZCA8PCA3 KSk7Cit9CisKK3N1YiBhZXM2NGVzbSB7CisgICAgIyBFbmNvZGluZyBmb3IgYWVzNjRlc20gcmQs IHJzMSwgcnMyIGluc3RydWN0aW9uIG9uIFJWNjQKKyAgICAjICAgICAgICAgICAgICAgIFhYWFhY WFhfIHJzMiBfIHJzMSBfWFhYXyByZCAgX1hYWFhYWFgKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAw MTEwMTFfMDAwMDBfMDAwMDBfMDAwXzAwMDAwXzAxMTAwMTE7CisgICAgbXkgJHJkID0gcmVhZF9y ZWcgc2hpZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRyczIgPSBy ZWFkX3JlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkcnMyIDw8 IDIwKSB8ICgkcnMxIDw8IDE1KSB8ICgkcmQgPDwgNykpOworfQorCitzdWIgYWVzNjRpbSB7Cisg ICAgIyBFbmNvZGluZyBmb3IgYWVzNjRpbSByZCwgcnMxIGluc3RydWN0aW9uIG9uIFJWNjQKKyAg ICAjICAgICAgICAgICAgICAgIFhYWFhYWFhYWFhYWF8gcnMxIF9YWFhfIHJkICBfWFhYWFhYWAor ICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAxMTAwMDAwMDAwXzAwMDAwXzAwMV8wMDAwMF8wMDEwMDEx OworICAgIG15ICRyZCA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBz aGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkcnMxIDw8IDE1KSB8ICgk cmQgPDwgNykpOworfQorCitzdWIgYWVzNjRrczFpIHsKKyAgICAjIEVuY29kaW5nIGZvciBhZXM2 NGtzMWkgcmQsIHJzMSwgcm51bSBpbnN0cnVjdGlvbiBvbiBSVjY0CisgICAgIyAgICAgICAgICAg ICAgICBYWFhYWFhYWF9ybnVtXyByczEgX1hYWF8gcmQgIF9YWFhYWFhYCisgICAgbXkgJHRlbXBs YXRlID0gMGIwMDExMDAwMV8wMDAwXzAwMDAwXzAwMV8wMDAwMF8wMDEwMDExOworICAgIG15ICRy ZCA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBt eSAkcm51bSA9IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRybnVt IDw8IDIwKSB8ICgkcnMxIDw8IDE1KSB8ICgkcmQgPDwgNykpOworfQorCitzdWIgYWVzNjRrczIg eworICAgICMgRW5jb2RpbmcgZm9yIGFlczY0a3MyIHJkLCByczEsIHJzMiBpbnN0cnVjdGlvbiBv biBSVjY0CisgICAgIyAgICAgICAgICAgICAgICBYWFhYWFhYXyByczIgXyByczEgX1hYWF8gcmQg IF9YWFhYWFhYCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMTExMTExXzAwMDAwXzAwMDAwXzAwMF8w MDAwMF8wMTEwMDExOworICAgIG15ICRyZCA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRyczEg PSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkcnMyID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgcmV0 dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHJzMiA8PCAyMCkgfCAoJHJzMSA8PCAxNSkgfCAo JHJkIDw8IDcpKTsKK30KKworc3ViIGJyZXY4IHsKKyAgICAjIGJyZXY4IHJkLCBycworICAgIG15 ICR0ZW1wbGF0ZSA9IDBiMDExMDEwMDAwMTExXzAwMDAwXzEwMV8wMDAwMF8wMDEwMDExOworICAg IG15ICRyZCA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRycyA9IHJlYWRfcmVnIHNoaWZ0Owor ICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRycyA8PCAxNSkgfCAoJHJkIDw8IDcp KTsKK30KKworc3ViIGNsbXVsIHsKKyAgICAjIEVuY29kaW5nIGZvciBjbG11bCByZCwgcnMxLCBy czIgaW5zdHJ1Y3Rpb24gb24gUlY2NAorICAgICMgICAgICAgICAgICAgICAgWFhYWFhYWF8gcnMy IF8gcnMxIF9YWFhfIHJkICBfWFhYWFhYWAorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAwMDEwMV8w MDAwMF8wMDAwMF8wMDFfMDAwMDBfMDExMDAxMTsKKyAgICBteSAkcmQgPSByZWFkX3JlZyBzaGlm dDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgbXkgJHJzMiA9IHJlYWRfcmVn IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRyczIgPDwgMjApIHwg KCRyczEgPDwgMTUpIHwgKCRyZCA8PCA3KSk7Cit9CisKK3N1YiBjbG11bGggeworICAgICMgRW5j b2RpbmcgZm9yIGNsbXVsaCByZCwgcnMxLCByczIgaW5zdHJ1Y3Rpb24gb24gUlY2NAorICAgICMg ICAgICAgICAgICAgICAgWFhYWFhYWF8gcnMyIF8gcnMxIF9YWFhfIHJkICBfWFhYWFhYWAorICAg IG15ICR0ZW1wbGF0ZSA9IDBiMDAwMDEwMV8wMDAwMF8wMDAwMF8wMTFfMDAwMDBfMDExMDAxMTsK KyAgICBteSAkcmQgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hp ZnQ7CisgICAgbXkgJHJzMiA9IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4o JHRlbXBsYXRlIHwgKCRyczIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCRyZCA8PCA3KSk7Cit9 CisKK3N1YiByZXY4IHsKKyAgICAjIEVuY29kaW5nIGZvciByZXY4IHJkLCBycyBpbnN0cnVjdGlv biBvbiBSVjY0CisgICAgIyAgICAgICAgICAgICAgIFhYWFhYWFhYWFhYWFhfIHJzICBfWFhYXyBy ZCAgX1hYWFhYWFgKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAxMTAxMDExMTAwMF8wMDAwMF8xMDFf MDAwMDBfMDAxMDAxMTsKKyAgICBteSAkcmQgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkcnMg PSByZWFkX3JlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkcnMg PDwgMTUpIHwgKCRyZCA8PCA3KSk7Cit9CisKKzE7Ci0tIAoyLjM5LjIKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxp c3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==