From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 97400 invoked by alias); 13 Feb 2018 16:37:43 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 95137 invoked by uid 89); 13 Feb 2018 16:37:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: =?ISO-8859-1?Q?No, score=-9.4 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_2,GIT_PATCH_3,KAM_ASCII_DIVIDERS,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_NONE,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=with, with=c2, H*M:online, H*r:172.20.26?= X-HELO: mailout01.t-online.de Received: from mailout01.t-online.de (HELO mailout01.t-online.de) (194.25.134.80) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 13 Feb 2018 16:37:39 +0000 Received: from fwd38.aul.t-online.de (fwd38.aul.t-online.de [172.20.26.138]) by mailout01.t-online.de (Postfix) with SMTP id 165D14217C47; Tue, 13 Feb 2018 17:37:37 +0100 (CET) Received: from [192.168.0.55] (bpfvbZZCZh5vHDx1MY837Wx-BP8vxOQaVO4Iv2kSaqeh5LsmuTpr4wc1iqujIvSQt1@[163.58.16.102]) by fwd38.t-online.de with (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384 encrypted) esmtp id 1eldaA-0WWRdY0; Tue, 13 Feb 2018 17:37:26 +0100 Message-ID: <1518539843.10908.30.camel@t-online.de> Subject: [RX] Fix PR 83831 -- Unused bclr, bnot, bset insns From: Oleg Endo To: gcc-patches , Nick Clifton Date: Tue, 13 Feb 2018 16:37:00 -0000 Content-Type: multipart/mixed; boundary="=-n5B6xjRtA1kLkKZ9Kq2k" Mime-Version: 1.0 X-IsSubscribed: yes X-SW-Source: 2018-02/txt/msg00746.txt.bz2 --=-n5B6xjRtA1kLkKZ9Kq2k Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Content-length: 1902 Hi, The attached patch fixes the deficits mentioned in PR 83831 which is about unused bclr, bnot and bset instructions. For some simple cases, the combine pass can successfully fuse a load- modify-store insn sequence into an insn that operates on a memory directly.  However, in some cases where it thinks it's too complex, it will not try to combine the insns. What I'm doing here is similar to what I've been doing on SH in the split1 pass after combine -- manually walking the insns up/down (limited to the BB) to find the def/use and fuse 3 insns into 1, if it's possible to do so. For that I've copy-pasted some of the RTL utility functions from SH.  I will propose folding and moving those into rtl.h / rtlanal.c during next stage 1. With that patch, I get a code size decrease of about 1 KByte on a larger application. The attached patch is the version for GCC 8 (trunk).  I've posted versions for GCC 6 and GCC 7 in the PR.  All 3 patches have been tested with     "make -k check" on rx-sim for c and c++ with no new failures. OK for trunk? Cheers, Oleg gcc/ChangeLog: PR target/83831 * config/rx/rx-protos.h (rx_reg_dead_or_unused_after_insn, rx_copy_reg_dead_or_unused_notes, rx_fuse_in_memory_bitop): New declarations. (set_of_reg): New struct. (rx_find_set_of_reg, rx_find_use_of_reg): New functions. * config/rx/rx.c (rx_reg_dead_or_unused_after_insn, rx_copy_reg_dead_or_unused_notes, rx_fuse_in_memory_bitop): New functions. * config/rx/rx.md (andsi3, iorsi3, xorsi3): Convert to insn_and_split. Split into bitclr, bitset, bitinvert patterns if appropriate. (*bitset, *bitinvert, *bitclr): Convert to named insn_and_split and use rx_fuse_in_memory_bitop. (*bitset_in_memory, *bitinvert_in_memory, *bitclr_in_memory): Convert to named insn, correct maximum insn length. gcc/testsuite/ChangeLog: PR target/83831 * gcc.target/rx/pr83831.c: New tests. --=-n5B6xjRtA1kLkKZ9Kq2k Content-Disposition: attachment; filename="rx_pr83831_ver2.patch" Content-Type: text/x-patch; name="rx_pr83831_ver2.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 Content-length: 20911 SW5kZXg6IGdjYy9jb25maWcvcngvcngtcHJvdG9zLmgKPT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLS0gZ2NjL2NvbmZpZy9yeC9yeC1wcm90b3MuaAkocmV2 aXNpb24gMjU3NTQ5KQorKysgZ2NjL2NvbmZpZy9yeC9yeC1wcm90b3MuaAko d29ya2luZyBjb3B5KQpAQCAtNjMsNiArNjMsMTEyIEBACiBleHRlcm4gdm9p ZAkJcnhfc3BsaXRfY2JyYW5jaCAobWFjaGluZV9tb2RlLCBlbnVtIHJ0eF9j b2RlLAogCQkJCQkgIHJ0eCwgcnR4LCBydHgpOwogZXh0ZXJuIG1hY2hpbmVf bW9kZQlyeF9zZWxlY3RfY2NfbW9kZSAoZW51bSBydHhfY29kZSwgcnR4LCBy dHgpOworCitleHRlcm4gYm9vbCByeF9yZWdfZGVhZF9vcl91bnVzZWRfYWZ0 ZXJfaW5zbiAoY29uc3QgcnR4X2luc24qIGksIGludCByZWdubyk7CitleHRl cm4gdm9pZCByeF9jb3B5X3JlZ19kZWFkX29yX3VudXNlZF9ub3RlcyAocnR4 IHJlZywgY29uc3QgcnR4X2luc24qIHNyYywKKwkJCQkJICAgICAgcnR4X2lu c24qIGRzdCk7CisKK2V4dGVybiBib29sIHJ4X2Z1c2VfaW5fbWVtb3J5X2Jp dG9wIChydHgqIG9wZXJhbmRzLCBydHhfaW5zbiogY3Vycl9pbnNuLAorCQkJ CSAgICAgcnR4ICgqZ2VuX2luc24pKHJ0eCwgcnR4KSk7CisKKy8qIFJlc3Vs dCB2YWx1ZSBvZiByeF9maW5kX3NldF9vZl9yZWcuICAqLworc3RydWN0IHNl dF9vZl9yZWcKK3sKKyAgLyogVGhlIGluc24gd2hlcmUgc2hfZmluZF9zZXRf b2ZfcmVnIHN0b3BwZWQgbG9va2luZy4KKyAgICAgQ2FuIGJlIE5VTExfUlRY IGlmIHRoZSBlbmQgb2YgdGhlIGluc24gbGlzdCB3YXMgcmVhY2hlZC4gICov CisgIHJ0eF9pbnNuKiBpbnNuOworCisgIC8qIFRoZSBzZXQgcnR4IG9mIHRo ZSBzcGVjaWZpZWQgcmVnIGlmIGZvdW5kLCBOVUxMX1JUWCBvdGhlcndpc2Uu ICAqLworICBjb25zdF9ydHggc2V0X3J0eDsKKworICAvKiBUaGUgc2V0IHNv dXJjZSBydHggb2YgdGhlIHNwZWNpZmllZCByZWcgaWYgZm91bmQsIE5VTExf UlRYIG90aGVyd2lzZS4KKyAgICAgVXN1YWxseSwgdGhpcyBpcyB0aGUgbW9z dCBpbnRlcmVzdGluZyByZXR1cm4gdmFsdWUuICAqLworICBydHggc2V0X3Ny YzsKK307CisKKy8qIEZJWE1FOiBDb3B5LXBhc3RhIGZyb20gU0guICBNb3Zl IHRvIHJ0bC5oLgorICAgR2l2ZW4gYSByZWcgcnR4IGFuZCBhIHN0YXJ0IGlu c24sIHRyeSB0byBmaW5kIHRoZSBpbnNuIHRoYXQgc2V0cworICAgdGhlIHNw ZWNpZmllZCByZWcgYnkgdXNpbmcgdGhlIHNwZWNpZmllZCBpbnNuIHN0ZXBw aW5nIGZ1bmN0aW9uLAorICAgc3VjaCBhcyAncHJldl9ub25ub3RlX25vbmRl YnVnX2luc25fYmInLiAgV2hlbiB0aGUgaW5zbiBpcyBmb3VuZCwKKyAgIHRy eSB0byBleHRyYWN0IHRoZSBydHggb2YgdGhlIHJlZyBzZXQuICAqLwordGVt cGxhdGUgPHR5cGVuYW1lIEY+IGlubGluZSBzZXRfb2ZfcmVnCityeF9maW5k X3NldF9vZl9yZWcgKHJ0eCByZWcsIHJ0eF9pbnNuKiBpbnNuLCBGIHN0ZXBm dW5jLAorCQkgICAgYm9vbCBpZ25vcmVfcmVnX3JlZ19jb3BpZXMgPSBmYWxz ZSkKK3sKKyAgc2V0X29mX3JlZyByZXN1bHQ7CisgIHJlc3VsdC5pbnNuID0g aW5zbjsKKyAgcmVzdWx0LnNldF9ydHggPSBOVUxMX1JUWDsKKyAgcmVzdWx0 LnNldF9zcmMgPSBOVUxMX1JUWDsKKworICBpZiAoIVJFR19QIChyZWcpIHx8 IGluc24gPT0gTlVMTF9SVFgpCisgICAgcmV0dXJuIHJlc3VsdDsKKworICBm b3IgKHJ0eF9pbnNuKiBpID0gc3RlcGZ1bmMgKGluc24pOyBpICE9IE5VTExf UlRYOyBpID0gc3RlcGZ1bmMgKGkpKQorICAgIHsKKyAgICAgIGlmIChCQVJS SUVSX1AgKGkpKQorCWJyZWFrOworICAgICAgaWYgKCFJTlNOX1AgKGkpIHx8 IERFQlVHX0lOU05fUCAoaSkpCisJICBjb250aW51ZTsKKyAgICAgIGlmIChy ZWdfc2V0X3AgKHJlZywgaSkpCisJeworCSAgaWYgKENBTExfUCAoaSkpCisJ ICAgIGJyZWFrOworCisJICByZXN1bHQuaW5zbiA9IGk7CisJICByZXN1bHQu c2V0X3J0eCA9IHNldF9vZiAocmVnLCBpKTsKKworCSAgaWYgKHJlc3VsdC5z ZXRfcnR4ID09IE5VTExfUlRYIHx8IEdFVF9DT0RFIChyZXN1bHQuc2V0X3J0 eCkgIT0gU0VUKQorCSAgICBicmVhazsKKworCSAgcmVzdWx0LnNldF9zcmMg PSBYRVhQIChyZXN1bHQuc2V0X3J0eCwgMSk7CisKKwkgIGlmIChpZ25vcmVf cmVnX3JlZ19jb3BpZXMgJiYgUkVHX1AgKHJlc3VsdC5zZXRfc3JjKSkKKwkg ICAgeworCSAgICAgIHJlZyA9IHJlc3VsdC5zZXRfc3JjOworCSAgICAgIGNv bnRpbnVlOworCSAgICB9CisJICBpZiAoaWdub3JlX3JlZ19yZWdfY29waWVz ICYmIFNVQlJFR19QIChyZXN1bHQuc2V0X3NyYykKKwkgICAgICAmJiBSRUdf UCAoU1VCUkVHX1JFRyAocmVzdWx0LnNldF9zcmMpKSkKKwkgICAgeworCSAg ICAgIHJlZyA9IFNVQlJFR19SRUcgKHJlc3VsdC5zZXRfc3JjKTsKKwkgICAg ICBjb250aW51ZTsKKwkgICAgfQorCisJICBicmVhazsKKwl9CisgICAgfQor CisgIC8qIElmIHRoZSBzZWFyY2hlZCByZWcgaXMgZm91bmQgaW5zaWRlIGEg KG1lbSAocG9zdF9pbmM6U0kgKHJlZykpKSwgc2V0X29mCisgICAgIHdpbGwg cmV0dXJuIE5VTEwgYW5kIHNldF9ydHggd2lsbCBiZSBOVUxMLgorICAgICBJ biB0aGlzIGNhc2UgcmVwb3J0IGEgJ25vdCBmb3VuZCcuICByZXN1bHQuaW5z biB3aWxsIGFsd2F5cyBiZSBub24tbnVsbAorICAgICBhdCB0aGlzIHBvaW50 LCBzbyBubyBuZWVkIHRvIGNoZWNrIGl0LiAgKi8KKyAgaWYgKHJlc3VsdC5z ZXRfc3JjICE9IE5VTEwgJiYgcmVzdWx0LnNldF9ydHggPT0gTlVMTCkKKyAg ICByZXN1bHQuc2V0X3NyYyA9IE5VTEw7CisKKyAgcmV0dXJuIHJlc3VsdDsK K30KKworLyogRklYTUU6IE1vdmUgdG8gcnRsaC5oLiAgKi8KK3RlbXBsYXRl IDx0eXBlbmFtZSBGPiBpbmxpbmUgcnR4X2luc24qCityeF9maW5kX3VzZV9v Zl9yZWcgKHJ0eCByZWcsIHJ0eF9pbnNuKiBpbnNuLCBGIHN0ZXBmdW5jKQor eworICBpZiAoIVJFR19QIChyZWcpIHx8IGluc24gPT0gTlVMTF9SVFgpCisg ICAgcmV0dXJuIE5VTEw7CisKKyAgZm9yIChydHhfaW5zbiogaSA9IHN0ZXBm dW5jIChpbnNuKTsgaSAhPSBOVUxMX1JUWDsgaSA9IHN0ZXBmdW5jIChpKSkK KyAgICB7CisgICAgICBpZiAoQkFSUklFUl9QIChpKSkKKwlicmVhazsKKyAg ICAgIGlmICghSU5TTl9QIChpKSB8fCBERUJVR19JTlNOX1AgKGkpKQorCWNv bnRpbnVlOworICAgICAgaWYgKHJlZ19vdmVybGFwX21lbnRpb25lZF9wIChy ZWcsIFBBVFRFUk4gKGkpKQorCSAgfHwgKENBTExfUCAoaSkgJiYgZmluZF9y ZWdfZnVzYWdlIChpLCBVU0UsIHJlZykpKQorCXJldHVybiBpOworICAgIH0K KworICByZXR1cm4gTlVMTDsKK30KKwogI2VuZGlmCiAKICNlbmRpZiAvKiBH Q0NfUlhfUFJPVE9TX0ggKi8KSW5kZXg6IGdjYy9jb25maWcvcngvcnguYwo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvY29uZmlnL3J4L3J4LmMJ KHJldmlzaW9uIDI1NzU0OSkKKysrIGdjYy9jb25maWcvcngvcnguYwkod29y a2luZyBjb3B5KQpAQCAtMzQzOSw2ICszNDM5LDg4IEBACiAgICAgZW1pdF9p bnNuIChnZW5fbXZ0YyAoR0VOX0lOVCAoQ1RSTFJFR19QU1cpLCBtX3ByZXZf cHN3X3JlZykpOwogfQogCisvKiBHaXZlbiBhbiBpbnNuIGFuZCBhIHJlZyBu dW1iZXIsIHRlbGwgd2hldGhlciB0aGUgcmVnIGRpZXMgb3IgaXMgdW51c2Vk CisgICBhZnRlciB0aGUgaW5zbi4gICovCitib29sCityeF9yZWdfZGVhZF9v cl91bnVzZWRfYWZ0ZXJfaW5zbiAoY29uc3QgcnR4X2luc24qIGksIGludCBy ZWdubykKK3sKKyAgcmV0dXJuIGZpbmRfcmVnbm9fbm90ZSAoaSwgUkVHX0RF QUQsIHJlZ25vKSAhPSBOVUxMCisJIHx8IGZpbmRfcmVnbm9fbm90ZSAoaSwg UkVHX1VOVVNFRCwgcmVnbm8pICE9IE5VTEw7Cit9CisKKy8qIENvcHkgZGVh ZCBhbmQgdW51c2VkIG5vdGVzIGZyb20gU1JDIHRvIERTVCBmb3IgdGhlIHNw ZWNpZmllZCBSRUdOTy4gICovCit2b2lkCityeF9jb3B5X3JlZ19kZWFkX29y X3VudXNlZF9ub3RlcyAocnR4IHJlZywgY29uc3QgcnR4X2luc24qIHNyYywg cnR4X2luc24qIGRzdCkKK3sKKyAgaW50IHJlZ25vID0gUkVHTk8gKFNVQlJF R19QIChyZWcpID8gU1VCUkVHX1JFRyAocmVnKSA6IHJlZyk7CisKKyAgaWYg KHJ0eCBub3RlID0gZmluZF9yZWdub19ub3RlIChzcmMsIFJFR19ERUFELCBy ZWdubykpCisgICAgYWRkX3NoYWxsb3dfY29weV9vZl9yZWdfbm90ZSAoZHN0 LCBub3RlKTsKKworICBpZiAocnR4IG5vdGUgPSBmaW5kX3JlZ25vX25vdGUg KHNyYywgUkVHX1VOVVNFRCwgcmVnbm8pKQorICAgIGFkZF9zaGFsbG93X2Nv cHlfb2ZfcmVnX25vdGUgKGRzdCwgbm90ZSk7Cit9CisKKy8qIFRyeSB0byBm dXNlIHRoZSBjdXJyZW50IGJpdC1vcGVyYXRpb24gaW5zbiB3aXRoIHRoZSBz dXJyb3VuZGluZyBtZW1vcnkgbG9hZAorICAgYW5kIHN0b3JlLiAgKi8KK2Jv b2wKK3J4X2Z1c2VfaW5fbWVtb3J5X2JpdG9wIChydHgqIG9wZXJhbmRzLCBy dHhfaW5zbiogY3Vycl9pbnNuLAorCQkJIHJ0eCAoKmdlbl9pbnNuKShydHgs IHJ0eCkpCit7CisgIHJ0eCBvcDJfcmVnID0gU1VCUkVHX1AgKG9wZXJhbmRz WzJdKSA/IFNVQlJFR19SRUcgKG9wZXJhbmRzWzJdKSA6IG9wZXJhbmRzWzJd OworCisgIHNldF9vZl9yZWcgb3AyX2RlZiA9IHJ4X2ZpbmRfc2V0X29mX3Jl ZyAob3AyX3JlZywgY3Vycl9pbnNuLAorCQkJCQkgICBwcmV2X25vbm5vdGVf bm9uZGVidWdfaW5zbl9iYik7CisgIGlmIChvcDJfZGVmLnNldF9zcmMgPT0g TlVMTF9SVFgKKyAgICAgIHx8ICFNRU1fUCAob3AyX2RlZi5zZXRfc3JjKQor ICAgICAgfHwgR0VUX01PREUgKG9wMl9kZWYuc2V0X3NyYykgIT0gUUltb2Rl CisgICAgICB8fCAhcnhfaXNfcmVzdHJpY3RlZF9tZW1vcnlfYWRkcmVzcyAo WEVYUCAob3AyX2RlZi5zZXRfc3JjLCAwKSwKKwkJCQkJICAgR0VUX01PREUg KG9wMl9kZWYuc2V0X3NyYykpCisgICAgICB8fCByZWdfdXNlZF9iZXR3ZWVu X3AgKG9wZXJhbmRzWzJdLCBvcDJfZGVmLmluc24sIGN1cnJfaW5zbikKKyAg ICAgIHx8ICFyeF9yZWdfZGVhZF9vcl91bnVzZWRfYWZ0ZXJfaW5zbiAoY3Vy cl9pbnNuLCBSRUdOTyAob3AyX3JlZykpCisgICAgKQorICAgIHJldHVybiBm YWxzZTsKKworICAvKiBUaGUgcmVnaXN0ZXIgb3BlcmFuZCBvcmlnaW5hdGVz IGZyb20gYSBtZW1vcnkgbG9hZCBhbmQgdGhlIG1lbW9yeSBsb2FkCisgICAg IGNvdWxkIGJlIGZ1c2VkIHdpdGggdGhlIGJpdG9wIGluc24uCisgICAgIExv b2sgZm9yIHRoZSBmb2xsb3dpbmcgbWVtb3J5IHN0b3JlIHdpdGggdGhlIHNh bWUgbWVtb3J5IG9wZXJhbmQuICAqLworICBydHggbWVtID0gb3AyX2RlZi5z ZXRfc3JjOworCisgIC8qIElmIHRoZSBtZW1vcnkgaXMgYW4gYXV0by1tb2Qg YWRkcmVzcywgaXQgY2FuJ3QgYmUgZnVzZWQuICAqLworICBpZiAoR0VUX0NP REUgKFhFWFAgKG1lbSwgMCkpID09IFBPU1RfSU5DCisgICAgICB8fCBHRVRf Q09ERSAoWEVYUCAobWVtLCAwKSkgPT0gUFJFX0lOQworICAgICAgfHwgR0VU X0NPREUgKFhFWFAgKG1lbSwgMCkpID09IFBPU1RfREVDCisgICAgICB8fCBH RVRfQ09ERSAoWEVYUCAobWVtLCAwKSkgPT0gUFJFX0RFQykKKyAgICByZXR1 cm4gZmFsc2U7CisKKyAgcnR4X2luc24qIG9wMF91c2UgPSByeF9maW5kX3Vz ZV9vZl9yZWcgKG9wZXJhbmRzWzBdLCBjdXJyX2luc24sCisJCQkJCSAgbmV4 dF9ub25ub3RlX25vbmRlYnVnX2luc25fYmIpOworICBpZiAob3AwX3VzZSA9 PSBOVUxMCisgICAgICB8fCAhKEdFVF9DT0RFIChQQVRURVJOIChvcDBfdXNl KSkgPT0gU0VUCisJICAgJiYgUlhfUkVHX1AgKFhFWFAgKFBBVFRFUk4gKG9w MF91c2UpLCAxKSkKKwkgICAmJiByZWdfb3ZlcmxhcF9tZW50aW9uZWRfcCAo b3BlcmFuZHNbMF0sIFhFWFAgKFBBVFRFUk4gKG9wMF91c2UpLCAxKSkKKwkg ICAmJiBydHhfZXF1YWxfcCAobWVtLCBYRVhQIChQQVRURVJOIChvcDBfdXNl KSwgMCkpKQorICAgICAgfHwgIXJ4X3JlZ19kZWFkX29yX3VudXNlZF9hZnRl cl9pbnNuIChvcDBfdXNlLCBSRUdOTyAob3BlcmFuZHNbMF0pKQorICAgICAg fHwgcmVnX3NldF9iZXR3ZWVuX3AgKG9wZXJhbmRzWzJdLCBjdXJyX2luc24s IG9wMF91c2UpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvKiBJZiB0aGUg bG9hZC1tb2RpZnktc3RvcmUgb3BlcmF0aW9uIGlzIGZ1c2VkIGl0IGNvdWxk IHBvdGVudGlhbGx5IG1vZGlmeQorICAgICBsb2FkL3N0b3JlIG9yZGVyaW5n IGlmIHRoZXJlIGFyZSBvdGhlciBtZW1vcnkgYWNjZXNzZXMgYmV0d2VlbiB0 aGUgbG9hZAorICAgICBhbmQgdGhlIHN0b3JlIGZvciB0aGlzIGluc24uICBJ ZiB0aGVyZSBhcmUgdm9sYXRpbGUgbWVtcyBiZXR3ZWVuIHRoZSBsb2FkCisg ICAgIGFuZCBzdG9yZSBpdCdzIGJldHRlciBub3QgdG8gY2hhbmdlIHRoZSBv cmRlcmluZy4gIElmIHRoZXJlIGlzIGEgY2FsbAorICAgICBiZXR3ZWVuIHRo ZSBsb2FkIGFuZCBzdG9yZSwgaXQncyBhbHNvIG5vdCBzYWZlIHRvIGZ1c2Ug aXQuICAqLworICBmb3IgKHJ0eF9pbnNuKiBpID0gbmV4dF9ub25ub3RlX25v bmRlYnVnX2luc25fYmIgKG9wMl9kZWYuaW5zbik7CisgICAgICAgaSAhPSBO VUxMICYmIGkgIT0gb3AwX3VzZTsKKyAgICAgICBpID0gbmV4dF9ub25ub3Rl X25vbmRlYnVnX2luc25fYmIgKGkpKQorICAgIGlmICh2b2xhdGlsZV9pbnNu X3AgKFBBVFRFUk4gKGkpKSB8fCBDQUxMX1AgKGkpKQorICAgICAgcmV0dXJu IGZhbHNlOworCisgIGVtaXRfaW5zbiAoZ2VuX2luc24gKG1lbSwgb3BlcmFu ZHNbMV0pKTsKKyAgc2V0X2luc25fZGVsZXRlZCAob3AyX2RlZi5pbnNuKTsK KyAgc2V0X2luc25fZGVsZXRlZCAob3AwX3VzZSk7CisgIHJldHVybiB0cnVl OworfQorCiAvKiBJbXBsZW1lbnQgVEFSR0VUX0hBUkRfUkVHTk9fTlJFR1Mu ICAqLwogCiBzdGF0aWMgdW5zaWduZWQgaW50CkluZGV4OiBnY2MvY29uZmln L3J4L3J4Lm1kCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jb25m aWcvcngvcngubWQJKHJldmlzaW9uIDI1NzU0OSkKKysrIGdjYy9jb25maWcv cngvcngubWQJKHdvcmtpbmcgY29weSkKQEAgLTEwOTQsNyArMTA5NCw3IEBA CiAgIERPTkU7CiB9KQogCi0oZGVmaW5lX2luc24gImFuZHNpMyIKKyhkZWZp bmVfaW5zbl9hbmRfc3BsaXQgImFuZHNpMyIKICAgWyhzZXQgKG1hdGNoX29w ZXJhbmQ6U0kgICAgICAgICAwICJyZWdpc3Rlcl9vcGVyYW5kIiAgIj1yLHIs cixyLHIscixyLHIsciIpCiAJKGFuZDpTSSAobWF0Y2hfb3BlcmFuZDpTSSAx ICJyZWdpc3Rlcl9vcGVyYW5kIiAgIiUwLDAsMCwwLDAsMCxyLHIsMCIpCiAJ CShtYXRjaF9vcGVyYW5kOlNJIDIgInJ4X3NvdXJjZV9vcGVyYW5kIiAicixV aW50MDQsU2ludDA4LFNpbnQxNixTaW50MjQsaSwwLHIsUSIpKSkKQEAgLTEx MTAsNiArMTExMCwyMSBAQAogICBhbmRcdCUxLCAlMAogICBhbmRcdCUyLCAl MSwgJTAKICAgYW5kXHQlUTIsICUwIgorICAiJiYgUlhfUkVHX1AgKG9wZXJh bmRzWzFdKSAmJiBDT05TVF9JTlRfUCAob3BlcmFuZHNbMl0pCisgICAmJiBw b3cycF9od2kgKH5VSU5UVkFMIChvcGVyYW5kc1syXSkpIgorIFsoY29uc3Rf aW50IDApXQoreworICAvKiBGb3IgbmVnYXRlZCBzaW5nbGUgYml0IGNvbnN0 YW50cyB1c2UgdGhlIGJjbHIgaW5zbiBmb3Igc21hbGxlciBjb2RlLiAgKi8K KworICBpZiAoIXJ4X3JlZ19kZWFkX29yX3VudXNlZF9hZnRlcl9pbnNuIChj dXJyX2luc24sIENDX1JFRykpCisgICAgRkFJTDsKKworICByeF9jb3B5X3Jl Z19kZWFkX29yX3VudXNlZF9ub3RlcyAob3BlcmFuZHNbMV0sIGN1cnJfaW5z biwKKyAgICBlbWl0X2luc24gKGdlbl9iaXRjbHIgKG9wZXJhbmRzWzBdLAor CQkJICAgR0VOX0lOVCAoZXhhY3RfbG9nMiAoflVJTlRWQUwgKG9wZXJhbmRz WzJdKSkpLAorCQkJICAgb3BlcmFuZHNbMV0pKSk7CisgIERPTkU7Cit9CiAg IFsoc2V0X2F0dHIgInRpbWluZ3MiICIxMSwxMSwxMSwxMSwxMSwxMSwxMSwx MSwzMyIpCiAgICAoc2V0X2F0dHIgImxlbmd0aCIgIjIsMiwzLDQsNSw2LDIs NSw1IildCiApCkBAIC0xMzgzLDcgKzEzOTgsNyBAQAogICBbKHNldF9hdHRy ICJsZW5ndGgiICIyLDMiKV0KICkKIAotKGRlZmluZV9pbnNuICJpb3JzaTMi CisoZGVmaW5lX2luc25fYW5kX3NwbGl0ICJpb3JzaTMiCiAgIFsoc2V0ICht YXRjaF9vcGVyYW5kOlNJICAgICAgICAgMCAicmVnaXN0ZXJfb3BlcmFuZCIg Ij1yLHIscixyLHIscixyLHIsciIpCiAJKGlvcjpTSSAobWF0Y2hfb3BlcmFu ZDpTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiJTAsMCwwLDAsMCwwLHIsciww IikKIAkgICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDIgInJ4X3NvdXJjZV9v cGVyYW5kIiAicixVaW50MDQsU2ludDA4LFNpbnQxNixTaW50MjQsaSwwLHIs USIpKSkKQEAgLTEzOTksNiArMTQxNCwyMSBAQAogICBvclx0JTEsICUwCiAg IG9yXHQlMiwgJTEsICUwCiAgIG9yXHQlUTIsICUwIgorICAiJiYgUlhfUkVH X1AgKG9wZXJhbmRzWzFdKSAmJiBDT05TVF9JTlRfUCAob3BlcmFuZHNbMl0p CisgICAmJiBwb3cycF9od2kgKFVJTlRWQUwgKG9wZXJhbmRzWzJdKSkiCisg IFsoY29uc3RfaW50IDApXQoreworICAvKiBGb3Igc2luZ2xlIGJpdCBjb25z dGFudHMgdXNlIHRoZSBic2V0IGluc24gZm9yIHNtYWxsZXIgY29kZS4gICov CisKKyAgaWYgKCFyeF9yZWdfZGVhZF9vcl91bnVzZWRfYWZ0ZXJfaW5zbiAo Y3Vycl9pbnNuLCBDQ19SRUcpKQorICAgIEZBSUw7CisKKyAgcnhfY29weV9y ZWdfZGVhZF9vcl91bnVzZWRfbm90ZXMgKG9wZXJhbmRzWzFdLCBjdXJyX2lu c24sCisgICAgZW1pdF9pbnNuIChnZW5fYml0c2V0IChvcGVyYW5kc1swXSwK KwkJCSAgIEdFTl9JTlQgKGV4YWN0X2xvZzIgKFVJTlRWQUwgKG9wZXJhbmRz WzJdKSkpLAorCQkJICAgb3BlcmFuZHNbMV0pKSk7CisgIERPTkU7Cit9CiAg IFsoc2V0X2F0dHIgInRpbWluZ3MiICIxMSwxMSwxMSwxMSwxMSwxMSwxMSwx MSwzMyIpCiAgICAoc2V0X2F0dHIgImxlbmd0aCIgICIyLDIsMyw0LDUsNiwy LDMsNSIpXQogKQpAQCAtMTcwNCw3ICsxNzM0LDcgQEAKICAgRE9ORTsKIH0p CiAKLShkZWZpbmVfaW5zbiAieG9yc2kzIgorKGRlZmluZV9pbnNuX2FuZF9z cGxpdCAieG9yc2kzIgogICBbKHNldCAobWF0Y2hfb3BlcmFuZDpTSSAgICAg ICAgIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9cixyLHIscixyLHIiKQogCSh4 b3I6U0kgKG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIg IiUwLDAsMCwwLDAsMCIpCiAJICAgICAgICAobWF0Y2hfb3BlcmFuZDpTSSAy ICJyeF9zb3VyY2Vfb3BlcmFuZCIKQEAgLTE3MTIsNiArMTc0MiwyMSBAQAog ICAgKGNsb2JiZXIgKHJlZzpDQyBDQ19SRUcpKV0KICAgIiIKICAgInhvclx0 JVEyLCAlMCIKKyAgIiYmIFJYX1JFR19QIChvcGVyYW5kc1sxXSkgJiYgQ09O U1RfSU5UX1AgKG9wZXJhbmRzWzJdKQorICAgJiYgcG93MnBfaHdpIChVSU5U VkFMIChvcGVyYW5kc1syXSkpIgorICBbKGNvbnN0X2ludCAwKV0KK3sKKyAg LyogRm9yIHNpbmdsZSBiaXQgY29uc3RhbnRzIHVzZSB0aGUgYm5vdCBpbnNu IGZvciBzbWFsbGVyIGNvZGUuICAqLworCisgIGlmICghcnhfcmVnX2RlYWRf b3JfdW51c2VkX2FmdGVyX2luc24gKGN1cnJfaW5zbiwgQ0NfUkVHKSkKKyAg ICBGQUlMOworCisgIHJ4X2NvcHlfcmVnX2RlYWRfb3JfdW51c2VkX25vdGVz IChvcGVyYW5kc1sxXSwgY3Vycl9pbnNuLAorICAgIGVtaXRfaW5zbiAoZ2Vu X2JpdGludmVydCAob3BlcmFuZHNbMF0sCisJCQkgICAgICBHRU5fSU5UIChl eGFjdF9sb2cyIChVSU5UVkFMIChvcGVyYW5kc1syXSkpKSwKKwkJCSAgICAg IG9wZXJhbmRzWzFdKSkpOworICBET05FOworfQogICBbKHNldF9hdHRyICJ0 aW1pbmdzIiAiMTEsMTEsMTEsMTEsMTEsMzMiKQogICAgKHNldF9hdHRyICJs ZW5ndGgiICIzLDQsNSw2LDcsNiIpXQogKQpAQCAtMTk2MCwxOSArMjAwNSwx NiBAQAogDAogOzsgQml0IG1hbmlwdWxhdGlvbiBpbnN0cnVjdGlvbnMuCiAK LTs7ID8/PyBUaGUgKl9pbl9tZW1vcnkgcGF0dGVybnMgd2lsbCBub3QgYmUg bWF0Y2hlZCB3aXRob3V0IGZ1cnRoZXIgaGVscC4KLTs7IEF0IG9uZSB0aW1l IHdlIGhhZCB0aGUgaW5zdiBleHBhbmRlciBnZW5lcmF0ZSB0aGVtLCBidXQg SSBzdXNwZWN0IHRoYXQKLTs7IGluIGdlbmVyYWwgd2UgZ2V0IGJldHRlciBw ZXJmb3JtYW5jZSBieSBleHBvc2luZyB0aGUgcmVnaXN0ZXIgbG9hZCB0bwot OzsgdGhlIG9wdGltaXplcnMuCi07OwotOzsgQW4gYWx0ZXJuYXRlIHNvbHV0 aW9uIHdvdWxkIGJlIHRvIHJlLW9yZ2FuaXplIHRoZXNlIHBhdHRlcm5zIHN1 Y2gKLTs7IHRoYXQgYWxsb3cgYm90aCByZWdpc3RlciBhbmQgbWVtb3J5IG9w ZXJhbmRzLiAgVGhpcyB3b3VsZCBhbGxvdyB0aGUKLTs7IHJlZ2lzdGVyIGFs bG9jYXRvciB0byBzcGlsbCBhbmQgbm90IGxvYWQgdGhlIHJlZ2lzdGVyIG9w ZXJhbmQuICBUaGlzCi07OyB3b3VsZCBiZSBwb3NzaWJsZSBvbmx5IGZvciBv cGVyYXRpb25zIGZvciB3aGljaCB3ZSBoYXZlIGEgY29uc3RhbnQKLTs7IGJp dCBvZmZzZXQsIHNvIHRoYXQgd2UgY2FuIGFkanVzdCB0aGUgYWRkcmVzcyBi eSBvZnMvOCBhbmQgcmVwbGFjZQotOzsgdGhlIG9mZnNldCBpbiB0aGUgaW5z biBieSBvZnMlOC4KKzs7IFRoZSAqX2luX21lbW9yeSBwYXR0ZXJucyB3aWxs IG5vdCBiZSBtYXRjaGVkIGF1dG9tYXRpY2FsbHksIG5vdCBldmVuIHdpdGgK Kzs7IGNvbWJpbmVyIGJyaWRnZSBwYXR0ZXJucy4gIEVzcGVjaWFsbHkgd2hl biB0aGUgbWVtb3J5IG9wZXJhbmRzIGhhdmUgYQorOzsgZGlzcGxhY2VtZW50 LCB0aGUgcmVzdWx0aW5nIHBhdHRlcm5zIGxvb2sgdG9vIGNvbXBsZXguCis7 OyBJbnN0ZWFkIHdlIG1hbnVhbGx5IGxvb2sgYXJvdW5kIHRoZSBtYXRjaGVk IGluc24gdG8gc2VlIGlmIHRoZXJlIGlzIGEKKzs7IHByZWNlZWRpbmcgbWVt b3J5IGxvYWQgYW5kIGEgZm9sbG93aW5nIG1lbW9yeSBzdG9yZSBvZiB0aGUg bW9kaWZpZWQgcmVnaXN0ZXIKKzs7IHdoaWNoIGNhbiBiZSBmdXNlZCBpbnRv IHRoZSBzaW5nbGUgKl9pbl9tZW1vcnkgaW5zbi4KKzs7IERvIHRoYXQgYmVm b3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24sIGFzIGl0IGNhbiBlbGltaW5hdGUg b25lIHRlbXBvcmFyeQorOzsgcmVnaXN0ZXIgdGhhdCBuZWVkcyB0byBiZSBh bGxvY2F0ZWQuCiAKLShkZWZpbmVfaW5zbiAiKmJpdHNldCIKKyhkZWZpbmVf aW5zbl9hbmRfc3BsaXQgImJpdHNldCIKICAgWyhzZXQgKG1hdGNoX29wZXJh bmQ6U0kgICAgICAgICAgICAgICAgICAgIDAgInJlZ2lzdGVyX29wZXJhbmQi ICI9ciIpCiAJKGlvcjpTSSAoYXNoaWZ0OlNJIChjb25zdF9pbnQgMSkKIAkJ CSAgIChtYXRjaF9vcGVyYW5kOlNJIDEgInJ4X3NoaWZ0X29wZXJhbmQiICJy aSIpKQpAQCAtMTk3OSwxMCArMjAyMSwxOCBAQAogCQkobWF0Y2hfb3BlcmFu ZDpTSSAgICAgICAgICAgIDIgInJlZ2lzdGVyX29wZXJhbmQiICIwIikpKV0K ICAgIiIKICAgImJzZXRcdCUxLCAlMCIKKyAgIiYmIGNhbl9jcmVhdGVfcHNl dWRvX3AgKCkiCisgIFsoY29uc3RfaW50IDApXQoreworICBpZiAocnhfZnVz ZV9pbl9tZW1vcnlfYml0b3AgKG9wZXJhbmRzLCBjdXJyX2luc24sICZnZW5f Yml0c2V0X2luX21lbW9yeSkpCisgICAgRE9ORTsKKyAgZWxzZQorICAgIEZB SUw7Cit9CiAgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjMiKV0KICkKIAotKGRl ZmluZV9pbnNuICIqYml0c2V0X2luX21lbW9yeSIKKyhkZWZpbmVfaW5zbiAi Yml0c2V0X2luX21lbW9yeSIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UUkg ICAgICAgICAgICAgICAgICAgIDAgInJ4X3Jlc3RyaWN0ZWRfbWVtX29wZXJh bmQiICIrUSIpCiAJKGlvcjpRSSAoYXNoaWZ0OlFJIChjb25zdF9pbnQgMSkK IAkJCSAgIChtYXRjaF9vcGVyYW5kOlFJIDEgIm5vbm1lbW9yeV9vcGVyYW5k IiAicmkiKSkKQEAgLTE5ODksMTEgKzIwMzksMTEgQEAKIAkJKG1hdGNoX2R1 cCAwKSkpXQogICAiIgogICAiYnNldFx0JTEsICUwLkIiCi0gIFsoc2V0X2F0 dHIgImxlbmd0aCIgIjMiKQorICBbKHNldF9hdHRyICJsZW5ndGgiICI1IikK ICAgIChzZXRfYXR0ciAidGltaW5ncyIgIjMzIildCiApCiAKLShkZWZpbmVf aW5zbiAiKmJpdGludmVydCIKKyhkZWZpbmVfaW5zbl9hbmRfc3BsaXQgImJp dGludmVydCIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kgMCAicmVnaXN0 ZXJfb3BlcmFuZCIgIj1yIikKIAkoeG9yOlNJIChhc2hpZnQ6U0kgKGNvbnN0 X2ludCAxKQogCQkJICAgKG1hdGNoX29wZXJhbmQ6U0kgMSAicnhfc2hpZnRf b3BlcmFuZCIgInJpIikpCkBAIC0yMDAwLDEwICsyMDUwLDE4IEBACiAJCSht YXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIwIikpKV0K ICAgIiIKICAgImJub3RcdCUxLCAlMCIKKyAgIiYmIGNhbl9jcmVhdGVfcHNl dWRvX3AgKCkiCisgIFsoY29uc3RfaW50IDApXQoreworICBpZiAocnhfZnVz ZV9pbl9tZW1vcnlfYml0b3AgKG9wZXJhbmRzLCBjdXJyX2luc24sICZnZW5f Yml0aW52ZXJ0X2luX21lbW9yeSkpCisgICAgRE9ORTsKKyAgZWxzZQorICAg IEZBSUw7Cit9CiAgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjMiKV0KICkKIAot KGRlZmluZV9pbnNuICIqYml0aW52ZXJ0X2luX21lbW9yeSIKKyhkZWZpbmVf aW5zbiAiYml0aW52ZXJ0X2luX21lbW9yeSIKICAgWyhzZXQgKG1hdGNoX29w ZXJhbmQ6UUkgMCAicnhfcmVzdHJpY3RlZF9tZW1fb3BlcmFuZCIgIitRIikK IAkoeG9yOlFJIChhc2hpZnQ6UUkgKGNvbnN0X2ludCAxKQogCQkJICAgKG1h dGNoX29wZXJhbmQ6UUkgMSAibm9ubWVtb3J5X29wZXJhbmQiICJyaSIpKQpA QCAtMjAxNCw3ICsyMDcyLDcgQEAKICAgIChzZXRfYXR0ciAidGltaW5ncyIg IjMzIildCiApCiAKLShkZWZpbmVfaW5zbiAiKmJpdGNsciIKKyhkZWZpbmVf aW5zbl9hbmRfc3BsaXQgImJpdGNsciIKICAgWyhzZXQgKG1hdGNoX29wZXJh bmQ6U0kgMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj1yIikKIAkoYW5kOlNJIChu b3Q6U0kKIAkJICAoYXNoaWZ0OlNJCkBAIC0yMDIzLDEwICsyMDgxLDE4IEBA CiAJCShtYXRjaF9vcGVyYW5kOlNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICIw IikpKV0KICAgIiIKICAgImJjbHJcdCUxLCAlMCIKKyAgIiYmIGNhbl9jcmVh dGVfcHNldWRvX3AgKCkiCisgIFsoY29uc3RfaW50IDApXQoreworICBpZiAo cnhfZnVzZV9pbl9tZW1vcnlfYml0b3AgKG9wZXJhbmRzLCBjdXJyX2luc24s ICZnZW5fYml0Y2xyX2luX21lbW9yeSkpCisgICAgRE9ORTsKKyAgZWxzZQor ICAgIEZBSUw7Cit9CiAgIFsoc2V0X2F0dHIgImxlbmd0aCIgIjMiKV0KICkK IAotKGRlZmluZV9pbnNuICIqYml0Y2xyX2luX21lbW9yeSIKKyhkZWZpbmVf aW5zbiAiYml0Y2xyX2luX21lbW9yeSIKICAgWyhzZXQgKG1hdGNoX29wZXJh bmQ6UUkgMCAicnhfcmVzdHJpY3RlZF9tZW1fb3BlcmFuZCIgIitRIikKIAko YW5kOlFJIChub3Q6UUkKIAkJICAoYXNoaWZ0OlFJCkBAIC0yMDM1LDcgKzIx MDEsNyBAQAogCQkobWF0Y2hfZHVwIDApKSldCiAgICIiCiAgICJiY2xyXHQl MSwgJTAuQiIKLSAgWyhzZXRfYXR0ciAibGVuZ3RoIiAiMyIpCisgIFsoc2V0 X2F0dHIgImxlbmd0aCIgIjUiKQogICAgKHNldF9hdHRyICJ0aW1pbmdzIiAi MzMiKV0KICkKIApJbmRleDogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L3J4 L3ByODM4MzEuYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvcngvcHI4MzgzMS5jCShub25leGlzdGVudCkK KysrIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9yeC9wcjgzODMxLmMJKHdv cmtpbmcgY29weSkKQEAgLTAsMCArMSw3NyBAQAorLyogeyBkZy1kbyBjb21w aWxlIH0gICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMSIgfSAgKi8KKy8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAiYmNsciIgNiB9IH0g ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgImJz ZXQiIDYgfSB9ICAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzICJibm90IiA2IH0gfSAgKi8KKwordm9pZAordGVzdF8wIChjaGFy KiB4LCB1bnNpZ25lZCBpbnQgeSkKK3sKKyAgLyogRXhwZWN0IDR4IGJjbHIg aGVyZS4gICovCisgIHhbMF0gJj0gMHhGRTsKKyAgeFsxXSA9IHkgJiB+KDEg PDwgMSk7CisgIHhbMl0gJj0gMHhGRTsKKyAgeFs2NTAwMF0gJj0gMHhGRTsK K30KKwordW5zaWduZWQgaW50Cit0ZXN0XzEgKHVuc2lnbmVkIGludCB4LCB1 bnNpZ25lZCBpbnQgeSkKK3sKKyAgLyogRXhwZWN0IDF4IGJjbHIgaGVyZS4g ICovCisgIHJldHVybiB4ICYgfigxIDw8IHkpOworfQorCit1bnNpZ25lZCBp bnQKK3Rlc3RfMiAodW5zaWduZWQgaW50IHgpCit7CisgIC8qIEV4cGVjdCAx eCBiY2xyIGhlcmUuICAqLworICByZXR1cm4geCAmIH4oMSA8PCAxKTsKK30K Kwordm9pZAordGVzdF8zIChjaGFyKiB4LCB1bnNpZ25lZCBpbnQgeSkKK3sK KyAgLyogRXhwZWN0IDR4IGJzZXQgaGVyZS4gICovCisgIHhbMF0gfD0gMHgx MDsKKyAgeFsxXSA9IHkgfCAoMSA8PCAxKTsKKyAgeFsyXSB8PSAweDEwOwor ICB4WzY1MDAwXSB8PSAweDEwOworfQorCit1bnNpZ25lZCBpbnQKK3Rlc3Rf NCAodW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5KQoreworICAvKiBF eHBlY3QgMXggYnNldCBoZXJlLiAgKi8KKyAgcmV0dXJuIHggfCAoMSA8PCB5 KTsKK30KKwordW5zaWduZWQgaW50Cit0ZXN0XzUgKHVuc2lnbmVkIGludCB4 KQoreworICAvKiBFeHBlY3QgMXggYnNldCBoZXJlLiAgKi8KKyAgcmV0dXJu IHggfCAoMSA8PCA4KTsKK30KKwordm9pZAordGVzdF82IChjaGFyKiB4LCB1 bnNpZ25lZCBpbnQgeSkKK3sKKyAgLyogRXhwZWN0IDR4IGJub3QgaGVyZS4g ICovCisgIHhbMF0gXj0gMHgxMDsKKyAgeFsxXSA9IHkgXiAoMSA8PCAxKTsK KyAgeFsyXSBePSAweDEwOworICB4WzY1MDAwXSBePSAweDEwOworfQorCit1 bnNpZ25lZCBpbnQKK3Rlc3RfNyAodW5zaWduZWQgaW50IHgsIHVuc2lnbmVk IGludCB5KQoreworICAvKiBFeHBlY3QgMXggYm5vdCBoZXJlLiAgKi8KKyAg cmV0dXJuIHggXiAoMSA8PCB5KTsKK30KKwordW5zaWduZWQgaW50Cit0ZXN0 XzggKHVuc2lnbmVkIGludCB4KQoreworICAvKiBFeHBlY3QgMXggYm5vdCBo ZXJlLiAgKi8KKyAgcmV0dXJuIHggXiAoMSA8PCA4KTsKK30K --=-n5B6xjRtA1kLkKZ9Kq2k--