From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x42d.google.com (mail-wr1-x42d.google.com [IPv6:2a00:1450:4864:20::42d]) by sourceware.org (Postfix) with ESMTPS id F3D603858D20 for ; Thu, 17 Feb 2022 15:39:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org F3D603858D20 Received: by mail-wr1-x42d.google.com with SMTP id d27so9754893wrb.5 for ; Thu, 17 Feb 2022 07:39:19 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=sp42vKKIWZuNEsDrrhoP8BW2bHM5r9PsCULg/ccQRG0=; b=Y7J0kwHoubM61BDKo8Z5L4heysUHuBEVA8/k7j4cPpMEn1rQL0MEdWogMtVz2e+tDR R6bv+QyP8bWgxDNv32y+xyFD/XGmZg/76fXeihOap3Fq42BESeam6GQWZk6ywJpDuOjT 2CuuWkLzYUMk+axPymlvOag+v99qBSRmWIIax1+CTNpPZx1U6+/3Fm9c2nlpp87xoTwu fZ+6ndVitOBy5dv5YcsWqQ5UtEo6XHWyMb9PYO2No65WUycfawP5JsSXXlxXo5GCwUV3 PurlzyORUyI5oq71v0pm2iTzjX5b0T2C9etx9lVSWV2+fQtWDBDYessqvG1C7wJoYOBK hFmQ== X-Gm-Message-State: AOAM530zPjuMLBNTjd5FocoEgsm2qlUaa48SpFqCNQ2KTWzDjcmQChFF yJhvJtm3xKXD+VZTTQ220Lgb5Hd7gYl1O/wcpEQ= X-Google-Smtp-Source: ABdhPJyphQiGksSVs142wRNxMhEse4RjaSK7Tqd9KEDQmeEcolGBULyUs7uTYxUeCUmmR9sm5Ocsl2XzGTIW3aR3YUs= X-Received: by 2002:a5d:5045:0:b0:1e3:20ed:4386 with SMTP id h5-20020a5d5045000000b001e320ed4386mr2754082wrt.262.1645112358835; Thu, 17 Feb 2022 07:39:18 -0800 (PST) MIME-Version: 1.0 References: <20220113145645.4077141-1-christophe.lyon@foss.st.com> <20220113145645.4077141-8-christophe.lyon@foss.st.com> In-Reply-To: From: Christophe Lyon Date: Thu, 17 Feb 2022 16:39:08 +0100 Message-ID: Subject: Re: [PATCH v3 07/15] arm: Implement MVE predicates as vectors of booleans To: Christophe Lyon , Christophe Lyon via Gcc-patches , Andre Simoes Dias Vieira , Richard Sandiford Content-Type: multipart/mixed; boundary="000000000000c4233005d83891ca" X-Spam-Status: No, score=-8.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, HTML_MESSAGE, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-Content-Filtered-By: Mailman/MimeDel 2.1.29 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 17 Feb 2022 15:39:24 -0000 --000000000000c4233005d83891ca Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Fri, Feb 4, 2022 at 10:43 AM Richard Sandiford wrote: > Christophe Lyon writes: > > On Tue, Feb 1, 2022 at 4:42 AM Richard Sandiford < > richard.sandiford@arm.com> > > wrote: > > > >> Christophe Lyon via Gcc-patches writes: > >> > On Mon, Jan 31, 2022 at 7:01 PM Richard Sandiford via Gcc-patches < > >> > gcc-patches@gcc.gnu.org> wrote: > >> > > >> >> Sorry for the slow response, was out last week. > >> >> > >> >> Christophe Lyon via Gcc-patches writes: > >> >> > diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c > >> >> > index feeee16d320..5f559f8fd93 100644 > >> >> > --- a/gcc/emit-rtl.c > >> >> > +++ b/gcc/emit-rtl.c > >> >> > @@ -6239,9 +6239,14 @@ init_emit_once (void) > >> >> > > >> >> > /* For BImode, 1 and -1 are unsigned and signed interpretation= s > >> >> > of the same value. */ > >> >> > - const_tiny_rtx[0][(int) BImode] =3D const0_rtx; > >> >> > - const_tiny_rtx[1][(int) BImode] =3D const_true_rtx; > >> >> > - const_tiny_rtx[3][(int) BImode] =3D const_true_rtx; > >> >> > + for (mode =3D MIN_MODE_BOOL; > >> >> > + mode <=3D MAX_MODE_BOOL; > >> >> > + mode =3D (machine_mode)((int)(mode) + 1)) > >> >> > + { > >> >> > + const_tiny_rtx[0][(int) mode] =3D const0_rtx; > >> >> > + const_tiny_rtx[1][(int) mode] =3D const_true_rtx; > >> >> > + const_tiny_rtx[3][(int) mode] =3D const_true_rtx; > >> >> > + } > >> >> > > >> >> > for (mode =3D MIN_MODE_PARTIAL_INT; > >> >> > mode <=3D MAX_MODE_PARTIAL_INT; > >> >> > >> >> Does this do the right thing for: > >> >> > >> >> gen_int_mode (-1, B2Imode) > >> >> > >> >> (which is used e.g. in native_decode_vector_rtx)? It looks like it > >> >> would give 0b01 rather than 0b11. > >> >> > >> >> Maybe for non-BImode we should use const1_rtx and constm1_rtx, like > with > >> >> MODE_INT. > >> >> > >> > > >> > debug_rtx ( gen_int_mode (-1, B2Imode) says: > >> > (const_int -1 [0xffffffffffffffff]) > >> > so that looks right? > >> > >> Ah, right, I forgot that the mode is unused for the small constant > lookup. > >> But it looks like CONSTM1_RTX (B2Imode) would be (const_int 1) instead= , > >> even though the two should be equal. > >> > > > > Indeed! > > > > So I changed the above loop into: > > /* For BImode, 1 and -1 are unsigned and signed interpretations > > of the same value. */ > > for (mode =3D MIN_MODE_BOOL; > > mode <=3D MAX_MODE_BOOL; > > mode =3D (machine_mode)((int)(mode) + 1)) > > { > > const_tiny_rtx[0][(int) mode] =3D const0_rtx; > > const_tiny_rtx[1][(int) mode] =3D const_true_rtx; > > - const_tiny_rtx[3][(int) mode] =3D const_true_rtx; > > + const_tiny_rtx[3][(int) mode] =3D constm1_rtx; > > } > > which works, both constants are now equal and the validation still > passes. > > I think we need to keep const_true_rtx for both [BImode][1] and > [BImode][3]. > BImode is an awkward special case in that the (only) nonzero value must b= e > exactly STORE_FLAG_VALUE, even if that leads to an otherwise non-canonica= l > const_int representation. > OK, done. > > For the multi-bit booleans, [1] needs to be const1_rtx rather than > const_true_rtx in case STORE_FLAG_VALUE !=3D 1. > > >> >> > @@ -1679,15 +1708,25 @@ emit_class_narrowest_mode (void) > >> >> > print_decl ("unsigned char", "class_narrowest_mode", > >> >> "MAX_MODE_CLASS"); > >> >> > > >> >> > for (c =3D 0; c < MAX_MODE_CLASS; c++) > >> >> > - /* Bleah, all this to get the comment right for > MIN_MODE_INT. */ > >> >> > - tagged_printf ("MIN_%s", mode_class_names[c], > >> >> > - modes[c] > >> >> > - ? ((c !=3D MODE_INT || modes[c]->precision !=3D = 1) > >> >> > - ? modes[c]->name > >> >> > - : (modes[c]->next > >> >> > - ? modes[c]->next->name > >> >> > - : void_mode->name)) > >> >> > - : void_mode->name); > >> >> > + { > >> >> > + /* Bleah, all this to get the comment right for > MIN_MODE_INT. > >> */ > >> >> > + const char *comment_name =3D void_mode->name; > >> >> > + > >> >> > + if (modes[c]) > >> >> > + if (c !=3D MODE_INT || !modes[c]->boolean) > >> >> > + comment_name =3D modes[c]->name; > >> >> > + else > >> >> > + { > >> >> > + struct mode_data *m =3D modes[c]; > >> >> > + while (m->boolean) > >> >> > + m =3D m->next; > >> >> > + if (m) > >> >> > + comment_name =3D m->name; > >> >> > + else > >> >> > + comment_name =3D void_mode->name; > >> >> > + } > >> >> > >> >> Have you tried bootstrapping the patch on a host of your choice? > >> >> I would expect a warning/Werror about an ambiguous else here. > >> >> > >> > No I hadn't and indeed the build fails > >> > > >> >> > >> >> I guess this reduces to: > >> >> > >> >> struct mode_data *m =3D modes[c]; > >> >> while (m && m->boolean) > >> >> m =3D m->next; > >> >> const char *comment_name =3D (m ? m : void_mode)->name; > >> >> > >> >> but I don't know if that's more readable. > >> >> > >> > but to my understanding the problem is that the ambiguous else > >> > is the first one, and the code should read: > >> > if (modes[c]) > >> > + { > >> > if (c !=3D MODE_INT || !modes[c]->boolean) > >> > comment_name =3D modes[c]->name; > >> > else > >> > { > >> > struct mode_data *m =3D modes[c]; > >> > while (m->boolean) > >> > m =3D m->next; > >> > if (m) > >> > comment_name =3D m->name; > >> > else > >> > comment_name =3D void_mode->name; > >> > } > >> > + } > >> > >> Yeah. I just meant that the alternative loop was probably simpler, > >> as a replacement for the outer =E2=80=9Cif=E2=80=9D. > >> > >> It looks like that the outer =E2=80=9Cif=E2=80=9D is effectively a pee= led iteration of > >> the while loop in the outer =E2=80=9Celse=E2=80=9D. And the =E2=80=9C= c !=3D MODE_INT=E2=80=9D part ought > >> to be redundant: as it stands, the boolean modes don't belong to any > class. > >> > >> Ack, I have now: > > for (c =3D 0; c < MAX_MODE_CLASS; c++) > > { > > /* Bleah, all this to get the comment right for MIN_MODE_INT. */ > > struct mode_data *m =3D modes[c]; > > while (m && m->boolean) > > m =3D m->next; > > const char *comment_name =3D (m ? m : void_mode)->name; > > > > tagged_printf ("MIN_%s", mode_class_names[c], comment_name); > > } > > > > > > Andre, any chance you tried the suggestion of: > > ENTRY (Pred1x16_t, V16BI, predicate, 16, pred1, 21) > > ENTRY (Pred2x8_t, V8BI, predicate, 8, pred1, 21) > > ENTRY (Pred4x4_t, V4BI, predicate, 4, pred1, 21) > > BTW: the final argument should be the length of the __simd__t > type name (for mangling purposes). It looks like the existing 32-bit > and 64-bit bfloat entries also get this wrong. > > But as far as Andre's point goes: I think we need to construct > a boolean type explicitly, using build_truth_vector_type_for_mode > or truth_type_for. Although the entries above specify the correct mode > (V16BI, etc.), the mode is really a function of the type tree properties, > rather than the other way round. > > The main thing that makes truth vector types special is that those > types are the only ones that allow multiple elements in the same byte. > A =E2=80=9Cnormal=E2=80=9D 16-byte vector created by build_vector_type(_f= or_mode) > cannot be smaller than 16 bytes. > > Thanks for the help, here is a new version of this patch, which contains all the changes requested. If OK, I'll rebase and commit the series. Thanks Christophe > Thanks, > Richard > --000000000000c4233005d83891ca Content-Type: text/x-patch; charset="US-ASCII"; name="v4-0007-arm-Implement-MVE-predicates-as-vectors-of-boolea.patch" Content-Disposition: attachment; filename="v4-0007-arm-Implement-MVE-predicates-as-vectors-of-boolea.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kzr5ewqy0 RnJvbSAxZWFlYzJhMDFkMWJjYmIzOTdjMjBkNzAzNGY4NWI3Yjg1YzY4MzFkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBDaHJpc3RvcGhlIEx5b24gPGNocmlzdG9waGUubHlvbkBmb3Nz LnN0LmNvbT4KRGF0ZTogV2VkLCAxMyBPY3QgMjAyMSAwOToxNjoyMiArMDAwMApTdWJqZWN0OiBb UEFUQ0ggdjQgMDcvMTVdIGFybTogSW1wbGVtZW50IE1WRSBwcmVkaWNhdGVzIGFzIHZlY3RvcnMg b2YgYm9vbGVhbnMKClRoaXMgcGF0Y2ggaW1wbGVtZW50cyBzdXBwb3J0IGZvciB2ZWN0b3JzIG9m IGJvb2xlYW5zIHRvIHN1cHBvcnQgTVZFCnByZWRpY2F0ZXMsIGluc3RlYWQgb2YgSEltb2RlLiAg U2luY2UgdGhlIEFCSSBtYW5kYXRlcyBwcmVkMTZfdCAoYWthCnVpbnQxNl90KSB0byByZXByZXNl bnQgcHJlZGljYXRlcyBpbiBpbnRyaW5zaWNzIHByb3RvdHlwZXMsIHdlCmludHJvZHVjZSBhIG5l dyAicHJlZGljYXRlIiB0eXBlIHF1YWxpZmllciBzbyB0aGF0IHdlIGNhbiBtYXAgcmVsZXZhbnQK YnVpbHRpbnMgSEltb2RlIGFyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlIHRvIHRoZSBhcHByb3By aWF0ZSB2ZWN0b3IKb2YgYm9vbGVhbnMgKFZ4QkkpLgoKV2UgaGF2ZSB0byB1cGRhdGUgdGVzdF92 ZWN0b3Jfb3BzX2R1cGxpY2F0ZSwgYmVjYXVzZSBpdCBpdGVyYXRlcyB1c2luZwphbiBvZmZzZXQg aW4gYnl0ZXMsIHdoZXJlIHdlIHdvdWxkIG5lZWQgdG8gaXRlcmF0ZSBpbiBiaXRzOiB3ZSBzdG9w Cml0ZXJhdGluZyB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHZlY3RvciBvZiBib29sZWFu cy4KCkluIGFkZGl0aW9uLCB3ZSBoYXZlIHRvIGZpeCB0aGUgdW5kZXJseWluZyBkZWZpbml0aW9u IG9mIHZlY3RvcnMgb2YKYm9vbGVhbnMgYmVjYXVzZSBBUk0vTVZFIG5lZWRzIGEgZGlmZmVyZW50 IHJlcHJlc2VudGF0aW9uIHRoYW4KQUFyY2g2NC9TVkUuIFdpdGggQVJNL01WRSB0aGUgJ3RydWUn IGJpdCBpcyBkdXBsaWNhdGVkIG92ZXIgdGhlCmVsZW1lbnQgc2l6ZSwgc28gdGhhdCBhIHRydWUg ZWxlbWVudCBvZiBWNEJJIGlzIHJlcHJlc2VudGVkIGJ5CicwYjExMTEnLiAgVGhpcyBwYXRjaCB1 cGRhdGVzIHRoZSBhYXJjaDY0IGRlZmluaXRpb24gb2YgVk54KkJJIGFzCm5lZWRlZC4KCjIwMjIt MDEtMTMgIENocmlzdG9waGUgTHlvbiAgPGNocmlzdG9waGUubHlvbkBmb3NzLnN0LmNvbT4KCVJp Y2hhcmQgU2FuZGlmb3JkICA8cmljaGFyZC5zYW5kaWZvcmRAYXJtLmNvbT4KCglnY2MvCglQUiB0 YXJnZXQvMTAwNzU3CglQUiB0YXJnZXQvMTAxMzI1CgkqIGNvbmZpZy9hYXJjaDY0L2FhcmNoNjQt bW9kZXMuZGVmIChWTngxNkJJLCBWTng4QkksIFZOeDRCSSwKCVZOeDJCSSk6IFVwZGF0ZSBkZWZp bml0aW9uLgoJKiBjb25maWcvYXJtL2FybS1idWlsdGlucy5jIChhcm1faW5pdF9zaW1kX2J1aWx0 aW5fdHlwZXMpOiBBZGQgbmV3CglzaW1kIHR5cGVzLgoJKGFybV9pbml0X2J1aWx0aW4pOiBNYXAg cHJlZGljYXRlIHZlY3RvcnMgYXJndW1lbnRzIHRvIEhJbW9kZS4KCShhcm1fZXhwYW5kX2J1aWx0 aW5fYXJncyk6IE1vdmUgSEltb2RlIHByZWRpY2F0ZSBhcmd1bWVudHMgdG8gVnhCSQoJcnR4LiBN b3ZlIHJldHVybiB2YWx1ZSB0byBISW1vZGUgcnR4LgoJKiBjb25maWcvYXJtL2FybS1idWlsdGlu cy5oIChhcm1fdHlwZV9xdWFsaWZpZXJzKTogQWRkIHF1YWxpZmllcl9wcmVkaWNhdGUuCgkqIGNv bmZpZy9hcm0vYXJtLW1vZGVzLmRlZiAoQjJJLCBCNEksIFYxNkJJLCBWOEJJLCBWNEJJKTogTmV3 IG1vZGVzLgoJKiBjb25maWcvYXJtL2FybS1zaW1kLWJ1aWx0aW4tdHlwZXMuZGVmIChQcmVkMXgx Nl90LAoJUHJlZDJ4OF90LFByZWQ0eDRfdCk6IE5ldy4KCSogZW1pdC1ydGwuYyAoaW5pdF9lbWl0 X29uY2UpOiBIYW5kbGUgYWxsIGJvb2xlYW4gbW9kZXMuCgkqIGdlbm1vZGVzLmMgKG1vZGVfZGF0 YSk6IEFkZCBib29sZWFuIGZpZWxkLgoJKGJsYW5rX21vZGUpOiBJbml0aWFsaXplIGl0LgoJKG1h a2VfY29tcGxleF9tb2Rlcyk6IEZpeCBoYW5kbGluZyBvZiBib29sZWFuIG1vZGVzLgoJKG1ha2Vf dmVjdG9yX21vZGVzKTogTGlrZXdpc2UuCgkoVkVDVE9SX0JPT0xfTU9ERSk6IFVzZSBuZXcgQ09N UE9ORU5UIHBhcmFtZXRlci4KCShtYWtlX3ZlY3Rvcl9ib29sX21vZGUpOiBMaWtld2lzZS4KCShC T09MX01PREUpOiBOZXcuCgkobWFrZV9ib29sX21vZGUpOiBOZXcuCgkoZW1pdF9pbnNuX21vZGVz X2gpOiBGaXggZ2VuZXJhdGlvbiBvZiBib29sZWFuIG1vZGVzLgoJKGVtaXRfY2xhc3NfbmFycm93 ZXN0X21vZGUpOiBMaWtld2lzZS4KCSogbWFjaG1vZGUuZGVmOiAoVkVDVE9SX0JPT0xfTU9ERSk6 IERvY3VtZW50IG5ldyBDT01QT05FTlQKCXBhcmFtZXRlci4gIFVzZSBuZXcgQk9PTF9NT0RFIGlu c3RlYWQgb2YgRlJBQ1RJT05BTF9JTlRfTU9ERSB0bwoJZGVmaW5lIEJJbW9kZS4KCSogcnR4LXZl Y3Rvci1idWlsZGVyLmMgKHJ0eF92ZWN0b3JfYnVpbGRlcjo6ZmluZF9jYWNoZWRfdmFsdWUpOgoJ Rml4IGhhbmRsaW5nIG9mIGNvbnN0bTFfcnR4IGZvciBWRUNUT1JfQk9PTC4KCSogc2ltcGxpZnkt cnR4LmMgKG5hdGl2ZV9lbmNvZGVfcnR4KTogRml4IHN1cHBvcnQgZm9yIFZFQ1RPUl9CT09MLgoJ KG5hdGl2ZV9kZWNvZGVfdmVjdG9yX3J0eCk6IExpa2V3aXNlLgoJKHRlc3RfdmVjdG9yX29wc19k dXBsaWNhdGUpOiBTa2lwIHZlY19tZXJnZSB0ZXN0Cgl3aXRoIHZlY3RvcnMgb2YgYm9vbGVhbnMu CgkqIHZhcmFzbS5jIChvdXRwdXRfY29uc3RhbnRfcG9vbF8yKTogTGlrZXdpc2UuCgpkaWZmIC0t Z2l0IGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtbW9kZXMuZGVmIGIvZ2NjL2NvbmZpZy9h YXJjaDY0L2FhcmNoNjQtbW9kZXMuZGVmCmluZGV4IDk3NmJmOWI0MmJlLi44ZjM5OTIyNWE4MCAx MDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtbW9kZXMuZGVmCisrKyBiL2dj Yy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LW1vZGVzLmRlZgpAQCAtNDcsMTAgKzQ3LDEwIEBAIEFE SlVTVF9GTE9BVF9GT1JNQVQgKEhGLCAmaWVlZV9oYWxmX2Zvcm1hdCk7CiAKIC8qIFZlY3RvciBt b2Rlcy4gICovCiAKLVZFQ1RPUl9CT09MX01PREUgKFZOeDE2QkksIDE2LCAyKTsKLVZFQ1RPUl9C T09MX01PREUgKFZOeDhCSSwgOCwgMik7Ci1WRUNUT1JfQk9PTF9NT0RFIChWTng0QkksIDQsIDIp OwotVkVDVE9SX0JPT0xfTU9ERSAoVk54MkJJLCAyLCAyKTsKK1ZFQ1RPUl9CT09MX01PREUgKFZO eDE2QkksIDE2LCBCSSwgMik7CitWRUNUT1JfQk9PTF9NT0RFIChWTng4QkksIDgsIEJJLCAyKTsK K1ZFQ1RPUl9CT09MX01PREUgKFZOeDRCSSwgNCwgQkksIDIpOworVkVDVE9SX0JPT0xfTU9ERSAo Vk54MkJJLCAyLCBCSSwgMik7CiAKIEFESlVTVF9OVU5JVFMgKFZOeDE2QkksIGFhcmNoNjRfc3Zl X3ZnICogOCk7CiBBREpVU1RfTlVOSVRTIChWTng4QkksIGFhcmNoNjRfc3ZlX3ZnICogNCk7CmRp ZmYgLS1naXQgYS9nY2MvY29uZmlnL2FybS9hcm0tYnVpbHRpbnMuYyBiL2djYy9jb25maWcvYXJt L2FybS1idWlsdGlucy5jCmluZGV4IDljNjQ1NzIyMjMwLi5kZDUzN2VjMTY3OSAxMDA2NDQKLS0t IGEvZ2NjL2NvbmZpZy9hcm0vYXJtLWJ1aWx0aW5zLmMKKysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJt LWJ1aWx0aW5zLmMKQEAgLTE1NTMsMTEgKzE1NTMsMjUgQEAgYXJtX2luaXRfc2ltZF9idWlsdGlu X3R5cGVzICh2b2lkKQogICAgICAgdHJlZSBlbHR5cGUgPSBhcm1fc2ltZF90eXBlc1tpXS5lbHR5 cGU7CiAgICAgICBtYWNoaW5lX21vZGUgbW9kZSA9IGFybV9zaW1kX3R5cGVzW2ldLm1vZGU7CiAK LSAgICAgIGlmIChlbHR5cGUgPT0gTlVMTCkKKyAgICAgIGlmIChlbHR5cGUgPT0gTlVMTAorCSAg LyogVkVDVE9SX0JPT0wgaXMgbm90IHN1cHBvcnRlZCB1bmxlc3MgTVZFIGlzIGFjdGl2YXRlZCwg dGhpcyB3b3VsZAorCSAgICAgbWFrZSBidWlsZF90cnV0aF92ZWN0b3JfdHlwZV9mb3JfbW9kZSBj cmFzaC4gICovCisJICAmJiAoKEdFVF9NT0RFX0NMQVNTIChtb2RlKSAhPSBNT0RFX1ZFQ1RPUl9C T09MKQorCSAgICAgIHx8IVRBUkdFVF9IQVZFX01WRSkpCiAJY29udGludWU7CiAgICAgICBpZiAo YXJtX3NpbWRfdHlwZXNbaV0uaXR5cGUgPT0gTlVMTCkKIAl7Ci0JICB0cmVlIHR5cGUgPSBidWls ZF92ZWN0b3JfdHlwZSAoZWx0eXBlLCBHRVRfTU9ERV9OVU5JVFMgKG1vZGUpKTsKKwkgIHRyZWUg dHlwZTsKKwkgIGlmIChHRVRfTU9ERV9DTEFTUyAobW9kZSkgPT0gTU9ERV9WRUNUT1JfQk9PTCkK KwkgICAgeworCSAgICAgIC8qIEhhbmRsZSBNVkUgcHJlZGljYXRlczogdGhleSBhcmUgaW50ZXJu YWxseSBzdG9yZWQgYXMgMTYgYml0cywKKwkJIGJ1dCBhcmUgdXNlZCBhcyB2ZWN0b3JzIG9mIDEs IDIgb3IgNC1iaXQgZWxlbWVudHMuICAqLworCSAgICAgIHR5cGUgPSBidWlsZF90cnV0aF92ZWN0 b3JfdHlwZV9mb3JfbW9kZSAoR0VUX01PREVfTlVOSVRTIChtb2RlKSwgbW9kZSk7CisJICAgICAg ZWx0eXBlID0gVFJFRV9UWVBFICh0eXBlKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB0eXBlID0g YnVpbGRfdmVjdG9yX3R5cGUgKGVsdHlwZSwgR0VUX01PREVfTlVOSVRTIChtb2RlKSk7CisKIAkg IHR5cGUgPSBidWlsZF9kaXN0aW5jdF90eXBlX2NvcHkgKHR5cGUpOwogCSAgU0VUX1RZUEVfU1RS VUNUVVJBTF9FUVVBTElUWSAodHlwZSk7CiAKQEAgLTE2OTUsNiArMTcwOSwxMSBAQCBhcm1faW5p dF9idWlsdGluICh1bnNpZ25lZCBpbnQgZmNvZGUsIGFybV9idWlsdGluX2RhdHVtICpkLAogICAg ICAgaWYgKHF1YWxpZmllcnMgJiBxdWFsaWZpZXJfbWFwX21vZGUpCiAJb3BfbW9kZSA9IGQtPm1v ZGU7CiAKKyAgICAgIC8qIE1WRSBQcmVkaWNhdGVzIHVzZSBISW1vZGUgYXMgbWFuZGF0ZWQgYnkg dGhlIEFCSTogcHJlZDE2X3QgaXMgdW5zaWduZWQKKwkgc2hvcnQuICAqLworICAgICAgaWYgKHF1 YWxpZmllcnMgJiBxdWFsaWZpZXJfcHJlZGljYXRlKQorCW9wX21vZGUgPSBISW1vZGU7CisKICAg ICAgIC8qIEZvciBwb2ludGVycywgd2Ugd2FudCBhIHBvaW50ZXIgdG8gdGhlIGJhc2ljIHR5cGUK IAkgb2YgdGhlIHZlY3Rvci4gICovCiAgICAgICBpZiAocXVhbGlmaWVycyAmIHF1YWxpZmllcl9w b2ludGVyICYmIFZFQ1RPUl9NT0RFX1AgKG9wX21vZGUpKQpAQCAtMjkzOSw2ICsyOTU4LDExIEBA IGFybV9leHBhbmRfYnVpbHRpbl9hcmdzIChydHggdGFyZ2V0LCBtYWNoaW5lX21vZGUgbWFwX21v ZGUsIGludCBmY29kZSwKIAkgICAgY2FzZSBBUkdfQlVJTFRJTl9DT1BZX1RPX1JFRzoKIAkgICAg ICBpZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAoYXJnW2FyZ2NdKSkpCiAJCW9wW2FyZ2Nd ID0gY29udmVydF9tZW1vcnlfYWRkcmVzcyAoUG1vZGUsIG9wW2FyZ2NdKTsKKworCSAgICAgIC8q IE1WRSB1c2VzIG12ZV9wcmVkMTZfdCAoYWthIEhJbW9kZSkgZm9yIHZlY3RvcnMgb2YgcHJlZGlj YXRlcy4gICovCisJICAgICAgaWYgKEdFVF9NT0RFX0NMQVNTIChtb2RlW2FyZ2NdKSA9PSBNT0RF X1ZFQ1RPUl9CT09MKQorCQlvcFthcmdjXSA9IGdlbl9sb3dwYXJ0IChtb2RlW2FyZ2NdLCBvcFth cmdjXSk7CisKIAkgICAgICAvKmdjY19hc3NlcnQgKEdFVF9NT0RFIChvcFthcmdjXSkgPT0gbW9k ZVthcmdjXSk7ICovCiAJICAgICAgaWYgKCEoKmluc25fZGF0YVtpY29kZV0ub3BlcmFuZFtvcG5v XS5wcmVkaWNhdGUpCiAJCSAgKG9wW2FyZ2NdLCBtb2RlW2FyZ2NdKSkKQEAgLTMxNDQsNiArMzE2 OCwxMyBAQCBjb25zdGFudF9hcmc6CiAgIGVsc2UKICAgICBlbWl0X2luc24gKGluc24pOwogCisg IGlmIChHRVRfTU9ERV9DTEFTUyAodG1vZGUpID09IE1PREVfVkVDVE9SX0JPT0wpCisgICAgewor ICAgICAgcnR4IEhJdGFyZ2V0ID0gZ2VuX3JlZ19ydHggKEhJbW9kZSk7CisgICAgICBlbWl0X21v dmVfaW5zbiAoSEl0YXJnZXQsIGdlbl9sb3dwYXJ0IChISW1vZGUsIHRhcmdldCkpOworICAgICAg cmV0dXJuIEhJdGFyZ2V0OworICAgIH0KKwogICByZXR1cm4gdGFyZ2V0OwogfQogCmRpZmYgLS1n aXQgYS9nY2MvY29uZmlnL2FybS9hcm0tYnVpbHRpbnMuaCBiL2djYy9jb25maWcvYXJtL2FybS1i dWlsdGlucy5oCmluZGV4IGU1MTMwZDZkMjg2Li5hOGVmOGFlZjgyZCAxMDA2NDQKLS0tIGEvZ2Nj L2NvbmZpZy9hcm0vYXJtLWJ1aWx0aW5zLmgKKysrIGIvZ2NjL2NvbmZpZy9hcm0vYXJtLWJ1aWx0 aW5zLmgKQEAgLTg0LDcgKzg0LDkgQEAgZW51bSBhcm1fdHlwZV9xdWFsaWZpZXJzCiAgIHF1YWxp Zmllcl9sYW5lX3BhaXJfaW5kZXggPSAweDEwMDAsCiAgIC8qIExhbmUgaW5kaWNlcyBzZWxlY3Rl ZCBpbiBxdWFkdHVwbGV0cyAtIG11c3QgYmUgd2l0aGluIHJhbmdlIG9mIHByZXZpb3VzCiAgICAg IGFyZ3VtZW50ID0gYSB2ZWN0b3IuICAqLwotICBxdWFsaWZpZXJfbGFuZV9xdWFkdHVwX2luZGV4 ID0gMHgyMDAwCisgIHF1YWxpZmllcl9sYW5lX3F1YWR0dXBfaW5kZXggPSAweDIwMDAsCisgIC8q IE1WRSB2ZWN0b3IgcHJlZGljYXRlcy4gICovCisgIHF1YWxpZmllcl9wcmVkaWNhdGUgPSAweDQw MDAKIH07CiAKIHN0cnVjdCBhcm1fc2ltZF90eXBlX2luZm8KZGlmZiAtLWdpdCBhL2djYy9jb25m aWcvYXJtL2FybS1tb2Rlcy5kZWYgYi9nY2MvY29uZmlnL2FybS9hcm0tbW9kZXMuZGVmCmluZGV4 IGRlNjg5YzhiNDVlLi45ZWQwY2QwNDJjNSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9hcm0vYXJt LW1vZGVzLmRlZgorKysgYi9nY2MvY29uZmlnL2FybS9hcm0tbW9kZXMuZGVmCkBAIC04NCw2ICs4 NCwxNCBAQCBWRUNUT1JfTU9ERSAoRkxPQVQsIEJGLCAyKTsgICAvKiAgICAgICAgICAgICAgICAg VjJCRi4gICovCiBWRUNUT1JfTU9ERSAoRkxPQVQsIEJGLCA0KTsgICAvKgkJIFY0QkYuICAqLwog VkVDVE9SX01PREUgKEZMT0FULCBCRiwgOCk7ICAgLyoJCSBWOEJGLiAgKi8KIAorLyogUHJlZGlj YXRlcyBmb3IgTVZFLiAgKi8KK0JPT0xfTU9ERSAoQjJJLCAyLCAxKTsKK0JPT0xfTU9ERSAoQjRJ LCA0LCAxKTsKKworVkVDVE9SX0JPT0xfTU9ERSAoVjE2QkksIDE2LCBCSSwgMik7CitWRUNUT1Jf Qk9PTF9NT0RFIChWOEJJLCA4LCBCMkksIDIpOworVkVDVE9SX0JPT0xfTU9ERSAoVjRCSSwgNCwg QjRJLCAyKTsKKwogLyogRnJhY3Rpb24gYW5kIGFjY3VtdWxhdG9yIHZlY3RvciBtb2Rlcy4gICov CiBWRUNUT1JfTU9ERVMgKEZSQUNULCA0KTsgICAgICAvKiBWNFFRICBWMkhRICovCiBWRUNUT1Jf TU9ERVMgKFVGUkFDVCwgNCk7ICAgICAvKiBWNFVRUSBWMlVIUSAqLwpkaWZmIC0tZ2l0IGEvZ2Nj L2NvbmZpZy9hcm0vYXJtLXNpbWQtYnVpbHRpbi10eXBlcy5kZWYgYi9nY2MvY29uZmlnL2FybS9h cm0tc2ltZC1idWlsdGluLXR5cGVzLmRlZgppbmRleCA2YmE2ZjIxMTUzMS4uZDFkNjQxNmRhZDEg MTAwNjQ0Ci0tLSBhL2djYy9jb25maWcvYXJtL2FybS1zaW1kLWJ1aWx0aW4tdHlwZXMuZGVmCisr KyBiL2djYy9jb25maWcvYXJtL2FybS1zaW1kLWJ1aWx0aW4tdHlwZXMuZGVmCkBAIC01MSwzICs1 MSw3IEBACiAgIEVOVFJZIChCZmxvYXQxNngyX3QsIFYyQkYsIG5vbmUsIDMyLCBiZmxvYXQxNiwg MjApCiAgIEVOVFJZIChCZmxvYXQxNng0X3QsIFY0QkYsIG5vbmUsIDY0LCBiZmxvYXQxNiwgMjAp CiAgIEVOVFJZIChCZmxvYXQxNng4X3QsIFY4QkYsIG5vbmUsIDEyOCwgYmZsb2F0MTYsIDIwKQor CisgIEVOVFJZIChQcmVkMXgxNl90LCBWMTZCSSwgcHJlZGljYXRlLCAxNiwgcHJlZDEsIDE2KQor ICBFTlRSWSAoUHJlZDJ4OF90LCBWOEJJLCBwcmVkaWNhdGUsIDgsIHByZWQxLCAxNSkKKyAgRU5U UlkgKFByZWQ0eDRfdCwgVjRCSSwgcHJlZGljYXRlLCA0LCBwcmVkMSwgMTUpCmRpZmYgLS1naXQg YS9nY2MvZW1pdC1ydGwuYyBiL2djYy9lbWl0LXJ0bC5jCmluZGV4IGZlZWVlMTZkMzIwLi41YmY3 ZDM3Y2ZhNiAxMDA2NDQKLS0tIGEvZ2NjL2VtaXQtcnRsLmMKKysrIGIvZ2NjL2VtaXQtcnRsLmMK QEAgLTYyMzksOSArNjIzOSwyMiBAQCBpbml0X2VtaXRfb25jZSAodm9pZCkKIAogICAvKiBGb3Ig Qkltb2RlLCAxIGFuZCAtMSBhcmUgdW5zaWduZWQgYW5kIHNpZ25lZCBpbnRlcnByZXRhdGlvbnMK ICAgICAgb2YgdGhlIHNhbWUgdmFsdWUuICAqLwotICBjb25zdF90aW55X3J0eFswXVsoaW50KSBC SW1vZGVdID0gY29uc3QwX3J0eDsKLSAgY29uc3RfdGlueV9ydHhbMV1bKGludCkgQkltb2RlXSA9 IGNvbnN0X3RydWVfcnR4OwotICBjb25zdF90aW55X3J0eFszXVsoaW50KSBCSW1vZGVdID0gY29u c3RfdHJ1ZV9ydHg7CisgIGZvciAobW9kZSA9IE1JTl9NT0RFX0JPT0w7CisgICAgICAgbW9kZSA8 PSBNQVhfTU9ERV9CT09MOworICAgICAgIG1vZGUgPSAobWFjaGluZV9tb2RlKSgoaW50KShtb2Rl KSArIDEpKQorICAgIHsKKyAgICAgIGNvbnN0X3RpbnlfcnR4WzBdWyhpbnQpIG1vZGVdID0gY29u c3QwX3J0eDsKKyAgICAgIGlmIChtb2RlID09IEJJbW9kZSkKKwl7CisJICBjb25zdF90aW55X3J0 eFsxXVsoaW50KSBtb2RlXSA9IGNvbnN0X3RydWVfcnR4OworCSAgY29uc3RfdGlueV9ydHhbM11b KGludCkgbW9kZV0gPSBjb25zdF90cnVlX3J0eDsKKwl9CisgICAgICBlbHNlCisJeworCSAgY29u c3RfdGlueV9ydHhbMV1bKGludCkgbW9kZV0gPSBjb25zdDFfcnR4OworCSAgY29uc3RfdGlueV9y dHhbM11bKGludCkgbW9kZV0gPSBjb25zdG0xX3J0eDsKKwl9CisgICAgfQogCiAgIGZvciAobW9k ZSA9IE1JTl9NT0RFX1BBUlRJQUxfSU5UOwogICAgICAgIG1vZGUgPD0gTUFYX01PREVfUEFSVElB TF9JTlQ7CkBAIC02MjYwLDEzICs2MjczLDE2IEBAIGluaXRfZW1pdF9vbmNlICh2b2lkKQogICAg ICAgY29uc3RfdGlueV9ydHhbMF1bKGludCkgbW9kZV0gPSBnZW5fcnR4X0NPTkNBVCAobW9kZSwg aW5uZXIsIGlubmVyKTsKICAgICB9CiAKLSAgLyogQXMgZm9yIEJJbW9kZSwgImFsbCAxIiBhbmQg ImFsbCAtMSIgYXJlIHVuc2lnbmVkIGFuZCBzaWduZWQKLSAgICAgaW50ZXJwcmV0YXRpb25zIG9m IHRoZSBzYW1lIHZhbHVlLiAgKi8KICAgRk9SX0VBQ0hfTU9ERV9JTl9DTEFTUyAobW9kZSwgTU9E RV9WRUNUT1JfQk9PTCkKICAgICB7CiAgICAgICBjb25zdF90aW55X3J0eFswXVsoaW50KSBtb2Rl XSA9IGdlbl9jb25zdF92ZWN0b3IgKG1vZGUsIDApOwogICAgICAgY29uc3RfdGlueV9ydHhbM11b KGludCkgbW9kZV0gPSBnZW5fY29uc3RfdmVjdG9yIChtb2RlLCAzKTsKLSAgICAgIGNvbnN0X3Rp bnlfcnR4WzFdWyhpbnQpIG1vZGVdID0gY29uc3RfdGlueV9ydHhbM11bKGludCkgbW9kZV07Cisg ICAgICBpZiAoR0VUX01PREVfSU5ORVIgKG1vZGUpID09IEJJbW9kZSkKKwkvKiBBcyBmb3IgQklt b2RlLCAiYWxsIDEiIGFuZCAiYWxsIC0xIiBhcmUgdW5zaWduZWQgYW5kIHNpZ25lZAorCSAgIGlu dGVycHJldGF0aW9ucyBvZiB0aGUgc2FtZSB2YWx1ZS4gICovCisJY29uc3RfdGlueV9ydHhbMV1b KGludCkgbW9kZV0gPSBjb25zdF90aW55X3J0eFszXVsoaW50KSBtb2RlXTsKKyAgICAgIGVsc2UK Kwljb25zdF90aW55X3J0eFsxXVsoaW50KSBtb2RlXSA9IGdlbl9jb25zdF92ZWN0b3IgKG1vZGUs IDEpOwogICAgIH0KIAogICBGT1JfRUFDSF9NT0RFX0lOX0NMQVNTIChtb2RlLCBNT0RFX1ZFQ1RP Ul9JTlQpCmRpZmYgLS1naXQgYS9nY2MvZ2VubW9kZXMuYyBiL2djYy9nZW5tb2Rlcy5jCmluZGV4 IDYwMDFiODU0NTQ3Li41ODgxYWJkODQ2YyAxMDA2NDQKLS0tIGEvZ2NjL2dlbm1vZGVzLmMKKysr IGIvZ2NjL2dlbm1vZGVzLmMKQEAgLTc4LDYgKzc4LDcgQEAgc3RydWN0IG1vZGVfZGF0YQogICBi b29sIG5lZWRfYnl0ZXNpemVfYWRqOwkvKiB0cnVlIGlmIHRoaXMgbW9kZSBuZWVkcyBkeW5hbWlj IHNpemUKIAkJCQkgICBhZGp1c3RtZW50ICovCiAgIHVuc2lnbmVkIGludCBpbnRfbjsJCS8qIElm IG5vbnplcm8sIHRoZW4gX19pbnQ8SU5UX04+IHdpbGwgYmUgZGVmaW5lZCAqLworICBib29sIGJv b2xlYW47CiB9OwogCiBzdGF0aWMgc3RydWN0IG1vZGVfZGF0YSAqbW9kZXNbTUFYX01PREVfQ0xB U1NdOwpAQCAtODgsNyArODksOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IG1vZGVfZGF0YSBibGFu a19tb2RlID0gewogICAwLCAiPHVua25vd24+IiwgTUFYX01PREVfQ0xBU1MsCiAgIDAsIC0xVSwg LTFVLCAtMVUsIC0xVSwKICAgMCwgMCwgMCwgMCwgMCwgMCwKLSAgIjx1bmtub3duPiIsIDAsIDAs IDAsIDAsIGZhbHNlLCBmYWxzZSwgMAorICAiPHVua25vd24+IiwgMCwgMCwgMCwgMCwgZmFsc2Us IGZhbHNlLCAwLAorICBmYWxzZQogfTsKIAogc3RhdGljIGh0YWJfdCBtb2Rlc19ieV9uYW1lOwpA QCAtNDU2LDcgKzQ1OCw3IEBAIG1ha2VfY29tcGxleF9tb2RlcyAoZW51bSBtb2RlX2NsYXNzIGNs LAogICAgICAgc2l6ZV90IG1fbGVuOwogCiAgICAgICAvKiBTa2lwIEJJbW9kZS4gIEZJWE1FOiBC SW1vZGUgcHJvYmFibHkgc2hvdWxkbid0IGJlIE1PREVfSU5ULiAgKi8KLSAgICAgIGlmIChtLT5w cmVjaXNpb24gPT0gMSkKKyAgICAgIGlmIChtLT5ib29sZWFuKQogCWNvbnRpbnVlOwogCiAgICAg ICBtX2xlbiA9IHN0cmxlbiAobS0+bmFtZSk7CkBAIC01MjgsNyArNTMwLDcgQEAgbWFrZV92ZWN0 b3JfbW9kZXMgKGVudW0gbW9kZV9jbGFzcyBjbCwgY29uc3QgY2hhciAqcHJlZml4LCB1bnNpZ25l ZCBpbnQgd2lkdGgsCiAJIG5vdCBiZSBuZWNlc3NhcnkuICAqLwogICAgICAgaWYgKGNsID09IE1P REVfRkxPQVQgJiYgbS0+Ynl0ZXNpemUgPT0gMSkKIAljb250aW51ZTsKLSAgICAgIGlmIChjbCA9 PSBNT0RFX0lOVCAmJiBtLT5wcmVjaXNpb24gPT0gMSkKKyAgICAgIGlmIChtLT5ib29sZWFuKQog CWNvbnRpbnVlOwogCiAgICAgICBpZiAoKHNpemVfdCkgc25wcmludGYgKGJ1Ziwgc2l6ZW9mIGJ1 ZiwgIiVzJXUlcyIsIHByZWZpeCwKQEAgLTU0OCwxNyArNTUwLDE4IEBAIG1ha2VfdmVjdG9yX21v ZGVzIChlbnVtIG1vZGVfY2xhc3MgY2wsIGNvbnN0IGNoYXIgKnByZWZpeCwgdW5zaWduZWQgaW50 IHdpZHRoLAogCiAvKiBDcmVhdGUgYSB2ZWN0b3Igb2YgYm9vbGVhbnMgY2FsbGVkIE5BTUUgd2l0 aCBDT1VOVCBlbGVtZW50cyBhbmQKICAgIEJZVEVTSVpFIGJ5dGVzIGluIHRvdGFsLiAgKi8KLSNk ZWZpbmUgVkVDVE9SX0JPT0xfTU9ERShOQU1FLCBDT1VOVCwgQllURVNJWkUpIFwKLSAgbWFrZV92 ZWN0b3JfYm9vbF9tb2RlICgjTkFNRSwgQ09VTlQsIEJZVEVTSVpFLCBfX0ZJTEVfXywgX19MSU5F X18pCisjZGVmaW5lIFZFQ1RPUl9CT09MX01PREUoTkFNRSwgQ09VTlQsIENPTVBPTkVOVCwgQllU RVNJWkUpCQlcCisgIG1ha2VfdmVjdG9yX2Jvb2xfbW9kZSAoI05BTUUsIENPVU5ULCAjQ09NUE9O RU5ULCBCWVRFU0laRSwJCVwKKwkJCSBfX0ZJTEVfXywgX19MSU5FX18pCiBzdGF0aWMgdm9pZCBB VFRSSUJVVEVfVU5VU0VECiBtYWtlX3ZlY3Rvcl9ib29sX21vZGUgKGNvbnN0IGNoYXIgKm5hbWUs IHVuc2lnbmVkIGludCBjb3VudCwKLQkJICAgICAgIHVuc2lnbmVkIGludCBieXRlc2l6ZSwgY29u c3QgY2hhciAqZmlsZSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBsaW5lKQorCQkgICAgICAgY29u c3QgY2hhciAqY29tcG9uZW50LCB1bnNpZ25lZCBpbnQgYnl0ZXNpemUsCisJCSAgICAgICBjb25z dCBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSkKIHsKLSAgc3RydWN0IG1vZGVfZGF0YSAq bSA9IGZpbmRfbW9kZSAoIkJJIik7CisgIHN0cnVjdCBtb2RlX2RhdGEgKm0gPSBmaW5kX21vZGUg KGNvbXBvbmVudCk7CiAgIGlmICghbSkKICAgICB7Ci0gICAgICBlcnJvciAoIiVzOiVkOiBubyBt b2RlIFwiQklcIiIsIGZpbGUsIGxpbmUpOworICAgICAgZXJyb3IgKCIlczolZDogbm8gbW9kZSBc IiVzXCIiLCBmaWxlLCBsaW5lLCBjb21wb25lbnQpOwogICAgICAgcmV0dXJuOwogICAgIH0KIApA QCAtNTk2LDYgKzU5OSwyMCBAQCBtYWtlX2ludF9tb2RlIChjb25zdCBjaGFyICpuYW1lLAogICBt LT5wcmVjaXNpb24gPSBwcmVjaXNpb247CiB9CiAKKyNkZWZpbmUgQk9PTF9NT0RFKE4sIEIsIFkp IFwKKyAgbWFrZV9ib29sX21vZGUgKCNOLCBCLCBZLCBfX0ZJTEVfXywgX19MSU5FX18pCisKK3N0 YXRpYyB2b2lkCittYWtlX2Jvb2xfbW9kZSAoY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQg aW50IHByZWNpc2lvbiwgdW5zaWduZWQgaW50IGJ5dGVzaXplLAorCQljb25zdCBjaGFyICpmaWxl LCB1bnNpZ25lZCBpbnQgbGluZSkKK3sKKyAgc3RydWN0IG1vZGVfZGF0YSAqbSA9IG5ld19tb2Rl IChNT0RFX0lOVCwgbmFtZSwgZmlsZSwgbGluZSk7CisgIG0tPmJ5dGVzaXplID0gYnl0ZXNpemU7 CisgIG0tPnByZWNpc2lvbiA9IHByZWNpc2lvbjsKKyAgbS0+Ym9vbGVhbiA9IHRydWU7Cit9CisK ICNkZWZpbmUgT1BBUVVFX01PREUoTiwgQikJCQlcCiAgIG1ha2Vfb3BhcXVlX21vZGUgKCNOLCAt MVUsIEIsIF9fRklMRV9fLCBfX0xJTkVfXykKIApAQCAtMTI5OCw5ICsxMzE1LDIxIEBAIGVudW0g bWFjaGluZV9tb2RlXG57Iik7CiAgICAgICAvKiBEb24ndCB1c2UgQkltb2RlIGZvciBNSU5fTU9E RV9JTlQsIHNpbmNlIG90aGVyd2lzZSB0aGUgbWlkZGxlCiAJIGVuZCB3aWxsIHRyeSB0byB1c2Ug aXQgZm9yIGJpdGZpZWxkcyBpbiBzdHJ1Y3R1cmVzIGFuZCB0aGUKIAkgbGlrZSwgd2hpY2ggd2Ug ZG8gbm90IHdhbnQuICBPbmx5IHRoZSB0YXJnZXQgbWQgZmlsZSBzaG91bGQKLQkgZ2VuZXJhdGUg Qkltb2RlIHdpZGdldHMuICAqLwotICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0LT5wcmVjaXNpb24g PT0gMSAmJiBjID09IE1PREVfSU5UKQotCWZpcnN0ID0gZmlyc3QtPm5leHQ7CisJIGdlbmVyYXRl IEJJbW9kZSB3aWRnZXRzLiAgU2luY2Ugc29tZSB0YXJnZXRzIHN1Y2ggYXMgQVJNL01WRQorCSBk ZWZpbmUgYm9vbGVhbiBtb2RlcyB3aXRoIG11bHRpcGxlIGJpdHMsIGhhbmRsZSB0aG9zZSB0b28u ICAqLworICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0LT5ib29sZWFuKQorCXsKKwkgIHN0cnVjdCBt b2RlX2RhdGEgKmxhc3RfYm9vbCA9IGZpcnN0OworCSAgcHJpbnRmICgiICBNSU5fTU9ERV9CT09M ID0gRV8lc21vZGUsXG4iLCBmaXJzdC0+bmFtZSk7CisKKwkgIHdoaWxlIChmaXJzdCAmJiBmaXJz dC0+Ym9vbGVhbikKKwkgICAgeworCSAgICAgIGxhc3RfYm9vbCA9IGZpcnN0OworCSAgICAgIGZp cnN0ID0gZmlyc3QtPm5leHQ7CisJICAgIH0KKworCSAgcHJpbnRmICgiICBNQVhfTU9ERV9CT09M ID0gRV8lc21vZGUsXG5cbiIsIGxhc3RfYm9vbC0+bmFtZSk7CisJfQogCiAgICAgICBpZiAoZmly c3QgJiYgbGFzdCkKIAlwcmludGYgKCIgIE1JTl8lcyA9IEVfJXNtb2RlLFxuICBNQVhfJXMgPSBF XyVzbW9kZSxcblxuIiwKQEAgLTE2NzksMTUgKzE3MDgsMTUgQEAgZW1pdF9jbGFzc19uYXJyb3dl c3RfbW9kZSAodm9pZCkKICAgcHJpbnRfZGVjbCAoInVuc2lnbmVkIGNoYXIiLCAiY2xhc3NfbmFy cm93ZXN0X21vZGUiLCAiTUFYX01PREVfQ0xBU1MiKTsKIAogICBmb3IgKGMgPSAwOyBjIDwgTUFY X01PREVfQ0xBU1M7IGMrKykKLSAgICAvKiBCbGVhaCwgYWxsIHRoaXMgdG8gZ2V0IHRoZSBjb21t ZW50IHJpZ2h0IGZvciBNSU5fTU9ERV9JTlQuICAqLwotICAgIHRhZ2dlZF9wcmludGYgKCJNSU5f JXMiLCBtb2RlX2NsYXNzX25hbWVzW2NdLAotCQkgICBtb2Rlc1tjXQotCQkgICA/ICgoYyAhPSBN T0RFX0lOVCB8fCBtb2Rlc1tjXS0+cHJlY2lzaW9uICE9IDEpCi0JCSAgICAgID8gbW9kZXNbY10t Pm5hbWUKLQkJICAgICAgOiAobW9kZXNbY10tPm5leHQKLQkJCSA/IG1vZGVzW2NdLT5uZXh0LT5u YW1lCi0JCQkgOiB2b2lkX21vZGUtPm5hbWUpKQotCQkgICA6IHZvaWRfbW9kZS0+bmFtZSk7Cisg ICAgeworICAgICAgLyogQmxlYWgsIGFsbCB0aGlzIHRvIGdldCB0aGUgY29tbWVudCByaWdodCBm b3IgTUlOX01PREVfSU5ULiAgKi8KKyAgICAgIHN0cnVjdCBtb2RlX2RhdGEgKm0gPSBtb2Rlc1tj XTsKKyAgICAgIHdoaWxlIChtICYmIG0tPmJvb2xlYW4pCisJbSA9IG0tPm5leHQ7CisgICAgICBj b25zdCBjaGFyICpjb21tZW50X25hbWUgPSAobSA/IG0gOiB2b2lkX21vZGUpLT5uYW1lOworCisg ICAgICB0YWdnZWRfcHJpbnRmICgiTUlOXyVzIiwgbW9kZV9jbGFzc19uYW1lc1tjXSwgY29tbWVu dF9uYW1lKTsKKyAgICB9CiAKICAgcHJpbnRfY2xvc2VyICgpOwogfQpkaWZmIC0tZ2l0IGEvZ2Nj L21hY2htb2RlLmRlZiBiL2djYy9tYWNobW9kZS5kZWYKaW5kZXggODY2YTIwODJkMDEuLjUzM2Nm NmFiNGIyIDEwMDY0NAotLS0gYS9nY2MvbWFjaG1vZGUuZGVmCisrKyBiL2djYy9tYWNobW9kZS5k ZWYKQEAgLTE0NiwxMiArMTQ2LDEzIEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09Q WUlORzMuICBJZiBub3Qgc2VlCiAJTGlrZSBWRUNUT1JfTU9ERVMsIGJ1dCBzdGFydCB0aGUgbW9k ZSBuYW1lcyB3aXRoIFBSRUZJWCBpbnN0ZWFkCiAJb2YgdGhlIHVzdWFsICJWIi4KIAotICAgICBW RUNUT1JfQk9PTF9NT0RFIChOQU1FLCBDT1VOVCwgQllURVNJWkUpCisgICAgIFZFQ1RPUl9CT09M X01PREUgKE5BTUUsIENPVU5ULCBDT01QT05FTlQsIEJZVEVTSVpFKQogICAgICAgICBDcmVhdGUg YSB2ZWN0b3IgbW9kZSBjYWxsZWQgTkFNRSB0aGF0IGNvbnRhaW5zIENPVU5UIGJvb2xlYW4KICAg ICAgICAgZWxlbWVudHMgYW5kIG9jY3VwaWVzIEJZVEVTSVpFIGJ5dGVzIGluIHRvdGFsLiAgRWFj aCBib29sZWFuCi0gICAgICAgIGVsZW1lbnQgb2NjdXBpZXMgKENPVU5UICogQklUU19QRVJfVU5J VCkgLyBCWVRFU0laRSBiaXRzLCB3aXRoCi0gICAgICAgIHRoZSBlbGVtZW50IGF0IGluZGV4IDAg b2NjdXB5aW5nIHRoZSBsc2Igb2YgdGhlIGZpcnN0IGJ5dGUgaW4KLSAgICAgICAgbWVtb3J5LiAg T25seSB0aGUgbG93ZXN0IGJpdCBvZiBlYWNoIGVsZW1lbnQgaXMgc2lnbmlmaWNhbnQuCisgICAg ICAgIGVsZW1lbnQgaXMgb2YgQ09NUE9ORU5UIHR5cGUgYW5kIG9jY3VwaWVzIChDT1VOVCAqIEJJ VFNfUEVSX1VOSVQpIC8KKyAgICAgICAgQllURVNJWkUgYml0cywgd2l0aCB0aGUgZWxlbWVudCBh dCBpbmRleCAwIG9jY3VweWluZyB0aGUgbHNiIG9mIHRoZQorICAgICAgICBmaXJzdCBieXRlIGlu IG1lbW9yeS4gIE9ubHkgdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBlbGVtZW50IGlzCisgICAgICAg IHNpZ25pZmljYW50LgogCiAgICAgIE9QQVFVRV9NT0RFIChOQU1FLCBCWVRFU0laRSkKICAgICAg ICAgQ3JlYXRlIGFuIG9wYXF1ZSBtb2RlIGNhbGxlZCBOQU1FIHRoYXQgaXMgQllURVNJWkUgYnl0 ZXMgd2lkZS4KQEAgLTE5Niw3ICsxOTcsNyBAQCBSQU5ET01fTU9ERSAoVk9JRCk7CiBSQU5ET01f TU9ERSAoQkxLKTsKIAogLyogU2luZ2xlIGJpdCBtb2RlIHVzZWQgZm9yIGJvb2xlYW5zLiAgKi8K LUZSQUNUSU9OQUxfSU5UX01PREUgKEJJLCAxLCAxKTsKK0JPT0xfTU9ERSAoQkksIDEsIDEpOwog CiAvKiBCYXNpYyBpbnRlZ2VyIG1vZGVzLiAgV2UgZ28gdXAgdG8gVEkgaW4gZ2VuZXJpYyBjb2Rl ICgxMjggYml0cykuCiAgICBUSW1vZGUgaXMgbmVlZGVkIGhlcmUgYmVjYXVzZSB0aGUgc29tZSBm cm9udCBlbmRzIG5vdyBnZW5lcmljbHkKZGlmZiAtLWdpdCBhL2djYy9ydHgtdmVjdG9yLWJ1aWxk ZXIuYyBiL2djYy9ydHgtdmVjdG9yLWJ1aWxkZXIuYwppbmRleCBlMzZhYmEwMTBhMC4uNTVmZmUw ZDVhNzYgMTAwNjQ0Ci0tLSBhL2djYy9ydHgtdmVjdG9yLWJ1aWxkZXIuYworKysgYi9nY2MvcnR4 LXZlY3Rvci1idWlsZGVyLmMKQEAgLTkwLDggKzkwLDEwIEBAIHJ0eF92ZWN0b3JfYnVpbGRlcjo6 ZmluZF9jYWNoZWRfdmFsdWUgKCkKIAogICBpZiAoR0VUX01PREVfQ0xBU1MgKG1fbW9kZSkgPT0g TU9ERV9WRUNUT1JfQk9PTCkKICAgICB7Ci0gICAgICBpZiAoZWx0ID09IGNvbnN0MV9ydHggfHwg ZWx0ID09IGNvbnN0bTFfcnR4KQorICAgICAgaWYgKGVsdCA9PSBjb25zdDFfcnR4KQogCXJldHVy biBDT05TVDFfUlRYIChtX21vZGUpOworICAgICAgZWxzZSBpZiAoZWx0ID09IGNvbnN0bTFfcnR4 KQorCXJldHVybiBDT05TVE0xX1JUWCAobV9tb2RlKTsKICAgICAgIGVsc2UgaWYgKGVsdCA9PSBj b25zdDBfcnR4KQogCXJldHVybiBDT05TVDBfUlRYIChtX21vZGUpOwogICAgICAgZWxzZQpkaWZm IC0tZ2l0IGEvZ2NjL3NpbXBsaWZ5LXJ0eC5jIGIvZ2NjL3NpbXBsaWZ5LXJ0eC5jCmluZGV4IGMz NmM4MjVmOTU4Li41MzI1MzdlYTQ4ZCAxMDA2NDQKLS0tIGEvZ2NjL3NpbXBsaWZ5LXJ0eC5jCisr KyBiL2djYy9zaW1wbGlmeS1ydHguYwpAQCAtNjg3NiwxMiArNjg3NiwxMyBAQCBuYXRpdmVfZW5j b2RlX3J0eCAobWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB4LCB2ZWM8dGFyZ2V0X3VuaXQ+ICZieXRl cywKIAkgIC8qIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCBlbGVtZW50cyBjYW4gYmUg c21hbGxlciB0aGFuCiAJICAgICBhIGJ5dGUuICAqLwogCSAgZ2NjX2Fzc2VydCAoR0VUX01PREVf Q0xBU1MgKG1vZGUpID09IE1PREVfVkVDVE9SX0JPT0wpOworCSAgYXV0byBtYXNrID0gR0VUX01P REVfTUFTSyAoR0VUX01PREVfSU5ORVIgKG1vZGUpKTsKIAkgIGZvciAodW5zaWduZWQgaW50IGkg PSAwOyBpIDwgbnVtX2J5dGVzOyArK2kpCiAJICAgIHsKIAkgICAgICB0YXJnZXRfdW5pdCB2YWx1 ZSA9IDA7CiAJICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaiA9IDA7IGogPCBCSVRTX1BFUl9VTklU OyBqICs9IGVsdF9iaXRzKQogCQl7Ci0JCSAgdmFsdWUgfD0gKElOVFZBTCAoQ09OU1RfVkVDVE9S X0VMVCAoeCwgZWx0KSkgJiAxKSA8PCBqOworCQkgIHZhbHVlIHw9IChJTlRWQUwgKENPTlNUX1ZF Q1RPUl9FTFQgKHgsIGVsdCkpICYgbWFzaykgPDwgajsKIAkJICBlbHQgKz0gMTsKIAkJfQogCSAg ICAgIGJ5dGVzLnF1aWNrX3B1c2ggKHZhbHVlKTsKQEAgLTcwMjUsOSArNzAyNiw4IEBAIG5hdGl2 ZV9kZWNvZGVfdmVjdG9yX3J0eCAobWFjaGluZV9tb2RlIG1vZGUsIGNvbnN0IHZlYzx0YXJnZXRf dW5pdD4gJmJ5dGVzLAogCSAgdW5zaWduZWQgaW50IGJpdF9pbmRleCA9IGZpcnN0X2J5dGUgKiBC SVRTX1BFUl9VTklUICsgaSAqIGVsdF9iaXRzOwogCSAgdW5zaWduZWQgaW50IGJ5dGVfaW5kZXgg PSBiaXRfaW5kZXggLyBCSVRTX1BFUl9VTklUOwogCSAgdW5zaWduZWQgaW50IGxzYiA9IGJpdF9p bmRleCAlIEJJVFNfUEVSX1VOSVQ7Ci0JICBidWlsZGVyLnF1aWNrX3B1c2ggKGJ5dGVzW2J5dGVf aW5kZXhdICYgKDEgPDwgbHNiKQotCQkJICAgICAgPyBDT05TVDFfUlRYIChCSW1vZGUpCi0JCQkg ICAgICA6IENPTlNUMF9SVFggKEJJbW9kZSkpOworCSAgdW5zaWduZWQgaW50IHZhbHVlID0gYnl0 ZXNbYnl0ZV9pbmRleF0gPj4gbHNiOworCSAgYnVpbGRlci5xdWlja19wdXNoIChnZW5faW50X21v ZGUgKHZhbHVlLCBHRVRfTU9ERV9JTk5FUiAobW9kZSkpKTsKIAl9CiAgICAgfQogICBlbHNlCkBA IC03OTk0LDE3ICs3OTk0LDIzIEBAIHRlc3RfdmVjdG9yX29wc19kdXBsaWNhdGUgKG1hY2hpbmVf bW9kZSBtb2RlLCBydHggc2NhbGFyX3JlZykKIAkJCQkJCSAgICBkdXBsaWNhdGUsIGxhc3RfcGFy KSk7CiAKICAgICAgIC8qIFRlc3QgYSBzY2FsYXIgc3VicmVnIG9mIGEgVkVDX01FUkdFIG9mIGEg VkVDX0RVUExJQ0FURS4gICovCi0gICAgICBydHggdmVjdG9yX3JlZyA9IG1ha2VfdGVzdF9yZWcg KG1vZGUpOwotICAgICAgZm9yICh1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGkgPSAwOyBpIDwgY29u c3RfbnVuaXRzOyBpKyspCisgICAgICAvKiBTa2lwIHRoaXMgdGVzdCBmb3IgdmVjdG9ycyBvZiBi b29sZWFucywgYmVjYXVzZSBvZmZzZXQgaXMgaW4gYnl0ZXMsCisJIHdoaWxlIHZlY19tZXJnZSBp bmRpY2VzIGFyZSBpbiBlbGVtZW50cyAodXN1YWxseSBiaXRzKS4gICovCisgICAgICBpZiAoR0VU X01PREVfQ0xBU1MgKG1vZGUpICE9IE1PREVfVkVDVE9SX0JPT0wpCiAJewotCSAgaWYgKGkgPj0g SE9TVF9CSVRTX1BFUl9XSURFX0lOVCkKLQkgICAgYnJlYWs7Ci0JICBydHggbWFzayA9IEdFTl9J TlQgKChIT1NUX1dJREVfSU5UXzFVIDw8IGkpIHwgKGkgKyAxKSk7Ci0JICBydHggdm0gPSBnZW5f cnR4X1ZFQ19NRVJHRSAobW9kZSwgZHVwbGljYXRlLCB2ZWN0b3JfcmVnLCBtYXNrKTsKLQkgIHBv bHlfdWludDY0IG9mZnNldCA9IGkgKiBHRVRfTU9ERV9TSVpFIChpbm5lcl9tb2RlKTsKLQkgIEFT U0VSVF9SVFhfRVEgKHNjYWxhcl9yZWcsCi0JCQkgc2ltcGxpZnlfZ2VuX3N1YnJlZyAoaW5uZXJf bW9kZSwgdm0sCi0JCQkJCSAgICAgIG1vZGUsIG9mZnNldCkpOworCSAgcnR4IHZlY3Rvcl9yZWcg PSBtYWtlX3Rlc3RfcmVnIChtb2RlKTsKKwkgIGZvciAodW5zaWduZWQgSE9TVF9XSURFX0lOVCBp ID0gMDsgaSA8IGNvbnN0X251bml0czsgaSsrKQorCSAgICB7CisJICAgICAgaWYgKGkgPj0gSE9T VF9CSVRTX1BFUl9XSURFX0lOVCkKKwkJYnJlYWs7CisJICAgICAgcnR4IG1hc2sgPSBHRU5fSU5U ICgoSE9TVF9XSURFX0lOVF8xVSA8PCBpKSB8IChpICsgMSkpOworCSAgICAgIHJ0eCB2bSA9IGdl bl9ydHhfVkVDX01FUkdFIChtb2RlLCBkdXBsaWNhdGUsIHZlY3Rvcl9yZWcsIG1hc2spOworCSAg ICAgIHBvbHlfdWludDY0IG9mZnNldCA9IGkgKiBHRVRfTU9ERV9TSVpFIChpbm5lcl9tb2RlKTsK KworCSAgICAgIEFTU0VSVF9SVFhfRVEgKHNjYWxhcl9yZWcsCisJCQkgICAgIHNpbXBsaWZ5X2dl bl9zdWJyZWcgKGlubmVyX21vZGUsIHZtLAorCQkJCQkJICBtb2RlLCBvZmZzZXQpKTsKKwkgICAg fQogCX0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2djYy92YXJhc20uYyBiL2djYy92YXJhc20uYwpp bmRleCA3NjU3NGJlMTkxZi4uNWY1OWI2YWNlMTUgMTAwNjQ0Ci0tLSBhL2djYy92YXJhc20uYwor KysgYi9nY2MvdmFyYXNtLmMKQEAgLTQwODUsNiArNDA4NSw3IEBAIG91dHB1dF9jb25zdGFudF9w b29sXzIgKGZpeGVkX3NpemVfbW9kZSBtb2RlLCBydHggeCwgdW5zaWduZWQgaW50IGFsaWduKQog CXVuc2lnbmVkIGludCBlbHRfYml0cyA9IEdFVF9NT0RFX0JJVFNJWkUgKG1vZGUpIC8gbmVsdHM7 CiAJdW5zaWduZWQgaW50IGludF9iaXRzID0gTUFYIChlbHRfYml0cywgQklUU19QRVJfVU5JVCk7 CiAJc2NhbGFyX2ludF9tb2RlIGludF9tb2RlID0gaW50X21vZGVfZm9yX3NpemUgKGludF9iaXRz LCAwKS5yZXF1aXJlICgpOworCXVuc2lnbmVkIGludCBtYXNrID0gR0VUX01PREVfTUFTSyAoR0VU X01PREVfSU5ORVIgKG1vZGUpKTsKIAogCS8qIEJ1aWxkIHRoZSBjb25zdGFudCB1cCBvbmUgaW50 ZWdlciBhdCBhIHRpbWUuICAqLwogCXVuc2lnbmVkIGludCBlbHRzX3Blcl9pbnQgPSBpbnRfYml0 cyAvIGVsdF9iaXRzOwpAQCAtNDA5Myw4ICs0MDk0LDEwIEBAIG91dHB1dF9jb25zdGFudF9wb29s XzIgKGZpeGVkX3NpemVfbW9kZSBtb2RlLCBydHggeCwgdW5zaWduZWQgaW50IGFsaWduKQogCSAg ICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIHZhbHVlID0gMDsKIAkgICAgdW5zaWduZWQgaW50IGxp bWl0ID0gTUlOIChuZWx0cyAtIGksIGVsdHNfcGVyX2ludCk7CiAJICAgIGZvciAodW5zaWduZWQg aW50IGogPSAwOyBqIDwgbGltaXQ7ICsraikKLQkgICAgICBpZiAoSU5UVkFMIChDT05TVF9WRUNU T1JfRUxUICh4LCBpICsgaikpICE9IDApCi0JCXZhbHVlIHw9IDEgPDwgKGogKiBlbHRfYml0cyk7 CisJICAgIHsKKwkgICAgICBhdXRvIGVsdCA9IElOVFZBTCAoQ09OU1RfVkVDVE9SX0VMVCAoeCwg aSArIGopKTsKKwkgICAgICB2YWx1ZSB8PSAoZWx0ICYgbWFzaykgPDwgKGogKiBlbHRfYml0cyk7 CisJICAgIH0KIAkgICAgb3V0cHV0X2NvbnN0YW50X3Bvb2xfMiAoaW50X21vZGUsIGdlbl9pbnRf bW9kZSAodmFsdWUsIGludF9tb2RlKSwKIAkJCQkgICAgaSAhPSAwID8gTUlOIChhbGlnbiwgaW50 X2JpdHMpIDogYWxpZ24pOwogCSAgfQotLSAKMi4yNS4xCgo= --000000000000c4233005d83891ca--