From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa2.mentor.iphmx.com (esa2.mentor.iphmx.com [68.232.141.98]) by sourceware.org (Postfix) with ESMTPS id E6F693857702 for ; Wed, 12 Jul 2023 12:05:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org E6F693857702 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=codesourcery.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mentor.com X-IronPort-AV: E=Sophos;i="6.01,199,1684828800"; d="diff'?scan'208";a="12985856" Received: from orw-gwy-02-in.mentorg.com ([192.94.38.167]) by esa2.mentor.iphmx.com with ESMTP; 12 Jul 2023 04:05:30 -0800 IronPort-SDR: HDa8StgoIP3dbrmm0yrvOIQPBBcMToWb804/YpwezjY11UeKgH8zhTt3nBlFoYMBFpieS/lCPn qE11hwTHtCfW85BW7hZzOA/h9uYE7hvVkh2n1MDpzzq+hFLH/UbqefIiwc0NVNxE4QbB7Etkmo vePmxPxDUEV8XnsVu2aDEdw4wdxmmD05jNnNiLyCMUlkf2r6tgL+y7EgfIwHNxogANsOlI86+Z I5yAVXTuwLcwTl8YbNOVWxMYQ5BJ0RzAsH5hjr/8TGQNRc1DCAz/rELiNpELlBAjT7CEZHjVWk L+Y= Content-Type: multipart/mixed; boundary="------------YwnZrWnbGwKQpJMzGRb0wsks" Message-ID: <5b66591e-6af2-7219-acfc-640aeffad0b0@codesourcery.com> Date: Wed, 12 Jul 2023 14:05:22 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.13.0 Subject: Re: [Patch] libgomp: Use libnuma for OpenMP's partition=nearest allocation trait Content-Language: en-US From: Tobias Burnus To: gcc-patches , Jakub Jelinek References: <34fce57b-69a0-a9fd-f8ff-671ee7f94227@codesourcery.com> In-Reply-To: <34fce57b-69a0-a9fd-f8ff-671ee7f94227@codesourcery.com> X-Originating-IP: [137.202.0.90] X-ClientProxiedBy: svr-ies-mbx-15.mgc.mentorg.com (139.181.222.15) To svr-ies-mbx-12.mgc.mentorg.com (139.181.222.12) X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,NICE_REPLY_A,SPF_HELO_PASS,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --------------YwnZrWnbGwKQpJMzGRb0wsks Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: quoted-printable Now committed as r14-2462-g450b05ce54d3f0. Changes to the patch in previous email: * I fixed some issues found on the way, * The wording in the .texi has been improved/expanded, and * I included two testcases to exercise the two libraries (or the default allocator when it is not available at runtime). Given that the default allocation already works fine (nearest) and the normal "malloc" is more economic in terms of memory handling (not multiples of page size or requesting a fixed pool size), I was wondering whether this patch is really needed. But at the end: default can be changed (cf. below) and given the user the choice makes sense. The manual states what GCC does which should help to make a conscious choice. * * * I did experiment with the testcase attached to previous email plus using dlopen to obtain the functions from libnuma if available. It was also using: /* { dg-do run { target { dlopen } } } */ /* { dg-additional-options "-ldl" } */ However, the Linux kernel too often placed the allocated memory on the "wrong" node to be usable as a testcase. I did get be 0 to 15 misplaced allocations, depending on the run. Hence, there is no such testcase. Using numactrl --preferred=3D1 I could force the normal allocation to (mostly) use node 1 for allocations such that the difference between partiton =3D default/environme= nt vs. partition =3D nearest was clearly visible. Hence it does work. Otherwise, the same applies as I wrote the yesterday: On 11.07.23 12:35, Tobias Burnus wrote: > While by default 'malloc' allocates memory on the same node as the > calling > process/thread ('numactl --show' shows 'preferred node: current', > Linux kernel memory policy MPOL_DEFAULT), this can be changed. > For instance, when running the program as follows, 'malloc' now > prefers to allocate on the second node: > numactl --preferred=3D1 ./myproc > > Thus, it seems to be sensible to provide a means to ensure the 'nearest' > allocation. The MPOL_LOCAL policy does so, as provided by > libnuma's numa_alloc_local. (Which is just wrapper around the syscalls > mmap and mbind.) As with (lib)memkind, there is a run-time dlopen check > for (lib)numa - and no numa*.h is required when bulding GCC. ----------------- Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstra=C3=9Fe 201= , 80634 M=C3=BCnchen; Gesellschaft mit beschr=C3=A4nkter Haftung; Gesch=C3= =A4ftsf=C3=BChrer: Thomas Heurung, Frank Th=C3=BCrauf; Sitz der Gesellschaf= t: M=C3=BCnchen; Registergericht M=C3=BCnchen, HRB 106955 --------------YwnZrWnbGwKQpJMzGRb0wsks Content-Type: text/x-patch; charset="UTF-8"; name="committed.diff" Content-Disposition: attachment; filename="committed.diff" Content-Transfer-Encoding: base64 Y29tbWl0IDQ1MGIwNWNlNTRkM2YwOGM1ODNjM2I1MzQxMjMzY2UwZGY5OTcyNWIKQXV0aG9y OiBUb2JpYXMgQnVybnVzIDx0b2JpYXNAY29kZXNvdXJjZXJ5LmNvbT4KRGF0ZTogICBXZWQg SnVsIDEyIDEzOjUwOjIxIDIwMjMgKzAyMDAKCiAgICBsaWJnb21wOiBVc2UgbGlibnVtYSBm b3IgT3Blbk1QJ3MgcGFydGl0aW9uPW5lYXJlc3QgYWxsb2NhdGlvbiB0cmFpdAogICAgCiAg ICBBcyB3aXRoIHRoZSBtZW1raW5kIGxpYnJhcnksIGl0IGlzIG9ubHkgdXNlZCB3aGVuIGZv dW5kIGF0IHJ1bnRpbWU7CiAgICBpdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXNlbnQgd2hl biBidWlsZGluZyBHQ0MuCiAgICAKICAgIFRoZSBpbmNsdWRlZCB0ZXN0Y2FzZSBkb2VzIG5v dCBjaGVjayB3aGV0aGVyIHRoZSBtZW1vcnkgaGFzIGJlZW4gcGxhY2VkCiAgICBvbiB0aGUg bmVhcmVzdCBub2RlIGFzIHRoZSBMaW51eCBrZXJuZWwgbWVtb3J5IGhhbmRsaW5nIHRvbyBv ZnRlbiBpZ25vcmVzCiAgICB0aGF0IGhpbnQsIHVzaW5nIGEgZGlmZmVyZW50IG5vZGUgZm9y IHRoZSBhbGxvY2F0aW9uLiAgSG93ZXZlciwgd2hlbgogICAgcnVubmluZyB3aXRoICdudW1h Y3RsIC0tcHJlZmVycmVkPTxub2RlPiAuL2V4ZWN1dGFibGUnLCBpdCBpcyBjbGVhcmx5CiAg ICB2aXNpYmxlIHRoYXQgdGhlIGZlYXR1cmUgd29ya3MgYnkgY29tcGFyaW5nIG1hbGxvYy9k ZWZhdWx0IHZzLiBuZWFyZXN0CiAgICBwbGFjZW1lbnQgKHVzaW5nIGdldF9tZW1wb2xpY3kg dG8gb2J0YWluIHRoZSBub2RlIGZvciBhIG1lbSBhZGRyKS4KICAgIAogICAgbGliZ29tcC9D aGFuZ2VMb2c6CiAgICAKICAgICAgICAgICAgKiBhbGxvY2F0b3IuYzogQWRkIGlmZGVmIGZv ciBMSUJHT01QX1VTRV9MSUJOVU1BLgogICAgICAgICAgICAoZW51bSBnb21wX251bWFfbWVt a2luZF9raW5kKTogUmVuYW1lZCBmcm9tIGdvbXBfbWVta2luZF9raW5kOwogICAgICAgICAg ICBhZGQgR09NUF9NRU1LSU5EX0xJQk5VTUEuCiAgICAgICAgICAgIChzdHJ1Y3QgZ29tcF9s aWJudW1hX2RhdGEsIGdvbXBfaW5pdF9saWJudW1hLCBnb21wX2dldF9saWJudW1hKTogTmV3 LgogICAgICAgICAgICAob21wX2luaXRfYWxsb2NhdG9yKTogSGFuZGxlIHBhcnRpdGlvbj1u ZWFyZXN0IHdpdGggbGlibnVtYSBpZiBhdmFpbC4KICAgICAgICAgICAgKG9tcF9hbGlnbmVk X2FsbG9jLCBvbXBfZnJlZSwgb21wX2FsaWduZWRfY2FsbG9jLCBvbXBfcmVhbGxvYyk6IEFk ZAogICAgICAgICAgICBudW1hX2FsbG9jX2xvY2FsICgrIG1lbXNldCksIG51bWFfZnJlZSwg YW5kIG51bWFfcmVhbGxvYyBjYWxscyBhcwogICAgICAgICAgICBuZWVkZWQuCiAgICAgICAg ICAgICogY29uZmlnL2xpbnV4L2FsbG9jYXRvci5jIChMSUJHT01QX1VTRV9MSUJOVU1BKTog RGVmaW5lCiAgICAgICAgICAgICogbGliZ29tcC50ZXhpOiBGaXggYSB0eXBvOyB1c2UgJ2Zp JyBpbnN0ZWFkIG9mIGl0cyBsaWdhdHVyZSBjaGFyLgogICAgICAgICAgICAoTWVtb3J5IGFs bG9jYXRpb24pOiBSZW5hbWVkIGZyb20gJ01lbW9yeSBhbGxvY2F0aW9uIHdpdGggbGlibWVt a2luZCc7CiAgICAgICAgICAgIHVwZGF0ZWQgZm9yIGxpYm51bWEgdXNhZ2UuCiAgICAgICAg ICAgICogdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2FsbG9jLTExLmM6IE5ldyB0 ZXN0LgogICAgICAgICAgICAqIHRlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9hbGxv Yy0xMi5jOiBOZXcgdGVzdC4KLS0tCiBsaWJnb21wL2FsbG9jYXRvci5jICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgMjAyICsrKysrKysrKysrKy0tLQogbGliZ29tcC9jb25m aWcvbGludXgvYWxsb2NhdG9yLmMgICAgICAgICAgICAgICAgICB8ICAgMSArCiBsaWJnb21w L2xpYmdvbXAudGV4aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDQyICsrKy0K IGxpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2FsbG9jLTExLmMgfCAy ODUgKysrKysrKysrKysrKysrKysrKysrKwogbGliZ29tcC90ZXN0c3VpdGUvbGliZ29tcC5j LWMrKy1jb21tb24vYWxsb2MtMTIuYyB8IDIxNyArKysrKysrKysrKysrKysrCiA1IGZpbGVz IGNoYW5nZWQsIDcwOCBpbnNlcnRpb25zKCspLCAzOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9saWJnb21wL2FsbG9jYXRvci5jIGIvbGliZ29tcC9hbGxvY2F0b3IuYwppbmRleCAy NWMwZjE1MDMwMi4uYjMxODdhYjI5MTEgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvYWxsb2NhdG9y LmMKKysrIGIvbGliZ29tcC9hbGxvY2F0b3IuYwpAQCAtMzEsMTMgKzMxLDEzIEBACiAjaW5j bHVkZSAibGliZ29tcC5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmlu Zy5oPgotI2lmZGVmIExJQkdPTVBfVVNFX01FTUtJTkQKKyNpZiBkZWZpbmVkKExJQkdPTVBf VVNFX01FTUtJTkQpIHx8IGRlZmluZWQoTElCR09NUF9VU0VfTElCTlVNQSkKICNpbmNsdWRl IDxkbGZjbi5oPgogI2VuZGlmCiAKICNkZWZpbmUgb21wX21heF9wcmVkZWZpbmVkX2FsbG9j IG9tcF90aHJlYWRfbWVtX2FsbG9jCiAKLWVudW0gZ29tcF9tZW1raW5kX2tpbmQKK2VudW0g Z29tcF9udW1hX21lbWtpbmRfa2luZAogewogICBHT01QX01FTUtJTkRfTk9ORSA9IDAsCiAj ZGVmaW5lIEdPTVBfTUVNS0lORF9LSU5EUyBcCkBAIC01MCw3ICs1MCw4IEBAIGVudW0gZ29t cF9tZW1raW5kX2tpbmQKICNkZWZpbmUgR09NUF9NRU1LSU5EX0tJTkQoa2luZCkgR09NUF9N RU1LSU5EXyMja2luZAogICBHT01QX01FTUtJTkRfS0lORFMsCiAjdW5kZWYgR09NUF9NRU1L SU5EX0tJTkQKLSAgR09NUF9NRU1LSU5EX0NPVU5UCisgIEdPTVBfTUVNS0lORF9DT1VOVCwK KyAgR09NUF9NRU1LSU5EX0xJQk5VTUEgPSBHT01QX01FTUtJTkRfQ09VTlQKIH07CiAKIHN0 cnVjdCBvbXBfYWxsb2NhdG9yX2RhdGEKQEAgLTY1LDcgKzY2LDcgQEAgc3RydWN0IG9tcF9h bGxvY2F0b3JfZGF0YQogICB1bnNpZ25lZCBpbnQgZmFsbGJhY2sgOiA4OwogICB1bnNpZ25l ZCBpbnQgcGlubmVkIDogMTsKICAgdW5zaWduZWQgaW50IHBhcnRpdGlvbiA6IDc7Ci0jaWZk ZWYgTElCR09NUF9VU0VfTUVNS0lORAorI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lO RCkgfHwgZGVmaW5lZChMSUJHT01QX1VTRV9MSUJOVU1BKQogICB1bnNpZ25lZCBpbnQgbWVt a2luZCA6IDg7CiAjZW5kaWYKICNpZm5kZWYgSEFWRV9TWU5DX0JVSUxUSU5TCkBAIC04MSw2 ICs4MiwxNCBAQCBzdHJ1Y3Qgb21wX21lbV9oZWFkZXIKICAgdm9pZCAqcGFkOwogfTsKIAor c3RydWN0IGdvbXBfbGlibnVtYV9kYXRhCit7CisgIHZvaWQgKm51bWFfaGFuZGxlOworICB2 b2lkICooKm51bWFfYWxsb2NfbG9jYWwpIChzaXplX3QpOworICB2b2lkICooKm51bWFfcmVh bGxvYykgKHZvaWQgKiwgc2l6ZV90LCBzaXplX3QpOworICB2b2lkICgqbnVtYV9mcmVlKSAo dm9pZCAqLCBzaXplX3QpOworfTsKKwogc3RydWN0IGdvbXBfbWVta2luZF9kYXRhCiB7CiAg IHZvaWQgKm1lbWtpbmRfaGFuZGxlOwpAQCAtOTIsNiArMTAxLDUwIEBAIHN0cnVjdCBnb21w X21lbWtpbmRfZGF0YQogICB2b2lkICoqa2luZHNbR09NUF9NRU1LSU5EX0NPVU5UXTsKIH07 CiAKKyNpZmRlZiBMSUJHT01QX1VTRV9MSUJOVU1BCitzdGF0aWMgc3RydWN0IGdvbXBfbGli bnVtYV9kYXRhICpsaWJudW1hX2RhdGE7CitzdGF0aWMgcHRocmVhZF9vbmNlX3QgbGlibnVt YV9kYXRhX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQKK2dvbXBf aW5pdF9saWJudW1hICh2b2lkKQoreworICB2b2lkICpoYW5kbGUgPSBkbG9wZW4gKCJsaWJu dW1hLnNvLjEiLCBSVExEX0xBWlkpOworICBzdHJ1Y3QgZ29tcF9saWJudW1hX2RhdGEgKmRh dGE7CisKKyAgZGF0YSA9IGNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgZ29tcF9saWJudW1h X2RhdGEpKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkKKyAgICB7CisgICAgICBpZiAoaGFuZGxl KQorCWRsY2xvc2UgKGhhbmRsZSk7CisgICAgICByZXR1cm47CisgICAgfQorICBpZiAoIWhh bmRsZSkKKyAgICB7CisgICAgICBfX2F0b21pY19zdG9yZV9uICgmbGlibnVtYV9kYXRhLCBk YXRhLCBNRU1NT0RFTF9SRUxFQVNFKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIGRhdGEt Pm51bWFfaGFuZGxlID0gaGFuZGxlOworICBkYXRhLT5udW1hX2FsbG9jX2xvY2FsCisgICAg PSAoX190eXBlb2YgKGRhdGEtPm51bWFfYWxsb2NfbG9jYWwpKSBkbHN5bSAoaGFuZGxlLCAi bnVtYV9hbGxvY19sb2NhbCIpOworICBkYXRhLT5udW1hX3JlYWxsb2MKKyAgICA9IChfX3R5 cGVvZiAoZGF0YS0+bnVtYV9yZWFsbG9jKSkgZGxzeW0gKGhhbmRsZSwgIm51bWFfcmVhbGxv YyIpOworICBkYXRhLT5udW1hX2ZyZWUKKyAgICA9IChfX3R5cGVvZiAoZGF0YS0+bnVtYV9m cmVlKSkgZGxzeW0gKGhhbmRsZSwgIm51bWFfZnJlZSIpOworICBfX2F0b21pY19zdG9yZV9u ICgmbGlibnVtYV9kYXRhLCBkYXRhLCBNRU1NT0RFTF9SRUxFQVNFKTsKK30KKworc3RhdGlj IHN0cnVjdCBnb21wX2xpYm51bWFfZGF0YSAqCitnb21wX2dldF9saWJudW1hICh2b2lkKQor eworICBzdHJ1Y3QgZ29tcF9saWJudW1hX2RhdGEgKmRhdGEKKyAgICA9IF9fYXRvbWljX2xv YWRfbiAoJmxpYm51bWFfZGF0YSwgTUVNTU9ERUxfQUNRVUlSRSk7CisgIGlmIChkYXRhKQor ICAgIHJldHVybiBkYXRhOworICBwdGhyZWFkX29uY2UgKCZsaWJudW1hX2RhdGFfb25jZSwg Z29tcF9pbml0X2xpYm51bWEpOworICByZXR1cm4gX19hdG9taWNfbG9hZF9uICgmbGlibnVt YV9kYXRhLCBNRU1NT0RFTF9BQ1FVSVJFKTsKK30KKyNlbmRpZgorCiAjaWZkZWYgTElCR09N UF9VU0VfTUVNS0lORAogc3RhdGljIHN0cnVjdCBnb21wX21lbWtpbmRfZGF0YSAqbWVta2lu ZF9kYXRhOwogc3RhdGljIHB0aHJlYWRfb25jZV90IG1lbWtpbmRfZGF0YV9vbmNlID0gUFRI UkVBRF9PTkNFX0lOSVQ7CkBAIC0xNjYsNyArMjE5LDcgQEAgb21wX2luaXRfYWxsb2NhdG9y IChvbXBfbWVtc3BhY2VfaGFuZGxlX3QgbWVtc3BhY2UsIGludCBudHJhaXRzLAogICBzdHJ1 Y3Qgb21wX2FsbG9jYXRvcl9kYXRhIGRhdGEKICAgICA9IHsgbWVtc3BhY2UsIDEsIH4odWlu dHB0cl90KSAwLCAwLCAwLCBvbXBfYXR2X2NvbnRlbmRlZCwgb21wX2F0dl9hbGwsCiAJb21w X2F0dl9kZWZhdWx0X21lbV9mYiwgb21wX2F0dl9mYWxzZSwgb21wX2F0dl9lbnZpcm9ubWVu dCwKLSNpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5ECisjaWYgZGVmaW5lZChMSUJHT01QX1VT RV9NRU1LSU5EKSB8fCBkZWZpbmVkKExJQkdPTVBfVVNFX0xJQk5VTUEpCiAJR09NUF9NRU1L SU5EX05PTkUKICNlbmRpZgogICAgICAgfTsKQEAgLTI4NSw4ICszMzgsOCBAQCBvbXBfaW5p dF9hbGxvY2F0b3IgKG9tcF9tZW1zcGFjZV9oYW5kbGVfdCBtZW1zcGFjZSwgaW50IG50cmFp dHMsCiAKICAgc3dpdGNoIChtZW1zcGFjZSkKICAgICB7Ci0gICAgY2FzZSBvbXBfaGlnaF9i d19tZW1fc3BhY2U6CiAjaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAorICAgIGNhc2Ugb21w X2hpZ2hfYndfbWVtX3NwYWNlOgogICAgICAgc3RydWN0IGdvbXBfbWVta2luZF9kYXRhICpt ZW1raW5kX2RhdGE7CiAgICAgICBtZW1raW5kX2RhdGEgPSBnb21wX2dldF9tZW1raW5kICgp OwogICAgICAgaWYgKGRhdGEucGFydGl0aW9uID09IG9tcF9hdHZfaW50ZXJsZWF2ZWQKQEAg LTMwMCwxNyArMzUzLDE1IEBAIG9tcF9pbml0X2FsbG9jYXRvciAob21wX21lbXNwYWNlX2hh bmRsZV90IG1lbXNwYWNlLCBpbnQgbnRyYWl0cywKIAkgIGRhdGEubWVta2luZCA9IEdPTVBf TUVNS0lORF9IQldfUFJFRkVSUkVEOwogCSAgYnJlYWs7CiAJfQotI2VuZGlmCiAgICAgICBi cmVhazsKICAgICBjYXNlIG9tcF9sYXJnZV9jYXBfbWVtX3NwYWNlOgotI2lmZGVmIExJQkdP TVBfVVNFX01FTUtJTkQKICAgICAgIG1lbWtpbmRfZGF0YSA9IGdvbXBfZ2V0X21lbWtpbmQg KCk7CiAgICAgICBpZiAobWVta2luZF9kYXRhLT5raW5kc1tHT01QX01FTUtJTkRfREFYX0tN RU1fQUxMXSkKIAlkYXRhLm1lbWtpbmQgPSBHT01QX01FTUtJTkRfREFYX0tNRU1fQUxMOwog ICAgICAgZWxzZSBpZiAobWVta2luZF9kYXRhLT5raW5kc1tHT01QX01FTUtJTkRfREFYX0tN RU1dKQogCWRhdGEubWVta2luZCA9IEdPTVBfTUVNS0lORF9EQVhfS01FTTsKLSNlbmRpZgog ICAgICAgYnJlYWs7CisjZW5kaWYKICAgICBkZWZhdWx0OgogI2lmZGVmIExJQkdPTVBfVVNF X01FTUtJTkQKICAgICAgIGlmIChkYXRhLnBhcnRpdGlvbiA9PSBvbXBfYXR2X2ludGVybGVh dmVkKQpAQCAtMzIzLDYgKzM3NCwxNCBAQCBvbXBfaW5pdF9hbGxvY2F0b3IgKG9tcF9tZW1z cGFjZV9oYW5kbGVfdCBtZW1zcGFjZSwgaW50IG50cmFpdHMsCiAgICAgICBicmVhazsKICAg ICB9CiAKKyNpZmRlZiBMSUJHT01QX1VTRV9MSUJOVU1BCisgIGlmIChkYXRhLm1lbWtpbmQg PT0gR09NUF9NRU1LSU5EX05PTkUgJiYgZGF0YS5wYXJ0aXRpb24gPT0gb21wX2F0dl9uZWFy ZXN0KQorICAgIHsKKyAgICAgIGRhdGEubWVta2luZCA9IEdPTVBfTUVNS0lORF9MSUJOVU1B OworICAgICAgbGlibnVtYV9kYXRhID0gZ29tcF9nZXRfbGlibnVtYSAoKTsKKyAgICB9Cisj ZW5kaWYKKwogICAvKiBObyBzdXBwb3J0IGZvciB0aGlzIHNvIGZhci4gICovCiAgIGlmIChk YXRhLnBpbm5lZCkKICAgICByZXR1cm4gb21wX251bGxfYWxsb2NhdG9yOwpAQCAtMzU3LDgg KzQxNiw4IEBAIG9tcF9hbGlnbmVkX2FsbG9jIChzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qg c2l6ZSwKICAgc3RydWN0IG9tcF9hbGxvY2F0b3JfZGF0YSAqYWxsb2NhdG9yX2RhdGE7CiAg IHNpemVfdCBuZXdfc2l6ZSwgbmV3X2FsaWdubWVudDsKICAgdm9pZCAqcHRyLCAqcmV0Owot I2lmZGVmIExJQkdPTVBfVVNFX01FTUtJTkQKLSAgZW51bSBnb21wX21lbWtpbmRfa2luZCBt ZW1raW5kOworI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lORCkgfHwgZGVmaW5lZChM SUJHT01QX1VTRV9MSUJOVU1BKQorICBlbnVtIGdvbXBfbnVtYV9tZW1raW5kX2tpbmQgbWVt a2luZDsKICNlbmRpZgogCiAgIGlmIChfX2J1aWx0aW5fZXhwZWN0IChzaXplID09IDAsIDAp KQpAQCAtMzc5LDcgKzQzOCw3IEBAIHJldHJ5OgogICAgICAgYWxsb2NhdG9yX2RhdGEgPSAo c3RydWN0IG9tcF9hbGxvY2F0b3JfZGF0YSAqKSBhbGxvY2F0b3I7CiAgICAgICBpZiAobmV3 X2FsaWdubWVudCA8IGFsbG9jYXRvcl9kYXRhLT5hbGlnbm1lbnQpCiAJbmV3X2FsaWdubWVu dCA9IGFsbG9jYXRvcl9kYXRhLT5hbGlnbm1lbnQ7Ci0jaWZkZWYgTElCR09NUF9VU0VfTUVN S0lORAorI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lORCkgfHwgZGVmaW5lZChMSUJH T01QX1VTRV9MSUJOVU1BKQogICAgICAgbWVta2luZCA9IGFsbG9jYXRvcl9kYXRhLT5tZW1r aW5kOwogI2VuZGlmCiAgICAgfQpAQCAtMzg4LDggKzQ0NywxMCBAQCByZXRyeToKICAgICAg IGFsbG9jYXRvcl9kYXRhID0gTlVMTDsKICAgICAgIGlmIChuZXdfYWxpZ25tZW50IDwgc2l6 ZW9mICh2b2lkICopKQogCW5ld19hbGlnbm1lbnQgPSBzaXplb2YgKHZvaWQgKik7Ci0jaWZk ZWYgTElCR09NUF9VU0VfTUVNS0lORAorI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lO RCkgfHwgZGVmaW5lZChMSUJHT01QX1VTRV9MSUJOVU1BKQogICAgICAgbWVta2luZCA9IEdP TVBfTUVNS0lORF9OT05FOworI2VuZGlmCisjaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAog ICAgICAgaWYgKGFsbG9jYXRvciA9PSBvbXBfaGlnaF9id19tZW1fYWxsb2MpCiAJbWVta2lu ZCA9IEdPTVBfTUVNS0lORF9IQldfUFJFRkVSUkVEOwogICAgICAgZWxzZSBpZiAoYWxsb2Nh dG9yID09IG9tcF9sYXJnZV9jYXBfbWVtX2FsbG9jKQpAQCAtNDQ0LDYgKzUwNSwxMyBAQCBy ZXRyeToKICAgICAgIGFsbG9jYXRvcl9kYXRhLT51c2VkX3Bvb2xfc2l6ZSA9IHVzZWRfcG9v bF9zaXplOwogICAgICAgZ29tcF9tdXRleF91bmxvY2sgKCZhbGxvY2F0b3JfZGF0YS0+bG9j ayk7CiAjZW5kaWYKKyNpZmRlZiBMSUJHT01QX1VTRV9MSUJOVU1BCisgICAgICBpZiAobWVt a2luZCA9PSBHT01QX01FTUtJTkRfTElCTlVNQSkKKwlwdHIgPSBsaWJudW1hX2RhdGEtPm51 bWFfYWxsb2NfbG9jYWwgKG5ld19zaXplKTsKKyMgaWZkZWYgTElCR09NUF9VU0VfTUVNS0lO RAorICAgICAgZWxzZQorIyBlbmRpZgorI2VuZGlmCiAjaWZkZWYgTElCR09NUF9VU0VfTUVN S0lORAogICAgICAgaWYgKG1lbWtpbmQpCiAJewpAQCAtNDY5LDYgKzUzNywxMyBAQCByZXRy eToKICAgICB9CiAgIGVsc2UKICAgICB7CisjaWZkZWYgTElCR09NUF9VU0VfTElCTlVNQQor ICAgICAgaWYgKG1lbWtpbmQgPT0gR09NUF9NRU1LSU5EX0xJQk5VTUEpCisJcHRyID0gbGli bnVtYV9kYXRhLT5udW1hX2FsbG9jX2xvY2FsIChuZXdfc2l6ZSk7CisjIGlmZGVmIExJQkdP TVBfVVNFX01FTUtJTkQKKyAgICAgIGVsc2UKKyMgZW5kaWYKKyNlbmRpZgogI2lmZGVmIExJ QkdPTVBfVVNFX01FTUtJTkQKICAgICAgIGlmIChtZW1raW5kKQogCXsKQEAgLTUwMiw3ICs1 NzcsNyBAQCBmYWlsOgogCXsKIAljYXNlIG9tcF9hdHZfZGVmYXVsdF9tZW1fZmI6CiAJICBp ZiAoKG5ld19hbGlnbm1lbnQgPiBzaXplb2YgKHZvaWQgKikgJiYgbmV3X2FsaWdubWVudCA+ IGFsaWdubWVudCkKLSNpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5ECisjaWYgZGVmaW5lZChM SUJHT01QX1VTRV9NRU1LSU5EKSB8fCBkZWZpbmVkKExJQkdPTVBfVVNFX0xJQk5VTUEpCiAJ ICAgICAgfHwgbWVta2luZAogI2VuZGlmCiAJICAgICAgfHwgKGFsbG9jYXRvcl9kYXRhCkBA IC01NzcsNiArNjUyLDE2IEBAIG9tcF9mcmVlICh2b2lkICpwdHIsIG9tcF9hbGxvY2F0b3Jf aGFuZGxlX3QgYWxsb2NhdG9yKQogCSAgZ29tcF9tdXRleF91bmxvY2sgKCZhbGxvY2F0b3Jf ZGF0YS0+bG9jayk7CiAjZW5kaWYKIAl9CisjaWZkZWYgTElCR09NUF9VU0VfTElCTlVNQQor ICAgICAgaWYgKGFsbG9jYXRvcl9kYXRhLT5tZW1raW5kID09IEdPTVBfTUVNS0lORF9MSUJO VU1BKQorCXsKKwkgIGxpYm51bWFfZGF0YS0+bnVtYV9mcmVlIChkYXRhLT5wdHIsIGRhdGEt PnNpemUpOworCSAgcmV0dXJuOworCX0KKyMgaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAor ICAgICAgZWxzZQorIyBlbmRpZgorI2VuZGlmCiAjaWZkZWYgTElCR09NUF9VU0VfTUVNS0lO RAogICAgICAgaWYgKGFsbG9jYXRvcl9kYXRhLT5tZW1raW5kKQogCXsKQEAgLTU5MCw3ICs2 NzUsNyBAQCBvbXBfZnJlZSAodm9pZCAqcHRyLCBvbXBfYWxsb2NhdG9yX2hhbmRsZV90IGFs bG9jYXRvcikKICNpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5ECiAgIGVsc2UKICAgICB7Ci0g ICAgICBlbnVtIGdvbXBfbWVta2luZF9raW5kIG1lbWtpbmQgPSBHT01QX01FTUtJTkRfTk9O RTsKKyAgICAgIGVudW0gZ29tcF9udW1hX21lbWtpbmRfa2luZCBtZW1raW5kID0gR09NUF9N RU1LSU5EX05PTkU7CiAgICAgICBpZiAoZGF0YS0+YWxsb2NhdG9yID09IG9tcF9oaWdoX2J3 X21lbV9hbGxvYykKIAltZW1raW5kID0gR09NUF9NRU1LSU5EX0hCV19QUkVGRVJSRUQ7CiAg ICAgICBlbHNlIGlmIChkYXRhLT5hbGxvY2F0b3IgPT0gb21wX2xhcmdlX2NhcF9tZW1fYWxs b2MpCkBAIC02MjUsOCArNzEwLDggQEAgb21wX2FsaWduZWRfY2FsbG9jIChzaXplX3QgYWxp Z25tZW50LCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplLAogICBzdHJ1Y3Qgb21wX2FsbG9j YXRvcl9kYXRhICphbGxvY2F0b3JfZGF0YTsKICAgc2l6ZV90IG5ld19zaXplLCBzaXplX3Rl bXAsIG5ld19hbGlnbm1lbnQ7CiAgIHZvaWQgKnB0ciwgKnJldDsKLSNpZmRlZiBMSUJHT01Q X1VTRV9NRU1LSU5ECi0gIGVudW0gZ29tcF9tZW1raW5kX2tpbmQgbWVta2luZDsKKyNpZiBk ZWZpbmVkKExJQkdPTVBfVVNFX01FTUtJTkQpIHx8IGRlZmluZWQoTElCR09NUF9VU0VfTElC TlVNQSkKKyAgZW51bSBnb21wX251bWFfbWVta2luZF9raW5kIG1lbWtpbmQ7CiAjZW5kaWYK IAogICBpZiAoX19idWlsdGluX2V4cGVjdCAoc2l6ZSA9PSAwIHx8IG5tZW1iID09IDAsIDAp KQpAQCAtNjQ3LDcgKzczMiw3IEBAIHJldHJ5OgogICAgICAgYWxsb2NhdG9yX2RhdGEgPSAo c3RydWN0IG9tcF9hbGxvY2F0b3JfZGF0YSAqKSBhbGxvY2F0b3I7CiAgICAgICBpZiAobmV3 X2FsaWdubWVudCA8IGFsbG9jYXRvcl9kYXRhLT5hbGlnbm1lbnQpCiAJbmV3X2FsaWdubWVu dCA9IGFsbG9jYXRvcl9kYXRhLT5hbGlnbm1lbnQ7Ci0jaWZkZWYgTElCR09NUF9VU0VfTUVN S0lORAorI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lORCkgfHwgZGVmaW5lZChMSUJH T01QX1VTRV9MSUJOVU1BKQogICAgICAgbWVta2luZCA9IGFsbG9jYXRvcl9kYXRhLT5tZW1r aW5kOwogI2VuZGlmCiAgICAgfQpAQCAtNjU2LDggKzc0MSwxMCBAQCByZXRyeToKICAgICAg IGFsbG9jYXRvcl9kYXRhID0gTlVMTDsKICAgICAgIGlmIChuZXdfYWxpZ25tZW50IDwgc2l6 ZW9mICh2b2lkICopKQogCW5ld19hbGlnbm1lbnQgPSBzaXplb2YgKHZvaWQgKik7Ci0jaWZk ZWYgTElCR09NUF9VU0VfTUVNS0lORAorI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lO RCkgfHwgZGVmaW5lZChMSUJHT01QX1VTRV9MSUJOVU1BKQogICAgICAgbWVta2luZCA9IEdP TVBfTUVNS0lORF9OT05FOworI2VuZGlmCisjaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAog ICAgICAgaWYgKGFsbG9jYXRvciA9PSBvbXBfaGlnaF9id19tZW1fYWxsb2MpCiAJbWVta2lu ZCA9IEdPTVBfTUVNS0lORF9IQldfUFJFRkVSUkVEOwogICAgICAgZWxzZSBpZiAoYWxsb2Nh dG9yID09IG9tcF9sYXJnZV9jYXBfbWVtX2FsbG9jKQpAQCAtNzE0LDYgKzgwMSwxNSBAQCBy ZXRyeToKICAgICAgIGFsbG9jYXRvcl9kYXRhLT51c2VkX3Bvb2xfc2l6ZSA9IHVzZWRfcG9v bF9zaXplOwogICAgICAgZ29tcF9tdXRleF91bmxvY2sgKCZhbGxvY2F0b3JfZGF0YS0+bG9j ayk7CiAjZW5kaWYKKyNpZmRlZiBMSUJHT01QX1VTRV9MSUJOVU1BCisgICAgICBpZiAobWVt a2luZCA9PSBHT01QX01FTUtJTkRfTElCTlVNQSkKKwkvKiBudW1hX2FsbG9jX2xvY2FsIHVz ZXMgbW1hcCB3aXRoIE1BUF9BTk9OWU1PVVMsIHJldHVybmluZworCSAgIG1lbW9yeSB0aGF0 IGlzIGluaXRpYWxpemVkIHRvIHplcm8uICAqLworCXB0ciA9IGxpYm51bWFfZGF0YS0+bnVt YV9hbGxvY19sb2NhbCAobmV3X3NpemUpOworIyBpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5E CisgICAgICBlbHNlCisjIGVuZGlmCisjZW5kaWYKICNpZmRlZiBMSUJHT01QX1VTRV9NRU1L SU5ECiAgICAgICBpZiAobWVta2luZCkKIAl7CkBAIC03MzksNiArODM1LDE1IEBAIHJldHJ5 OgogICAgIH0KICAgZWxzZQogICAgIHsKKyNpZmRlZiBMSUJHT01QX1VTRV9MSUJOVU1BCisg ICAgICBpZiAobWVta2luZCA9PSBHT01QX01FTUtJTkRfTElCTlVNQSkKKwkvKiBudW1hX2Fs bG9jX2xvY2FsIHVzZXMgbW1hcCB3aXRoIE1BUF9BTk9OWU1PVVMsIHJldHVybmluZworCSAg IG1lbW9yeSB0aGF0IGlzIGluaXRpYWxpemVkIHRvIHplcm8uICAqLworCXB0ciA9IGxpYm51 bWFfZGF0YS0+bnVtYV9hbGxvY19sb2NhbCAobmV3X3NpemUpOworIyBpZmRlZiBMSUJHT01Q X1VTRV9NRU1LSU5ECisgICAgICBlbHNlCisjIGVuZGlmCisjZW5kaWYKICNpZmRlZiBMSUJH T01QX1VTRV9NRU1LSU5ECiAgICAgICBpZiAobWVta2luZCkKIAl7CkBAIC03NzIsNyArODc3 LDcgQEAgZmFpbDoKIAl7CiAJY2FzZSBvbXBfYXR2X2RlZmF1bHRfbWVtX2ZiOgogCSAgaWYg KChuZXdfYWxpZ25tZW50ID4gc2l6ZW9mICh2b2lkICopICYmIG5ld19hbGlnbm1lbnQgPiBh bGlnbm1lbnQpCi0jaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAorI2lmIGRlZmluZWQoTElC R09NUF9VU0VfTUVNS0lORCkgfHwgZGVmaW5lZChMSUJHT01QX1VTRV9MSUJOVU1BKQogCSAg ICAgIHx8IG1lbWtpbmQKICNlbmRpZgogCSAgICAgIHx8IChhbGxvY2F0b3JfZGF0YQpAQCAt ODE1LDggKzkyMCw4IEBAIG9tcF9yZWFsbG9jICh2b2lkICpwdHIsIHNpemVfdCBzaXplLCBv bXBfYWxsb2NhdG9yX2hhbmRsZV90IGFsbG9jYXRvciwKICAgc2l6ZV90IG5ld19zaXplLCBv bGRfc2l6ZSwgbmV3X2FsaWdubWVudCwgb2xkX2FsaWdubWVudDsKICAgdm9pZCAqbmV3X3B0 ciwgKnJldDsKICAgc3RydWN0IG9tcF9tZW1faGVhZGVyICpkYXRhOwotI2lmZGVmIExJQkdP TVBfVVNFX01FTUtJTkQKLSAgZW51bSBnb21wX21lbWtpbmRfa2luZCBtZW1raW5kLCBmcmVl X21lbWtpbmQ7CisjaWYgZGVmaW5lZChMSUJHT01QX1VTRV9NRU1LSU5EKSB8fCBkZWZpbmVk KExJQkdPTVBfVVNFX0xJQk5VTUEpCisgIGVudW0gZ29tcF9udW1hX21lbWtpbmRfa2luZCBt ZW1raW5kLCBmcmVlX21lbWtpbmQ7CiAjZW5kaWYKIAogICBpZiAoX19idWlsdGluX2V4cGVj dCAocHRyID09IE5VTEwsIDApKQpAQCAtODQxLDE1ICs5NDYsMTcgQEAgcmV0cnk6CiAgICAg ICBhbGxvY2F0b3JfZGF0YSA9IChzdHJ1Y3Qgb21wX2FsbG9jYXRvcl9kYXRhICopIGFsbG9j YXRvcjsKICAgICAgIGlmIChuZXdfYWxpZ25tZW50IDwgYWxsb2NhdG9yX2RhdGEtPmFsaWdu bWVudCkKIAluZXdfYWxpZ25tZW50ID0gYWxsb2NhdG9yX2RhdGEtPmFsaWdubWVudDsKLSNp ZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5ECisjaWYgZGVmaW5lZChMSUJHT01QX1VTRV9NRU1L SU5EKSB8fCBkZWZpbmVkKExJQkdPTVBfVVNFX0xJQk5VTUEpCiAgICAgICBtZW1raW5kID0g YWxsb2NhdG9yX2RhdGEtPm1lbWtpbmQ7CiAjZW5kaWYKICAgICB9CiAgIGVsc2UKICAgICB7 CiAgICAgICBhbGxvY2F0b3JfZGF0YSA9IE5VTEw7Ci0jaWZkZWYgTElCR09NUF9VU0VfTUVN S0lORAorI2lmIGRlZmluZWQoTElCR09NUF9VU0VfTUVNS0lORCkgfHwgZGVmaW5lZChMSUJH T01QX1VTRV9MSUJOVU1BKQogICAgICAgbWVta2luZCA9IEdPTVBfTUVNS0lORF9OT05FOwor I2VuZGlmCisjaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAogICAgICAgaWYgKGFsbG9jYXRv ciA9PSBvbXBfaGlnaF9id19tZW1fYWxsb2MpCiAJbWVta2luZCA9IEdPTVBfTUVNS0lORF9I QldfUFJFRkVSUkVEOwogICAgICAgZWxzZSBpZiAoYWxsb2NhdG9yID09IG9tcF9sYXJnZV9j YXBfbWVtX2FsbG9jKQpAQCAtODY1LDE1ICs5NzIsMTcgQEAgcmV0cnk6CiAgIGlmIChmcmVl X2FsbG9jYXRvciA+IG9tcF9tYXhfcHJlZGVmaW5lZF9hbGxvYykKICAgICB7CiAgICAgICBm cmVlX2FsbG9jYXRvcl9kYXRhID0gKHN0cnVjdCBvbXBfYWxsb2NhdG9yX2RhdGEgKikgZnJl ZV9hbGxvY2F0b3I7Ci0jaWZkZWYgTElCR09NUF9VU0VfTUVNS0lORAorI2lmIGRlZmluZWQo TElCR09NUF9VU0VfTUVNS0lORCkgfHwgZGVmaW5lZChMSUJHT01QX1VTRV9MSUJOVU1BKQog ICAgICAgZnJlZV9tZW1raW5kID0gZnJlZV9hbGxvY2F0b3JfZGF0YS0+bWVta2luZDsKICNl bmRpZgogICAgIH0KICAgZWxzZQogICAgIHsKICAgICAgIGZyZWVfYWxsb2NhdG9yX2RhdGEg PSBOVUxMOwotI2lmZGVmIExJQkdPTVBfVVNFX01FTUtJTkQKKyNpZiBkZWZpbmVkKExJQkdP TVBfVVNFX01FTUtJTkQpIHx8IGRlZmluZWQoTElCR09NUF9VU0VfTElCTlVNQSkKICAgICAg IGZyZWVfbWVta2luZCA9IEdPTVBfTUVNS0lORF9OT05FOworI2VuZGlmCisjaWZkZWYgTElC R09NUF9VU0VfTUVNS0lORAogICAgICAgaWYgKGZyZWVfYWxsb2NhdG9yID09IG9tcF9oaWdo X2J3X21lbV9hbGxvYykKIAlmcmVlX21lbWtpbmQgPSBHT01QX01FTUtJTkRfSEJXX1BSRUZF UlJFRDsKICAgICAgIGVsc2UgaWYgKGZyZWVfYWxsb2NhdG9yID09IG9tcF9sYXJnZV9jYXBf bWVtX2FsbG9jKQpAQCAtOTUzLDYgKzEwNjIsMTkgQEAgcmV0cnk6CiAgICAgICBhbGxvY2F0 b3JfZGF0YS0+dXNlZF9wb29sX3NpemUgPSB1c2VkX3Bvb2xfc2l6ZTsKICAgICAgIGdvbXBf bXV0ZXhfdW5sb2NrICgmYWxsb2NhdG9yX2RhdGEtPmxvY2spOwogI2VuZGlmCisjaWZkZWYg TElCR09NUF9VU0VfTElCTlVNQQorICAgICAgaWYgKG1lbWtpbmQgPT0gR09NUF9NRU1LSU5E X0xJQk5VTUEpCisJeworCSAgaWYgKHByZXZfc2l6ZSkKKwkgICAgbmV3X3B0ciA9IGxpYm51 bWFfZGF0YS0+bnVtYV9yZWFsbG9jIChkYXRhLT5wdHIsIGRhdGEtPnNpemUsCisJCQkJCQkg IG5ld19zaXplKTsKKwkgIGVsc2UKKwkgICAgbmV3X3B0ciA9IGxpYm51bWFfZGF0YS0+bnVt YV9hbGxvY19sb2NhbCAobmV3X3NpemUpOworCX0KKyMgaWZkZWYgTElCR09NUF9VU0VfTUVN S0lORAorICAgICAgZWxzZQorIyBlbmRpZgorI2VuZGlmCiAjaWZkZWYgTElCR09NUF9VU0Vf TUVNS0lORAogICAgICAgaWYgKG1lbWtpbmQpCiAJewpAQCAtOTk0LDEyICsxMTE2LDE5IEBA IHJldHJ5OgogICAgIH0KICAgZWxzZSBpZiAobmV3X2FsaWdubWVudCA9PSBzaXplb2YgKHZv aWQgKikKIAkgICAmJiBvbGRfYWxpZ25tZW50ID09IHNpemVvZiAoc3RydWN0IG9tcF9tZW1f aGVhZGVyKQotI2lmZGVmIExJQkdPTVBfVVNFX01FTUtJTkQKKyNpZiBkZWZpbmVkKExJQkdP TVBfVVNFX01FTUtJTkQpIHx8IGRlZmluZWQoTElCR09NUF9VU0VfTElCTlVNQSkKIAkgICAm JiBtZW1raW5kID09IGZyZWVfbWVta2luZAogI2VuZGlmCiAJICAgJiYgKGZyZWVfYWxsb2Nh dG9yX2RhdGEgPT0gTlVMTAogCSAgICAgICB8fCBmcmVlX2FsbG9jYXRvcl9kYXRhLT5wb29s X3NpemUgPT0gfih1aW50cHRyX3QpIDApKQogICAgIHsKKyNpZmRlZiBMSUJHT01QX1VTRV9M SUJOVU1BCisgICAgICBpZiAobWVta2luZCA9PSBHT01QX01FTUtJTkRfTElCTlVNQSkKKwlu ZXdfcHRyID0gbGlibnVtYV9kYXRhLT5udW1hX3JlYWxsb2MgKGRhdGEtPnB0ciwgZGF0YS0+ c2l6ZSwgbmV3X3NpemUpOworIyBpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5ECisgICAgICBl bHNlCisjIGVuZGlmCisjZW5kaWYKICNpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5ECiAgICAg ICBpZiAobWVta2luZCkKIAl7CkBAIC0xMDIxLDYgKzExNTAsMTMgQEAgcmV0cnk6CiAgICAg fQogICBlbHNlCiAgICAgeworI2lmZGVmIExJQkdPTVBfVVNFX0xJQk5VTUEKKyAgICAgIGlm IChtZW1raW5kID09IEdPTVBfTUVNS0lORF9MSUJOVU1BKQorCW5ld19wdHIgPSBsaWJudW1h X2RhdGEtPm51bWFfYWxsb2NfbG9jYWwgKG5ld19zaXplKTsKKyMgaWZkZWYgTElCR09NUF9V U0VfTUVNS0lORAorICAgICAgZWxzZQorIyBlbmRpZgorI2VuZGlmCiAjaWZkZWYgTElCR09N UF9VU0VfTUVNS0lORAogICAgICAgaWYgKG1lbWtpbmQpCiAJewpAQCAtMTA2MCw2ICsxMTk2 LDE2IEBAIHJldHJ5OgogICAgICAgZ29tcF9tdXRleF91bmxvY2sgKCZmcmVlX2FsbG9jYXRv cl9kYXRhLT5sb2NrKTsKICNlbmRpZgogICAgIH0KKyNpZmRlZiBMSUJHT01QX1VTRV9MSUJO VU1BCisgIGlmIChmcmVlX21lbWtpbmQgPT0gR09NUF9NRU1LSU5EX0xJQk5VTUEpCisgICAg eworICAgICAgbGlibnVtYV9kYXRhLT5udW1hX2ZyZWUgKGRhdGEtPnB0ciwgZGF0YS0+c2l6 ZSk7CisgICAgICByZXR1cm4gcmV0OworICAgIH0KKyMgaWZkZWYgTElCR09NUF9VU0VfTUVN S0lORAorICBlbHNlCisjIGVuZGlmCisjZW5kaWYKICNpZmRlZiBMSUJHT01QX1VTRV9NRU1L SU5ECiAgIGlmIChmcmVlX21lbWtpbmQpCiAgICAgewpAQCAtMTA3OSw3ICsxMjI1LDcgQEAg ZmFpbDoKIAl7CiAJY2FzZSBvbXBfYXR2X2RlZmF1bHRfbWVtX2ZiOgogCSAgaWYgKG5ld19h bGlnbm1lbnQgPiBzaXplb2YgKHZvaWQgKikKLSNpZmRlZiBMSUJHT01QX1VTRV9NRU1LSU5E CisjaWYgZGVmaW5lZChMSUJHT01QX1VTRV9NRU1LSU5EKSB8fCBkZWZpbmVkKExJQkdPTVBf VVNFX0xJQk5VTUEpCiAJICAgICAgfHwgbWVta2luZAogI2VuZGlmCiAJICAgICAgfHwgKGFs bG9jYXRvcl9kYXRhCmRpZmYgLS1naXQgYS9saWJnb21wL2NvbmZpZy9saW51eC9hbGxvY2F0 b3IuYyBiL2xpYmdvbXAvY29uZmlnL2xpbnV4L2FsbG9jYXRvci5jCmluZGV4IDE1YmFiY2Qx YWRhLi42NGIxYjRiOTYyMyAxMDA2NDQKLS0tIGEvbGliZ29tcC9jb25maWcvbGludXgvYWxs b2NhdG9yLmMKKysrIGIvbGliZ29tcC9jb25maWcvbGludXgvYWxsb2NhdG9yLmMKQEAgLTMx LDYgKzMxLDcgQEAKICNpbmNsdWRlICJsaWJnb21wLmgiCiAjaWYgZGVmaW5lZChQTFVHSU5f U1VQUE9SVCkgJiYgZGVmaW5lZChMSUJHT01QX1VTRV9QVEhSRUFEUykKICNkZWZpbmUgTElC R09NUF9VU0VfTUVNS0lORAorI2RlZmluZSBMSUJHT01QX1VTRV9MSUJOVU1BCiAjZW5kaWYK IAogI2luY2x1ZGUgIi4uLy4uL2FsbG9jYXRvci5jIgpkaWZmIC0tZ2l0IGEvbGliZ29tcC9s aWJnb21wLnRleGkgYi9saWJnb21wL2xpYmdvbXAudGV4aQppbmRleCBkMWE1ZTY3MzI5YS4u OWQ5MTBlNjg4M2MgMTAwNjQ0Ci0tLSBhL2xpYmdvbXAvbGliZ29tcC50ZXhpCisrKyBiL2xp YmdvbXAvbGliZ29tcC50ZXhpCkBAIC0yMDYxLDcgKzIwNjEsNyBAQCBTcGVjaWFsIHZhbHVl cyBhcmUgb3V0cHV0IHVzaW5nIEBjb2RleyV9IGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIHNp emUKIHNwZWNpZmljYXRpb24gYW5kIHRoZW4gZWl0aGVyIHRoZSBzaW5nbGUtY2hhcmFjdGVy IGZpZWxkIHR5cGUgb3IgaXRzIGxvbmcKIG5hbWUgZW5jbG9zZWQgaW4gY3VybHkgYnJhY2Vz OyB1c2luZyBAY29kZXslJX0gd2lsbCBkaXNwbGF5IGEgbGl0ZXJhbCBwZXJjZW50LgogVGhl IHNpemUgc3BlY2lmaWNhdGlvbiBjb25zaXN0cyBvZiBhbiBvcHRpb25hbCBAY29kZXswLn0g b3IgQGNvZGV7Ln0gZm9sbG93ZWQKLWJ5IGEgcG9zaXRpdmUgaW50ZWdlciwgc3BlY2lmaW5n IHRoZSBtaW5pbWFsIHdpZHRoIG9mIHRoZSBvdXRwdXQuICBXaXRoCitieSBhIHBvc2l0aXZl IGludGVnZXIsIHNwZWNpZnlpbmcgdGhlIG1pbmltYWwgd2lkdGggb2YgdGhlIG91dHB1dC4g IFdpdGgKIEBjb2RlezAufSBhbmQgbnVtZXJpY2FsIHZhbHVlcywgdGhlIG91dHB1dCBpcyBw YWRkZWQgd2l0aCB6ZXJvcyBvbiB0aGUgbGVmdDsKIHdpdGggQGNvZGV7Ln0sIHRoZSBvdXRw dXQgaXMgcGFkZGVkIGJ5IHNwYWNlcyBvbiB0aGUgbGVmdDsgb3RoZXJ3aXNlLCB0aGUKIG91 dHB1dCBpcyBwYWRkZWQgYnkgc3BhY2VzIG9uIHRoZSByaWdodC4gIElmIHVuc2V0LCB0aGUg dmFsdWUgaXMKQEAgLTIwNzksOCArMjA3OSw4IEBAIFN1cHBvcnRlZCBmaWVsZCB0eXBlcyBh cmU6CiAgICAgICBAdGFiIHZhbHVlIHJldHVybmVkIGJ5CiAgICAgICAgICAgIEBjb2Rle29t cF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShvbXBfZ2V0X2xldmVsKCktMSl9CiBAaXRlbSBI IEB0YWIgaG9zdCBAdGFiIG5hbWUgb2YgdGhlIGhvc3QgdGhhdCBleGVjdXRlcyB0aGUgdGhy ZWFkCi1AaXRlbSBQIEB0YWIgcHJvY2Vzc19pZCBAdGFiIHByb2Nlc3MgaWRlbnRp76yBZXIK LUBpdGVtIGkgQHRhYiBuYXRpdmVfdGhyZWFkX2lkIEB0YWIgbmF0aXZlIHRocmVhZCBpZGVu dGnvrIFlcgorQGl0ZW0gUCBAdGFiIHByb2Nlc3NfaWQgQHRhYiBwcm9jZXNzIGlkZW50aWZp ZXIKK0BpdGVtIGkgQHRhYiBuYXRpdmVfdGhyZWFkX2lkIEB0YWIgbmF0aXZlIHRocmVhZCBp ZGVudGlmaWVyCiBAaXRlbSBBIEB0YWIgdGhyZWFkX2FmZmluaXR5CiAgICAgICBAdGFiIGNv bW1hIHNlcGFyYXRlZCBsaXN0IG9mIGludGVnZXIgdmFsdWVzIG9yIHJhbmdlcywgcmVwcmVz ZW50aW5nIHRoZQogICAgICAgICAgICBwcm9jZXNzb3JzIG9uIHdoaWNoIGEgcHJvY2VzcyBt aWdodCBleGVjdXRlLCBzdWJqZWN0IHRvIGFmZmluaXR5CkBAIC00NTg0LDcgKzQ1ODQsNyBA QCBvZmZsb2FkaW5nIGRldmljZXMgKGl0J3Mgbm90IGNsZWFyIGlmIHRoZXkgc2hvdWxkIGJl KToKIEBtZW51CiAqIEltcGxlbWVudGF0aW9uLWRlZmluZWQgSUNWIEluaXRpYWxpemF0aW9u OjoKICogT3Blbk1QIENvbnRleHQgU2VsZWN0b3JzOjoKLSogTWVtb3J5IGFsbG9jYXRpb24g d2l0aCBsaWJtZW1raW5kOjoKKyogTWVtb3J5IGFsbG9jYXRpb246OgogQGVuZCBtZW51CiAK IEBub2RlIEltcGxlbWVudGF0aW9uLWRlZmluZWQgSUNWIEluaXRpYWxpemF0aW9uCkBAIC00 NjMxLDggKzQ2MzEsOCBAQCBzbWFsbGVyIG51bWJlci4gIE9uIG5vbi1ob3N0IGRldmljZXMs IHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgIEB0YWIgU2VlIEBjb2Rley1tYXJjaD19IGluIGBg TnZpZGlhIFBUWCBPcHRpb25zJycKIEBlbmQgbXVsdGl0YWJsZQogCi1Abm9kZSBNZW1vcnkg YWxsb2NhdGlvbiB3aXRoIGxpYm1lbWtpbmQKLUBzZWN0aW9uIE1lbW9yeSBhbGxvY2F0aW9u IHdpdGggbGlibWVta2luZAorQG5vZGUgTWVtb3J5IGFsbG9jYXRpb24KK0BzZWN0aW9uIE1l bW9yeSBhbGxvY2F0aW9uCiAKIEZvciB0aGUgbWVtb3J5IHNwYWNlcywgdGhlIGZvbGxvd2lu ZyBhcHBsaWVzOgogQGl0ZW1pemUKQEAgLTQ2NTIsMjAgKzQ2NTIsNDAgQEAgY3JlYXRpbmcg bWVtb3J5IGFsbG9jYXRvcnMgcmVxdWVzdGluZwogQGl0ZW1pemUKIEBpdGVtIHRoZSBtZW1v cnkgc3BhY2UgQGNvZGV7b21wX2hpZ2hfYndfbWVtX3NwYWNlfQogQGl0ZW0gdGhlIG1lbW9y eSBzcGFjZSBAY29kZXtvbXBfbGFyZ2VfY2FwX21lbV9zcGFjZX0KLUBpdGVtIHRoZSBwYXJ0 aXRpb24gdHJhaXQgQGNvZGV7b21wX2F0dl9pbnRlcmxlYXZlZH07IG5vdGUgdGhhdCBmb3IK K0BpdGVtIHRoZSBAY29kZXtwYXJ0aXRpb259IHRyYWl0IEBjb2Rle2ludGVybGVhdmVkfTsg bm90ZSB0aGF0IGZvcgogICAgICAgQGNvZGV7b21wX2xhcmdlX2NhcF9tZW1fc3BhY2V9IHRo ZSBhbGxvY2F0aW9uIHdpbGwgbm90IGJlIGludGVybGVhdmVkCiBAZW5kIGl0ZW1pemUKIAor T24gTGludXggc3lzdGVtcywgd2hlcmUgdGhlIEB1cmVme2h0dHBzOi8vZ2l0aHViLmNvbS9u dW1hY3RsL251bWFjdGwsIG51bWEKK2xpYnJhcnl9IChAY29kZXtsaWJudW1hLnNvLjF9KSBp cyBhdmFpbGFibGUgYXQgcnVudGltZSwgaXQgdXNlZCB3aGVuIGNyZWF0aW5nCittZW1vcnkg YWxsb2NhdG9ycyByZXF1ZXN0aW5nCisKK0BpdGVtaXplCitAaXRlbSB0aGUgQGNvZGV7cGFy dGl0aW9ufSB0cmFpdCBAY29kZXtuZWFyZXN0fSwgZXhjZXB0IHdoZW4gYm90aCB0aGUKK2xp Ym1lbWtpbmQgbGlicmFyeSBpcyBhdmFpbGFibGUgYW5kIHRoZSBtZW1vcnkgc3BhY2UgaXMg ZWl0aGVyCitAY29kZXtvbXBfbGFyZ2VfY2FwX21lbV9zcGFjZX0gb3IgQGNvZGV7b21wX2hp Z2hfYndfbWVtX3NwYWNlfQorQGVuZCBpdGVtaXplCisKK05vdGUgdGhhdCB0aGUgbnVtYSBs aWJyYXJ5IHdpbGwgcm91bmQgdXAgdGhlIGFsbG9jYXRpb24gc2l6ZSB0byBhIG11bHRpcGxl IG9mCit0aGUgc3lzdGVtIHBhZ2Ugc2l6ZTsgdGhlcmVmb3JlLCBjb25zaWRlciB1c2luZyBp dCBvbmx5IHdpdGggbGFyZ2UgZGF0YSBvcgorYnkgc2hhcmluZyBhbGxvY2F0aW9ucyB2aWEg dGhlIEBjb2Rle3Bvb2xfc2l6ZX0gdHJhaXQuICBGdXJ0aGVybW9yZSwgdGhlIExpbnV4Citr ZXJuZWwgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgYW4gYWxsb2NhdGlvbiB3aWxsIGFsd2F5 cyBiZSBvbiB0aGUgbmVhcmVzdCBOVU1BCitub2RlIG5vciB0aGF0IGFmdGVyIHJlYWxsb2Nh dGlvbiB0aGUgc2FtZSBub2RlIHdpbGwgYmUgdXNlZC4gIE5vdGUgYWRkaXRpb25hbGx5Cit0 aGF0LCBvbiBMaW51eCwgdGhlIGRlZmF1bHQgc2V0dGluZyBvZiB0aGUgbWVtb3J5IHBsYWNl bWVudCBwb2xpY3kgaXMgdG8gdXNlIHRoZQorY3VycmVudCBub2RlOyB0aGVyZWZvcmUsIHVu bGVzcyB0aGUgbWVtb3J5IHBsYWNlbWVudCBwb2xpY3kgaGFzIGJlZW4gb3ZlcnJpZGRlbiwK K3RoZSBAY29kZXtwYXJ0aXRpb259IHRyYWl0IEBjb2Rle2Vudmlyb25tZW50fSAodGhlIGRl ZmF1bHQpIHdpbGwgYmUgZWZmZWN0aXZlbHkKK2EgQGNvZGV7bmVhcmVzdH0gYWxsb2NhdGlv bi4KKwogQWRkaXRpb25hbCBub3RlczoKIEBpdGVtaXplCiBAaXRlbSBUaGUgQGNvZGV7cGlu bmVkfSB0cmFpdCBpcyB1bnN1cHBvcnRlZC4KIEBpdGVtIEZvciB0aGUgQGNvZGV7cGFydGl0 aW9ufSB0cmFpdCwgdGhlIHBhcnRpdGlvbiBwYXJ0IHNpemUgd2lsbCBiZSB0aGUgc2FtZQog ICAgICAgYXMgdGhlIHJlcXVlc3RlZCBzaXplIChpLmUuIEBjb2Rle2ludGVybGVhdmVkfSBv ciBAY29kZXtibG9ja2VkfSBoYXMgbm8KICAgICAgIGVmZmVjdCksIGV4Y2VwdCBmb3IgQGNv ZGV7aW50ZXJsZWF2ZWR9IHdoZW4gdGhlIG1lbWtpbmQgbGlicmFyeSBpcwotICAgICAgYXZh aWxhYmxlLiAgRnVydGhlcm1vcmUsIGZvciBAY29kZXtuZWFyZXN0fSB0aGUgbWVtb3J5IG1p Z2h0IG5vdCBiZQotICAgICAgb24gdGhlIHNhbWUgTlVNQSBub2RlIGFzIHRocmVhZCB0aGF0 IGFsbG9jYXRlZCB0aGUgbWVtb3J5OyBvbiBMaW51eCwKLSAgICAgIHRoaXMgaXMgaW4gcGFy dGljdWxhciB0aGUgY2FzZSB3aGVuIHRoZSBtZW1vcnkgcGxhY2VtZW50IHBvbGljeSBpcwot ICAgICAgc2V0IHRvIHByZWZlcnJlZC4KKyAgICAgIGF2YWlsYWJsZS4gIEZ1cnRoZXJtb3Jl LCBmb3IgQGNvZGV7bmVhcmVzdH0gYW5kIHVubGVzcyB0aGUgbnVtYSBsaWJyYXJ5CisgICAg ICBpcyBhdmFpbGFibGUsIHRoZSBtZW1vcnkgbWlnaHQgbm90IGJlIG9uIHRoZSBzYW1lIE5V TUEgbm9kZSBhcyB0aHJlYWQKKyAgICAgIHRoYXQgYWxsb2NhdGVkIHRoZSBtZW1vcnk7IG9u IExpbnV4LCB0aGlzIGlzIGluIHBhcnRpY3VsYXIgdGhlIGNhc2Ugd2hlbgorICAgICAgdGhl IG1lbW9yeSBwbGFjZW1lbnQgcG9saWN5IGlzIHNldCB0byBwcmVmZXJyZWQuCiBAaXRlbSBU aGUgQGNvZGV7YWNjZXNzfSB0cmFpdCBoYXMgbm8gZWZmZWN0IHN1Y2ggdGhhdCBtZW1vcnkg aXMgYWx3YXlzCiAgICAgICBhY2Nlc3NpYmxlIGJ5IGFsbCB0aHJlYWRzLgogQGl0ZW0gVGhl IEBjb2Rle3N5bmNfaGludH0gdHJhaXQgaGFzIG5vIGVmZmVjdC4KZGlmZiAtLWdpdCBhL2xp YmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2FsbG9jLTExLmMgYi9saWJn b21wL3Rlc3RzdWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9hbGxvYy0xMS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi41ZmJhZGY0NDA2YQotLS0gL2Rldi9u dWxsCisrKyBiL2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2FsbG9j LTExLmMKQEAgLTAsMCArMSwyODUgQEAKKy8qIFRoaXMgdGVzdGNhc2UgaXMgbW9zdGx5IHRo ZSBzYW1lIGFzIGFsbG9jLTkuYy4KKyAgIEhvd2V2ZXIsIG9uIHN5c3RlbXMgd2hlcmUgdGhl IG51bWEgYW5kL29yIG1lbWtpbmQgbGlicmFyaWVzIGFyZQorICAgaW5zdGFsbGVkLCBsaWJn b21wIHVzZXMgdGhvc2UuICBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHRoZSBtaW5pbWFsCisg ICBmZWF0dXJlcyB3b3JrLiBOb3RlOiBObyBhdHRlbXB0IGhhcyBiZWVuIG1hZGUgdG8gdmVy aWZ5IHRoZSBwYXJpdGlvbgorICAgaGludHMgaW50ZXJsZWF2ZWQgYW5kIG5lYXJlc3QgYXMg dGhlIGtlcm5hbCBwdXJwb3NlbHkgaWdub3JlIHRoZW0gb25jZQorICAgaW4gYSB3aGlsZSBh bmQgaXQgd291bGQgYWxzbyByZXF1aXJlIGEgJ2Rsb3BlbicgZGFuY2UuCisKKyAgIG1lbWtp bmQgaXMgdXNlZCBmb3Igb21wX2hpZ2hfYndfbWVtX3NwYWNlLCBvbXBfbGFyZ2VfY2FwX21l bV9zcGFjZQorICAgYW5kIHBhcnRpdGlvbiA9IGludGVybGVhdmVkLCBhbGJlaXQgaXQgd29u J3QgYmUgaW50ZXJsZWF2ZWQgZm9yCisgICBvbXBfbGFyZ2VfY2FwX21lbV9zcGFjZS4KKwor ICAgbnVtYSBpcyB1c2VkIGZvciBwYXJ0aXRpb24gPSBuZWFyZXN0LCB1bmxlc3MgbWVta2lu ZCBpcyB1c2VkLiAgKi8KKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGludC5o PgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitjb25zdCBvbXBfYWxsb2N0cmFpdF90IHRyYWl0 czJbXQorPSB7IHsgb21wX2F0a19hbGlnbm1lbnQsIDE2IH0sCisgICAgeyBvbXBfYXRrX3N5 bmNfaGludCwgb21wX2F0dl9kZWZhdWx0IH0sCisgICAgeyBvbXBfYXRrX2FjY2Vzcywgb21w X2F0dl9kZWZhdWx0IH0sCisgICAgeyBvbXBfYXRrX3Bvb2xfc2l6ZSwgMTAyNCB9LAorICAg IHsgb21wX2F0a19mYWxsYmFjaywgb21wX2F0dl9kZWZhdWx0X21lbV9mYiB9LAorICAgIHsg b21wX2F0a19wYXJ0aXRpb24sIG9tcF9hdHZfbmVhcmVzdCB9IH07CitvbXBfYWxsb2N0cmFp dF90IHRyYWl0czNbXQorPSB7IHsgb21wX2F0a19zeW5jX2hpbnQsIG9tcF9hdHZfdW5jb250 ZW5kZWQgfSwKKyAgICB7IG9tcF9hdGtfYWxpZ25tZW50LCAzMiB9LAorICAgIHsgb21wX2F0 a19hY2Nlc3MsIG9tcF9hdHZfYWxsIH0sCisgICAgeyBvbXBfYXRrX3Bvb2xfc2l6ZSwgNTEy IH0sCisgICAgeyBvbXBfYXRrX2ZhbGxiYWNrLCBvbXBfYXR2X2FsbG9jYXRvcl9mYiB9LAor ICAgIHsgb21wX2F0a19mYl9kYXRhLCAwIH0sCisgICAgeyBvbXBfYXRrX3BhcnRpdGlvbiwg b21wX2F0dl9pbnRlcmxlYXZlZCB9IH07Citjb25zdCBvbXBfYWxsb2N0cmFpdF90IHRyYWl0 czRbXQorPSB7IHsgb21wX2F0a19hbGlnbm1lbnQsIDEyOCB9LAorICAgIHsgb21wX2F0a19w b29sX3NpemUsIDEwMjQgfSwKKyAgICB7IG9tcF9hdGtfZmFsbGJhY2ssIG9tcF9hdHZfbnVs bF9mYiB9IH07CisKK2ludAorbWFpbiAoKQoreworICBpbnQgKnZvbGF0aWxlIHAgPSAoaW50 ICopIG9tcF9hbGxvYyAoMyAqIHNpemVvZiAoaW50KSwgb21wX2RlZmF1bHRfbWVtX2FsbG9j KTsKKyAgaW50ICp2b2xhdGlsZSBxOworICBpbnQgKnZvbGF0aWxlIHI7CisgIG9tcF9hbGxv Y3RyYWl0X3QgdHJhaXRzWzRdCisgICAgPSB7IHsgb21wX2F0a19hbGlnbm1lbnQsIDY0IH0s CisJeyBvbXBfYXRrX2ZhbGxiYWNrLCBvbXBfYXR2X251bGxfZmIgfSwKKwl7IG9tcF9hdGtf cG9vbF9zaXplLCA0MDk2IH0sCisgICAgICAgIHsgb21wX2F0a19wYXJ0aXRpb24sIG9tcF9h dHZfbmVhcmVzdCB9IH07CisgIG9tcF9hbGxvY3RyYWl0X3QgdHJhaXRzNVsyXQorICAgID0g eyB7IG9tcF9hdGtfZmFsbGJhY2ssIG9tcF9hdHZfbnVsbF9mYiB9LAorCXsgb21wX2F0a19w b29sX3NpemUsIDQwOTYgfSB9OworICBvbXBfYWxsb2NhdG9yX2hhbmRsZV90IGEsIGEyOwor CisgIGlmICgoKCh1aW50cHRyX3QpIHApICUgX19hbGlnbm9mIChpbnQpKSAhPSAwKQorICAg IGFib3J0ICgpOworICBwWzBdID0gMTsKKyAgcFsxXSA9IDI7CisgIHBbMl0gPSAzOworICBw ID0gKGludCAqKSBvbXBfcmVhbGxvYyAocCwgNCAqIHNpemVvZiAoaW50KSwgb21wX2hpZ2hf YndfbWVtX2FsbG9jLCBvbXBfaGlnaF9id19tZW1fYWxsb2MpOworICBpZiAoKCgodWludHB0 cl90KSBwKSAlIF9fYWxpZ25vZiAoaW50KSkgIT0gMCB8fCBwWzBdICE9IDEgfHwgcFsxXSAh PSAyIHx8IHBbMl0gIT0gMykKKyAgICBhYm9ydCAoKTsKKyAgcFswXSA9IDQ7CisgIHBbMV0g PSA1OworICBwWzJdID0gNjsKKyAgcFszXSA9IDc7CisgIHAgPSAoaW50ICopIG9tcF9yZWFs bG9jIChwLCAyICogc2l6ZW9mIChpbnQpLCBvbXBfaGlnaF9id19tZW1fYWxsb2MsIG9tcF9o aWdoX2J3X21lbV9hbGxvYyk7CisgIGlmICgoKCh1aW50cHRyX3QpIHApICUgX19hbGlnbm9m IChpbnQpKSAhPSAwIHx8IHBbMF0gIT0gNCB8fCBwWzFdICE9IDUpCisgICAgYWJvcnQgKCk7 CisgIHBbMF0gPSA4OworICBwWzFdID0gOTsKKyAgaWYgKG9tcF9yZWFsbG9jIChwLCAwLCBv bXBfbnVsbF9hbGxvY2F0b3IsIG9tcF9oaWdoX2J3X21lbV9hbGxvYykgIT0gTlVMTCkKKyAg ICBhYm9ydCAoKTsKKyAgcCA9IChpbnQgKikgb21wX3JlYWxsb2MgKE5VTEwsIDIgKiBzaXpl b2YgKGludCksIG9tcF9sYXJnZV9jYXBfbWVtX2FsbG9jLCBvbXBfbnVsbF9hbGxvY2F0b3Ip OworICBpZiAoKCgodWludHB0cl90KSBwKSAlIF9fYWxpZ25vZiAoaW50KSkgIT0gMCkKKyAg ICBhYm9ydCAoKTsKKyAgcFswXSA9IDE7CisgIHBbMV0gPSAyOworICBwID0gKGludCAqKSBv bXBfcmVhbGxvYyAocCwgNSAqIHNpemVvZiAoaW50KSwgb21wX2xhcmdlX2NhcF9tZW1fYWxs b2MsIG9tcF9sYXJnZV9jYXBfbWVtX2FsbG9jKTsKKyAgaWYgKCgoKHVpbnRwdHJfdCkgcCkg JSBfX2FsaWdub2YgKGludCkpICE9IDAgfHwgcFswXSAhPSAxIHx8IHBbMV0gIT0gMikKKyAg ICBhYm9ydCAoKTsKKyAgcFswXSA9IDM7CisgIHBbMV0gPSA0OworICBwWzJdID0gNTsKKyAg cFszXSA9IDY7CisgIHBbNF0gPSA3OworICBvbXBfZnJlZSAocCwgb21wX251bGxfYWxsb2Nh dG9yKTsKKyAgb21wX3NldF9kZWZhdWx0X2FsbG9jYXRvciAob21wX2xhcmdlX2NhcF9tZW1f YWxsb2MpOworICBpZiAob21wX3JlYWxsb2MgKE5VTEwsIDAsIG9tcF9udWxsX2FsbG9jYXRv ciwgb21wX251bGxfYWxsb2NhdG9yKSAhPSBOVUxMKQorICAgIGFib3J0ICgpOworICBwID0g KGludCAqKSBvbXBfYWxsb2MgKHNpemVvZiAoaW50KSwgb21wX251bGxfYWxsb2NhdG9yKTsK KyAgaWYgKCgoKHVpbnRwdHJfdCkgcCkgJSBfX2FsaWdub2YgKGludCkpICE9IDApCisgICAg YWJvcnQgKCk7CisgIHBbMF0gPSAzOworICBwID0gKGludCAqKSBvbXBfcmVhbGxvYyAocCwg MyAqIHNpemVvZiAoaW50KSwgb21wX251bGxfYWxsb2NhdG9yLCBvbXBfbnVsbF9hbGxvY2F0 b3IpOworICBpZiAoKCgodWludHB0cl90KSBwKSAlIF9fYWxpZ25vZiAoaW50KSkgIT0gMCB8 fCBwWzBdICE9IDMpCisgICAgYWJvcnQgKCk7CisgIHBbMF0gPSA0OworICBwWzFdID0gNTsK KyAgcFsyXSA9IDY7CisgIGlmIChvbXBfcmVhbGxvYyAocCwgMCwgb21wX251bGxfYWxsb2Nh dG9yLCBvbXBfZ2V0X2RlZmF1bHRfYWxsb2NhdG9yICgpKSAhPSBOVUxMKQorICAgIGFib3J0 ICgpOworICBhID0gb21wX2luaXRfYWxsb2NhdG9yIChvbXBfZGVmYXVsdF9tZW1fc3BhY2Us IDQsIHRyYWl0cyk7CisgIGlmIChhID09IG9tcF9udWxsX2FsbG9jYXRvcikKKyAgICBhYm9y dCAoKTsKKyAgcCA9IChpbnQgKikgb21wX2FsbG9jIChzaXplb2YgKGludCksIGEpOworICBp ZiAoKCgodWludHB0cl90KSBwKSAlIDY0KSAhPSAwKQorICAgIGFib3J0ICgpOworICBwWzBd ID0gNzsKKyAgcCA9IChpbnQgKikgb21wX3JlYWxsb2MgKHAsIDMwNzIsIGEsIGEpOworICBp ZiAoKCgodWludHB0cl90KSBwKSAlIDY0KSAhPSAwIHx8IHBbMF0gIT0gNykKKyAgICBhYm9y dCAoKTsKKyAgcFswXSA9IDE7CisgIHBbMzA3MSAvIHNpemVvZiAoaW50KV0gPSAyOworICBx ID0gKGludCAqKSBvbXBfYWxsb2MgKHNpemVvZiAoaW50KSwgYSk7CisgIGlmICgoKCh1aW50 cHRyX3QpIHEpICUgNjQpICE9IDApCisgICAgYWJvcnQgKCk7CisgIHFbMF0gPSA4OworICBp ZiAob21wX3JlYWxsb2MgKHEsIDMwNzIsIGEsIGEpICE9IE5VTEwpCisgICAgYWJvcnQgKCk7 CisgIG9tcF9mcmVlIChwLCBhKTsKKyAgb21wX2ZyZWUgKHEsIGEpOworICBwID0gKGludCAq KSBvbXBfYWxsb2MgKHNpemVvZiAoaW50KSwgYSk7CisgIHBbMF0gPSA0MjsKKyAgcCA9IChp bnQgKikgb21wX3JlYWxsb2MgKHAsIDMwNzIsIGEsIGEpOworICBpZiAocFswXSAhPSA0MikK KyAgICBhYm9ydCAoKTsKKyAgcFswXSA9IDM7CisgIHBbMzA3MSAvIHNpemVvZiAoaW50KV0g PSA0OworICBvbXBfcmVhbGxvYyAocCwgMCwgb21wX251bGxfYWxsb2NhdG9yLCBvbXBfbnVs bF9hbGxvY2F0b3IpOworICBvbXBfc2V0X2RlZmF1bHRfYWxsb2NhdG9yIChhKTsKKyAgaWYg KG9tcF9nZXRfZGVmYXVsdF9hbGxvY2F0b3IgKCkgIT0gYSkKKyAgICBhYm9ydCAoKTsKKyAg cCA9IChpbnQgKikgb21wX2FsbG9jICgzMSwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAgaWYg KHAgPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKyAgcCA9IChpbnQgKikgb21wX3JlYWxsb2Mg KHAsIDMwNzIsIG9tcF9udWxsX2FsbG9jYXRvciwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAg aWYgKHAgPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKyAgcSA9IChpbnQgKikgb21wX2FsbG9j IChzaXplb2YgKGludCksIG9tcF9udWxsX2FsbG9jYXRvcik7CisgIGlmIChxID09IE5VTEwp CisgICAgYWJvcnQgKCk7CisgIGlmIChvbXBfcmVhbGxvYyAocSwgMzA3Miwgb21wX251bGxf YWxsb2NhdG9yLCBvbXBfbnVsbF9hbGxvY2F0b3IpICE9IE5VTEwpCisgICAgYWJvcnQgKCk7 CisgIG9tcF9mcmVlIChwLCBhKTsKKyAgb21wX2ZyZWUgKHEsIGEpOworICBvbXBfZGVzdHJv eV9hbGxvY2F0b3IgKGEpOworCisgIGEgPSBvbXBfaW5pdF9hbGxvY2F0b3IgKG9tcF9sYXJn ZV9jYXBfbWVtX3NwYWNlLCAyLCB0cmFpdHM1KTsKKyAgaWYgKGEgPT0gb21wX251bGxfYWxs b2NhdG9yKQorICAgIGFib3J0ICgpOworICBvbXBfc2V0X2RlZmF1bHRfYWxsb2NhdG9yIChh KTsKKyAgaWYgKG9tcF9nZXRfZGVmYXVsdF9hbGxvY2F0b3IgKCkgIT0gYSkKKyAgICBhYm9y dCAoKTsKKyAgcCA9IChpbnQgKikgb21wX2FsbG9jICgzMDcxLCBvbXBfbnVsbF9hbGxvY2F0 b3IpOworICBpZiAocCA9PSBOVUxMKQorICAgIGFib3J0ICgpOworICBwID0gKGludCAqKSBv bXBfcmVhbGxvYyAocCwgMzA3Miwgb21wX251bGxfYWxsb2NhdG9yLCBvbXBfbnVsbF9hbGxv Y2F0b3IpOworICBpZiAocCA9PSBOVUxMKQorICAgIGFib3J0ICgpOworICBxID0gKGludCAq KSBvbXBfYWxsb2MgKHNpemVvZiAoaW50KSwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAgaWYg KHEgPT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKyAgaWYgKG9tcF9yZWFsbG9jIChxLCAzMDcy LCBvbXBfbnVsbF9hbGxvY2F0b3IsIG9tcF9udWxsX2FsbG9jYXRvcikgIT0gTlVMTCkKKyAg ICBhYm9ydCAoKTsKKyAgb21wX2ZyZWUgKHAsIGEpOworICBvbXBfZnJlZSAocSwgYSk7Cisg IG9tcF9kZXN0cm95X2FsbG9jYXRvciAoYSk7CisKKyAgYSA9IG9tcF9pbml0X2FsbG9jYXRv ciAob21wX2RlZmF1bHRfbWVtX3NwYWNlLAorCQkJICBzaXplb2YgKHRyYWl0czIpIC8gc2l6 ZW9mICh0cmFpdHMyWzBdKSwKKwkJCSAgdHJhaXRzMik7CisgIGlmIChhID09IG9tcF9udWxs X2FsbG9jYXRvcikKKyAgICBhYm9ydCAoKTsKKyAgaWYgKHRyYWl0czNbNV0ua2V5ICE9IG9t cF9hdGtfZmJfZGF0YSkKKyAgICBhYm9ydCAoKTsKKyAgdHJhaXRzM1s1XS52YWx1ZSA9ICh1 aW50cHRyX3QpIGE7CisgIGEyID0gb21wX2luaXRfYWxsb2NhdG9yIChvbXBfZGVmYXVsdF9t ZW1fc3BhY2UsCisJCQkgICBzaXplb2YgKHRyYWl0czMpIC8gc2l6ZW9mICh0cmFpdHMzWzBd KSwKKwkJCSAgIHRyYWl0czMpOworICBpZiAoYTIgPT0gb21wX251bGxfYWxsb2NhdG9yKQor ICAgIGFib3J0ICgpOworICBwID0gKGludCAqKSBvbXBfYWxsb2MgKHNpemVvZiAoaW50KSwg YTIpOworICBpZiAoKCgodWludHB0cl90KSBwKSAlIDMyKSAhPSAwKQorICAgIGFib3J0ICgp OworICBwWzBdID0gODQ7CisgIHAgPSAoaW50ICopIG9tcF9yZWFsbG9jIChwLCAzODAsIGEy LCBhMik7CisgIGlmICgoKCh1aW50cHRyX3QpIHApICUgMzIpICE9IDAgfHwgcFswXSAhPSA4 NCkKKyAgICBhYm9ydCAoKTsKKyAgcFswXSA9IDU7CisgIHBbMzc5IC8gc2l6ZW9mIChpbnQp XSA9IDY7CisgIHEgPSAoaW50ICopIG9tcF9hbGxvYyAoc2l6ZW9mIChpbnQpLCBhMik7Cisg IGlmICgoKCh1aW50cHRyX3QpIHEpICUgMzIpICE9IDApCisgICAgYWJvcnQgKCk7CisgIHFb MF0gPSA0MjsKKyAgcSA9IChpbnQgKikgb21wX3JlYWxsb2MgKHEsIDc2OCwgYTIsIGEyKTsK KyAgaWYgKCgoKHVpbnRwdHJfdCkgcSkgJSAxNikgIT0gMCB8fCBxWzBdICE9IDQyKQorICAg IGFib3J0ICgpOworICBxWzBdID0gNzsKKyAgcVs3NjcgLyBzaXplb2YgKGludCldID0gODsK KyAgciA9IChpbnQgKikgb21wX3JlYWxsb2MgKE5VTEwsIDUxMiwgYTIsIG9tcF9udWxsX2Fs bG9jYXRvcik7CisgIGlmICgoKCh1aW50cHRyX3QpIHIpICUgX19hbGlnbm9mIChpbnQpKSAh PSAwKQorICAgIGFib3J0ICgpOworICByWzBdID0gOTsKKyAgcls1MTEgLyBzaXplb2YgKGlu dCldID0gMTA7CisgIG9tcF9mcmVlIChwLCBvbXBfbnVsbF9hbGxvY2F0b3IpOworICBvbXBf ZnJlZSAocSwgYTIpOworICBvbXBfZnJlZSAociwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAg cCA9IChpbnQgKikgb21wX2FsbG9jIChzaXplb2YgKGludCksIGEyKTsKKyAgaWYgKCgoKHVp bnRwdHJfdCkgcCkgJSAzMikgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgcFswXSA9IDg1Owor ICBwID0gKGludCAqKSBvbXBfcmVhbGxvYyAocCwgMzIwLCBhLCBhMik7CisgIGlmICgoKCh1 aW50cHRyX3QpIHApICUgMTYpICE9IDAgfHwgcFswXSAhPSA4NSkKKyAgICBhYm9ydCAoKTsK KyAgcFswXSA9IDU7CisgIHBbMzE5IC8gc2l6ZW9mIChpbnQpXSA9IDY7CisgIHEgPSAoaW50 ICopIG9tcF9hbGxvYyAoc2l6ZW9mIChpbnQpLCBhKTsKKyAgaWYgKCgoKHVpbnRwdHJfdCkg cSkgJSAxNikgIT0gMCkKKyAgICBhYm9ydCAoKTsKKyAgcVswXSA9IDQzOworICBxID0gKGlu dCAqKSBvbXBfcmVhbGxvYyAocSwgMzIwLCBhMiwgYSk7CisgIGlmICgoKCh1aW50cHRyX3Qp IHEpICUgMzIpICE9IDAgfHwgcVswXSAhPSA0MykKKyAgICBhYm9ydCAoKTsKKyAgcVswXSA9 IDQ0OworICBxWzMxOSAvIHNpemVvZiAoaW50KV0gPSA4OworICBxID0gKGludCAqKSBvbXBf cmVhbGxvYyAocSwgNTY4LCBhMiwgYTIpOworICBpZiAoKCgodWludHB0cl90KSBxKSAlIDE2 KSAhPSAwIHx8IHFbMF0gIT0gNDQpCisgICAgYWJvcnQgKCk7CisgIHFbMF0gPSA3OworICBx WzU2NyAvIHNpemVvZiAoaW50KV0gPSA4OworICBvbXBfZnJlZSAocCwgb21wX251bGxfYWxs b2NhdG9yKTsKKyAgb21wX2ZyZWUgKHEsIGEyKTsKKyAgb21wX2Rlc3Ryb3lfYWxsb2NhdG9y IChhMik7CisgIG9tcF9kZXN0cm95X2FsbG9jYXRvciAoYSk7CisKKyAgYSA9IG9tcF9pbml0 X2FsbG9jYXRvciAob21wX2xhcmdlX2NhcF9tZW1fc3BhY2UsCisJCQkgIHNpemVvZiAodHJh aXRzNCkgLyBzaXplb2YgKHRyYWl0czRbMF0pLAorCQkJICB0cmFpdHM0KTsKKyAgaWYgKGEg PT0gb21wX251bGxfYWxsb2NhdG9yKQorICAgIGFib3J0ICgpOworICBpZiAodHJhaXRzM1s1 XS5rZXkgIT0gb21wX2F0a19mYl9kYXRhKQorICAgIGFib3J0ICgpOworICB0cmFpdHMzWzVd LnZhbHVlID0gKHVpbnRwdHJfdCkgYTsKKyAgYTIgPSBvbXBfaW5pdF9hbGxvY2F0b3IgKG9t cF9kZWZhdWx0X21lbV9zcGFjZSwKKwkJCSAgIHNpemVvZiAodHJhaXRzMykgLyBzaXplb2Yg KHRyYWl0czNbMF0pLAorCQkJICAgdHJhaXRzMyk7CisgIGlmIChhMiA9PSBvbXBfbnVsbF9h bGxvY2F0b3IpCisgICAgYWJvcnQgKCk7CisgIG9tcF9zZXRfZGVmYXVsdF9hbGxvY2F0b3Ig KGEyKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworICBwID0gc3RhdGljX2Nhc3QgPGludCAqPiAo b21wX3JlYWxsb2MgKE5VTEwsIDQyMCkpOworI2Vsc2UKKyAgcCA9IChpbnQgKikgb21wX3Jl YWxsb2MgKE5VTEwsIDQyMCwgb21wX251bGxfYWxsb2NhdG9yLCBvbXBfbnVsbF9hbGxvY2F0 b3IpOworI2VuZGlmCisgIGlmICgoKCh1aW50cHRyX3QpIHApICUgMzIpICE9IDApCisgICAg YWJvcnQgKCk7CisgIHBbMF0gPSA1OworICBwWzQxOSAvIHNpemVvZiAoaW50KV0gPSA2Owor ICBxID0gKGludCAqKSBvbXBfcmVhbGxvYyAoTlVMTCwgc2l6ZW9mIChpbnQpLCBvbXBfbnVs bF9hbGxvY2F0b3IsIG9tcF9udWxsX2FsbG9jYXRvcik7CisgIGlmICgoKCh1aW50cHRyX3Qp IHEpICUgMzIpICE9IDApCisgICAgYWJvcnQgKCk7CisgIHFbMF0gPSA5OTsKKyAgcSA9IChp bnQgKikgb21wX3JlYWxsb2MgKHEsIDcwMCwgb21wX251bGxfYWxsb2NhdG9yLCBvbXBfbnVs bF9hbGxvY2F0b3IpOworICBpZiAoKCgodWludHB0cl90KSBxKSAlIDEyOCkgIT0gMCB8fCBx WzBdICE9IDk5KQorICAgIGFib3J0ICgpOworICBxWzBdID0gNzsKKyAgcVs2OTkgLyBzaXpl b2YgKGludCldID0gODsKKyAgaWYgKG9tcF9yZWFsbG9jIChOVUxMLCA3NjgsIG9tcF9udWxs X2FsbG9jYXRvciwgb21wX251bGxfYWxsb2NhdG9yKSAhPSBOVUxMKQorICAgIGFib3J0ICgp OworI2lmZGVmIF9fY3BsdXNwbHVzCisgIG9tcF9mcmVlIChwKTsKKyAgaWYgKG9tcF9yZWFs bG9jIChxLCAwKSAhPSBOVUxMKQorICAgIGFib3J0ICgpOworICBvbXBfZnJlZSAoTlVMTCk7 CisjZWxzZQorICBvbXBfZnJlZSAocCwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAgaWYgKG9t cF9yZWFsbG9jIChxLCAwLCBvbXBfbnVsbF9hbGxvY2F0b3IsIG9tcF9udWxsX2FsbG9jYXRv cikgIT0gTlVMTCkKKyAgICBhYm9ydCAoKTsKKyAgb21wX2ZyZWUgKE5VTEwsIG9tcF9udWxs X2FsbG9jYXRvcik7CisjZW5kaWYKKyAgb21wX2ZyZWUgKE5VTEwsIG9tcF9udWxsX2FsbG9j YXRvcik7CisgIG9tcF9kZXN0cm95X2FsbG9jYXRvciAoYTIpOworICBvbXBfZGVzdHJveV9h bGxvY2F0b3IgKGEpOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmdvbXAvdGVz dHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2FsbG9jLTEyLmMgYi9saWJnb21wL3Rlc3Rz dWl0ZS9saWJnb21wLmMtYysrLWNvbW1vbi9hbGxvYy0xMi5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5lMDdkZTNiZTZhNwotLS0gL2Rldi9udWxsCisrKyBi L2xpYmdvbXAvdGVzdHN1aXRlL2xpYmdvbXAuYy1jKystY29tbW9uL2FsbG9jLTEyLmMKQEAg LTAsMCArMSwyMTcgQEAKKy8qIFRoaXMgdGVzdGNhc2UgaXMgbW9zdGx5IHRoZSBzYW1lIGFz IGFsbG9jLTguYy4KKyAgIEhvd2V2ZXIsIG9uIHN5c3RlbXMgd2hlcmUgdGhlIG51bWEgYW5k L29yIG1lbWtpbmQgbGlicmFyaWVzIGFyZQorICAgaW5zdGFsbGVkLCBsaWJnb21wIHVzZXMg dGhvc2UuICBUaGlzIHRlc3QgZW5zdXJlcyB0aGF0IHRoZSBtaW5pbWFsCisgICBmZWF0dXJl cyB3b3JrLiBOb3RlOiBObyBhdHRlbXB0IGhhcyBiZWVuIG1hZGUgdG8gdmVyaWZ5IHRoZSBw YXJpdGlvbgorICAgaGludHMgaW50ZXJsZWF2ZWQgYW5kIG5lYXJlc3QgYXMgdGhlIGtlcm5h bCBwdXJwb3NlbHkgaWdub3JlIHRoZW0gb25jZQorICAgaW4gYSB3aGlsZSBhbmQgaXQgd291 bGQgYWxzbyByZXF1aXJlIGEgJ2Rsb3BlbicgZGFuY2UuCisKKyAgIG1lbWtpbmQgaXMgdXNl ZCBmb3Igb21wX2hpZ2hfYndfbWVtX3NwYWNlLCBvbXBfbGFyZ2VfY2FwX21lbV9zcGFjZQor ICAgYW5kIHBhcnRpdGlvbiA9IGludGVybGVhdmVkLCBhbGJlaXQgaXQgd29uJ3QgYmUgaW50 ZXJsZWF2ZWQgZm9yCisgICBvbXBfbGFyZ2VfY2FwX21lbV9zcGFjZS4KKworICAgbnVtYSBp cyB1c2VkIGZvciBwYXJ0aXRpb24gPSBuZWFyZXN0LCB1bmxlc3MgbWVta2luZCBpcyB1c2Vk LiAgKi8KKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1 ZGUgPHN0ZGxpYi5oPgorCitjb25zdCBvbXBfYWxsb2N0cmFpdF90IHRyYWl0czJbXQorPSB7 IHsgb21wX2F0a19hbGlnbm1lbnQsIDE2IH0sCisgICAgeyBvbXBfYXRrX3N5bmNfaGludCwg b21wX2F0dl9kZWZhdWx0IH0sCisgICAgeyBvbXBfYXRrX2FjY2Vzcywgb21wX2F0dl9kZWZh dWx0IH0sCisgICAgeyBvbXBfYXRrX3Bvb2xfc2l6ZSwgMTAyNCB9LAorICAgIHsgb21wX2F0 a19mYWxsYmFjaywgb21wX2F0dl9kZWZhdWx0X21lbV9mYiB9LAorICAgIHsgb21wX2F0a19w YXJ0aXRpb24sIG9tcF9hdHZfbmVhcmVzdCB9IH07CitvbXBfYWxsb2N0cmFpdF90IHRyYWl0 czNbXQorPSB7IHsgb21wX2F0a19zeW5jX2hpbnQsIG9tcF9hdHZfdW5jb250ZW5kZWQgfSwK KyAgICB7IG9tcF9hdGtfYWxpZ25tZW50LCAzMiB9LAorICAgIHsgb21wX2F0a19hY2Nlc3Ms IG9tcF9hdHZfYWxsIH0sCisgICAgeyBvbXBfYXRrX3Bvb2xfc2l6ZSwgNTEyIH0sCisgICAg eyBvbXBfYXRrX2ZhbGxiYWNrLCBvbXBfYXR2X2FsbG9jYXRvcl9mYiB9LAorICAgIHsgb21w X2F0a19mYl9kYXRhLCAwIH0sCisgICAgeyBvbXBfYXRrX3BhcnRpdGlvbiwgb21wX2F0dl9p bnRlcmxlYXZlZCB9IH07Citjb25zdCBvbXBfYWxsb2N0cmFpdF90IHRyYWl0czRbXQorPSB7 IHsgb21wX2F0a19hbGlnbm1lbnQsIDEyOCB9LAorICAgIHsgb21wX2F0a19wb29sX3NpemUs IDEwMjQgfSwKKyAgICB7IG9tcF9hdGtfZmFsbGJhY2ssIG9tcF9hdHZfbnVsbF9mYiB9IH07 CisKK3N0YXRpYyB2b2lkCitjaGVja19hbGxfemVybyAodm9pZCAqcHRyLCBzaXplX3QgbGVu KQoreworICBjaGFyICpwID0gKGNoYXIgKikgcHRyOworICBmb3IgKHNpemVfdCBpID0gMDsg aSA8IGxlbjsgaSsrKQorICAgIGlmIChwW2ldICE9ICdcMCcpCisgICAgICBhYm9ydCAoKTsK K30KKworaW50CittYWluICgpCit7CisgIGludCAqdm9sYXRpbGUgcCA9IChpbnQgKikgb21w X2FsaWduZWRfY2FsbG9jIChzaXplb2YgKGludCksIDMsIHNpemVvZiAoaW50KSwgb21wX2hp Z2hfYndfbWVtX2FsbG9jKTsKKyAgY2hlY2tfYWxsX3plcm8gKHAsIDMqc2l6ZW9mIChpbnQp KTsKKyAgaW50ICp2b2xhdGlsZSBxOworICBpbnQgKnZvbGF0aWxlIHI7CisgIGludCBpOwor ICBvbXBfYWxsb2N0cmFpdF90IHRyYWl0c1szXQorICAgID0geyB7IG9tcF9hdGtfYWxpZ25t ZW50LCA2NCB9LAorCXsgb21wX2F0a19mYWxsYmFjaywgb21wX2F0dl9udWxsX2ZiIH0sCisJ eyBvbXBfYXRrX3Bvb2xfc2l6ZSwgNDA5NiB9IH07CisgIG9tcF9hbGxvY2F0b3JfaGFuZGxl X3QgYSwgYTI7CisKKyAgaWYgKCgoKHVpbnRwdHJfdCkgcCkgJSBfX2FsaWdub2YgKGludCkp ICE9IDAgfHwgcFswXSB8fCBwWzFdIHx8IHBbMl0pCisgICAgYWJvcnQgKCk7CisgIHBbMF0g PSAxOworICBwWzFdID0gMjsKKyAgcFsyXSA9IDM7CisgIG9tcF9mcmVlIChwLCBvbXBfaGln aF9id19tZW1fYWxsb2MpOworICBwID0gKGludCAqKSBvbXBfYWxpZ25lZF9jYWxsb2MgKDIg KiBzaXplb2YgKGludCksIDEsIDIgKiBzaXplb2YgKGludCksIG9tcF9sYXJnZV9jYXBfbWVt X2FsbG9jKTsKKyAgY2hlY2tfYWxsX3plcm8gKHAsIDIqc2l6ZW9mIChpbnQpKTsKKyAgaWYg KCgoKHVpbnRwdHJfdCkgcCkgJSAoMiAqIHNpemVvZiAoaW50KSkpICE9IDAgfHwgcFswXSB8 fCBwWzFdKQorICAgIGFib3J0ICgpOworICBwWzBdID0gMTsKKyAgcFsxXSA9IDI7CisgIG9t cF9mcmVlIChwLCBvbXBfbnVsbF9hbGxvY2F0b3IpOworICBvbXBfc2V0X2RlZmF1bHRfYWxs b2NhdG9yIChvbXBfbGFyZ2VfY2FwX21lbV9hbGxvYyk7CisgIHAgPSAoaW50ICopIG9tcF9h bGlnbmVkX2NhbGxvYyAoMSwgMSwgc2l6ZW9mIChpbnQpLCBvbXBfbnVsbF9hbGxvY2F0b3Ip OworICBjaGVja19hbGxfemVybyAocCwgc2l6ZW9mIChpbnQpKTsKKyAgaWYgKCgoKHVpbnRw dHJfdCkgcCkgJSBfX2FsaWdub2YgKGludCkpICE9IDAgfHwgcFswXSkKKyAgICBhYm9ydCAo KTsKKyAgcFswXSA9IDM7CisgIG9tcF9mcmVlIChwLCBvbXBfZ2V0X2RlZmF1bHRfYWxsb2Nh dG9yICgpKTsKKworICBhID0gb21wX2luaXRfYWxsb2NhdG9yIChvbXBfbGFyZ2VfY2FwX21l bV9zcGFjZSwgMywgdHJhaXRzKTsKKyAgaWYgKGEgPT0gb21wX251bGxfYWxsb2NhdG9yKQor ICAgIGFib3J0ICgpOworICBwID0gKGludCAqKSBvbXBfYWxpZ25lZF9jYWxsb2MgKDMyLCAz LCAxMDI0LCBhKTsKKyAgY2hlY2tfYWxsX3plcm8gKHAsIDMqMTAyNCk7CisgIGlmICgoKCh1 aW50cHRyX3QpIHApICUgNjQpICE9IDApCisgICAgYWJvcnQgKCk7CisgIGZvciAoaSA9IDA7 IGkgPCAzMDcyIC8gc2l6ZW9mIChpbnQpOyBpKyspCisgICAgaWYgKHBbaV0pCisgICAgICBh Ym9ydCAoKTsKKyAgcFswXSA9IDE7CisgIHBbMzA3MSAvIHNpemVvZiAoaW50KV0gPSAyOwor ICBpZiAob21wX2FsaWduZWRfY2FsbG9jICg4LCAxOTIsIDE2LCBhKSAhPSBOVUxMKQorICAg IGFib3J0ICgpOworICBvbXBfZnJlZSAocCwgYSk7CisgIHAgPSAoaW50ICopIG9tcF9hbGln bmVkX2NhbGxvYyAoMTI4LCA2LCA1MTIsIGEpOworICBjaGVja19hbGxfemVybyAocCwgNio1 MTIpOworICBpZiAoKCgodWludHB0cl90KSBwKSAlIDEyOCkgIT0gMCkKKyAgICBhYm9ydCAo KTsKKyAgZm9yIChpID0gMDsgaSA8IDMwNzIgLyBzaXplb2YgKGludCk7IGkrKykKKyAgICBp ZiAocFtpXSkKKyAgICAgIGFib3J0ICgpOworICBwWzBdID0gMzsKKyAgcFszMDcxIC8gc2l6 ZW9mIChpbnQpXSA9IDQ7CisgIG9tcF9mcmVlIChwLCBvbXBfbnVsbF9hbGxvY2F0b3IpOwor ICBvbXBfc2V0X2RlZmF1bHRfYWxsb2NhdG9yIChhKTsKKyAgaWYgKG9tcF9nZXRfZGVmYXVs dF9hbGxvY2F0b3IgKCkgIT0gYSkKKyAgICBhYm9ydCAoKTsKKyAgcCA9IChpbnQgKikgb21w X2FsaWduZWRfY2FsbG9jICg2NCwgMTIsIDI1Niwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAg Y2hlY2tfYWxsX3plcm8gKHAsIDEyKjI1Nik7CisgIGZvciAoaSA9IDA7IGkgPCAzMDcyIC8g c2l6ZW9mIChpbnQpOyBpKyspCisgICAgaWYgKHBbaV0pCisgICAgICBhYm9ydCAoKTsKKyAg aWYgKG9tcF9hbGlnbmVkX2NhbGxvYyAoOCwgMTI4LCAyNCwgb21wX251bGxfYWxsb2NhdG9y KSAhPSBOVUxMKQorICAgIGFib3J0ICgpOworICBvbXBfZnJlZSAocCwgYSk7CisgIG9tcF9k ZXN0cm95X2FsbG9jYXRvciAoYSk7CisKKyAgYSA9IG9tcF9pbml0X2FsbG9jYXRvciAob21w X2RlZmF1bHRfbWVtX3NwYWNlLAorCQkJICBzaXplb2YgKHRyYWl0czIpIC8gc2l6ZW9mICh0 cmFpdHMyWzBdKSwKKwkJCSAgdHJhaXRzMik7CisgIGlmIChhID09IG9tcF9udWxsX2FsbG9j YXRvcikKKyAgICBhYm9ydCAoKTsKKyAgaWYgKHRyYWl0czNbNV0ua2V5ICE9IG9tcF9hdGtf ZmJfZGF0YSkKKyAgICBhYm9ydCAoKTsKKyAgdHJhaXRzM1s1XS52YWx1ZSA9ICh1aW50cHRy X3QpIGE7CisgIGEyID0gb21wX2luaXRfYWxsb2NhdG9yIChvbXBfZGVmYXVsdF9tZW1fc3Bh Y2UsCisJCQkgICBzaXplb2YgKHRyYWl0czMpIC8gc2l6ZW9mICh0cmFpdHMzWzBdKSwKKwkJ CSAgIHRyYWl0czMpOworICBpZiAoYTIgPT0gb21wX251bGxfYWxsb2NhdG9yKQorICAgIGFi b3J0ICgpOworICBwID0gKGludCAqKSBvbXBfYWxpZ25lZF9jYWxsb2MgKDQsIDUsIDg0LCBh Mik7CisgIGNoZWNrX2FsbF96ZXJvIChwLCA1Kjg0KTsKKyAgZm9yIChpID0gMDsgaSA8IDQy MCAvIHNpemVvZiAoaW50KTsgaSsrKQorICAgIGlmIChwW2ldKQorICAgICAgYWJvcnQgKCk7 CisgIGlmICgoKCh1aW50cHRyX3QpIHApICUgMzIpICE9IDApCisgICAgYWJvcnQgKCk7Cisg IHBbMF0gPSA1OworICBwWzQxOSAvIHNpemVvZiAoaW50KV0gPSA2OworICBxID0gKGludCAq KSBvbXBfYWxpZ25lZF9jYWxsb2MgKDgsIDI0LCAzMiwgYTIpOworICBjaGVja19hbGxfemVy byAocSwgMjQqMzIpOworICBpZiAoKCgodWludHB0cl90KSBxKSAlIDE2KSAhPSAwKQorICAg IGFib3J0ICgpOworICBmb3IgKGkgPSAwOyBpIDwgNzY4IC8gc2l6ZW9mIChpbnQpOyBpKysp CisgICAgaWYgKHFbaV0pCisgICAgICBhYm9ydCAoKTsKKyAgcVswXSA9IDc7CisgIHFbNzY3 IC8gc2l6ZW9mIChpbnQpXSA9IDg7CisgIHIgPSAoaW50ICopIG9tcF9hbGlnbmVkX2NhbGxv YyAoOCwgNjQsIDgsIGEyKTsKKyAgY2hlY2tfYWxsX3plcm8gKHIsIDY0KjgpOworICBpZiAo KCgodWludHB0cl90KSByKSAlIDgpICE9IDApCisgICAgYWJvcnQgKCk7CisgIGZvciAoaSA9 IDA7IGkgPCA1MTIgLyBzaXplb2YgKGludCk7IGkrKykKKyAgICBpZiAocltpXSkKKyAgICAg IGFib3J0ICgpOworICByWzBdID0gOTsKKyAgcls1MTEgLyBzaXplb2YgKGludCldID0gMTA7 CisgIG9tcF9mcmVlIChwLCBvbXBfbnVsbF9hbGxvY2F0b3IpOworICBvbXBfZnJlZSAocSwg YTIpOworICBvbXBfZnJlZSAociwgb21wX251bGxfYWxsb2NhdG9yKTsKKyAgb21wX2Rlc3Ry b3lfYWxsb2NhdG9yIChhMik7CisgIG9tcF9kZXN0cm95X2FsbG9jYXRvciAoYSk7CisKKyAg YSA9IG9tcF9pbml0X2FsbG9jYXRvciAob21wX2hpZ2hfYndfbWVtX3NwYWNlLAorCQkJICBz aXplb2YgKHRyYWl0czQpIC8gc2l6ZW9mICh0cmFpdHM0WzBdKSwKKwkJCSAgdHJhaXRzNCk7 CisgIGlmIChhID09IG9tcF9udWxsX2FsbG9jYXRvcikKKyAgICBhYm9ydCAoKTsKKyAgaWYg KHRyYWl0czNbNV0ua2V5ICE9IG9tcF9hdGtfZmJfZGF0YSkKKyAgICBhYm9ydCAoKTsKKyAg dHJhaXRzM1s1XS52YWx1ZSA9ICh1aW50cHRyX3QpIGE7CisgIGEyID0gb21wX2luaXRfYWxs b2NhdG9yIChvbXBfaGlnaF9id19tZW1fc3BhY2UsCisJCQkgICBzaXplb2YgKHRyYWl0czMp IC8gc2l6ZW9mICh0cmFpdHMzWzBdKSwKKwkJCSAgIHRyYWl0czMpOworICBpZiAoYTIgPT0g b21wX251bGxfYWxsb2NhdG9yKQorICAgIGFib3J0ICgpOworICBvbXBfc2V0X2RlZmF1bHRf YWxsb2NhdG9yIChhMik7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgcCA9IHN0YXRpY19jYXN0 IDxpbnQgKj4gKG9tcF9hbGlnbmVkX2NhbGxvYyAoNCwgMjEsIDIwKSk7CisjZWxzZQorICBw ID0gKGludCAqKSBvbXBfYWxpZ25lZF9jYWxsb2MgKDQsIDIxLCAyMCwgb21wX251bGxfYWxs b2NhdG9yKTsKKyNlbmRpZgorICBjaGVja19hbGxfemVybyAocCwgMjEqMjApOworICBpZiAo KCgodWludHB0cl90KSBwKSAlIDMyKSAhPSAwKQorICAgIGFib3J0ICgpOworICBmb3IgKGkg PSAwOyBpIDwgNDIwIC8gc2l6ZW9mIChpbnQpOyBpKyspCisgICAgaWYgKHBbaV0pCisgICAg ICBhYm9ydCAoKTsKKyAgcFswXSA9IDU7CisgIHBbNDE5IC8gc2l6ZW9mIChpbnQpXSA9IDY7 CisgIHEgPSAoaW50ICopIG9tcF9hbGlnbmVkX2NhbGxvYyAoNjQsIDEyLCA2NCwgb21wX251 bGxfYWxsb2NhdG9yKTsKKyAgY2hlY2tfYWxsX3plcm8gKHEsIDEyKjY0KTsKKyAgaWYgKCgo KHVpbnRwdHJfdCkgcSkgJSAxMjgpICE9IDApCisgICAgYWJvcnQgKCk7CisgIGZvciAoaSA9 IDA7IGkgPCA3NjggLyBzaXplb2YgKGludCk7IGkrKykKKyAgICBpZiAocVtpXSkKKyAgICAg IGFib3J0ICgpOworICBxWzBdID0gNzsKKyAgcVs3NjcgLyBzaXplb2YgKGludCldID0gODsK KyAgaWYgKG9tcF9hbGlnbmVkX2NhbGxvYyAoOCwgMjQsIDMyLCBvbXBfbnVsbF9hbGxvY2F0 b3IpICE9IE5VTEwpCisgICAgYWJvcnQgKCk7CisjaWZkZWYgX19jcGx1c3BsdXMKKyAgb21w X2ZyZWUgKHApOworICBvbXBfZnJlZSAocSk7CisgIG9tcF9mcmVlIChOVUxMKTsKKyNlbHNl CisgIG9tcF9mcmVlIChwLCBvbXBfbnVsbF9hbGxvY2F0b3IpOworICBvbXBfZnJlZSAocSwg b21wX251bGxfYWxsb2NhdG9yKTsKKyAgb21wX2ZyZWUgKE5VTEwsIG9tcF9udWxsX2FsbG9j YXRvcik7CisjZW5kaWYKKyAgb21wX2ZyZWUgKE5VTEwsIG9tcF9udWxsX2FsbG9jYXRvcik7 CisgIG9tcF9kZXN0cm95X2FsbG9jYXRvciAoYTIpOworICBvbXBfZGVzdHJveV9hbGxvY2F0 b3IgKGEpOworICByZXR1cm4gMDsKK30K --------------YwnZrWnbGwKQpJMzGRb0wsks--