From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 29DCBC001B0 for ; Sun, 9 Jul 2023 13:40:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230449AbjGINkT (ORCPT ); Sun, 9 Jul 2023 09:40:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35880 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229760AbjGINkR (ORCPT ); Sun, 9 Jul 2023 09:40:17 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 54057103; Sun, 9 Jul 2023 06:40:15 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id A1D1760BEC; Sun, 9 Jul 2023 13:40:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 032F8C433C7; Sun, 9 Jul 2023 13:40:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1688910014; bh=tZgkSd7oymqonWNvgX6gc+9exz3n3C13pRvO6OYLDFs=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=kfl2UYkHiE2r6L0jaK47wVVykz32Lxq0PCkGXxOOS87tLul/IGwcrzWl74f2yYSP7 rXM2zka6CCH/eN4Eh1Iu13KhddsUH4DiigqZDYk/Zwlt+E3NG5NsvpjQP6qQFq5PU1 M8CEAOQiAoDINErrZiDpiZT6v2iwBhILV2Ws0v9dtX7ZGJU++3Tjng+SNDOrsF0CY1 AK6uLwy6VPfTExw0G7oJObR+WKVEqjquTj6S7djGfz7VyFcPSj4F+VFBhNr9SibQAk fPjpT2l10UFe9okC5yrIZtk6cyMVe5GS+VU3m0waxGqViy02DbVuSIxHz9ybNnNnBe XDWqBiW55jaTA== Received: by mail-ed1-f53.google.com with SMTP id 4fb4d7f45d1cf-51cff235226so6942682a12.0; Sun, 09 Jul 2023 06:40:13 -0700 (PDT) X-Gm-Message-State: ABy/qLYnWIxQicbW4M+ebOjF4VT2OEaUmfDzugRKsn0mOeokYr46RdFr pFx8pjLbo9tJk4Cc6HbKop3PXEnX/d/UL131Dvc= X-Google-Smtp-Source: APBJJlFt0elwP4WrtSl0ldTm2Qz34A5kQ8iW84OMzjbmMHdWyTJIha+ylJb4Hv4yM5KrP/2WvIjDbYkOz25ESMViPUI= X-Received: by 2002:a05:6402:34c1:b0:51e:53be:9ddc with SMTP id w1-20020a05640234c100b0051e53be9ddcmr3746534edc.2.1688910012179; Sun, 09 Jul 2023 06:40:12 -0700 (PDT) MIME-Version: 1.0 References: <20230629082032.3481237-1-guoren@kernel.org> <2ab8ca7c-a648-f73c-1815-086274af6013@ghiti.fr> <41be0796-c884-bffa-8b3b-8b2da1cc2709@ghiti.fr> In-Reply-To: <41be0796-c884-bffa-8b3b-8b2da1cc2709@ghiti.fr> From: Guo Ren Date: Sun, 9 Jul 2023 21:40:00 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] riscv: pageattr: Fixup synchronization problem between init_mm and active_mm To: Alexandre Ghiti Cc: palmer@rivosinc.com, Paul Walmsley , zong.li@sifive.com, atishp@atishpatra.org, jszhang@kernel.org, bjorn@kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, Guo Ren Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jul 5, 2023 at 8:06=E2=80=AFPM Alexandre Ghiti wrot= e: > > + fixed Paul's address > > > On 05/07/2023 11:15, Guo Ren wrote: > > On Wed, Jul 5, 2023 at 3:01=E2=80=AFPM Alexandre Ghiti = wrote: > >> > >> On 04/07/2023 04:25, Guo Ren wrote: > >>> On Mon, Jul 3, 2023 at 6:17=E2=80=AFPM Alexandre Ghiti wrote: > >>>> Hi Guo, > >>>> > >>>> On 29/06/2023 10:20, guoren@kernel.org wrote: > >>>>> From: Guo Ren > >>>>> > >>>>> The machine_kexec() uses set_memory_x to add the executable attribu= te to the > >>>>> page table entry of control_code_buffer. It only modifies the init_= mm but not > >>>>> the current->active_mm. The current kexec process won't use init_mm= directly, > >>>>> and it depends on minor_pagefault, which is removed by commit 7d333= 2be011e4 > >>>> Is the removal of minor_pagefault an issue? I'm not sure I understan= d > >>>> this part of the changelog. > >>> I use two different work-around patches to answer your question: > >>> 1st: > >>> ----- > >>> diff --git a/arch/riscv/mm/fault.c b/arch/riscv/mm/fault.c > >>> index 705d63a59aec..b8b200c81606 100644 > >>> --- a/arch/riscv/mm/fault.c > >>> +++ b/arch/riscv/mm/fault.c > >>> @@ -249,7 +249,7 @@ void handle_page_fault(struct pt_regs *regs) > >>> * only copy the information from the master page table, > >>> * nothing more. > >>> */ > >>> - if (unlikely((addr >=3D VMALLOC_START) && (addr < VMALLOC_END))) { > >>> + if (unlikely(addr >=3D 0x8000000000000000UL)) { > >>> vmalloc_fault(regs, code, addr); > >>> return; > >>> } > >>> ------ > >>> > >>> 2nd: > >>> ------ > >>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > >>> index 8e65f0a953e5..270f50852886 100644 > >>> --- a/arch/riscv/mm/init.c > >>> +++ b/arch/riscv/mm/init.c > >>> @@ -1387,7 +1387,7 @@ static void __init create_linear_mapping_page_t= able(void) > >>> if (end >=3D __pa(PAGE_OFFSET) + memory_limit) > >>> end =3D __pa(PAGE_OFFSET) + memory_limit; > >>> > >>> - create_linear_mapping_range(start, end, 0); > >>> + create_linear_mapping_range(start, end, PMD_SIZE); > >>> } > >>> > >>> #ifdef CONFIG_STRICT_KERNEL_RWX > >>> ----- > >>> > >>> The removal of minor_pagefault could be an issue, but in this case > >>> it's the VMALLOC_START/END which prevents the minor_pagefault at > >>> first. I didn't say commit 7d3332be011e4 is the problem. > >> > >> Sorry I still don't understand what you mean here and why you mention > >> the minor pagefault, could you explain again please? > >> > >> > >>>>> ("riscv: mm: Pre-allocate PGD entries for vmalloc/modules area") of= 64BIT. So, > >>>>> when it met pud mapping on an MMU_SV39 machine, it caused the follo= wing: > >>>>> > >>>>> kexec_core: Starting new kernel > >>>>> Will call new kernel at 00300000 from hart id 0 > >>>>> FDT image at 747c7000 > >>>>> Bye... > >>>>> Unable to handle kernel paging request at virtual address fffff= fda23b0d000 > >>>>> Oops [#1] > >>>>> Modules linked in: > >>>>> CPU: 0 PID: 53 Comm: uinit Not tainted 6.4.0-rc6 #15 > >>>>> Hardware name: Sophgo Mango (DT) > >>>>> epc : 0xffffffda23b0d000 > >>>>> ra : machine_kexec+0xa6/0xb0 > >>>>> epc : ffffffda23b0d000 ra : ffffffff80008272 sp : ffffffc80c173= d10 > >>>>> gp : ffffffff8150e1e0 tp : ffffffd9073d2c40 t0 : 0000000000000= 000 > >>>>> t1 : 0000000000000042 t2 : 6567616d69205444 s0 : ffffffc80c173= d50 > >>>>> s1 : ffffffd9076c4800 a0 : ffffffd9076c4800 a1 : 0000000000300= 000 > >>>>> a2 : 00000000747c7000 a3 : 0000000000000000 a4 : ffffffd800000= 000 > >>>>> a5 : 0000000000000000 a6 : ffffffd903619c40 a7 : fffffffffffff= fff > >>>>> s2 : ffffffda23b0d000 s3 : 0000000000300000 s4 : 00000000747c7= 000 > >>>>> s5 : 0000000000000000 s6 : 0000000000000000 s7 : 0000000000000= 000 > >>>>> s8 : 0000000000000000 s9 : 0000000000000000 s10: 0000000000000= 000 > >>>>> s11: 0000003f940001a0 t3 : ffffffff815351af t4 : ffffffff81535= 1af > >>>>> t5 : ffffffff815351b0 t6 : ffffffc80c173b50 > >>>>> status: 0000000200000100 badaddr: ffffffda23b0d000 cause: 00000= 0000000000c > >>>>> > >>>>> Yes, Using set_memory_x API after boot has the limitation, and at l= east we > >>>>> should synchronize the current->active_mm to fix the problem. > >>>>> > >>>>> Fixes: d3ab332a5021 ("riscv: add ARCH_HAS_SET_MEMORY support") > >>>>> Signed-off-by: Guo Ren > >>>>> Signed-off-by: Guo Ren > >>>>> --- > >>>>> arch/riscv/mm/pageattr.c | 7 +++++++ > >>>>> 1 file changed, 7 insertions(+) > >>>>> > >>>>> diff --git a/arch/riscv/mm/pageattr.c b/arch/riscv/mm/pageattr.c > >>>>> index ea3d61de065b..23d169c4ee81 100644 > >>>>> --- a/arch/riscv/mm/pageattr.c > >>>>> +++ b/arch/riscv/mm/pageattr.c > >>>>> @@ -123,6 +123,13 @@ static int __set_memory(unsigned long addr, in= t numpages, pgprot_t set_mask, > >>>>> &masks); > >>>>> mmap_write_unlock(&init_mm); > >>>>> > >>>>> + if (current->active_mm !=3D &init_mm) { > >>>>> + mmap_write_lock(current->active_mm); > >>>>> + ret =3D walk_page_range_novma(current->active_mm, st= art, end, > >>>>> + &pageattr_ops, NULL, &ma= sks); > >>>>> + mmap_write_unlock(current->active_mm); > >>>>> + } > >>>>> + > >>>>> flush_tlb_kernel_range(start, end); > >>>>> > >>>>> return ret; > >>>> I don't understand: any page table inherits the entries of > >>>> swapper_pg_dir (see pgd_alloc()), so any kernel page table entry is > >>>> "automatically" synchronized, so why should we synchronize one 4K en= try > >>>> explicitly? A PGD entry would need to be synced, but not a PTE entry= . > >>> The purpose of the second walk_page_range_novma() is for pgd's entrie= s > >>> synchronization. I'm a bit lazy here, I agree, it's unnecessary to > >>> write lower level entries again. So I would use a simple pgd entries > >>> synchronization from vmalloc_fault in the next version of patch, all > >>> right? > >> > >> But vmalloc_fault was removed by commit 7d3332be011e4 for CONFIG_64BIT= , > >> so I don't get it: why would we need to synchronize a PGD entry in you= r > >> case? Where does this new PGD come from? And the trap address is > >> ffffffda23b0d000, which lies in the direct mapping, so why do you > >> mention vmalloc_fault at all? > > The machine_kexec() uses set_memory_x to modify the direct mapping > > attributes from RW to RWX. But set_memory_x only changes the init_mm's > > attributes, not current->active_mm, so when kexec jumps into > > control_buffer, the instruction page fault happens, and there is no > > minor_pagefault for it, then panic. > > > > I found the bug on an MMU_sv39 machine, and the direct mapping used a > > 1GB PUD, the pgd entries. This patch could solve the problem by > > synchronizing a PGD entry between init_mm and current->active_mm. > > > Ok I get it now, thanks. So a few thoughts: > > - the trap address is in the linear mapping, so there won't be any sync > in the trap handler. Even if we implemented such behavior, waiting for a > fault to synchronize those mappings is error-prone (see commit > 7d3332be011e4) > > - this is Fixes: 3335068f8721 ("riscv: Use PUD/P4D/PGD pages for the > linear mapping") > > - that only happens if we use the largest mapping possible size for the > current mode: one simple solution is to restrict to the second largest > size (2MB for sv39, 1GB for sv48, 512GB for sv57). > > - your solution only works in this case, but we should fix the larger > problem: we need to sync all the page tables if such things happen, not > just the "calling" one. > > - set_memory* changing the protection of a whole PUD mapping for a > single page is a problem: if we set_memory_ro() a single page, we end up > with a 1GB linear mapping set to read only (which will obviously be > problematic!) > > - can we really use set_memory* on the direct mapping? Maybe we should > simply not, and the solution is to fix machine_kexec() so it remaps this > page outside the linear mapping. Okay, I agree to limit usage of set_memory*. And I would let machine_kexec() remaps control_buffer_page in the next version of patch instead of modifing linear mapping. > > - at the moment, we do not deal with the linear mapping in set_memory* > (for example, when used with modules, we protect the module mapping in > the vmalloc region but don't do anything with its linear mapping alias, > I have that on my todo list for a moment now). > > The best very short-term solution to me is to restrict to the second > largest size (easy to hack that in best_map_size()). > > And to me the long term solution is to split those mappings: that fixes > all the issues mentioned above + the thing with the modules (but I have > to dig a bit more, no other archs seems to do that). > > That's interesting, thanks for bringing that up, let me know what you > think, I'll keep digging! > > Alex > > > > > >> Sorry if I'm missing something, hope you can clarify things! > >> > >> Thanks, > >> > >> Alex > >> > >> > >>> > >>> -- > >>> Best Regards > >>> Guo Ren > >>> > >>> _______________________________________________ > >>> linux-riscv mailing list > >>> linux-riscv@lists.infradead.org > >>> http://lists.infradead.org/mailman/listinfo/linux-riscv > > > > --=20 Best Regards Guo Ren From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id DF19CEB64DD for ; Sun, 9 Jul 2023 13:40:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From: In-Reply-To:References:MIME-Version:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=M6KmiS5EasgLZdHwaIMNFsnN3cGVAumbZEVcCOketF4=; b=qnmv3pcQPR/UcA VhcereW0+amGOvZzyYQfKnm4nRzeO2dNesm7r40VchRWol/HsahjB3putvD5ri6cmsJj6kGSGlNR8 t3R5FByyXNJUTW4ahvUs6ExBbehM4EMNbgq+j8pYvcMsfP+xCsvutnWWHmyg91Ys/EaiYjuCC9r5d UI3wGZfr6tcdKF2hy8/ijPyGEzL2t/iJh64Cw639DFsJCxBnZdsvCoC4blT+5wXuT0G9m89QQ7Hb+ doSE45/cRYDi5RzvK38zk2CIWQK0PfK/QfUv2ozQOUi+DdouwQLI5aYNNsv2iIiUyRU8dssSK5jxE t2ldivtd5KELGrYcXOsA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qIUeD-009B06-1I; Sun, 09 Jul 2023 13:40:21 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qIUe9-009AzC-15 for linux-riscv@lists.infradead.org; Sun, 09 Jul 2023 13:40:19 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 9D02760BE9 for ; Sun, 9 Jul 2023 13:40:14 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 098C4C433CB for ; Sun, 9 Jul 2023 13:40:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1688910014; bh=tZgkSd7oymqonWNvgX6gc+9exz3n3C13pRvO6OYLDFs=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=kfl2UYkHiE2r6L0jaK47wVVykz32Lxq0PCkGXxOOS87tLul/IGwcrzWl74f2yYSP7 rXM2zka6CCH/eN4Eh1Iu13KhddsUH4DiigqZDYk/Zwlt+E3NG5NsvpjQP6qQFq5PU1 M8CEAOQiAoDINErrZiDpiZT6v2iwBhILV2Ws0v9dtX7ZGJU++3Tjng+SNDOrsF0CY1 AK6uLwy6VPfTExw0G7oJObR+WKVEqjquTj6S7djGfz7VyFcPSj4F+VFBhNr9SibQAk fPjpT2l10UFe9okC5yrIZtk6cyMVe5GS+VU3m0waxGqViy02DbVuSIxHz9ybNnNnBe XDWqBiW55jaTA== Received: by mail-ed1-f50.google.com with SMTP id 4fb4d7f45d1cf-51e344efd75so6450331a12.1 for ; Sun, 09 Jul 2023 06:40:13 -0700 (PDT) X-Gm-Message-State: ABy/qLayxUJi/hZiefTHEd93CvoGAG15deFZmHtmsc3x5Q14SPeg9ZJY 0l277F6CFInzZqGWD8u0kRvuKkxU9BkZCBR/Akw= X-Google-Smtp-Source: APBJJlFt0elwP4WrtSl0ldTm2Qz34A5kQ8iW84OMzjbmMHdWyTJIha+ylJb4Hv4yM5KrP/2WvIjDbYkOz25ESMViPUI= X-Received: by 2002:a05:6402:34c1:b0:51e:53be:9ddc with SMTP id w1-20020a05640234c100b0051e53be9ddcmr3746534edc.2.1688910012179; Sun, 09 Jul 2023 06:40:12 -0700 (PDT) MIME-Version: 1.0 References: <20230629082032.3481237-1-guoren@kernel.org> <2ab8ca7c-a648-f73c-1815-086274af6013@ghiti.fr> <41be0796-c884-bffa-8b3b-8b2da1cc2709@ghiti.fr> In-Reply-To: <41be0796-c884-bffa-8b3b-8b2da1cc2709@ghiti.fr> From: Guo Ren Date: Sun, 9 Jul 2023 21:40:00 +0800 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] riscv: pageattr: Fixup synchronization problem between init_mm and active_mm To: Alexandre Ghiti Cc: palmer@rivosinc.com, Paul Walmsley , zong.li@sifive.com, atishp@atishpatra.org, jszhang@kernel.org, bjorn@kernel.org, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, Guo Ren X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230709_064017_493976_9C977562 X-CRM114-Status: GOOD ( 61.43 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gV2VkLCBKdWwgNSwgMjAyMyBhdCA4OjA24oCvUE0gQWxleGFuZHJlIEdoaXRpIDxhbGV4QGdo aXRpLmZyPiB3cm90ZToKPgo+ICsgZml4ZWQgUGF1bCdzIGFkZHJlc3MKPgo+Cj4gT24gMDUvMDcv MjAyMyAxMToxNSwgR3VvIFJlbiB3cm90ZToKPiA+IE9uIFdlZCwgSnVsIDUsIDIwMjMgYXQgMzow MeKAr1BNIEFsZXhhbmRyZSBHaGl0aSA8YWxleEBnaGl0aS5mcj4gd3JvdGU6Cj4gPj4KPiA+PiBP biAwNC8wNy8yMDIzIDA0OjI1LCBHdW8gUmVuIHdyb3RlOgo+ID4+PiBPbiBNb24sIEp1bCAzLCAy MDIzIGF0IDY6MTfigK9QTSBBbGV4YW5kcmUgR2hpdGkgPGFsZXhAZ2hpdGkuZnI+IHdyb3RlOgo+ ID4+Pj4gSGkgR3VvLAo+ID4+Pj4KPiA+Pj4+IE9uIDI5LzA2LzIwMjMgMTA6MjAsIGd1b3JlbkBr ZXJuZWwub3JnIHdyb3RlOgo+ID4+Pj4+IEZyb206IEd1byBSZW4gPGd1b3JlbkBsaW51eC5hbGli YWJhLmNvbT4KPiA+Pj4+Pgo+ID4+Pj4+IFRoZSBtYWNoaW5lX2tleGVjKCkgdXNlcyBzZXRfbWVt b3J5X3ggdG8gYWRkIHRoZSBleGVjdXRhYmxlIGF0dHJpYnV0ZSB0byB0aGUKPiA+Pj4+PiBwYWdl IHRhYmxlIGVudHJ5IG9mIGNvbnRyb2xfY29kZV9idWZmZXIuIEl0IG9ubHkgbW9kaWZpZXMgdGhl IGluaXRfbW0gYnV0IG5vdAo+ID4+Pj4+IHRoZSBjdXJyZW50LT5hY3RpdmVfbW0uIFRoZSBjdXJy ZW50IGtleGVjIHByb2Nlc3Mgd29uJ3QgdXNlIGluaXRfbW0gZGlyZWN0bHksCj4gPj4+Pj4gYW5k IGl0IGRlcGVuZHMgb24gbWlub3JfcGFnZWZhdWx0LCB3aGljaCBpcyByZW1vdmVkIGJ5IGNvbW1p dCA3ZDMzMzJiZTAxMWU0Cj4gPj4+PiBJcyB0aGUgcmVtb3ZhbCBvZiBtaW5vcl9wYWdlZmF1bHQg YW4gaXNzdWU/IEknbSBub3Qgc3VyZSBJIHVuZGVyc3RhbmQKPiA+Pj4+IHRoaXMgcGFydCBvZiB0 aGUgY2hhbmdlbG9nLgo+ID4+PiBJIHVzZSB0d28gZGlmZmVyZW50IHdvcmstYXJvdW5kIHBhdGNo ZXMgdG8gYW5zd2VyIHlvdXIgcXVlc3Rpb246Cj4gPj4+IDFzdDoKPiA+Pj4gLS0tLS0KPiA+Pj4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvbW0vZmF1bHQuYyBiL2FyY2gvcmlzY3YvbW0vZmF1bHQu Ywo+ID4+PiBpbmRleCA3MDVkNjNhNTlhZWMuLmI4YjIwMGM4MTYwNiAxMDA2NDQKPiA+Pj4gLS0t IGEvYXJjaC9yaXNjdi9tbS9mYXVsdC5jCj4gPj4+ICsrKyBiL2FyY2gvcmlzY3YvbW0vZmF1bHQu Ywo+ID4+PiBAQCAtMjQ5LDcgKzI0OSw3IEBAIHZvaWQgaGFuZGxlX3BhZ2VfZmF1bHQoc3RydWN0 IHB0X3JlZ3MgKnJlZ3MpCj4gPj4+ICogb25seSBjb3B5IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRo ZSBtYXN0ZXIgcGFnZSB0YWJsZSwKPiA+Pj4gKiBub3RoaW5nIG1vcmUuCj4gPj4+ICovCj4gPj4+ IC0gaWYgKHVubGlrZWx5KChhZGRyID49IFZNQUxMT0NfU1RBUlQpICYmIChhZGRyIDwgVk1BTExP Q19FTkQpKSkgewo+ID4+PiArIGlmICh1bmxpa2VseShhZGRyID49IDB4ODAwMDAwMDAwMDAwMDAw MFVMKSkgewo+ID4+PiB2bWFsbG9jX2ZhdWx0KHJlZ3MsIGNvZGUsIGFkZHIpOwo+ID4+PiByZXR1 cm47Cj4gPj4+IH0KPiA+Pj4gLS0tLS0tCj4gPj4+Cj4gPj4+IDJuZDoKPiA+Pj4gLS0tLS0tCj4g Pj4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L21tL2luaXQuYyBiL2FyY2gvcmlzY3YvbW0vaW5p dC5jCj4gPj4+IGluZGV4IDhlNjVmMGE5NTNlNS4uMjcwZjUwODUyODg2IDEwMDY0NAo+ID4+PiAt LS0gYS9hcmNoL3Jpc2N2L21tL2luaXQuYwo+ID4+PiArKysgYi9hcmNoL3Jpc2N2L21tL2luaXQu Ywo+ID4+PiBAQCAtMTM4Nyw3ICsxMzg3LDcgQEAgc3RhdGljIHZvaWQgX19pbml0IGNyZWF0ZV9s aW5lYXJfbWFwcGluZ19wYWdlX3RhYmxlKHZvaWQpCj4gPj4+IGlmIChlbmQgPj0gX19wYShQQUdF X09GRlNFVCkgKyBtZW1vcnlfbGltaXQpCj4gPj4+IGVuZCA9IF9fcGEoUEFHRV9PRkZTRVQpICsg bWVtb3J5X2xpbWl0Owo+ID4+Pgo+ID4+PiAtIGNyZWF0ZV9saW5lYXJfbWFwcGluZ19yYW5nZShz dGFydCwgZW5kLCAwKTsKPiA+Pj4gKyBjcmVhdGVfbGluZWFyX21hcHBpbmdfcmFuZ2Uoc3RhcnQs IGVuZCwgUE1EX1NJWkUpOwo+ID4+PiB9Cj4gPj4+Cj4gPj4+ICNpZmRlZiBDT05GSUdfU1RSSUNU X0tFUk5FTF9SV1gKPiA+Pj4gLS0tLS0KPiA+Pj4KPiA+Pj4gVGhlIHJlbW92YWwgb2YgbWlub3Jf cGFnZWZhdWx0IGNvdWxkIGJlIGFuIGlzc3VlLCBidXQgaW4gdGhpcyBjYXNlCj4gPj4+IGl0J3Mg dGhlIFZNQUxMT0NfU1RBUlQvRU5EIHdoaWNoIHByZXZlbnRzIHRoZSBtaW5vcl9wYWdlZmF1bHQg YXQKPiA+Pj4gZmlyc3QuIEkgZGlkbid0IHNheSBjb21taXQgN2QzMzMyYmUwMTFlNCBpcyB0aGUg cHJvYmxlbS4KPiA+Pgo+ID4+IFNvcnJ5IEkgc3RpbGwgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IHlv dSBtZWFuIGhlcmUgYW5kIHdoeSB5b3UgbWVudGlvbgo+ID4+IHRoZSBtaW5vciBwYWdlZmF1bHQs IGNvdWxkIHlvdSBleHBsYWluIGFnYWluIHBsZWFzZT8KPiA+Pgo+ID4+Cj4gPj4+Pj4gKCJyaXNj djogbW06IFByZS1hbGxvY2F0ZSBQR0QgZW50cmllcyBmb3Igdm1hbGxvYy9tb2R1bGVzIGFyZWEi KSBvZiA2NEJJVC4gU28sCj4gPj4+Pj4gd2hlbiBpdCBtZXQgcHVkIG1hcHBpbmcgb24gYW4gTU1V X1NWMzkgbWFjaGluZSwgaXQgY2F1c2VkIHRoZSBmb2xsb3dpbmc6Cj4gPj4+Pj4KPiA+Pj4+PiAg ICAga2V4ZWNfY29yZTogU3RhcnRpbmcgbmV3IGtlcm5lbAo+ID4+Pj4+ICAgICBXaWxsIGNhbGwg bmV3IGtlcm5lbCBhdCAwMDMwMDAwMCBmcm9tIGhhcnQgaWQgMAo+ID4+Pj4+ICAgICBGRFQgaW1h Z2UgYXQgNzQ3YzcwMDAKPiA+Pj4+PiAgICAgQnllLi4uCj4gPj4+Pj4gICAgIFVuYWJsZSB0byBo YW5kbGUga2VybmVsIHBhZ2luZyByZXF1ZXN0IGF0IHZpcnR1YWwgYWRkcmVzcyBmZmZmZmZkYTIz YjBkMDAwCj4gPj4+Pj4gICAgIE9vcHMgWyMxXQo+ID4+Pj4+ICAgICBNb2R1bGVzIGxpbmtlZCBp bjoKPiA+Pj4+PiAgICAgQ1BVOiAwIFBJRDogNTMgQ29tbTogdWluaXQgTm90IHRhaW50ZWQgNi40 LjAtcmM2ICMxNQo+ID4+Pj4+ICAgICBIYXJkd2FyZSBuYW1lOiBTb3BoZ28gTWFuZ28gKERUKQo+ ID4+Pj4+ICAgICBlcGMgOiAweGZmZmZmZmRhMjNiMGQwMDAKPiA+Pj4+PiAgICAgIHJhIDogbWFj aGluZV9rZXhlYysweGE2LzB4YjAKPiA+Pj4+PiAgICAgZXBjIDogZmZmZmZmZGEyM2IwZDAwMCBy YSA6IGZmZmZmZmZmODAwMDgyNzIgc3AgOiBmZmZmZmZjODBjMTczZDEwCj4gPj4+Pj4gICAgICBn cCA6IGZmZmZmZmZmODE1MGUxZTAgdHAgOiBmZmZmZmZkOTA3M2QyYzQwIHQwIDogMDAwMDAwMDAw MDAwMDAwMAo+ID4+Pj4+ICAgICAgdDEgOiAwMDAwMDAwMDAwMDAwMDQyIHQyIDogNjU2NzYxNmQ2 OTIwNTQ0NCBzMCA6IGZmZmZmZmM4MGMxNzNkNTAKPiA+Pj4+PiAgICAgIHMxIDogZmZmZmZmZDkw NzZjNDgwMCBhMCA6IGZmZmZmZmQ5MDc2YzQ4MDAgYTEgOiAwMDAwMDAwMDAwMzAwMDAwCj4gPj4+ Pj4gICAgICBhMiA6IDAwMDAwMDAwNzQ3YzcwMDAgYTMgOiAwMDAwMDAwMDAwMDAwMDAwIGE0IDog ZmZmZmZmZDgwMDAwMDAwMAo+ID4+Pj4+ICAgICAgYTUgOiAwMDAwMDAwMDAwMDAwMDAwIGE2IDog ZmZmZmZmZDkwMzYxOWM0MCBhNyA6IGZmZmZmZmZmZmZmZmZmZmYKPiA+Pj4+PiAgICAgIHMyIDog ZmZmZmZmZGEyM2IwZDAwMCBzMyA6IDAwMDAwMDAwMDAzMDAwMDAgczQgOiAwMDAwMDAwMDc0N2M3 MDAwCj4gPj4+Pj4gICAgICBzNSA6IDAwMDAwMDAwMDAwMDAwMDAgczYgOiAwMDAwMDAwMDAwMDAw MDAwIHM3IDogMDAwMDAwMDAwMDAwMDAwMAo+ID4+Pj4+ICAgICAgczggOiAwMDAwMDAwMDAwMDAw MDAwIHM5IDogMDAwMDAwMDAwMDAwMDAwMCBzMTA6IDAwMDAwMDAwMDAwMDAwMDAKPiA+Pj4+PiAg ICAgIHMxMTogMDAwMDAwM2Y5NDAwMDFhMCB0MyA6IGZmZmZmZmZmODE1MzUxYWYgdDQgOiBmZmZm ZmZmZjgxNTM1MWFmCj4gPj4+Pj4gICAgICB0NSA6IGZmZmZmZmZmODE1MzUxYjAgdDYgOiBmZmZm ZmZjODBjMTczYjUwCj4gPj4+Pj4gICAgIHN0YXR1czogMDAwMDAwMDIwMDAwMDEwMCBiYWRhZGRy OiBmZmZmZmZkYTIzYjBkMDAwIGNhdXNlOiAwMDAwMDAwMDAwMDAwMDBjCj4gPj4+Pj4KPiA+Pj4+ PiBZZXMsIFVzaW5nIHNldF9tZW1vcnlfeCBBUEkgYWZ0ZXIgYm9vdCBoYXMgdGhlIGxpbWl0YXRp b24sIGFuZCBhdCBsZWFzdCB3ZQo+ID4+Pj4+IHNob3VsZCBzeW5jaHJvbml6ZSB0aGUgY3VycmVu dC0+YWN0aXZlX21tIHRvIGZpeCB0aGUgcHJvYmxlbS4KPiA+Pj4+Pgo+ID4+Pj4+IEZpeGVzOiBk M2FiMzMyYTUwMjEgKCJyaXNjdjogYWRkIEFSQ0hfSEFTX1NFVF9NRU1PUlkgc3VwcG9ydCIpCj4g Pj4+Pj4gU2lnbmVkLW9mZi1ieTogR3VvIFJlbiA8Z3VvcmVuQGxpbnV4LmFsaWJhYmEuY29tPgo+ ID4+Pj4+IFNpZ25lZC1vZmYtYnk6IEd1byBSZW4gPGd1b3JlbkBrZXJuZWwub3JnPgo+ID4+Pj4+ IC0tLQo+ID4+Pj4+ICAgICBhcmNoL3Jpc2N2L21tL3BhZ2VhdHRyLmMgfCA3ICsrKysrKysKPiA+ Pj4+PiAgICAgMSBmaWxlIGNoYW5nZWQsIDcgaW5zZXJ0aW9ucygrKQo+ID4+Pj4+Cj4gPj4+Pj4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvbW0vcGFnZWF0dHIuYyBiL2FyY2gvcmlzY3YvbW0vcGFn ZWF0dHIuYwo+ID4+Pj4+IGluZGV4IGVhM2Q2MWRlMDY1Yi4uMjNkMTY5YzRlZTgxIDEwMDY0NAo+ ID4+Pj4+IC0tLSBhL2FyY2gvcmlzY3YvbW0vcGFnZWF0dHIuYwo+ID4+Pj4+ICsrKyBiL2FyY2gv cmlzY3YvbW0vcGFnZWF0dHIuYwo+ID4+Pj4+IEBAIC0xMjMsNiArMTIzLDEzIEBAIHN0YXRpYyBp bnQgX19zZXRfbWVtb3J5KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzLCBwZ3Byb3Rf dCBzZXRfbWFzaywKPiA+Pj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Jm1hc2tzKTsKPiA+Pj4+PiAgICAgICAgIG1tYXBfd3JpdGVfdW5sb2NrKCZpbml0X21tKTsKPiA+ Pj4+Pgo+ID4+Pj4+ICsgICAgIGlmIChjdXJyZW50LT5hY3RpdmVfbW0gIT0gJmluaXRfbW0pIHsK PiA+Pj4+PiArICAgICAgICAgICAgIG1tYXBfd3JpdGVfbG9jayhjdXJyZW50LT5hY3RpdmVfbW0p Owo+ID4+Pj4+ICsgICAgICAgICAgICAgcmV0ID0gIHdhbGtfcGFnZV9yYW5nZV9ub3ZtYShjdXJy ZW50LT5hY3RpdmVfbW0sIHN0YXJ0LCBlbmQsCj4gPj4+Pj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZwYWdlYXR0cl9vcHMsIE5VTEwsICZtYXNrcyk7Cj4gPj4+ Pj4gKyAgICAgICAgICAgICBtbWFwX3dyaXRlX3VubG9jayhjdXJyZW50LT5hY3RpdmVfbW0pOwo+ ID4+Pj4+ICsgICAgIH0KPiA+Pj4+PiArCj4gPj4+Pj4gICAgICAgICBmbHVzaF90bGJfa2VybmVs X3JhbmdlKHN0YXJ0LCBlbmQpOwo+ID4+Pj4+Cj4gPj4+Pj4gICAgICAgICByZXR1cm4gcmV0Owo+ ID4+Pj4gSSBkb24ndCB1bmRlcnN0YW5kOiBhbnkgcGFnZSB0YWJsZSBpbmhlcml0cyB0aGUgZW50 cmllcyBvZgo+ID4+Pj4gc3dhcHBlcl9wZ19kaXIgKHNlZSBwZ2RfYWxsb2MoKSksIHNvIGFueSBr ZXJuZWwgcGFnZSB0YWJsZSBlbnRyeSBpcwo+ID4+Pj4gImF1dG9tYXRpY2FsbHkiIHN5bmNocm9u aXplZCwgc28gd2h5IHNob3VsZCB3ZSBzeW5jaHJvbml6ZSBvbmUgNEsgZW50cnkKPiA+Pj4+IGV4 cGxpY2l0bHk/IEEgUEdEIGVudHJ5IHdvdWxkIG5lZWQgdG8gYmUgc3luY2VkLCBidXQgbm90IGEg UFRFIGVudHJ5Lgo+ID4+PiBUaGUgcHVycG9zZSBvZiB0aGUgc2Vjb25kIHdhbGtfcGFnZV9yYW5n ZV9ub3ZtYSgpIGlzIGZvciBwZ2QncyBlbnRyaWVzCj4gPj4+IHN5bmNocm9uaXphdGlvbi4gSSdt IGEgYml0IGxhenkgaGVyZSwgSSBhZ3JlZSwgaXQncyB1bm5lY2Vzc2FyeSB0bwo+ID4+PiB3cml0 ZSBsb3dlciBsZXZlbCBlbnRyaWVzIGFnYWluLiBTbyBJIHdvdWxkIHVzZSBhIHNpbXBsZSBwZ2Qg ZW50cmllcwo+ID4+PiBzeW5jaHJvbml6YXRpb24gZnJvbSB2bWFsbG9jX2ZhdWx0IGluIHRoZSBu ZXh0IHZlcnNpb24gb2YgcGF0Y2gsIGFsbAo+ID4+PiByaWdodD8KPiA+Pgo+ID4+IEJ1dCB2bWFs bG9jX2ZhdWx0IHdhcyByZW1vdmVkIGJ5IGNvbW1pdCA3ZDMzMzJiZTAxMWU0IGZvciBDT05GSUdf NjRCSVQsCj4gPj4gc28gSSBkb24ndCBnZXQgaXQ6IHdoeSB3b3VsZCB3ZSBuZWVkIHRvIHN5bmNo cm9uaXplIGEgUEdEIGVudHJ5IGluIHlvdXIKPiA+PiBjYXNlPyBXaGVyZSBkb2VzIHRoaXMgbmV3 IFBHRCBjb21lIGZyb20/IEFuZCB0aGUgdHJhcCBhZGRyZXNzIGlzCj4gPj4gZmZmZmZmZGEyM2Iw ZDAwMCwgd2hpY2ggbGllcyBpbiB0aGUgZGlyZWN0IG1hcHBpbmcsIHNvIHdoeSBkbyB5b3UKPiA+ PiBtZW50aW9uIHZtYWxsb2NfZmF1bHQgYXQgYWxsPwo+ID4gVGhlIG1hY2hpbmVfa2V4ZWMoKSB1 c2VzIHNldF9tZW1vcnlfeCB0byBtb2RpZnkgdGhlIGRpcmVjdCBtYXBwaW5nCj4gPiBhdHRyaWJ1 dGVzIGZyb20gUlcgdG8gUldYLiBCdXQgc2V0X21lbW9yeV94IG9ubHkgY2hhbmdlcyB0aGUgaW5p dF9tbSdzCj4gPiBhdHRyaWJ1dGVzLCBub3QgY3VycmVudC0+YWN0aXZlX21tLCBzbyB3aGVuIGtl eGVjIGp1bXBzIGludG8KPiA+IGNvbnRyb2xfYnVmZmVyLCB0aGUgaW5zdHJ1Y3Rpb24gcGFnZSBm YXVsdCBoYXBwZW5zLCBhbmQgdGhlcmUgaXMgbm8KPiA+IG1pbm9yX3BhZ2VmYXVsdCBmb3IgaXQs IHRoZW4gcGFuaWMuCj4gPgo+ID4gSSBmb3VuZCB0aGUgYnVnIG9uIGFuIE1NVV9zdjM5IG1hY2hp bmUsIGFuZCB0aGUgZGlyZWN0IG1hcHBpbmcgdXNlZCBhCj4gPiAxR0IgUFVELCB0aGUgcGdkIGVu dHJpZXMuIFRoaXMgcGF0Y2ggY291bGQgc29sdmUgdGhlIHByb2JsZW0gYnkKPiA+IHN5bmNocm9u aXppbmcgYSBQR0QgZW50cnkgYmV0d2VlbiBpbml0X21tIGFuZCBjdXJyZW50LT5hY3RpdmVfbW0u Cj4KPgo+IE9rIEkgZ2V0IGl0IG5vdywgdGhhbmtzLiBTbyBhIGZldyB0aG91Z2h0czoKPgo+IC0g dGhlIHRyYXAgYWRkcmVzcyBpcyBpbiB0aGUgbGluZWFyIG1hcHBpbmcsIHNvIHRoZXJlIHdvbid0 IGJlIGFueSBzeW5jCj4gaW4gdGhlIHRyYXAgaGFuZGxlci4gRXZlbiBpZiB3ZSBpbXBsZW1lbnRl ZCBzdWNoIGJlaGF2aW9yLCB3YWl0aW5nIGZvciBhCj4gZmF1bHQgdG8gc3luY2hyb25pemUgdGhv c2UgbWFwcGluZ3MgaXMgZXJyb3ItcHJvbmUgKHNlZSBjb21taXQKPiA3ZDMzMzJiZTAxMWU0KQo+ Cj4gLSB0aGlzIGlzIEZpeGVzOiAzMzM1MDY4Zjg3MjEgKCJyaXNjdjogVXNlIFBVRC9QNEQvUEdE IHBhZ2VzIGZvciB0aGUKPiBsaW5lYXIgbWFwcGluZyIpCj4KPiAtIHRoYXQgb25seSBoYXBwZW5z IGlmIHdlIHVzZSB0aGUgbGFyZ2VzdCBtYXBwaW5nIHBvc3NpYmxlIHNpemUgZm9yIHRoZQo+IGN1 cnJlbnQgbW9kZTogb25lIHNpbXBsZSBzb2x1dGlvbiBpcyB0byByZXN0cmljdCB0byB0aGUgc2Vj b25kIGxhcmdlc3QKPiBzaXplICgyTUIgZm9yIHN2MzksIDFHQiBmb3Igc3Y0OCwgNTEyR0IgZm9y IHN2NTcpLgo+Cj4gLSB5b3VyIHNvbHV0aW9uIG9ubHkgd29ya3MgaW4gdGhpcyBjYXNlLCBidXQg d2Ugc2hvdWxkIGZpeCB0aGUgbGFyZ2VyCj4gcHJvYmxlbTogd2UgbmVlZCB0byBzeW5jIGFsbCB0 aGUgcGFnZSB0YWJsZXMgaWYgc3VjaCB0aGluZ3MgaGFwcGVuLCBub3QKPiBqdXN0IHRoZSAiY2Fs bGluZyIgb25lLgo+Cj4gLSBzZXRfbWVtb3J5KiBjaGFuZ2luZyB0aGUgcHJvdGVjdGlvbiBvZiBh IHdob2xlIFBVRCBtYXBwaW5nIGZvciBhCj4gc2luZ2xlIHBhZ2UgaXMgYSBwcm9ibGVtOiBpZiB3 ZSBzZXRfbWVtb3J5X3JvKCkgYSBzaW5nbGUgcGFnZSwgd2UgZW5kIHVwCj4gd2l0aCBhIDFHQiBs aW5lYXIgbWFwcGluZyBzZXQgdG8gcmVhZCBvbmx5ICh3aGljaCB3aWxsIG9idmlvdXNseSBiZQo+ IHByb2JsZW1hdGljISkKPgo+IC0gY2FuIHdlIHJlYWxseSB1c2Ugc2V0X21lbW9yeSogb24gdGhl IGRpcmVjdCBtYXBwaW5nPyBNYXliZSB3ZSBzaG91bGQKPiBzaW1wbHkgbm90LCBhbmQgdGhlIHNv bHV0aW9uIGlzIHRvIGZpeCBtYWNoaW5lX2tleGVjKCkgc28gaXQgcmVtYXBzIHRoaXMKPiBwYWdl IG91dHNpZGUgdGhlIGxpbmVhciBtYXBwaW5nLgpPa2F5LCBJIGFncmVlIHRvIGxpbWl0IHVzYWdl IG9mIHNldF9tZW1vcnkqLiBBbmQgSSB3b3VsZCBsZXQKbWFjaGluZV9rZXhlYygpIHJlbWFwcyBj b250cm9sX2J1ZmZlcl9wYWdlICBpbiB0aGUgbmV4dCB2ZXJzaW9uIG9mCnBhdGNoIGluc3RlYWQg b2YgbW9kaWZpbmcgbGluZWFyIG1hcHBpbmcuCgo+Cj4gLSBhdCB0aGUgbW9tZW50LCB3ZSBkbyBu b3QgZGVhbCB3aXRoIHRoZSBsaW5lYXIgbWFwcGluZyBpbiBzZXRfbWVtb3J5Kgo+IChmb3IgZXhh bXBsZSwgd2hlbiB1c2VkIHdpdGggbW9kdWxlcywgd2UgcHJvdGVjdCB0aGUgbW9kdWxlIG1hcHBp bmcgaW4KPiB0aGUgdm1hbGxvYyByZWdpb24gYnV0IGRvbid0IGRvIGFueXRoaW5nIHdpdGggaXRz IGxpbmVhciBtYXBwaW5nIGFsaWFzLAo+IEkgaGF2ZSB0aGF0IG9uIG15IHRvZG8gbGlzdCBmb3Ig YSBtb21lbnQgbm93KS4KPgo+IFRoZSBiZXN0IHZlcnkgc2hvcnQtdGVybSBzb2x1dGlvbiB0byBt ZSBpcyB0byByZXN0cmljdCB0byB0aGUgc2Vjb25kCj4gbGFyZ2VzdCBzaXplIChlYXN5IHRvIGhh Y2sgdGhhdCBpbiBiZXN0X21hcF9zaXplKCkpLgo+Cj4gQW5kIHRvIG1lIHRoZSBsb25nIHRlcm0g c29sdXRpb24gaXMgdG8gc3BsaXQgdGhvc2UgbWFwcGluZ3M6IHRoYXQgZml4ZXMKPiBhbGwgdGhl IGlzc3VlcyBtZW50aW9uZWQgYWJvdmUgKyB0aGUgdGhpbmcgd2l0aCB0aGUgbW9kdWxlcyAoYnV0 IEkgaGF2ZQo+IHRvIGRpZyBhIGJpdCBtb3JlLCBubyBvdGhlciBhcmNocyBzZWVtcyB0byBkbyB0 aGF0KS4KPgo+IFRoYXQncyBpbnRlcmVzdGluZywgdGhhbmtzIGZvciBicmluZ2luZyB0aGF0IHVw LCBsZXQgbWUga25vdyB3aGF0IHlvdQo+IHRoaW5rLCBJJ2xsIGtlZXAgZGlnZ2luZyEKPgo+IEFs ZXgKPgo+Cj4gPgo+ID4+IFNvcnJ5IGlmIEknbSBtaXNzaW5nIHNvbWV0aGluZywgaG9wZSB5b3Ug Y2FuIGNsYXJpZnkgdGhpbmdzIQo+ID4+Cj4gPj4gVGhhbmtzLAo+ID4+Cj4gPj4gQWxleAo+ID4+ Cj4gPj4KPiA+Pj4KPiA+Pj4gLS0KPiA+Pj4gQmVzdCBSZWdhcmRzCj4gPj4+ICAgIEd1byBSZW4K PiA+Pj4KPiA+Pj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KPiA+Pj4gbGludXgtcmlzY3YgbWFpbGluZyBsaXN0Cj4gPj4+IGxpbnV4LXJpc2N2QGxpc3Rz LmluZnJhZGVhZC5vcmcKPiA+Pj4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9s aXN0aW5mby9saW51eC1yaXNjdgo+ID4KPiA+CgoKCi0tIApCZXN0IFJlZ2FyZHMKIEd1byBSZW4K Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJp c2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK