From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9125 invoked by alias); 21 May 2019 15:54:58 -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 9116 invoked by uid 89); 21 May 2019 15:54:58 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-4.1 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,GIT_PATCH_2,KAM_SHORT,RCVD_IN_DNSWL_NONE,SPF_PASS autolearn=ham version=3.3.1 spammy=PLUS, xv X-HELO: mail-ot1-f67.google.com Received: from mail-ot1-f67.google.com (HELO mail-ot1-f67.google.com) (209.85.210.67) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 21 May 2019 15:54:57 +0000 Received: by mail-ot1-f67.google.com with SMTP id t24so16754602otl.12 for ; Tue, 21 May 2019 08:54:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=ArxISmDRfWFp86rhaMVVuFSqRixGz/ynq6I0vhwYtGE=; b=hnMTZGObyKQxtwYE1pp5x5fbQA/CdJAJPwfjkw3mO2mY7k/tajDTT0AVrnybP2tf5S ezQDHwSlDli+6zItm+ggQmAbeivu0GQIKP+OON33LlGnMZMO21KNtkR6KSYyPG9KCJMS sZqcm8MlMBUSzU7Uz9iGYAwgEe4RqQFiWqrRyUOii7s0Z3sqHTZaJrPW8A73WiAytKFZ MFXYuHNDdRFLIAht2qVByElnwhm6qvMYsNgq/T1UDejHBpE8mH+lb8qmTAVg5PB9mk7g McYsfDzd5qKLWPXAzO4A5vkFnckd7xpNhYv0ClUTOYknY02L2asmjgnkHcmL9FUG/ma/ 6Msg== MIME-Version: 1.0 References: <20190207174942.20825-1-hjl.tools@gmail.com> In-Reply-To: From: "H.J. Lu" Date: Tue, 21 May 2019 15:54:00 -0000 Message-ID: Subject: [PATCH] i386: Generate standard floating point scalar operation patterns To: GCC Patches , Uros Bizjak , Marc Glisse , Richard Sandiford Content-Type: multipart/mixed; boundary="000000000000bace11058967de39" X-IsSubscribed: yes X-SW-Source: 2019-05/txt/msg01416.txt.bz2 --000000000000bace11058967de39 Content-Type: text/plain; charset="UTF-8" Content-length: 4036 On Wed, May 15, 2019 at 2:29 PM Richard Sandiford wrote: > > "H.J. Lu" writes: > > On Thu, Feb 7, 2019 at 9:49 AM H.J. Lu wrote: > >> > >> Standard scalar operation patterns which preserve the rest of the vector > >> look like > >> > >> (vec_merge:V2DF > >> (vec_duplicate:V2DF > >> (op:DF (vec_select:DF (reg/v:V2DF 85 [ x ]) > >> (parallel [ (const_int 0 [0])])) > >> (reg:DF 87)) > >> (reg/v:V2DF 85 [ x ]) > >> (const_int 1 [0x1])])) > >> > >> Add such pattens to i386 backend and convert VEC_CONCAT patterns to > >> standard standard scalar operation patterns. > > It looks like there's some variety in the patterns used, e.g.: > > (define_insn "_vm3" > [(set (match_operand:VF_128 0 "register_operand" "=x,v") > (vec_merge:VF_128 > (smaxmin:VF_128 > (match_operand:VF_128 1 "register_operand" "0,v") > (match_operand:VF_128 2 "vector_operand" "xBm,")) > (match_dup 1) > (const_int 1)))] > "TARGET_SSE" > "@ > \t{%2, %0|%0, %2} > v\t{%2, %1, %0|%0, %1, %2}" > [(set_attr "isa" "noavx,avx") > (set_attr "type" "sse") > (set_attr "btver2_sse_attr" "maxmin") > (set_attr "prefix" "") > (set_attr "mode" "")]) > > makes the operand a full vector operation, which seems simpler. This pattern is used to implement scalar smaxmin intrinsics. > The above would then be: > > (vec_merge:V2DF > (op:V2DF > (reg:V2DF 85) > (vec_duplicate:V2DF (reg:DF 87))) > (reg/v:V2DF 85 [ x ]) > (const_int 1 [0x1])])) > > I guess technically the two have different faulting behaviour though, > since the smaxmin gets applied to all elements, not just element 0. This is the issue. We don't use the correct mode for scalar instructions: --- #include __m128d foo1 (__m128d x, double *p) { __m128d y = _mm_load_sd (p); return _mm_max_pd (x, y); } --- movq (%rdi), %xmm1 maxpd %xmm1, %xmm0 ret Here is the updated patch to add standard floating point scalar operation patterns to i386 backend. Then we can do --- #include extern __inline __m128d __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _new_mm_max_pd (__m128d __A, __m128d __B) { __A[0] = __A[0] > __B[0] ? __A[0] : __B[0]; return __A; } __m128d foo2 (__m128d x, double *p) { __m128d y = _mm_load_sd (p); return _new_mm_max_pd (x, y); } maxsd (%rdi), %xmm0 ret We should use generic vector operations to implement i386 intrinsics as much as we can. > The patch seems very specific. E.g. why just PLUS, MINUS, MULT and DIV? This patch only adds +, -, *, /, > and <. We can add more if there are testcases for them. > Thanks, > Richard > > > >> > >> gcc/ > >> > >> PR target/54855 > >> * simplify-rtx.c (simplify_binary_operation_1): Convert > >> VEC_CONCAT patterns to standard standard scalar operation > >> patterns. > >> * config/i386/sse.md (*_vm3): New. > >> (*_vm3): Likewise. > >> > >> gcc/testsuite/ > >> > >> PR target/54855 > >> * gcc.target/i386/pr54855-1.c: New test. > >> * gcc.target/i386/pr54855-2.c: Likewise. > >> * gcc.target/i386/pr54855-3.c: Likewise. > >> * gcc.target/i386/pr54855-4.c: Likewise. > >> * gcc.target/i386/pr54855-5.c: Likewise. > >> * gcc.target/i386/pr54855-6.c: Likewise. > >> * gcc.target/i386/pr54855-7.c: Likewise. > > > > PING: > > > > https://gcc.gnu.org/ml/gcc-patches/2019-02/msg00398.html Thanks. -- H.J. --000000000000bace11058967de39 Content-Type: application/x-patch; name="0001-i386-Generate-standard-floating-point-scalar-operati.patch" Content-Disposition: attachment; filename="0001-i386-Generate-standard-floating-point-scalar-operati.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_jvxybydd0 Content-length: 19415 RnJvbSA1ZDkxYmYyNjRjODk1NDFhNzljYThmOTEyMTI2NDQxNmNlMzA3NDIw IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiSC5KLiBMdSIgPGhq bC50b29sc0BnbWFpbC5jb20+CkRhdGU6IFN1biwgMyBGZWIgMjAxOSAwOTox NjoyMyAtMDgwMApTdWJqZWN0OiBbUEFUQ0hdIGkzODY6IEdlbmVyYXRlIHN0 YW5kYXJkIGZsb2F0aW5nIHBvaW50IHNjYWxhciBvcGVyYXRpb24KIHBhdHRl cm5zCgpTdGFuZGFyZCBmbG9hdGluZyBwb2ludCBzY2FsYXIgb3BlcmF0aW9u IHBhdHRlcm5zIGZvciBjb21iaW5lciwgd2hpY2gKcHJlc2VydmUgdGhlIHJl c3Qgb2YgdGhlIHZlY3RvciwgbG9vayBsaWtlCgogICAgICh2ZWNfbWVyZ2U6 VjJERgogICAgICAgKHZlY19kdXBsaWNhdGU6VjJERiAocmVnOkRGIDg3KSkK ICAgICAgIChyZWcvdjpWMkRGIDg1IFsgeCBdKQogICAgICAgKGNvbnN0X2lu dCAxIFsweDFdKV0pKQoKYW5kCgogICAgICh2ZWNfbWVyZ2U6VjJERgogICAg ICAgKHZlY19kdXBsaWNhdGU6VjJERgogICAgICAgICAob3A6REYgKHZlY19z ZWxlY3Q6REYgKHJlZy92OlYyREYgODUgWyB4IF0pCiAgICAgICAgICAgICAg ICAocGFyYWxsZWwgWyAoY29uc3RfaW50IDAgWzBdKV0pKQogICAgICAgICAo cmVnOkRGIDg3KSkKICAgICAgIChyZWcvdjpWMkRGIDg1IFsgeCBdKQogICAg ICAgKGNvbnN0X2ludCAxIFsweDFdKV0pKQoKVGhpcyBwYXRjaCBhZGRzIGFu ZCBnZW5lcmF0ZXMgc3VjaCBzdGFuZGFyZCBmbG9hdGluZyBwb2ludCBzY2Fs YXIKb3BlcmF0aW9uIHBhdHRlcm5zIGZvciArLCAtLCAqLCAvLCA+IGFuZCA8 LgoKVGVzdGVkIG9uIHg4Ni02NC4KCmdjYy8KCglQUiB0YXJnZXQvNTQ4NTUK CSogY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYyAoaXg4Nl9leHBhbmRfdmVj dG9yX3NldCk6IEdlbmVyYXRlCglzdGFuZGFyZCBzY2FsYXIgb3BlcmF0aW9u IHBhdHRlcm4gZm9yIFYyREYuCgkqIGNvbmZpZy9pMzg2L3NzZS5tZCAoKjxz c2U+X3ZtPHBsdXNtaW51c19pbnNuPjxtb2RlPjMpOiBOZXcuCgkoKjxzc2U+ X3ZtPG11bHRkaXZfbW5lbW9uaWM+PG1vZGU+Myk6IExpa2V3aXNlLgoJKCpp ZWVlXzxpZWVlX21heG1pbj48bW9kZT4zKTogTGlrZXdpc2UuCgkodmVjX3Nl dHYyZGZfMCk6IExpa2V3aXNlLgoKZ2NjL3Rlc3RzdWl0ZS8KCglQUiB0YXJn ZXQvNTQ4NTUKCSogZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMS5jOiBOZXcg dGVzdC4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMi5jOiBMaWtld2lz ZS4KCSogZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMy5jOiBMaWtld2lzZS4K CSogZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtNC5jOiBMaWtld2lzZS4KCSog Z2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtNS5jOiBMaWtld2lzZS4KCSogZ2Nj LnRhcmdldC9pMzg2L3ByNTQ4NTUtNi5jOiBMaWtld2lzZS4KCSogZ2NjLnRh cmdldC9pMzg2L3ByNTQ4NTUtNy5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdl dC9pMzg2L3ByNTQ4NTUtOC5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9p Mzg2L3ByNTQ4NTUtOS5jOiBMaWtld2lzZS4KCSogZ2NjLnRhcmdldC9pMzg2 L3ByNTQ4NTUtMTAuYzogTGlrZXdpc2UuCi0tLQogZ2NjL2NvbmZpZy9pMzg2 L2kzODYtZXhwYW5kLmMgICAgICAgICAgICAgIHwgMTIgKysrCiBnY2MvY29u ZmlnL2kzODYvc3NlLm1kICAgICAgICAgICAgICAgICAgICAgfCA4OCArKysr KysrKysrKysrKysrKysrKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9wcjU0ODU1LTEuYyAgfCAxNiArKysrCiBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjU0ODU1LTEwLmMgfCAxMyArKysrCiBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTIuYyAgfCAxNSArKysr CiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTMuYyAg fCAxNCArKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0 ODU1LTQuYyAgfCAxNCArKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9wcjU0ODU1LTUuYyAgfCAxNiArKysrCiBnY2MvdGVzdHN1aXRlL2dj Yy50YXJnZXQvaTM4Ni9wcjU0ODU1LTYuYyAgfCAxNCArKysrCiBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTcuYyAgfCAxNCArKysr CiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTguYyAg fCAxNCArKysrCiBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0 ODU1LTkuYyAgfCAxNCArKysrCiAxMiBmaWxlcyBjaGFuZ2VkLCAyNDQgaW5z ZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMS5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS0xMC5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0 L2kzODYvcHI1NDg1NS0yLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVz dHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTMuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4 NTUtNC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI1NDg1NS01LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBn Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTYuYwogY3Jl YXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2 L3ByNTQ4NTUtNy5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0 ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS04LmMKIGNyZWF0ZSBtb2RlIDEw MDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTku YwoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2LWV4cGFuZC5j IGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYtZXhwYW5kLmMKaW5kZXggODdlMDk3 M2UxY2EuLjE4YWIyMmNhY2IwIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kz ODYvaTM4Ni1leHBhbmQuYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni1l eHBhbmQuYwpAQCAtMTQwOTIsNiArMTQwOTIsMTcgQEAgaXg4Nl9leHBhbmRf dmVjdG9yX3NldCAoYm9vbCBtbXhfb2ssIHJ0eCB0YXJnZXQsIHJ0eCB2YWws IGludCBlbHQpCiAgICAgICByZXR1cm47CiAKICAgICBjYXNlIEVfVjJERm1v ZGU6CisgICAgICAvKiBOQjogRm9yIEVMVCA9PSAwLCB1c2Ugc3RhbmRhcmQg c2NhbGFyIG9wZXJhdGlvbiBwYXR0ZXJucyB3aGljaAorCSBwcmVzZXJ2ZSB0 aGUgcmVzdCBvZiB0aGUgdmVjdG9yIGZvciBjb21iaW5lcjoKKworCSAodmVj X21lcmdlOlYyREYKKwkgICAodmVjX2R1cGxpY2F0ZTpWMkRGIChyZWc6REYp KQorCSAgIChyZWc6VjJERikKKwkgICAoY29uc3RfaW50IDEpKQorICAgICAg ICovCisgICAgICBpZiAoZWx0ID09IDApCisJZ290byBkb192ZWNfbWVyZ2U7 CisKICAgICAgIHsKIAlydHggb3AwLCBvcDE7CiAKQEAgLTE0Mzg5LDYgKzE0 NDAwLDcgQEAgcXVhcnRlcjoKICAgICB9CiAgIGVsc2UgaWYgKHVzZV92ZWNf bWVyZ2UpCiAgICAgeworZG9fdmVjX21lcmdlOgogICAgICAgdG1wID0gZ2Vu X3J0eF9WRUNfRFVQTElDQVRFIChtb2RlLCB2YWwpOwogICAgICAgdG1wID0g Z2VuX3J0eF9WRUNfTUVSR0UgKG1vZGUsIHRtcCwgdGFyZ2V0LAogCQkJICAg ICAgIEdFTl9JTlQgKEhPU1RfV0lERV9JTlRfMVUgPDwgZWx0KSk7CmRpZmYg LS1naXQgYS9nY2MvY29uZmlnL2kzODYvc3NlLm1kIGIvZ2NjL2NvbmZpZy9p Mzg2L3NzZS5tZAppbmRleCA2NzdlNzAyM2ViMi4uZjM2NTM3ZGZiM2YgMTAw NjQ0Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9zc2UubWQKKysrIGIvZ2NjL2Nv bmZpZy9pMzg2L3NzZS5tZApAQCAtMTgwMiw2ICsxODAyLDI4IEBACiAgICAo c2V0X2F0dHIgInR5cGUiICJzc2VhZGQiKQogICAgKHNldF9hdHRyICJtb2Rl IiAiPE1PREU+IildKQogCis7OyBTdGFuZGFyZCBzY2FsYXIgb3BlcmF0aW9u IHBhdHRlcm5zIHdoaWNoIHByZXNlcnZlIHRoZSByZXN0IG9mIHRoZQorOzsg dmVjdG9yIGZvciBjb21iaW5lci4KKyhkZWZpbmVfaW5zbiAiKjxzc2U+X3Zt PHBsdXNtaW51c19pbnNuPjxtb2RlPjMiCisgIFsoc2V0IChtYXRjaF9vcGVy YW5kOlZGXzEyOCAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXgsdiIpCisJKHZl Y19tZXJnZTpWRl8xMjgKKwkgICh2ZWNfZHVwbGljYXRlOlZGXzEyOAorCSAg ICAocGx1c21pbnVzOjxzc2VzY2FsYXJtb2RlPgorCSAgICAgICh2ZWNfc2Vs ZWN0Ojxzc2VzY2FsYXJtb2RlPgorCSAgICAgICAgKG1hdGNoX29wZXJhbmQ6 VkZfMTI4IDEgInJlZ2lzdGVyX29wZXJhbmQiICIwLHYiKQorCQkocGFyYWxs ZWwgWyhjb25zdF9pbnQgMCldKSkKKwkgICAgICAobWF0Y2hfb3BlcmFuZDo8 c3Nlc2NhbGFybW9kZT4gMiAibm9uaW1tZWRpYXRlX29wZXJhbmQiICJ4bSx2 bSIpKSkKKwkgIChtYXRjaF9kdXAgMSkKKwkgIChjb25zdF9pbnQgMSkpKV0K KyAgIlRBUkdFVF9TU0UiCisgICJACisgICA8cGx1c21pbnVzX21uZW1vbmlj Pjxzc2VzY2FsYXJtb2Rlc3VmZml4Plx0eyUyLCAlMHwlMCwgJTxpcHRyPjJ9 CisgICB2PHBsdXNtaW51c19tbmVtb25pYz48c3Nlc2NhbGFybW9kZXN1ZmZp eD5cdHslMiwgJTEsICUwfCUwLCAlMSwgJTxpcHRyPjJ9IgorICBbKHNldF9h dHRyICJpc2EiICJub2F2eCxhdngiKQorICAgKHNldF9hdHRyICJ0eXBlIiAi c3NlYWRkIikKKyAgIChzZXRfYXR0ciAicHJlZml4IiAib3JpZyx2ZXgiKQor ICAgKHNldF9hdHRyICJtb2RlIiAiPHNzZXNjYWxhcm1vZGU+IildKQorCiAo ZGVmaW5lX2luc24gIjxzc2U+X3ZtPHBsdXNtaW51c19pbnNuPjxtb2RlPjM8 bWFza19zY2FsYXJfbmFtZT48cm91bmRfc2NhbGFyX25hbWU+IgogICBbKHNl dCAobWF0Y2hfb3BlcmFuZDpWRl8xMjggMCAicmVnaXN0ZXJfb3BlcmFuZCIg Ij14LHYiKQogCSh2ZWNfbWVyZ2U6VkZfMTI4CkBAIC0xODU2LDYgKzE4Nzgs MjkgQEAKICAgIChzZXRfYXR0ciAidHlwZSIgInNzZW11bCIpCiAgICAoc2V0 X2F0dHIgIm1vZGUiICI8TU9ERT4iKV0pCiAKKzs7IFN0YW5kYXJkIHNjYWxh ciBvcGVyYXRpb24gcGF0dGVybnMgd2hpY2ggcHJlc2VydmUgdGhlIHJlc3Qg b2YgdGhlCis7OyB2ZWN0b3IgZm9yIGNvbWJpbmVyLgorKGRlZmluZV9pbnNu ICIqPHNzZT5fdm08bXVsdGRpdl9tbmVtb25pYz48bW9kZT4zIgorICBbKHNl dCAobWF0Y2hfb3BlcmFuZDpWRl8xMjggMCAicmVnaXN0ZXJfb3BlcmFuZCIg Ij14LHYiKQorCSh2ZWNfbWVyZ2U6VkZfMTI4CisJICAodmVjX2R1cGxpY2F0 ZTpWRl8xMjgKKwkgICAgKG11bHRkaXY6PHNzZXNjYWxhcm1vZGU+CisJICAg ICAgKHZlY19zZWxlY3Q6PHNzZXNjYWxhcm1vZGU+CisJICAgICAgICAobWF0 Y2hfb3BlcmFuZDpWRl8xMjggMSAicmVnaXN0ZXJfb3BlcmFuZCIgIjAsdiIp CisJCShwYXJhbGxlbCBbKGNvbnN0X2ludCAwKV0pKQorCSAgICAgIChtYXRj aF9vcGVyYW5kOjxzc2VzY2FsYXJtb2RlPiAyICJub25pbW1lZGlhdGVfb3Bl cmFuZCIgInhtLHZtIikpKQorCSAgKG1hdGNoX2R1cCAxKQorCSAgKGNvbnN0 X2ludCAxKSkpXQorICAiVEFSR0VUX1NTRSIKKyAgIkAKKyAgIDxtdWx0ZGl2 X21uZW1vbmljPjxzc2VzY2FsYXJtb2Rlc3VmZml4Plx0eyUyLCAlMHwlMCwg JTxpcHRyPjJ9CisgICB2PG11bHRkaXZfbW5lbW9uaWM+PHNzZXNjYWxhcm1v ZGVzdWZmaXg+XHR7JTIsICUxLCAlMHwlMCwgJTEsICU8aXB0cj4yfSIKKyAg WyhzZXRfYXR0ciAiaXNhIiAibm9hdngsYXZ4IikKKyAgIChzZXRfYXR0ciAi dHlwZSIgInNzZTxtdWx0ZGl2X21uZW1vbmljPiIpCisgICAoc2V0X2F0dHIg InByZWZpeCIgIm9yaWcsdmV4IikKKyAgIChzZXRfYXR0ciAiYnR2ZXIyX2Rl Y29kZSIgImRpcmVjdCxkb3VibGUiKQorICAgKHNldF9hdHRyICJtb2RlIiAi PHNzZXNjYWxhcm1vZGU+IildKQorCiAoZGVmaW5lX2luc24gIjxzc2U+X3Zt PG11bHRkaXZfbW5lbW9uaWM+PG1vZGU+MzxtYXNrX3NjYWxhcl9uYW1lPjxy b3VuZF9zY2FsYXJfbmFtZT4iCiAgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZG XzEyOCAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXgsdiIpCiAJKHZlY19tZXJn ZTpWRl8xMjgKQEAgLTIyMDUsNiArMjI1MCwzMCBAQAogICAgKHNldF9hdHRy ICJwcmVmaXgiICI8bWFza19wcmVmaXgzPiIpCiAgICAoc2V0X2F0dHIgIm1v ZGUiICI8TU9ERT4iKV0pCiAKKzs7IFN0YW5kYXJkIHNjYWxhciBvcGVyYXRp b24gcGF0dGVybnMgd2hpY2ggcHJlc2VydmUgdGhlIHJlc3Qgb2YgdGhlCis7 OyB2ZWN0b3IgZm9yIGNvbWJpbmVyLgorKGRlZmluZV9pbnNuICIqaWVlZV88 aWVlZV9tYXhtaW4+PG1vZGU+MyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6 VkZfMTI4IDAgInJlZ2lzdGVyX29wZXJhbmQiICI9eCx2IikKKwkodmVjX21l cmdlOlZGXzEyOAorCSAgKHZlY19kdXBsaWNhdGU6VkZfMTI4CisJICAgICh1 bnNwZWM6PHNzZXNjYWxhcm1vZGU+CisJICAgICAgWyh2ZWNfc2VsZWN0Ojxz c2VzY2FsYXJtb2RlPgorCSAgICAgICAgIChtYXRjaF9vcGVyYW5kOlZGXzEy OCAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiMCx2IikKKwkJIChwYXJhbGxlbCBb KGNvbnN0X2ludCAwKV0pKQorCSAgICAgICAobWF0Y2hfb3BlcmFuZDo8c3Nl c2NhbGFybW9kZT4gMiAibm9uaW1tZWRpYXRlX29wZXJhbmQiICJ4bSx2bSIp XQorCSAgICAgICBJRUVFX01BWE1JTikpCisJICAobWF0Y2hfZHVwIDEpCisJ ICAoY29uc3RfaW50IDEpKSldCisgICJUQVJHRVRfU1NFIgorICAiQAorICAg PGllZWVfbWF4bWluPjxzc2VzY2FsYXJtb2Rlc3VmZml4Plx0eyUyLCAlMHwl MCwgJTJ9CisgICB2PGllZWVfbWF4bWluPjxzc2VzY2FsYXJtb2Rlc3VmZml4 Plx0eyUyLCAlMSwgJTB8JTAsICUxLCAlMn0iCisgIFsoc2V0X2F0dHIgImlz YSIgIm5vYXZ4LGF2eCIpCisgICAoc2V0X2F0dHIgInR5cGUiICJzc2VhZGQi KQorICAgKHNldF9hdHRyICJidHZlcjJfc3NlX2F0dHIiICJtYXhtaW4iKQor ICAgKHNldF9hdHRyICJwcmVmaXgiICJvcmlnLHZleCIpCisgICAoc2V0X2F0 dHIgIm1vZGUiICI8c3Nlc2NhbGFybW9kZT4iKV0pCisKIChkZWZpbmVfaW5z biAiPHNzZT5fdm08Y29kZT48bW9kZT4zPG1hc2tfc2NhbGFyX25hbWU+PHJv dW5kX3NhZW9ubHlfc2NhbGFyX25hbWU+IgogICBbKHNldCAobWF0Y2hfb3Bl cmFuZDpWRl8xMjggMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj14LHYiKQogCSh2 ZWNfbWVyZ2U6VkZfMTI4CkBAIC03ODgxLDYgKzc5NTAsMjUgQEAKICAgWyhz ZXQgKG1hdGNoX2R1cCAwKSAobWF0Y2hfZHVwIDEpKV0KICAgIm9wZXJhbmRz WzBdID0gYWRqdXN0X2FkZHJlc3MgKG9wZXJhbmRzWzBdLCA8c3Nlc2NhbGFy bW9kZT5tb2RlLCAwKTsiKQogCis7OyBTdGFuZGFyZCBzY2FsYXIgb3BlcmF0 aW9uIHBhdHRlcm5zIHdoaWNoIHByZXNlcnZlIHRoZSByZXN0IG9mIHRoZQor OzsgdmVjdG9yIGZvciBjb21iaW5lci4KKyhkZWZpbmVfaW5zbiAidmVjX3Nl dHYyZGZfMCIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VjJERiAwICJyZWdp c3Rlcl9vcGVyYW5kIiAgICAgICAiPXgsdix4LHYiKQorCSh2ZWNfbWVyZ2U6 VjJERgorCSAgKHZlY19kdXBsaWNhdGU6VjJERgorCSAgICAobWF0Y2hfb3Bl cmFuZDpERiAyICJub25pbW1lZGlhdGVfb3BlcmFuZCIgIiB4LHYsbSxtIikp CisJICAobWF0Y2hfb3BlcmFuZDpWMkRGIDEgInJlZ2lzdGVyX29wZXJhbmQi ICAgICAiIDAsdiwwLHYiKQorCSAgKGNvbnN0X2ludCAxKSkpXQorICAiVEFS R0VUX1NTRTIiCisgICJACisgICBtb3ZzZFx0eyUyLCAlMHwlMCwgJTJ9Cisg ICB2bW92c2RcdHslMiwgJTEsICUwfCUwLCAlMSwgJTJ9CisgICBtb3ZscGRc dHslMiwgJTB8JTAsICUyfQorICAgdm1vdmxwZFx0eyUyLCAlMSwgJTB8JTAs ICUxLCAlMn0iCisgIFsoc2V0X2F0dHIgImlzYSIgIm5vYXZ4LGF2eCxub2F2 eCxhdngiKQorICAgKHNldF9hdHRyICJ0eXBlIiAic3NlbW92IikKKyAgIChz ZXRfYXR0ciAibW9kZSIgIkRGIildKQorCiAoZGVmaW5lX2V4cGFuZCAidmVj X3NldDxtb2RlPiIKICAgWyhtYXRjaF9vcGVyYW5kOlYgMCAicmVnaXN0ZXJf b3BlcmFuZCIpCiAgICAobWF0Y2hfb3BlcmFuZDo8c3Nlc2NhbGFybW9kZT4g MSAicmVnaXN0ZXJfb3BlcmFuZCIpCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTEuYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi42OTNhYWZhMDlhYgotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By NTQ4NTUtMS5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZTIgLW1mcG1hdGg9 c3NlIiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGlt ZXMgImFkZHNkIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAibW92YXBkIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci1ub3QgIm1vdnNkIiB9IH0gKi8KKwordHlwZWRlZiBk b3VibGUgX192MmRmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rvcl9zaXplX18g KDE2KSkpOwordHlwZWRlZiBkb3VibGUgX19tMTI4ZCBfX2F0dHJpYnV0ZV9f ICgoX192ZWN0b3Jfc2l6ZV9fICgxNiksIF9fbWF5X2FsaWFzX18pKTsKKwor X19tMTI4ZAorX21tX2FkZF9zZCAoX19tMTI4ZCB4LCBfX20xMjhkIHkpCit7 CisgIF9fbTEyOGQgeiA9ICBfX2V4dGVuc2lvbl9fIChfX20xMjhkKShfX3Yy ZGYpCisgICAgeyAoKChfX3YyZGYpIHgpWzBdICsgKChfX3YyZGYpIHkpWzBd KSwgKChfX3YyZGYpIHgpWzFdIH07CisgIHJldHVybiB6OworfQpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS0x MC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS0x MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi45 ZTA4YTg1NzIzZQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUv Z2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMTAuYwpAQCAtMCwwICsxLDEzIEBA CisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICIt TzIgLW1zc2UyIC1tZnBtYXRoPXNzZSIgfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJtb3ZscGQiIDEgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJtb3ZzZCIgfSB9ICov CisKK3R5cGVkZWYgZG91YmxlIHZlYyBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jf c2l6ZSgxNikpKTsKKwordmVjCitmb28gKHZlYyB4LCBkb3VibGUgKmEpCit7 CisgIHhbMF0gPSAqYTsKKyAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9n Y2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTIuYyBiL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtMi5jCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4yMGM2ZjhlYjUy OQotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L3ByNTQ4NTUtMi5jCkBAIC0wLDAgKzEsMTUgQEAKKy8qIHsgZGct ZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZTIg LW1mcG1hdGg9c3NlIiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItdGltZXMgIm11bHNkIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92YXBkIiB9IH0gKi8KKy8qIHsgZGct ZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdnNkIiB9IH0gKi8KKwor dHlwZWRlZiBkb3VibGUgX192MmRmIF9fYXR0cmlidXRlX18gKChfX3ZlY3Rv cl9zaXplX18gKDE2KSkpOworCitfX3YyZGYKK19tbV9tdWxfc2QgKF9fdjJk ZiB4LCBfX3YyZGYgeSkKK3sKKyAgX192MmRmIHogPSB4OworICB6WzBdID0g eFswXSAqIHlbMF07CisgIHJldHVybiB6OworfQpkaWZmIC0tZ2l0IGEvZ2Nj L3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS0zLmMgYi9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTMuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uM2MxNWRmYzkzZDEK LS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9wcjU0ODU1LTMuYwpAQCAtMCwwICsxLDE0IEBACisvKiB7IGRnLWRv IGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1zc2UyIC1t ZnBtYXRoPXNzZSIgfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLXRpbWVzICJzdWJzZCIgMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci1ub3QgIm1vdmFwZCIgfSB9ICovCisvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJtb3ZzZCIgfSB9ICovCisKK3R5 cGVkZWYgZG91YmxlIHZlYyBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgx NikpKTsKKwordmVjCitmb28gKHZlYyB4KQoreworICB4WzBdIC09IDEuOwor ICByZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L3ByNTQ4NTUtNC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI1NDg1NS00LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLjMyZWIyOGU4NTJhCi0tLSAvZGV2L251bGwK KysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS00 LmMKQEAgLTAsMCArMSwxNCBAQAorLyogeyBkZy1kbyBjb21waWxlIH0gKi8K Ky8qIHsgZGctb3B0aW9ucyAiLU8yIC1tc3NlMiAtbWZwbWF0aD1zc2UiIH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAic3Vi c2QiIDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt bm90ICJtb3ZhcGQiIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAibW92c2QiIH0gfSAqLworCit0eXBlZGVmIGRvdWJsZSB2 ZWMgX19hdHRyaWJ1dGVfXygodmVjdG9yX3NpemUoMTYpKSk7CisKK3ZlYwor Zm9vICh2ZWMgeCwgZG91YmxlIGEpCit7CisgIHhbMF0gLT0gYTsKKyAgcmV0 dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9wcjU0ODU1LTUuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L3ByNTQ4NTUtNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAwLi5lMDY5OTkwNzRlMAotLS0gL2Rldi9udWxsCisrKyBi L2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtNS5jCkBA IC0wLDAgKzEsMTYgQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7 IGRnLW9wdGlvbnMgIi1PMiAtbXNzZTIgLW1mcG1hdGg9c3NlIiB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInN1YnNkIiAx IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVz ICJtdWxwZCIgMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci1ub3QgIm1vdmFwZCIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItbm90ICJtb3ZzZCIgfSB9ICovCisKK3R5cGVkZWYgZG91 YmxlIF9fdjJkZiBfX2F0dHJpYnV0ZV9fICgoX192ZWN0b3Jfc2l6ZV9fICgx NikpKTsKKworX192MmRmCitmb28gKF9fdjJkZiB4LCBfX3YyZGYgeSkKK3sK KyAgeFswXSAtPSB5WzBdOworICB4ICo9IHk7CisgIHJldHVybiB4OworfQpk aWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1 NDg1NS02LmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0 ODU1LTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MC4uOGY0NGQxN2I2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTYuYwpAQCAtMCwwICsxLDE0 IEBACisvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25z ICItTzIgLW1zc2UgLW1mcG1hdGg9c3NlIiB9ICovCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgImRpdnNzIiAxIH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92YXBzIiB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdnNz IiB9IH0gKi8KKwordHlwZWRlZiBmbG9hdCB2ZWMgX19hdHRyaWJ1dGVfXygo dmVjdG9yX3NpemUoMTYpKSk7CisKK3ZlYworZm9vICh2ZWMgeCwgZmxvYXQg ZikKK3sKKyAgeFswXSAvPSBmOworICByZXR1cm4geDsKK30KZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtNy5j IGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHI1NDg1NS03LmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAuLmE1NTFi ZDVjOTJmCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2Mu dGFyZ2V0L2kzODYvcHI1NDg1NS03LmMKQEAgLTAsMCArMSwxNCBAQAorLyog eyBkZy1kbyBjb21waWxlIH0gKi8KKy8qIHsgZGctb3B0aW9ucyAiLU8yIC1t c3NlIC1tZnBtYXRoPXNzZSIgfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzICJkaXZzcyIgMSB9IH0gKi8KKy8qIHsgZGctZmlu YWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdmFwcyIgfSB9ICovCisvKiB7 IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJtb3ZzcyIgfSB9ICov CisKK3R5cGVkZWYgZmxvYXQgdmVjIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9z aXplKDE2KSkpOworCit2ZWMKK2ZvbyAodmVjIHgpCit7CisgIHhbMF0gLz0g Mi4xZjsKKyAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTguYyBiL2djYy90ZXN0c3Vp dGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtOC5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43NjAyZGMyOTNhNwotLS0gL2Rl di9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By NTQ4NTUtOC5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIHsgZGctZG8gY29tcGls ZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNzZTIgLW1mcG1hdGg9 c3NlIiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGlt ZXMgIm1heHNkIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNz ZW1ibGVyLW5vdCAibW92YXBkIiB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci1ub3QgIm1vdnNkIiB9IH0gKi8KKwordHlwZWRlZiBk b3VibGUgdmVjIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDE2KSkpOwor Cit2ZWMKK2ZvbyAodmVjIHgsIGRvdWJsZSBhKQoreworICB4WzBdID0geFsw XSA+IGEgPyB4WzBdIDogYTsKKyAgcmV0dXJuIHg7Cit9CmRpZmYgLS1naXQg YS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjU0ODU1LTkuYyBi L2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByNTQ4NTUtOS5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40MGFkZDVm Njc2MwotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRh cmdldC9pMzg2L3ByNTQ4NTUtOS5jCkBAIC0wLDAgKzEsMTQgQEAKKy8qIHsg ZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbXNz ZTIgLW1mcG1hdGg9c3NlIiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItdGltZXMgIm1pbnNzIiAxIH0gfSAqLworLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyLW5vdCAibW92YXBzIiB9IH0gKi8KKy8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3QgIm1vdnNzIiB9IH0gKi8K KwordHlwZWRlZiBmbG9hdCB2ZWMgX19hdHRyaWJ1dGVfXygodmVjdG9yX3Np emUoMTYpKSk7CisKK3ZlYworZm9vICh2ZWMgeCwgZmxvYXQgYSkKK3sKKyAg eFswXSA9IHhbMF0gPCBhID8geFswXSA6IGE7CisgIHJldHVybiB4OworfQot LSAKMi4yMC4xCgo= --000000000000bace11058967de39--