From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa1.mentor.iphmx.com (esa1.mentor.iphmx.com [68.232.129.153]) by sourceware.org (Postfix) with ESMTPS id 00EA0384D16D for ; Wed, 14 Sep 2022 17:32:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 00EA0384D16D 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="5.93,315,1654588800"; d="scan'208,223";a="85767850" Received: from orw-gwy-01-in.mentorg.com ([192.94.38.165]) by esa1.mentor.iphmx.com with ESMTP; 14 Sep 2022 09:32:14 -0800 IronPort-SDR: dLAChwzmLCVgt/AaESuEj1VeiODTakjccwqFrfwvimFc3jdf4lJb37a+auCPGFmySbnYr7Jf5V QG7ePd1SZ+m4lOpx7fJt0M8mzP1v0cbenpvt2je11m/lpH/VuE9jueIe+t8ykeLMapZxa1C01S 4FMPki6yRl9j7uTryBKr8ZDTinrqs2U+iUbVyQF+c02HdJte6yOdim4KErlA1YgB6r4ntrxFiC 8D1VNHCWGcSdWdPaCGrfuiH36tZOVJLL+kpBxLKtRWRoZ7XZLBDsmPmRdqig1Upx1SHJVC4IWR X3k= Content-Type: multipart/mixed; boundary="------------Zeji9wNRSH2704gKFvZre4yu" Message-ID: <0b64e323-63f9-e4b7-eb7f-83f3b5e3125b@codesourcery.com> Date: Wed, 14 Sep 2022 11:32:11 -0600 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Content-Language: en-US To: "gcc-patches@gcc.gnu.org" From: Sandra Loosemore Subject: OpenMP: Generate SIMD clones for functions with "declare target" X-ClientProxiedBy: SVR-ORW-MBX-09.mgc.mentorg.com (147.34.90.209) To svr-orw-mbx-13.mgc.mentorg.com (147.34.90.213) X-Spam-Status: No, score=-10.0 required=5.0 tests=BAYES_00,GIT_PATCH_0,HEADER_FROM_DIFFERENT_DOMAINS,KAM_DMARC_STATUS,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: --------------Zeji9wNRSH2704gKFvZre4yu Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 7bit This patch is part of the ongoing effort to find more SIMD optimization opportunities in OpenMP code. Here we are looking for functions that have the "omp declare target" attribute that are also suitable candidates for automatic SIMD cloning. I've made the filter quite conservative, but maybe it could be improved with some further analysis. I added a command-line flag to disable this in case it is buggy :-P or leads to excessive code bloat without improving performance in some cases, otherwise the SIMD clones are generated in the same way and at the same optimization levels as the existing simdclone pass. I had to modify the TARGET_SIMD_CLONE_COMPUTE_VECSIZE_AND_SIMDLEN hook to add a boolean argument to control diagnostics, since GCC shouldn't complain about types the target doesn't support in cases where the user didn't explicitly ask for clones to be created. I tested on x86_64-linux-gnu-amdgcn, plain x86_64-linux-gnu, and aarch64-linux-gnu to get coverage of all 3 backends that implement this hook. OK for mainline? -Sandra --------------Zeji9wNRSH2704gKFvZre4yu Content-Type: text/x-patch; charset="UTF-8"; name="0001-OpenMP-Generate-SIMD-clones-for-functions-with-decla.patch" Content-Disposition: attachment; filename*0="0001-OpenMP-Generate-SIMD-clones-for-functions-with-decla.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3N2RmMjAzZjhlYzE5MWUwMzY1ODBkMTdiN2ZhODNhZTUxN2E4MDE4IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBTYW5kcmEgTG9vc2Vtb3JlIDxzYW5kcmFAY29kZXNv dXJjZXJ5LmNvbT4KRGF0ZTogV2VkLCAxNCBTZXAgMjAyMiAwMDoyMDoyNSArMDAwMApTdWJq ZWN0OiBbUEFUQ0hdIE9wZW5NUDogR2VuZXJhdGUgU0lNRCBjbG9uZXMgZm9yIGZ1bmN0aW9u cyB3aXRoICJkZWNsYXJlCiB0YXJnZXQiCgpUaGlzIHBhdGNoIGNhdXNlcyB0aGUgSVBBIHNp bWRjbG9uZSBwYXNzIHRvIGdlbmVyYXRlIGNsb25lcyBmb3IKZnVuY3Rpb25zIHdpdGggdGhl ICJvbXAgZGVjbGFyZSB0YXJnZXQiIGF0dHJpYnV0ZSBhcyBpZiB0aGV5IGhhZAoib21wIGRl Y2xhcmUgc2ltZCIsIHByb3ZpZGVkIHRoZSBmdW5jdGlvbiBhcHBlYXJzIHRvIGJlIHN1aXRh YmxlIGZvcgpTSU1EIGV4ZWN1dGlvbi4gIFRoZSBmaWx0ZXIgaXMgY29uc2VydmF0aXZlLCBy ZWplY3RpbmcgZnVuY3Rpb25zCnRoYXQgd3JpdGUgbWVtb3J5IG9yIHRoYXQgY2FsbCBvdGhl ciBmdW5jdGlvbnMgbm90IGtub3duIHRvIGJlIHNhZmUuCkEgbmV3IG9wdGlvbiAtZm9wZW5t cC10YXJnZXQtc2ltZC1jbG9uZSBpcyBhZGRlZCB0byBjb250cm9sIHRoaXMKdHJhbnNmb3Jt YXRpb247IGl0J3MgZW5hYmxlZCBieSBkZWZhdWx0LgoKZ2NjL0NoYW5nZUxvZzoKCgkqIGMt ZmFtaWx5L2Mub3B0IChmb3Blbm1wLXRhcmdldC1zaW1kLWNsb25lKTogTmV3IG9wdGlvbi4K CSogZm9ydHJhbi9sYW5nLm9wdCAoZm9wZW5tcC10YXJnZXQtc2ltZC1jbG9uZSk6IE5ldyBv cHRpb24uCgkqIGRvYy9pbnZva2UudGV4aSAoLWZuby1vcGVubXAtdGFyZ2V0LXNpbWQtY2xv bmUpOiBEb2N1bWVudC4KCSogb21wLXNpbWQtY2xvbmUuY2MgKGF1dG9fc2ltZF9jaGVja19z dG10KTogTmV3IGZ1bmN0aW9uLgoJKG1hcmtfYXV0b19zaW1kX2Nsb25lKTogTmV3IGZ1bmN0 aW9uLgoJKGV4cGFuZF9zaW1kX2Nsb25lcyk6IEFsc28gY2hlY2sgZm9yIGNsb25lYWJsZSBm dW5jdGlvbnMgd2l0aAoJIm9tcCBkZWNsYXJlIHRhcmdldCIuICBQYXNzIGVycm9yX3AgYXJn dW1lbnQgdG8KCXNpbWRfY2xvbmUuY29tcHV0ZV92ZWNzaXplX2FuZF9zaW1kbGVuIHRhcmdl dCBob29rLgoJKiB0YXJnZXQuZGVmIChUQVJHRVRfU0lNRF9DTE9ORV9DT01QVVRFX1ZFQ1NJ WkVfQU5EX1NJTURMRU4pOgoJQWRkIGJvb2wgZXJyb3JfcCBhcmd1bWVudC4KCSogZG9jL3Rt LnRleGk6IFJlZ2VuZXJhdGVkLgoJKiBjb25maWcvYWFyY2g2NC9hYXJjaDY0LmNjCgkoYWFy Y2g2NF9zaW1kX2Nsb25lX2NvbXB1dGVfdmVjc2l6ZV9hbmRfc2ltZGxlbik6IFVwZGF0ZS4K CSogY29uZmlnL2djbi9nY24uY2MKCShnY25fc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVf YW5kX3NpbWRsZW4pOiBVcGRhdGUuCgkqIGNvbmZpZy9pMzg2L2kzODYuY2MKCShpeDg2X3Np bWRfY2xvbmVfY29tcHV0ZV92ZWNzaXplX2FuZF9zaW1kbGVuKTogVXBkYXRlLgoKZ2NjL3Rl c3RzdWl0ZS9DaGFuZ2VMb2c6CgoJKiBnY2MuZGcvZ29tcC90YXJnZXQtc2ltZC1jbG9uZS0x LmM6IE5ldy4KCSogZ2NjLmRnL2dvbXAvdGFyZ2V0LXNpbWQtY2xvbmUtMi5jOiBOZXcuCgkq IGdjYy5kZy9nb21wL3RhcmdldC1zaW1kLWNsb25lLTMuYzogTmV3LgoJKiBnY2MuZGcvZ29t cC90YXJnZXQtc2ltZC1jbG9uZS00LmM6IE5ldy4KLS0tCiBnY2MvYy1mYW1pbHkvYy5vcHQg ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDQgKwogZ2NjL2NvbmZpZy9hYXJjaDY0 L2FhcmNoNjQuY2MgICAgICAgICAgICAgICAgIHwgIDI0ICsrLQogZ2NjL2NvbmZpZy9nY24v Z2NuLmNjICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDEwICstCiBnY2MvY29uZmlnL2kz ODYvaTM4Ni5jYyAgICAgICAgICAgICAgICAgICAgICAgfCAgMjUgKystCiBnY2MvZG9jL2lu dm9rZS50ZXhpICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTMgKy0KIGdjYy9kb2Mv dG0udGV4aSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgMiArLQogZ2NjL2Zv cnRyYW4vbGFuZy5vcHQgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0ICsKIGdjYy9v bXAtc2ltZC1jbG9uZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICB8IDE3OCArKysrKysr KysrKysrKysrKy0KIGdjYy90YXJnZXQuZGVmICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgMiArLQogLi4uL2djYy5kZy9nb21wL3RhcmdldC1zaW1kLWNsb25lLTEuYyAg ICAgICAgIHwgIDE5ICsrCiAuLi4vZ2NjLmRnL2dvbXAvdGFyZ2V0LXNpbWQtY2xvbmUtMi5j ICAgICAgICAgfCAgMTggKysKIC4uLi9nY2MuZGcvZ29tcC90YXJnZXQtc2ltZC1jbG9uZS0z LmMgICAgICAgICB8ICAxNyArKwogLi4uL2djYy5kZy9nb21wL3RhcmdldC1zaW1kLWNsb25l LTQuYyAgICAgICAgIHwgIDE2ICsrCiAxMyBmaWxlcyBjaGFuZ2VkLCAzMDEgaW5zZXJ0aW9u cygrKSwgMzEgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0 ZS9nY2MuZGcvZ29tcC90YXJnZXQtc2ltZC1jbG9uZS0xLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnY2MvdGVzdHN1aXRlL2djYy5kZy9nb21wL3RhcmdldC1zaW1kLWNsb25lLTIuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLmRnL2dvbXAvdGFyZ2V0LXNpbWQt Y2xvbmUtMy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZ29t cC90YXJnZXQtc2ltZC1jbG9uZS00LmMKCmRpZmYgLS1naXQgYS9nY2MvYy1mYW1pbHkvYy5v cHQgYi9nY2MvYy1mYW1pbHkvYy5vcHQKaW5kZXggZmY2ZmU4NjE1MzQuLjBiZTM5YWU3NzA5 IDEwMDY0NAotLS0gYS9nY2MvYy1mYW1pbHkvYy5vcHQKKysrIGIvZ2NjL2MtZmFtaWx5L2Mu b3B0CkBAIC0xOTkzLDYgKzE5OTMsMTAgQEAgZm9wZW5tcC1zaW1kCiBDIE9iakMgQysrIE9i akMrKyBWYXIoZmxhZ19vcGVubXBfc2ltZCkKIEVuYWJsZSBPcGVuTVAncyBTSU1EIGRpcmVj dGl2ZXMuCiAKK2ZvcGVubXAtdGFyZ2V0LXNpbWQtY2xvbmUKK0MgT2JqQyBDKysgT2JqQysr IFZhcihmbGFnX29wZW5tcF90YXJnZXRfc2ltZF9jbG9uZSkgSW5pdCgxKQorR2VuZXJhdGUg U0lNRCBjbG9uZXMgZm9yIGZ1bmN0aW9ucyB3aXRoIHRoZSBPcGVuTVAgZGVjbGFyZSB0YXJn ZXQgZGlyZWN0aXZlLgorCiBmb3BlcmF0b3ItbmFtZXMKIEMrKyBPYmpDKysKIFJlY29nbml6 ZSBDKysga2V5d29yZHMgbGlrZSBcImNvbXBsXCIgYW5kIFwieG9yXCIuCmRpZmYgLS1naXQg YS9nY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC5jYyBiL2djYy9jb25maWcvYWFyY2g2NC9h YXJjaDY0LmNjCmluZGV4IGYxOTllNzdjZDQyLi40MmM1ZDI4MTUzNyAxMDA2NDQKLS0tIGEv Z2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQuY2MKKysrIGIvZ2NjL2NvbmZpZy9hYXJjaDY0 L2FhcmNoNjQuY2MKQEAgLTI2NjEyLDcgKzI2NjEyLDggQEAgY3VycmVudGx5X3N1cHBvcnRl ZF9zaW1kX3R5cGUgKHRyZWUgdCwgdHJlZSBiKQogc3RhdGljIGludAogYWFyY2g2NF9zaW1k X2Nsb25lX2NvbXB1dGVfdmVjc2l6ZV9hbmRfc2ltZGxlbiAoc3RydWN0IGNncmFwaF9ub2Rl ICpub2RlLAogCQkJCQlzdHJ1Y3QgY2dyYXBoX3NpbWRfY2xvbmUgKmNsb25laSwKLQkJCQkJ dHJlZSBiYXNlX3R5cGUsIGludCBudW0pCisJCQkJCXRyZWUgYmFzZV90eXBlLCBpbnQgbnVt LAorCQkJCQlib29sIGVycm9yX3ApCiB7CiAgIHRyZWUgdCwgcmV0X3R5cGU7CiAgIHVuc2ln bmVkIGludCBlbHRfYml0cywgY291bnQ7CkBAIC0yNjYzMCw4ICsyNjYzMSw5IEBAIGFhcmNo NjRfc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4gKHN0cnVjdCBjZ3Jh cGhfbm9kZSAqbm9kZSwKIAkgIHx8IGNvbnN0X3NpbWRsZW4gPiAxMDI0CiAJICB8fCAoY29u c3Rfc2ltZGxlbiAmIChjb25zdF9zaW1kbGVuIC0gMSkpICE9IDApKQogICAgIHsKLSAgICAg IHdhcm5pbmdfYXQgKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChub2RlLT5kZWNsKSwgMCwKLQkJ ICAidW5zdXBwb3J0ZWQgc2ltZGxlbiAld2QiLCBjb25zdF9zaW1kbGVuKTsKKyAgICAgIGlm IChlcnJvcl9wKQorCXdhcm5pbmdfYXQgKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChub2RlLT5k ZWNsKSwgMCwKKwkJICAgICJ1bnN1cHBvcnRlZCBzaW1kbGVuICV3ZCIsIGNvbnN0X3NpbWRs ZW4pOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0yNjYzOSw3ICsyNjY0MSw5IEBA IGFhcmNoNjRfc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4gKHN0cnVj dCBjZ3JhcGhfbm9kZSAqbm9kZSwKICAgaWYgKFRSRUVfQ09ERSAocmV0X3R5cGUpICE9IFZP SURfVFlQRQogICAgICAgJiYgIWN1cnJlbnRseV9zdXBwb3J0ZWRfc2ltZF90eXBlIChyZXRf dHlwZSwgYmFzZV90eXBlKSkKICAgICB7Ci0gICAgICBpZiAoVFlQRV9TSVpFIChyZXRfdHlw ZSkgIT0gVFlQRV9TSVpFIChiYXNlX3R5cGUpKQorICAgICAgaWYgKCFlcnJvcl9wKQorCTsK KyAgICAgIGVsc2UgaWYgKFRZUEVfU0laRSAocmV0X3R5cGUpICE9IFRZUEVfU0laRSAoYmFz ZV90eXBlKSkKIAl3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVj bCksIDAsCiAJCSAgICAiR0NDIGRvZXMgbm90IGN1cnJlbnRseSBzdXBwb3J0IG1peGVkIHNp emUgdHlwZXMgIgogCQkgICAgImZvciAlPHNpbWQlPiBmdW5jdGlvbnMiKTsKQEAgLTI2NjY2 LDcgKzI2NjcwLDkgQEAgYWFyY2g2NF9zaW1kX2Nsb25lX2NvbXB1dGVfdmVjc2l6ZV9hbmRf c2ltZGxlbiAoc3RydWN0IGNncmFwaF9ub2RlICpub2RlLAogICAgICAgaWYgKGNsb25laS0+ YXJnc1tpXS5hcmdfdHlwZSAhPSBTSU1EX0NMT05FX0FSR19UWVBFX1VOSUZPUk0KIAkgICYm ICFjdXJyZW50bHlfc3VwcG9ydGVkX3NpbWRfdHlwZSAoYXJnX3R5cGUsIGJhc2VfdHlwZSkp CiAJewotCSAgaWYgKFRZUEVfU0laRSAoYXJnX3R5cGUpICE9IFRZUEVfU0laRSAoYmFzZV90 eXBlKSkKKwkgIGlmICghZXJyb3JfcCkKKwkgICAgOworCSAgZWxzZSBpZiAoVFlQRV9TSVpF IChhcmdfdHlwZSkgIT0gVFlQRV9TSVpFIChiYXNlX3R5cGUpKQogCSAgICB3YXJuaW5nX2F0 IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksIDAsCiAJCQkiR0NDIGRvZXMg bm90IGN1cnJlbnRseSBzdXBwb3J0IG1peGVkIHNpemUgdHlwZXMgIgogCQkJImZvciAlPHNp bWQlPiBmdW5jdGlvbnMiKTsKQEAgLTI2Njk2LDkgKzI2NzAyLDExIEBAIGFhcmNoNjRfc2lt ZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4gKHN0cnVjdCBjZ3JhcGhfbm9k ZSAqbm9kZSwKICAgICAgIGlmIChjbG9uZWktPnNpbWRsZW4uaXNfY29uc3RhbnQgKCZjb25z dF9zaW1kbGVuKQogCSAgJiYgbWF5YmVfbmUgKHZlY19iaXRzLCA2NFUpICYmIG1heWJlX25l ICh2ZWNfYml0cywgMTI4VSkpCiAJewotCSAgd2FybmluZ19hdCAoREVDTF9TT1VSQ0VfTE9D QVRJT04gKG5vZGUtPmRlY2wpLCAwLAotCQkgICAgICAiR0NDIGRvZXMgbm90IGN1cnJlbnRs eSBzdXBwb3J0IHNpbWRsZW4gJXdkIGZvciB0eXBlICVxVCIsCi0JCSAgICAgIGNvbnN0X3Np bWRsZW4sIGJhc2VfdHlwZSk7CisJICBpZiAoZXJyb3JfcCkKKwkgICAgd2FybmluZ19hdCAo REVDTF9TT1VSQ0VfTE9DQVRJT04gKG5vZGUtPmRlY2wpLCAwLAorCQkJIkdDQyBkb2VzIG5v dCBjdXJyZW50bHkgc3VwcG9ydCBzaW1kbGVuICV3ZCBmb3IgIgorCQkJInR5cGUgJXFUIiwK KwkJCWNvbnN0X3NpbWRsZW4sIGJhc2VfdHlwZSk7CiAJICByZXR1cm4gMDsKIAl9CiAgICAg fQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9nY24vZ2NuLmNjIGIvZ2NjL2NvbmZpZy9nY24v Z2NuLmNjCmluZGV4IGNlYjY5MDAwODA3Li43NzFjZmFjOTY3MiAxMDA2NDQKLS0tIGEvZ2Nj L2NvbmZpZy9nY24vZ2NuLmNjCisrKyBiL2djYy9jb25maWcvZ2NuL2djbi5jYwpAQCAtNDU2 Miw3ICs0NTYyLDggQEAgc3RhdGljIGludAogZ2NuX3NpbWRfY2xvbmVfY29tcHV0ZV92ZWNz aXplX2FuZF9zaW1kbGVuIChzdHJ1Y3QgY2dyYXBoX25vZGUgKkFSR19VTlVTRUQgKG5vZGUp LAogCQkJCQkgICAgc3RydWN0IGNncmFwaF9zaW1kX2Nsb25lICpjbG9uZWksCiAJCQkJCSAg ICB0cmVlIGJhc2VfdHlwZSwKLQkJCQkJICAgIGludCBBUkdfVU5VU0VEIChudW0pKQorCQkJ CQkgICAgaW50IEFSR19VTlVTRUQgKG51bSksCisJCQkJCSAgICBib29sIGVycm9yX3ApCiB7 CiAgIHVuc2lnbmVkIGludCBlbHRfYml0cyA9IEdFVF9NT0RFX0JJVFNJWkUgKFNDQUxBUl9U WVBFX01PREUgKGJhc2VfdHlwZSkpOwogCkBAIC00NTcyLDkgKzQ1NzMsMTAgQEAgZ2NuX3Np bWRfY2xvbmVfY29tcHV0ZV92ZWNzaXplX2FuZF9zaW1kbGVuIChzdHJ1Y3QgY2dyYXBoX25v ZGUgKkFSR19VTlVTRUQgKG5vZGUKICAgICB7CiAgICAgICAvKiBOb3RlIHRoYXQgeDg2IGhh cyBhIHNpbWlsYXIgbWVzc2FnZSB0aGF0IGlzIGxpa2VseSB0byB0cmlnZ2VyIG9uCiAJIHNp emVzIHRoYXQgYXJlIE9LIGZvciBnY247IHRoZSB1c2VyIGNhbid0IHdpbi4gICovCi0gICAg ICB3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksIDAsCi0J CSAgInVuc3VwcG9ydGVkIHNpbWRsZW4gJXdkIChhbWRnY24pIiwKLQkJICBjbG9uZWktPnNp bWRsZW4udG9fY29uc3RhbnQgKCkpOworICAgICAgaWYgKGVycm9yX3ApCisJd2FybmluZ19h dCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKG5vZGUtPmRlY2wpLCAwLAorCQkgICAgInVuc3Vw cG9ydGVkIHNpbWRsZW4gJXdkIChhbWRnY24pIiwKKwkJICAgIGNsb25laS0+c2ltZGxlbi50 b19jb25zdGFudCAoKSk7CiAgICAgICByZXR1cm4gMDsKICAgICB9CiAKZGlmZiAtLWdpdCBh L2djYy9jb25maWcvaTM4Ni9pMzg2LmNjIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYuY2MKaW5k ZXggYzRkMGUzNmU5YzAuLjk4ZTVhM2YyOGZlIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kz ODYvaTM4Ni5jYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5jYwpAQCAtMjM2NDcsNyAr MjM2NDcsOCBAQCBpeDg2X21lbW1vZGVsX2NoZWNrICh1bnNpZ25lZCBIT1NUX1dJREVfSU5U IHZhbCkKIHN0YXRpYyBpbnQKIGl4ODZfc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5k X3NpbWRsZW4gKHN0cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSwKIAkJCQkJICAgICBzdHJ1Y3Qg Y2dyYXBoX3NpbWRfY2xvbmUgKmNsb25laSwKLQkJCQkJICAgICB0cmVlIGJhc2VfdHlwZSwg aW50IG51bSkKKwkJCQkJICAgICB0cmVlIGJhc2VfdHlwZSwgaW50IG51bSwKKwkJCQkJICAg ICBib29sIGVycm9yX3ApCiB7CiAgIGludCByZXQgPSAxOwogCkBAIC0yMzY1Niw4ICsyMzY1 Nyw5IEBAIGl4ODZfc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4gKHN0 cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSwKIAkgIHx8IGNsb25laS0+c2ltZGxlbiA+IDEwMjQK IAkgIHx8IChjbG9uZWktPnNpbWRsZW4gJiAoY2xvbmVpLT5zaW1kbGVuIC0gMSkpICE9IDAp KQogICAgIHsKLSAgICAgIHdhcm5pbmdfYXQgKERFQ0xfU09VUkNFX0xPQ0FUSU9OIChub2Rl LT5kZWNsKSwgMCwKLQkJICAidW5zdXBwb3J0ZWQgc2ltZGxlbiAld2QiLCBjbG9uZWktPnNp bWRsZW4udG9fY29uc3RhbnQgKCkpOworICAgICAgaWYgKGVycm9yX3ApCisJd2FybmluZ19h dCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKG5vZGUtPmRlY2wpLCAwLAorCQkgICAgInVuc3Vw cG9ydGVkIHNpbWRsZW4gJXdkIiwgY2xvbmVpLT5zaW1kbGVuLnRvX2NvbnN0YW50ICgpKTsK ICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjM2NzcsOCArMjM2NzksOSBAQCBpeDg2 X3NpbWRfY2xvbmVfY29tcHV0ZV92ZWNzaXplX2FuZF9zaW1kbGVuIChzdHJ1Y3QgY2dyYXBo X25vZGUgKm5vZGUsCiAJICBicmVhazsKIAkvKiBGQUxMVEhSVSAqLwogICAgICAgZGVmYXVs dDoKLQl3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElPTiAobm9kZS0+ZGVjbCksIDAs Ci0JCSAgICAidW5zdXBwb3J0ZWQgcmV0dXJuIHR5cGUgJXFUIGZvciBzaW1kIiwgcmV0X3R5 cGUpOworCWlmIChlcnJvcl9wKQorCSAgd2FybmluZ19hdCAoREVDTF9TT1VSQ0VfTE9DQVRJ T04gKG5vZGUtPmRlY2wpLCAwLAorCQkgICAgICAidW5zdXBwb3J0ZWQgcmV0dXJuIHR5cGUg JXFUIGZvciBzaW1kIiwgcmV0X3R5cGUpOwogCXJldHVybiAwOwogICAgICAgfQogCkBAIC0y MzcwNyw4ICsyMzcxMCw5IEBAIGl4ODZfc2ltZF9jbG9uZV9jb21wdXRlX3ZlY3NpemVfYW5k X3NpbWRsZW4gKHN0cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSwKIAlkZWZhdWx0OgogCSAgaWYg KGNsb25laS0+YXJnc1tpXS5hcmdfdHlwZSA9PSBTSU1EX0NMT05FX0FSR19UWVBFX1VOSUZP Uk0pCiAJICAgIGJyZWFrOwotCSAgd2FybmluZ19hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04g KG5vZGUtPmRlY2wpLCAwLAotCQkgICAgICAidW5zdXBwb3J0ZWQgYXJndW1lbnQgdHlwZSAl cVQgZm9yIHNpbWQiLCBhcmdfdHlwZSk7CisJICBpZiAoZXJyb3JfcCkKKwkgICAgd2Fybmlu Z19hdCAoREVDTF9TT1VSQ0VfTE9DQVRJT04gKG5vZGUtPmRlY2wpLCAwLAorCQkJInVuc3Vw cG9ydGVkIGFyZ3VtZW50IHR5cGUgJXFUIGZvciBzaW1kIiwgYXJnX3R5cGUpOwogCSAgcmV0 dXJuIDA7CiAJfQogICAgIH0KQEAgLTIzNzg0LDkgKzIzNzg4LDEwIEBAIGl4ODZfc2ltZF9j bG9uZV9jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4gKHN0cnVjdCBjZ3JhcGhfbm9kZSAq bm9kZSwKIAljbnQgLz0gY2xvbmVpLT52ZWNzaXplX2Zsb2F0OwogICAgICAgaWYgKGNudCA+ IChUQVJHRVRfNjRCSVQgPyAxNiA6IDgpKQogCXsKLQkgIHdhcm5pbmdfYXQgKERFQ0xfU09V UkNFX0xPQ0FUSU9OIChub2RlLT5kZWNsKSwgMCwKLQkJICAgICAgInVuc3VwcG9ydGVkIHNp bWRsZW4gJXdkIiwKLQkJICAgICAgY2xvbmVpLT5zaW1kbGVuLnRvX2NvbnN0YW50ICgpKTsK KwkgIGlmIChlcnJvcl9wKQorCSAgICB3YXJuaW5nX2F0IChERUNMX1NPVVJDRV9MT0NBVElP TiAobm9kZS0+ZGVjbCksIDAsCisJCQkidW5zdXBwb3J0ZWQgc2ltZGxlbiAld2QiLAorCQkJ Y2xvbmVpLT5zaW1kbGVuLnRvX2NvbnN0YW50ICgpKTsKIAkgIHJldHVybiAwOwogCX0KICAg ICAgIH0KZGlmZiAtLWdpdCBhL2djYy9kb2MvaW52b2tlLnRleGkgYi9nY2MvZG9jL2ludm9r ZS50ZXhpCmluZGV4IDhkZWY2YmFhOTA0Li5mODIyMDkxYWYwOSAxMDA2NDQKLS0tIGEvZ2Nj L2RvYy9pbnZva2UudGV4aQorKysgYi9nY2MvZG9jL2ludm9rZS50ZXhpCkBAIC0yMDQsNyAr MjA0LDcgQEAgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KIC1mbGF4LXZlY3Rvci1jb252 ZXJzaW9ucyAgLWZtcy1leHRlbnNpb25zIEBnb2wKIC1mb2ZmbG9hZD1AdmFye2FyZ30gIC1m b2ZmbG9hZC1vcHRpb25zPUB2YXJ7YXJnfSBAZ29sCiAtZm9wZW5hY2MgIC1mb3BlbmFjYy1k aW09QHZhcntnZW9tfSBAZ29sCi0tZm9wZW5tcCAgLWZvcGVubXAtc2ltZCBAZ29sCistZm9w ZW5tcCAgLWZvcGVubXAtc2ltZCAgLWZuby1vcGVubXAtdGFyZ2V0LXNpbWQtY2xvbmUgQGdv bAogLWZwZXJtaXR0ZWQtZmx0LWV2YWwtbWV0aG9kcz1AdmFye3N0YW5kYXJkfSBAZ29sCiAt ZnBsYW45LWV4dGVuc2lvbnMgIC1mc2lnbmVkLWJpdGZpZWxkcyAgLWZ1bnNpZ25lZC1iaXRm aWVsZHMgQGdvbAogLWZzaWduZWQtY2hhciAgLWZ1bnNpZ25lZC1jaGFyICAtZnNzby1zdHJ1 Y3Q9QHZhcntlbmRpYW5uZXNzfX0KQEAgLTI3NDksNiArMjc0OSwxNyBAQCBFbmFibGUgaGFu ZGxpbmcgb2YgT3Blbk1QJ3MgU0lNRCBkaXJlY3RpdmVzIHdpdGggQGNvZGV7I3ByYWdtYSBv bXB9CiBpbiBDL0MrKyBhbmQgQGNvZGV7ISRvbXB9IGluIEZvcnRyYW4uIE90aGVyIE9wZW5N UCBkaXJlY3RpdmVzCiBhcmUgaWdub3JlZC4KIAorQGl0ZW0gLWZuby1vcGVubXAtdGFyZ2V0 LXNpbWQtY2xvbmUKK0BvcGluZGV4IGZuby1vcGVubXAtdGFyZ2V0LXNpbWQtY2xvbmUKK0Bj aW5kZXggT3Blbk1QIHRhcmdldCBTSU1EIGNsb25lCitJbiBhZGRpdGlvbiB0byBnZW5lcmF0 aW5nIFNJTUQgY2xvbmVzIGZvciBmdW5jdGlvbnMgbWFya2VkIHdpdGggdGhlCitAY29kZXtk ZWNsYXJlIHNpbWR9IGRpcmVjdGl2ZSwgYnkgZGVmYXVsdCwgR0NDIGFsc28gZ2VuZXJhdGVz IGNsb25lcworZm9yIGZ1bmN0aW9ucyBtYXJrZWQgd2l0aCB0aGUgT3Blbk1QIEBjb2Rle2Rl Y2xhcmUgdGFyZ2V0fSBkaXJlY3RpdmUKK3RoYXQgYXJlIHN1aXRhYmxlIGZvciB2ZWN0b3Jp emF0aW9uLgorWW91IGNhbiBkaXNhYmxlIHRoaXMgYmVoYXZpb3IgYW5kIHJlc3RyaWN0IFNJ TUQgY2xvbmUgZ2VuZXJhdGlvbiBvbmx5Cit0byBmdW5jdGlvbnMgZXhwbGljaXRseSBtYXJr ZWQgQGNvZGV7ZGVjbGFyZSBzaW1kfSB1c2luZworQG9wdGlvbnstZm5vLW9wZW5tcC10YXJn ZXQtc2ltZH0uCisKIEBpdGVtIC1mcGVybWl0dGVkLWZsdC1ldmFsLW1ldGhvZHM9QHZhcntz dHlsZX0KIEBvcGluZGV4IGZwZXJtaXR0ZWQtZmx0LWV2YWwtbWV0aG9kcwogQG9waW5kZXgg ZnBlcm1pdHRlZC1mbHQtZXZhbC1tZXRob2RzPWMxMQpkaWZmIC0tZ2l0IGEvZ2NjL2RvYy90 bS50ZXhpIGIvZ2NjL2RvYy90bS50ZXhpCmluZGV4IGMzMDAxYzZkZWQ5Li5kMGEzNjZmMTkw OCAxMDA2NDQKLS0tIGEvZ2NjL2RvYy90bS50ZXhpCisrKyBiL2djYy9kb2MvdG0udGV4aQpA QCAtNjI0OSw3ICs2MjQ5LDcgQEAgVGhlIGRlZmF1bHQgaXMgQGNvZGV7TlVMTF9UUkVFfSB3 aGljaCBtZWFucyB0byBub3QgdmVjdG9yaXplIHNjYXR0ZXIKIHN0b3Jlcy4KIEBlbmQgZGVm dHlwZWZuCiAKLUBkZWZ0eXBlZm4ge1RhcmdldCBIb29rfSBpbnQgVEFSR0VUX1NJTURfQ0xP TkVfQ09NUFVURV9WRUNTSVpFX0FORF9TSU1ETEVOIChzdHJ1Y3QgY2dyYXBoX25vZGUgKkB2 YXJ7fSwgc3RydWN0IGNncmFwaF9zaW1kX2Nsb25lICpAdmFye30sIEB2YXJ7dHJlZX0sIEB2 YXJ7aW50fSkKK0BkZWZ0eXBlZm4ge1RhcmdldCBIb29rfSBpbnQgVEFSR0VUX1NJTURfQ0xP TkVfQ09NUFVURV9WRUNTSVpFX0FORF9TSU1ETEVOIChzdHJ1Y3QgY2dyYXBoX25vZGUgKkB2 YXJ7fSwgc3RydWN0IGNncmFwaF9zaW1kX2Nsb25lICpAdmFye30sIEB2YXJ7dHJlZX0sIEB2 YXJ7aW50fSwgQHZhcntib29sfSkKIFRoaXMgaG9vayBzaG91bGQgc2V0IEB2YXJ7dmVjc2l6 ZV9tYW5nbGV9LCBAdmFye3ZlY3NpemVfaW50fSwgQHZhcnt2ZWNzaXplX2Zsb2F0fQogZmll bGRzIGluIEB2YXJ7c2ltZF9jbG9uZX0gc3RydWN0dXJlIHBvaW50ZWQgYnkgQHZhcntjbG9u ZV9pbmZvfSBhcmd1bWVudCBhbmQgYWxzbwogQHZhcntzaW1kbGVufSBmaWVsZCBpZiBpdCB3 YXMgcHJldmlvdXNseSAwLgpkaWZmIC0tZ2l0IGEvZ2NjL2ZvcnRyYW4vbGFuZy5vcHQgYi9n Y2MvZm9ydHJhbi9sYW5nLm9wdAppbmRleCBiMThhNmQzZjRmOS4uNThmN2QzYTI4MzUgMTAw NjQ0Ci0tLSBhL2djYy9mb3J0cmFuL2xhbmcub3B0CisrKyBiL2djYy9mb3J0cmFuL2xhbmcu b3B0CkBAIC03MTIsNiArNzEyLDEwIEBAIGZvcGVubXAtc2ltZAogRm9ydHJhbgogOyBEb2N1 bWVudGVkIGluIEMKIAorZm9wZW5tcC10YXJnZXQtc2ltZC1jbG9uZQorRm9ydHJhbgorOyBE b2N1bWVudGVkIGluIEMKKwogZnBhY2stZGVyaXZlZAogRm9ydHJhbiBWYXIoZmxhZ19wYWNr X2Rlcml2ZWQpCiBUcnkgdG8gbGF5IG91dCBkZXJpdmVkIHR5cGVzIGFzIGNvbXBhY3RseSBh cyBwb3NzaWJsZS4KZGlmZiAtLWdpdCBhL2djYy9vbXAtc2ltZC1jbG9uZS5jYyBiL2djYy9v bXAtc2ltZC1jbG9uZS5jYwppbmRleCAzNGNiZWU1YWZjZC4uMDdjN2JhZDBlMmMgMTAwNjQ0 Ci0tLSBhL2djYy9vbXAtc2ltZC1jbG9uZS5jYworKysgYi9nY2Mvb21wLXNpbWQtY2xvbmUu Y2MKQEAgLTUxLDYgKzUxLDE1MSBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxlIENP UFlJTkczLiAgSWYgbm90IHNlZQogI2luY2x1ZGUgInN0cmluZ3Bvb2wuaCIKICNpbmNsdWRl ICJhdHRyaWJzLmgiCiAjaW5jbHVkZSAib21wLXNpbWQtY2xvbmUuaCIKKyNpbmNsdWRlICJv bXAtbG93LmgiCisKKy8qIEhlbHBlciBmdW5jdGlvbiBmb3IgbWFya19hdXRvX3NpbWRfY2xv bmU7IHJldHVybiBmYWxzZSBpZiB0aGUgc3RhdGVtZW50CisgICB2aW9sYXRlcyByZXN0cmlj dGlvbnMgZm9yIGFuICJvbXAgZGVjbGFyZSBzaW1kIiBmdW5jdGlvbi4gIFNwZWNpZmljYWxs eSwKKyAgIHRoZSBmdW5jdGlvbiBtdXN0IG5vdAorICAgLSB0aHJvdyBvciBjYWxsIHNldGpt cC9sb25nam1wCisgICAtIHdyaXRlIG1lbW9yeSB0aGF0IGNvdWxkIGFsaWFzIHBhcmFsbGVs IGNhbGxzCisgICAtIGluY2x1ZGUgb3Blbm1wIGRpcmVjdGl2ZXMgb3IgY2FsbHMKKyAgIC0g Y2FsbCBmdW5jdGlvbnMgdGhhdCBtaWdodCBkbyB0aG9zZSB0aGluZ3MgKi8KKworc3RhdGlj IGJvb2wKK2F1dG9fc2ltZF9jaGVja19zdG10IChnaW1wbGUgKnN0bXQsIHRyZWUgb3V0ZXIp Cit7CisgIHRyZWUgZGVjbDsKKworICBzd2l0Y2ggKGdpbXBsZV9jb2RlIChzdG10KSkKKyAg ICB7CisgICAgY2FzZSBHSU1QTEVfQ0FMTDoKKyAgICAgIGRlY2wgPSBnaW1wbGVfY2FsbF9m bmRlY2wgKHN0bXQpOworCisgICAgICAvKiBXZSBjYW4ndCBrbm93IHdoZXRoZXIgaW5kaXJl Y3QgY2FsbHMgYXJlIHNhZmUuICAqLworICAgICAgaWYgKGRlY2wgPT0gTlVMTF9UUkVFKQor CXJldHVybiBmYWxzZTsKKworICAgICAgLyogQ2FsbHMgdG8gZnVuY3Rpb25zIHRoYXQgYXJl IENPTlNUIG9yIFBVUkUgYXJlIG9rLiAgKi8KKyAgICAgIGlmIChnaW1wbGVfY2FsbF9mbGFn cyAoc3RtdCkgJiAoRUNGX0NPTlNUIHwgRUNGX1BVUkUpKQorCWJyZWFrOworCisgICAgICAv KiBDYWxscyB0byBmdW5jdGlvbnMgdGhhdCBhcmUgYWxyZWFkeSBtYXJrZWQgIm9tcCBkZWNs YXJlIHNpbWQiIGFyZQorCSBPSy4gICovCisgICAgICBpZiAobG9va3VwX2F0dHJpYnV0ZSAo Im9tcCBkZWNsYXJlIHNpbWQiLCBERUNMX0FUVFJJQlVURVMgKGRlY2wpKSkKKwlicmVhazsK KworICAgICAgLyogTGV0IHJlY3Vyc2l2ZSBjYWxscyB0byB0aGUgY3VycmVudCBmdW5jdGlv biB0aHJvdWdoLiAgKi8KKyAgICAgIGlmIChkZWNsID09IG91dGVyKQorCWJyZWFrOworCisg ICAgICAvKiBPdGhlciBmdW5jdGlvbiBjYWxscyBhcmUgbm90IHBlcm1pdHRlZC4gICovCisg ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8qIE9wZW5NUCBkaXJlY3RpdmVzIGFyZSBu b3QgcGVybWl0dGVkLiAgKi8KKyAgICBDQVNFX0dJTVBMRV9PTVA6CisgICAgICByZXR1cm4g ZmFsc2U7CisKKyAgICAgIC8qIENvbnNlcnZhdGl2ZWx5IHJlamVjdCBhbGwgRUgtcmVsYXRl ZCBjb25zdHJ1Y3RzLiAgKi8KKyAgICBjYXNlIEdJTVBMRV9DQVRDSDoKKyAgICBjYXNlIEdJ TVBMRV9FSF9GSUxURVI6CisgICAgY2FzZSBHSU1QTEVfRUhfTVVTVF9OT1RfVEhST1c6Cisg ICAgY2FzZSBHSU1QTEVfRUhfRUxTRToKKyAgICBjYXNlIEdJTVBMRV9FSF9ESVNQQVRDSDoK KyAgICBjYXNlIEdJTVBMRV9SRVNYOgorICAgIGNhc2UgR0lNUExFX1RSWToKKyAgICAgIHJl dHVybiBmYWxzZTsKKworICAgICAgLyogQXNtcyBhcmUgbm90IHBlcm1pdHRlZCBzaW5jZSB3 ZSBkb24ndCBrbm93IHdoYXQgdGhleSBkby4gICovCisgICAgY2FzZSBHSU1QTEVfQVNNOgor ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAg IH0KKworICAvKiBNZW1vcnkgd3JpdGVzIGFyZSBub3QgcGVybWl0dGVkLgorICAgICBGSVhN RTogdGhpcyBjb3VsZCBiZSByZWxheGVkIGEgbGl0dGxlIHRvIHBlcm1pdCB3cml0ZXMgdG8K KyAgICAgZnVuY3Rpb24tbG9jYWwgdmFyaWFibGVzIHRoYXQgY291bGQgbm90IGFsaWFzIG90 aGVyIGluc3RhbmNlcworICAgICBvZiB0aGUgZnVuY3Rpb24gcnVubmluZyBpbiBwYXJhbGxl bC4gICovCisgIGlmIChnaW1wbGVfc3RvcmVfcCAoc3RtdCkpCisgICAgcmV0dXJuIGZhbHNl OworICBlbHNlCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8qIElmIHRoZSBmdW5jdGlvbiBO T0RFIGFwcGVhcnMgc3VpdGFibGUgZm9yIGF1dG8tYW5ub3RhdGlvbiB3aXRoICJkZWNsYXJl CisgICBzaW1kIiwgYWRkIGFuZCByZXR1cm4gc3VjaCBhbiBhdHRyaWJ1dGUsIG90aGVyd2lz ZSByZXR1cm4gbnVsbC4gICovCisKK3N0YXRpYyB0cmVlCittYXJrX2F1dG9fc2ltZF9jbG9u ZSAoc3RydWN0IGNncmFwaF9ub2RlICpub2RlKQoreworICB0cmVlIGRlY2wgPSBub2RlLT5k ZWNsOworICB0cmVlIHQ7CisgIG1hY2hpbmVfbW9kZSBtOworICB0cmVlIHJlc3VsdDsKKyAg YmFzaWNfYmxvY2sgYmI7CisKKyAgLyogTm90aGluZyB0byBkbyBpZiB0aGUgZnVuY3Rpb24g aXNuJ3QgYSBkZWNsYXJhdGlvbiBvciBkb2Vzbid0CisgICAgIGhhdmUgYSBib2R5LiAgKi8K KyAgaWYgKCFub2RlLT5kZWZpbml0aW9uIHx8ICFub2RlLT5oYXNfZ2ltcGxlX2JvZHlfcCAo KSkKKyAgICByZXR1cm4gTlVMTF9UUkVFOworCisgIC8qIE5vdGhpbmcgdG8gZG8gaWYgdGhl IGZ1bmN0aW9uIGFscmVhZHkgaGFzIHRoZSAib21wIGRlY2xhcmUgc2ltZCIKKyAgICAgYXR0 cmlidXRlLCBpcyBtYXJrZWQgbm9jbG9uZSwgb3IgaXMgbm90ICJvbXAgZGVjbGFyZSB0YXJn ZXQiLiAgKi8KKyAgaWYgKGxvb2t1cF9hdHRyaWJ1dGUgKCJvbXAgZGVjbGFyZSBzaW1kIiwg REVDTF9BVFRSSUJVVEVTIChkZWNsKSkKKyAgICAgIHx8IGxvb2t1cF9hdHRyaWJ1dGUgKCJu b2Nsb25lIiwgREVDTF9BVFRSSUJVVEVTIChkZWNsKSkKKyAgICAgIHx8ICFsb29rdXBfYXR0 cmlidXRlICgib21wIGRlY2xhcmUgdGFyZ2V0IiwgREVDTF9BVFRSSUJVVEVTIChkZWNsKSkp CisgICAgcmV0dXJuIE5VTExfVFJFRTsKKworICAvKiBCYWNrZW5kcyB3aWxsIGNoZWNrIGZv ciB2ZWN0b3JpemFibGUgYXJndW1lbnRzL3JldHVybiB0eXBlcyBpbiBhCisgICAgIHRhcmdl dC1zcGVjaWZpYyB3YXksIGJ1dCB3ZSBjYW4gaW1tZWRpYXRlbHkgZmlsdGVyIG91dCBmdW5j dGlvbnMKKyAgICAgdGhhdCBoYXZlIG5vbi1zY2FsYXIgYXJndW1lbnRzL3JldHVybiB0eXBl cy4gIEFsc28sIGF0b21pYyB0eXBlcworICAgICB0cmlnZ2VyIHdhcm5pbmdzIGluIHNpbWRf Y2xvbmVfY2xhdXNlc19leHRyYWN0LiAgKi8KKyAgdCA9IFRSRUVfVFlQRSAoVFJFRV9UWVBF IChkZWNsKSk7CisgIG0gPSBUWVBFX01PREUgKHQpOworICBpZiAoIShWT0lEX1RZUEVfUCAo dCkgfHwgaXNfYSA8c2NhbGFyX21vZGU+IChtKSkgfHwgVFlQRV9BVE9NSUMgKHQpKQorICAg IHJldHVybiBOVUxMX1RSRUU7CisKKyAgaWYgKFRZUEVfQVJHX1RZUEVTIChUUkVFX1RZUEUg KGRlY2wpKSkKKyAgICB7CisgICAgICBmb3IgKHRyZWUgdGVtcCA9IFRZUEVfQVJHX1RZUEVT IChUUkVFX1RZUEUgKGRlY2wpKTsKKwkgICB0ZW1wOyB0ZW1wID0gVFJFRV9DSEFJTiAodGVt cCkpCisJeworCSAgdCA9IFRSRUVfVkFMVUUgKHRlbXApOworCSAgbSA9IFRZUEVfTU9ERSAo dCk7CisJICBpZiAoIShWT0lEX1RZUEVfUCAodCkgfHwgaXNfYSA8c2NhbGFyX21vZGU+ICht KSkgfHwgVFlQRV9BVE9NSUMgKHQpKQorCSAgICByZXR1cm4gTlVMTF9UUkVFOworCX0KKyAg ICB9CisgIGVsc2UKKyAgICB7CisgICAgICBmb3IgKHRyZWUgdGVtcCA9IERFQ0xfQVJHVU1F TlRTIChkZWNsKTsgdGVtcDsgdGVtcCA9IERFQ0xfQ0hBSU4gKHRlbXApKQorCXsKKwkgIHQg PSBUUkVFX1RZUEUgKHRlbXApOworCSAgbSA9IFRZUEVfTU9ERSAodCk7CisJICBpZiAoIShW T0lEX1RZUEVfUCAodCkgfHwgaXNfYSA8c2NhbGFyX21vZGU+IChtKSkgfHwgVFlQRV9BVE9N SUMgKHQpKQorCSAgICByZXR1cm4gTlVMTF9UUkVFOworCX0KKyAgICB9CisKKyAgLyogU2Nh biB0aGUgZnVuY3Rpb24gYm9keSB0byBzZWUgaWYgaXQgaXMgc3VpdGFibGUgZm9yIFNJTUQt aXphdGlvbi4gICovCisgIG5vZGUtPmdldF9ib2R5ICgpOworCisgIEZPUl9FQUNIX0JCX0ZO IChiYiwgREVDTF9TVFJVQ1RfRlVOQ1RJT04gKGRlY2wpKQorICAgIHsKKyAgICAgIGZvciAo Z2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpID0gZ3NpX3N0YXJ0X2JiIChiYik7ICFnc2lfZW5k X3AgKGdzaSk7CisJICAgZ3NpX25leHQgKCZnc2kpKQorCWlmICghYXV0b19zaW1kX2NoZWNr X3N0bXQgKGdzaV9zdG10IChnc2kpLCBkZWNsKSkKKwkgIHJldHVybiBOVUxMX1RSRUU7Cisg ICAgfQorCisgIC8qIEFsbCBpcyBnb29kLiAgKi8KKyAgcmVzdWx0ID0gdHJlZV9jb25zIChn ZXRfaWRlbnRpZmllciAoIm9tcCBkZWNsYXJlIHNpbWQiKSwgTlVMTCwKKwkJICAgICAgREVD TF9BVFRSSUJVVEVTIChkZWNsKSk7CisgIERFQ0xfQVRUUklCVVRFUyAoZGVjbCkgPSByZXN1 bHQ7CisgIHJldHVybiByZXN1bHQ7Cit9CisKIAogLyogUmV0dXJuIHRoZSBudW1iZXIgb2Yg ZWxlbWVudHMgaW4gdmVjdG9yIHR5cGUgVkVDVFlQRSwgd2hpY2ggaXMgYXNzb2NpYXRlZAog ICAgd2l0aCBhIFNJTUQgY2xvbmUuICBBdCBwcmVzZW50IHRoZXNlIGFsd2F5cyBoYXZlIGEg Y29uc3RhbnQgbGVuZ3RoLiAgKi8KQEAgLTE2ODMsMTMgKzE4MjgsMzEgQEAgc2ltZF9jbG9u ZV9hZGp1c3QgKHN0cnVjdCBjZ3JhcGhfbm9kZSAqbm9kZSkKIHZvaWQKIGV4cGFuZF9zaW1k X2Nsb25lcyAoc3RydWN0IGNncmFwaF9ub2RlICpub2RlKQogewotICB0cmVlIGF0dHIgPSBs b29rdXBfYXR0cmlidXRlICgib21wIGRlY2xhcmUgc2ltZCIsCi0JCQkJREVDTF9BVFRSSUJV VEVTIChub2RlLT5kZWNsKSk7Ci0gIGlmIChhdHRyID09IE5VTExfVFJFRQotICAgICAgfHwg bm9kZS0+aW5saW5lZF90bworICB0cmVlIGF0dHI7CisgIGJvb2wgZXJyb3JfcCA9IHRydWU7 CisKKyAgaWYgKG5vZGUtPmlubGluZWRfdG8KICAgICAgIHx8IGxvb2t1cF9hdHRyaWJ1dGUg KCJub2Nsb25lIiwgREVDTF9BVFRSSUJVVEVTIChub2RlLT5kZWNsKSkpCiAgICAgcmV0dXJu OwogCisgIGF0dHIgPSBsb29rdXBfYXR0cmlidXRlICgib21wIGRlY2xhcmUgc2ltZCIsCisJ CQkgICBERUNMX0FUVFJJQlVURVMgKG5vZGUtPmRlY2wpKTsKKworICAvKiBTZWUgaWYgd2Ug Y2FuIGFkZCBhbiAib21wIGRlY2xhcmUgc2ltZCIgZGlyZWN0aXZlIGltcGxpY2l0bHkKKyAg ICAgYmVmb3JlIGdpdmluZyB1cC4gICovCisgIC8qIEZJWE1FOiBPcGVuQUNDICIjcHJhZ21h IGFjYyByb3V0aW5lIiB0cmFuc2xhdGVzIGludG8KKyAgICAgIm9tcCBkZWNsYXJlIHRhcmdl dCIsIGJ1dCBhcHBlYXJzIGFsc28gdG8gaGF2ZSBzb21lIG90aGVyIGVmZmVjdHMKKyAgICAg dGhhdCBjb25mbGljdCB3aXRoIGdlbmVyYXRpbmcgU0lNRCBjbG9uZXMsIGNhdXNpbmcgSUNF cy4gIFNvIGRvbid0CisgICAgIGRvIHRoaXMgaWYgd2UndmUgZ290IE9wZW5BQ0MgaW5zdGVh ZCBvZiBPcGVuTVAuICAqLworICBpZiAoYXR0ciA9PSBOVUxMX1RSRUUKKyAgICAgICYmIGZs YWdfb3Blbm1wX3RhcmdldF9zaW1kX2Nsb25lICYmICFmbGFnX29wZW5hY2MpCisgICAgewor ICAgICAgYXR0ciA9IG1hcmtfYXV0b19zaW1kX2Nsb25lIChub2RlKTsKKyAgICAgIGVycm9y X3AgPSBmYWxzZTsKKyAgICB9CisgIGlmIChhdHRyID09IE5VTExfVFJFRSkKKyAgICByZXR1 cm47CisKICAgLyogSWdub3JlCiAgICAgICNwcmFnbWEgb21wIGRlY2xhcmUgc2ltZAogICAg ICBleHRlcm4gaW50IGZvbyAoKTsKQEAgLTE3MTQsMTMgKzE4NzcsMTUgQEAgZXhwYW5kX3Np bWRfY2xvbmVzIChzdHJ1Y3QgY2dyYXBoX25vZGUgKm5vZGUpCiAKICAgICAgIHBvbHlfdWlu dDY0IG9yaWdfc2ltZGxlbiA9IGNsb25lX2luZm8tPnNpbWRsZW47CiAgICAgICB0cmVlIGJh c2VfdHlwZSA9IHNpbWRfY2xvbmVfY29tcHV0ZV9iYXNlX2RhdGFfdHlwZSAobm9kZSwgY2xv bmVfaW5mbyk7CisKICAgICAgIC8qIFRoZSB0YXJnZXQgY2FuIHJldHVybiAwIChubyBzaW1k IGNsb25lcyBzaG91bGQgYmUgY3JlYXRlZCksCiAJIDEgKGp1c3Qgb25lIElTQSBvZiBzaW1k IGNsb25lcyBzaG91bGQgYmUgY3JlYXRlZCkgb3IgaGlnaGVyCiAJIGNvdW50IG9mIElTQSB2 YXJpYW50cy4gIEluIHRoYXQgY2FzZSwgY2xvbmVfaW5mbyBpcyBpbml0aWFsaXplZAogCSBm b3IgdGhlIGZpcnN0IElTQSB2YXJpYW50LiAgKi8KICAgICAgIGludCBjb3VudAogCT0gdGFy Z2V0bS5zaW1kX2Nsb25lLmNvbXB1dGVfdmVjc2l6ZV9hbmRfc2ltZGxlbiAobm9kZSwgY2xv bmVfaW5mbywKLQkJCQkJCQkgIGJhc2VfdHlwZSwgMCk7CisJCQkJCQkJICBiYXNlX3R5cGUs IDAsCisJCQkJCQkJICBlcnJvcl9wKTsKICAgICAgIGlmIChjb3VudCA9PSAwKQogCWNvbnRp bnVlOwogCkBAIC0xNzQ1LDcgKzE5MTAsOCBAQCBleHBhbmRfc2ltZF9jbG9uZXMgKHN0cnVj dCBjZ3JhcGhfbm9kZSAqbm9kZSkKIAkgICAgICAvKiBBbmQgY2FsbCB0aGUgdGFyZ2V0IGhv b2sgYWdhaW4gdG8gZ2V0IHRoZSByaWdodCBJU0EuICAqLwogCSAgICAgIHRhcmdldG0uc2lt ZF9jbG9uZS5jb21wdXRlX3ZlY3NpemVfYW5kX3NpbWRsZW4gKG5vZGUsIGNsb25lLAogCQkJ CQkJCSAgICAgIGJhc2VfdHlwZSwKLQkJCQkJCQkgICAgICBpIC8gMik7CisJCQkJCQkJICAg ICAgaSAvIDIsCisJCQkJCQkJICAgICAgZXJyb3JfcCk7CiAJICAgICAgaWYgKChpICYgMSkg IT0gMCkKIAkJY2xvbmUtPmluYnJhbmNoID0gMTsKIAkgICAgfQpkaWZmIC0tZ2l0IGEvZ2Nj L3RhcmdldC5kZWYgYi9nY2MvdGFyZ2V0LmRlZgppbmRleCA0ZDQ5ZmZjMmM4OC4uNmU4MzBi ZWQ1MmEgMTAwNjQ0Ci0tLSBhL2djYy90YXJnZXQuZGVmCisrKyBiL2djYy90YXJnZXQuZGVm CkBAIC0xNjM0LDcgKzE2MzQsNyBAQCBmaWVsZHMgaW4gQHZhcntzaW1kX2Nsb25lfSBzdHJ1 Y3R1cmUgcG9pbnRlZCBieSBAdmFye2Nsb25lX2luZm99IGFyZ3VtZW50IGFuZCBhbAogbm90 IGRldGVybWluZWQgYnkgdGhlIGJpdHNpemUgKGluIHdoaWNoIGNhc2UgQHZhcntzaW1kbGVu fSBpcyBhbHdheXMgdXNlZCkuXG5cCiBUaGUgaG9vayBzaG91bGQgcmV0dXJuIDAgaWYgU0lN RCBjbG9uZXMgc2hvdWxkbid0IGJlIGVtaXR0ZWQsXG5cCiBvciBudW1iZXIgb2YgQHZhcnt2 ZWNzaXplX21hbmdsZX0gdmFyaWFudHMgdGhhdCBzaG91bGQgYmUgZW1pdHRlZC4iLAotaW50 LCAoc3RydWN0IGNncmFwaF9ub2RlICosIHN0cnVjdCBjZ3JhcGhfc2ltZF9jbG9uZSAqLCB0 cmVlLCBpbnQpLCBOVUxMKQoraW50LCAoc3RydWN0IGNncmFwaF9ub2RlICosIHN0cnVjdCBj Z3JhcGhfc2ltZF9jbG9uZSAqLCB0cmVlLCBpbnQsIGJvb2wpLCBOVUxMKQogCiBERUZIT09L CiAoYWRqdXN0LApkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZ29tcC90YXJn ZXQtc2ltZC1jbG9uZS0xLmMgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9nb21wL3RhcmdldC1z aW1kLWNsb25lLTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u YzM2N2Q3MDQwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy5kZy9n b21wL3RhcmdldC1zaW1kLWNsb25lLTEuYwpAQCAtMCwwICsxLDE5IEBACisvKiB7IGRnLW9w dGlvbnMgIi1mb3Blbm1wIC1mZHVtcC10cmVlLW9wdGltaXplZCAtTzIiIH0gKi8KKworLyog VGVzdCB0aGF0IHNpbWQgY2xvbmVzIGFyZSBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9ucyB3aXRo ICJkZWNsYXJlIHRhcmdldCIuICAqLworCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAor aW50IGFkZGl0KGludCBhLCBpbnQgYiwgaW50IGMpCit7CisgIHJldHVybiBhICsgYjsKK30K KyNwcmFnbWEgb21wIGVuZCBkZWNsYXJlIHRhcmdldAorCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi10cmVlLWR1bXAgIl9aR1ZiTjR2dnZfYWRkaXQiICJvcHRpbWl6ZWQiIHsgdGFyZ2V0IGk/ ODYtKi0qIHg4Nl82NC0qLSogfSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUt ZHVtcCAiX1pHVmJNNHZ2dl9hZGRpdCIgIm9wdGltaXplZCIgeyB0YXJnZXQgaT84Ni0qLSog eDg2XzY0LSotKiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJf WkdWY040dnZ2X2FkZGl0IiAib3B0aW1pemVkIiB7IHRhcmdldCBpPzg2LSotKiB4ODZfNjQt Ki0qIH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIl9aR1ZjTTR2 dnZfYWRkaXQiICJvcHRpbWl6ZWQiIHsgdGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcCAiX1pHVmROOHZ2dl9hZGRp dCIgIm9wdGltaXplZCIgeyB0YXJnZXQgaT84Ni0qLSogeDg2XzY0LSotKiB9IH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tdHJlZS1kdW1wICJfWkdWZE04dnZ2X2FkZGl0IiAib3B0 aW1pemVkIiB7IHRhcmdldCBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSB9ICovCisvKiB7IGRn LWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAgIl9aR1ZlTjE2dnZ2X2FkZGl0IiAib3B0aW1pemVk IiB7IHRhcmdldCBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSB9ICovCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi10cmVlLWR1bXAgIl9aR1ZlTTE2dnZ2X2FkZGl0IiAib3B0aW1pemVkIiB7IHRh cmdldCBpPzg2LSotKiB4ODZfNjQtKi0qIH0gfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVz dHN1aXRlL2djYy5kZy9nb21wL3RhcmdldC1zaW1kLWNsb25lLTIuYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLmRnL2dvbXAvdGFyZ2V0LXNpbWQtY2xvbmUtMi5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yOGRmNDI4MjYyMwotLS0gL2Rldi9udWxsCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLmRnL2dvbXAvdGFyZ2V0LXNpbWQtY2xvbmUtMi5jCkBAIC0w LDAgKzEsMTggQEAKKy8qIHsgZGctb3B0aW9ucyAiLWZvcGVubXAgLWZkdW1wLXRyZWUtb3B0 aW1pemVkIC1PMiIgfSAqLworCisvKiBUZXN0IHRoYXQgc2ltZCBjbG9uZXMgYXJlIG5vdCBn ZW5lcmF0ZWQgZm9yIGZ1bmN0aW9ucyB3aXRoIAorICAgImRlY2xhcmUgdGFyZ2V0IiBidXQg dW5zdWl0YWJsZSBhcmd1bWVudHMuICAqLworCitzdHJ1Y3QgcyB7CisgIGludCBhOworICBp bnQgYjsKK307CisgIAorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKK2ludCBhZGRpdCAo c3RydWN0IHMgeCkKK3sKKyAgcmV0dXJuIHguYSArIHguYjsKK30KKyNwcmFnbWEgb21wIGVu ZCBkZWNsYXJlIHRhcmdldAorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1bXAtbm90 ICJfWi4qX2FkZGl0IiAib3B0aW1pemVkIiB7IHRhcmdldCBpPzg2LSotKiB4ODZfNjQtKi0q IH0gfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy5kZy9nb21wL3Rhcmdl dC1zaW1kLWNsb25lLTMuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2dvbXAvdGFyZ2V0LXNp bWQtY2xvbmUtMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi44 MDdhMmY5MjA0ZAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2dv bXAvdGFyZ2V0LXNpbWQtY2xvbmUtMy5jCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHsgZGctb3B0 aW9ucyAiLWZvcGVubXAgLWZkdW1wLXRyZWUtb3B0aW1pemVkIC1PMiIgfSAqLworCisvKiBU ZXN0IHRoYXQgc2ltZCBjbG9uZXMgYXJlIG5vdCBnZW5lcmF0ZWQgZm9yIGZ1bmN0aW9ucyB3 aXRoIAorICAgImRlY2xhcmUgdGFyZ2V0IiBidXQgdGhhdCBjYWxsIHBvc3NpYmx5IHNpZGUt ZWZmZWN0aW5nIGZ1bmN0aW9ucyAKKyAgIGluIHRoZSBib2R5LiAgKi8KKworZXh0ZXJuIGlu dCBmIChpbnQpOworCisjcHJhZ21hIG9tcCBkZWNsYXJlIHRhcmdldAoraW50IGFkZGl0KGlu dCBhLCBpbnQgYiwgaW50IGMpCit7CisgIHJldHVybiBmKGEpICsgYjsKK30KKyNwcmFnbWEg b21wIGVuZCBkZWNsYXJlIHRhcmdldAorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi10cmVlLWR1 bXAtbm90ICJfWi4qX2FkZGl0IiAib3B0aW1pemVkIiB7IHRhcmdldCBpPzg2LSotKiB4ODZf NjQtKi0qIH0gfSB9ICovCisKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLmRnL2dv bXAvdGFyZ2V0LXNpbWQtY2xvbmUtNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MuZGcvZ29tcC90 YXJnZXQtc2ltZC1jbG9uZS00LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAuLjc2YmJjZjQzYjAzCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9n Y2MuZGcvZ29tcC90YXJnZXQtc2ltZC1jbG9uZS00LmMKQEAgLTAsMCArMSwxNiBAQAorLyog eyBkZy1vcHRpb25zICItZm9wZW5tcCAtZmR1bXAtdHJlZS1vcHRpbWl6ZWQgLU8yIiB9ICov CisKKy8qIFRlc3QgdGhhdCBzaW1kIGNsb25lcyBhcmUgbm90IGdlbmVyYXRlZCBmb3IgZnVu Y3Rpb25zIHdpdGggCisgICAiZGVjbGFyZSB0YXJnZXQiIGJ1dCB0aGF0IHdyaXRlIG1lbW9y eSBpbiB0aGUgYm9keS4gICovCisKK2V4dGVybiBpbnQgc2F2ZTsKKworI3ByYWdtYSBvbXAg ZGVjbGFyZSB0YXJnZXQKK2ludCBhZGRpdChpbnQgYSwgaW50IGIsIGludCBjKQoreworICBz YXZlID0gYzsKKyAgcmV0dXJuIGEgKyBiOworfQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUg dGFyZ2V0CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLXRyZWUtZHVtcC1ub3QgIl9aLipfYWRk aXQiICJvcHRpbWl6ZWQiIHsgdGFyZ2V0IGk/ODYtKi0qIHg4Nl82NC0qLSogfSB9IH0gKi8K LS0gCjIuMzEuMQoK --------------Zeji9wNRSH2704gKFvZre4yu--