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 2BC6FEB64DD for ; Mon, 31 Jul 2023 03:25:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229618AbjGaDZV (ORCPT ); Sun, 30 Jul 2023 23:25:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50902 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229454AbjGaDZS (ORCPT ); Sun, 30 Jul 2023 23:25:18 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A4DBE185; Sun, 30 Jul 2023 20:25:16 -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)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 13A9B60E08; Mon, 31 Jul 2023 03:25:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BB690C433C8; Mon, 31 Jul 2023 03:25:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690773915; bh=NyOtGJ9ScDpXnEDjAz0B65c6xIYaJN3eVi8UQRLZtCA=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=FZUJZ433YqwFs7OmHN5j88kuYjtPB27QdQWjHHCqJ/Q17SWW13ciuHxFd64qhh2QT KCfdS0ORDnAMzK1dFk3ZbWvVLocUkCqbZY2ZZfO4zw5+xWP9P9cTdELes0EUpVutE9 qajPKK7NRr2OnJPD6T9Npv7Yj798EdUl0Ss+J9wikL/+xtHV9JQ0FSlBfaGCikT+8N Kf4MFDP3xeh6TY3KQmJkt4Fj+ZwBV4CmS9EqY4YbaAUkWccy7Z5yWr1fQ4yU//EjEK nOQU5ldm/+CHWBZMvyIgCkn5Bh1+GeifUtS5ZDWni/yENXYvbMyKipYlqbV0af3Nuy uwRcwcKP9d6Nw== Date: Sun, 30 Jul 2023 23:25:03 -0400 From: Guo Ren To: Alexandre Ghiti , palmer@rivosinc.com Cc: paul.walmsley@sifive.com, zong.li@sifive.com, atishp@atishpatra.org, jszhang@kernel.org, bjorn@kernel.org, xingxg2008@163.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, Guo Ren , Alexandre Ghiti Subject: Re: [PATCH V4] riscv: kexec: Fixup synchronization problem between init_mm and active_mm Message-ID: References: <20230714103659.3146949-1-guoren@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-arch@vger.kernel.org On Fri, Jul 21, 2023 at 08:14:42PM -0400, Guo Ren wrote: > On Thu, Jul 20, 2023 at 4:28 AM Alexandre Ghiti wrote: > > > > > > On 18/07/2023 14:30, Guo Ren wrote: > > > On Mon, Jul 17, 2023 at 9:17 PM Alexandre Ghiti wrote: > > >> > > >> On 14/07/2023 12:36, guoren@kernel.org wrote: > > >>> From: Guo Ren > > >>> > > >>> The machine_kexec() uses set_memory_x to modify the direct mapping > > >>> attributes from RW to RWX. The current implementation of set_memory_x > > >>> does not split hugepages in the linear mapping and then when a PGD > > >>> mapping is used, the whole PGD is marked as executable. But changing > > >>> the permissions at the PGD level must be propagated to all the page > > >>> tables. When kexec jumps into control_buffer, the instruction page > > >>> fault happens, and there is no minor_pagefault for it, then panic. > > >>> > > >>> The bug is found on an MMU_sv39 machine, and the direct mapping used a > > >>> 1GB PUD, the pgd entries. Here is the bug output: > > >>> > > >>> 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 ffffffda23b0d000 > > >>> 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 : ffffffc80c173d10 > > >>> gp : ffffffff8150e1e0 tp : ffffffd9073d2c40 t0 : 0000000000000000 > > >>> t1 : 0000000000000042 t2 : 6567616d69205444 s0 : ffffffc80c173d50 > > >>> s1 : ffffffd9076c4800 a0 : ffffffd9076c4800 a1 : 0000000000300000 > > >>> a2 : 00000000747c7000 a3 : 0000000000000000 a4 : ffffffd800000000 > > >>> a5 : 0000000000000000 a6 : ffffffd903619c40 a7 : ffffffffffffffff > > >>> s2 : ffffffda23b0d000 s3 : 0000000000300000 s4 : 00000000747c7000 > > >>> s5 : 0000000000000000 s6 : 0000000000000000 s7 : 0000000000000000 > > >>> s8 : 0000000000000000 s9 : 0000000000000000 s10: 0000000000000000 > > >>> s11: 0000003f940001a0 t3 : ffffffff815351af t4 : ffffffff815351af > > >>> t5 : ffffffff815351b0 t6 : ffffffc80c173b50 > > >>> status: 0000000200000100 badaddr: ffffffda23b0d000 cause: 000000000000000c > > >>> > > >>> Given the current flaw in the set_memory_x implementation, the simplest > > >>> solution is to fix machine_kexec() to remap control code page outside > > >>> the linear mapping. Because the control code buffer was moved from the > > >>> direct mapping area to the vmalloc location, we need an additional > > >>> va_va_offset to fix up va_pa_offset. > > >>> > > >>> Fixes: 3335068f8721 ("riscv: Use PUD/P4D/PGD pages for the linear mapping") > > >>> Reviewed-by: Alexandre Ghiti > > >>> Reported-by: Xing XiaoGuang > > >>> Signed-off-by: Guo Ren > > >>> Signed-off-by: Guo Ren > > >>> --- > > >>> Changelog: > > >>> V4: > > >>> - Fixup va_pa_offset with additional va_va_offset. > > >>> - Add Reported-by tag. > > >>> > > >>> V3: > > >>> - Resume set_memory_x to set the _PAGE_EXEC attribute > > >>> - Optimize the commit log with Alexandre advice > > >>> > > >>> V2: > > >>> - Use vm_map_ram instead of modifying set_memory_x > > >>> - Correct Fixes tag > > >>> --- > > >>> arch/riscv/include/asm/kexec.h | 1 + > > >>> arch/riscv/kernel/machine_kexec.c | 18 +++++++++++++++--- > > >>> 2 files changed, 16 insertions(+), 3 deletions(-) > > >>> > > >>> diff --git a/arch/riscv/include/asm/kexec.h b/arch/riscv/include/asm/kexec.h > > >>> index 2b56769cb530..17456e91476e 100644 > > >>> --- a/arch/riscv/include/asm/kexec.h > > >>> +++ b/arch/riscv/include/asm/kexec.h > > >>> @@ -41,6 +41,7 @@ crash_setup_regs(struct pt_regs *newregs, > > >>> struct kimage_arch { > > >>> void *fdt; /* For CONFIG_KEXEC_FILE */ > > >>> unsigned long fdt_addr; > > >>> + void *control_code_buffer; > > >>> }; > > >>> > > >>> extern const unsigned char riscv_kexec_relocate[]; > > >>> diff --git a/arch/riscv/kernel/machine_kexec.c b/arch/riscv/kernel/machine_kexec.c > > >>> index 2d139b724bc8..60c1ef3c2232 100644 > > >>> --- a/arch/riscv/kernel/machine_kexec.c > > >>> +++ b/arch/riscv/kernel/machine_kexec.c > > >>> @@ -86,7 +86,14 @@ machine_kexec_prepare(struct kimage *image) > > >>> > > >>> /* Copy the assembler code for relocation to the control page */ > > >>> if (image->type != KEXEC_TYPE_CRASH) { > > >>> - control_code_buffer = page_address(image->control_code_page); > > >>> + control_code_buffer = vm_map_ram(&image->control_code_page, > > >>> + KEXEC_CONTROL_PAGE_SIZE/PAGE_SIZE, > > >>> + NUMA_NO_NODE); > > >>> + if (control_code_buffer == NULL) { > > >>> + pr_err("Failed to vm_map control page\n"); > > >>> + return -ENOMEM; > > >>> + } > > >>> + > > >>> control_code_buffer_sz = page_size(image->control_code_page); > > >>> > > >>> if (unlikely(riscv_kexec_relocate_size > control_code_buffer_sz)) { > > >>> @@ -99,6 +106,8 @@ machine_kexec_prepare(struct kimage *image) > > >>> > > >>> /* Mark the control page executable */ > > >>> set_memory_x((unsigned long) control_code_buffer, 1); > > >>> + > > >>> + internal->control_code_buffer = control_code_buffer; > > >>> } > > >>> > > >>> return 0; > > >>> @@ -211,7 +220,10 @@ machine_kexec(struct kimage *image) > > >>> unsigned long this_cpu_id = __smp_processor_id(); > > >>> unsigned long this_hart_id = cpuid_to_hartid_map(this_cpu_id); > > >>> unsigned long fdt_addr = internal->fdt_addr; > > >>> - void *control_code_buffer = page_address(image->control_code_page); > > >>> + void *control_code_buffer = internal->control_code_buffer; > > >>> + unsigned long va_va_offset = > > >>> + (unsigned long) page_address(image->control_code_page) > > >>> + - (unsigned long) control_code_buffer; > > >>> riscv_kexec_method kexec_method = NULL; > > >>> > > >>> #ifdef CONFIG_SMP > > >>> @@ -234,6 +246,6 @@ machine_kexec(struct kimage *image) > > >>> /* Jump to the relocation code */ > > >>> pr_notice("Bye...\n"); > > >>> kexec_method(first_ind_entry, jump_addr, fdt_addr, > > >>> - this_hart_id, kernel_map.va_pa_offset); > > >>> + this_hart_id, kernel_map.va_pa_offset - va_va_offset); > > >>> unreachable(); > > >>> } > > >> > > >> I started working on the set_memory fix and the first thing to do is to > > >> prevent the use of PGD mapping, it's too cumbersome to propagate changes > > >> at this level: IIRC x86 keeps a list of page tables to go through > > >> whenever that happens, that's why Bjorn pre-allocated all the PGD > > >> entries to cover the vmalloc region. > > >> > > >> So, to me, the simple fix for this issue is to prevent the use of PGD > > >> mapping. What do you think? Does the following patch work? > > > The PGD mapping is necessary (especially for Sv32, Sv39), and it has > > > been solved under your first advice. I think limit set_memory_x usage > > > is the smart choice for now. > > > > > > If we use PGD mappings, we won't be able to change the protections or > > remove pages from the linear mapping as we don't have a means to > > synchronize all the page tables. Removing pages from the linear mapping > > is used for example for memfd_secret and certainly other things so that > > means using PGD mappings will break a few things. > > > > The benefits of PGD mappings for the linear mapping was not proven, and > We need PGD mappings for Sv32. liner mapping with 4KB would cause a > significant performance gap in the small core (memset stride with 4KB, > PTW with every store). > > > even if I agree we should do our best to keep the largest mapping > > possible just in case, implementing a page table synchronization seems > > very cumbersome (x86 does that though). > > > > I'm not opposed to your solution, but: Hi Alexandre & Palmer, This patch is about fixing the problem of kexec, not solving the larger scale of set_memory_x/pgd_mapping problems. And only limiting the changes in the control buffer page is also necessary. Kexec shouldn't modify direct mapping attributes. Here is the flow of sg2042: zsbl -> opensbi -> linux-boot (kexec boot next stage) -> linux (ubuntu/Fedora) Could we merge this patch first? Best Regards Guo Ren > > > > - either we remove the PGD mappings, and your problem is fixed, > This patch limits control_buffer_code into a 4KB page mapping entry. I > don't think they are the same solution, even you remove the PGD > mappings. > > > > > - or we keep PGD mappings, implement a page table synchronization, and > > your problem is fixed. > We need your synchronization, but not for this case. > > > > > And since we need to fix this larger problem, I don't see the point of > > this workaround. > This patch is for kexec. See title riscv: kexec: tag. > > And I don't think your larger problem needs to be fixed. I agree with > your first point that simply limit the usage of set_memory_x. > > > > > Thanks, > > > > Alex > > > > > > > > > > > > >> > > >> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c > > >> index 70fb31960b63..6dd12443bfa4 100644 > > >> --- a/arch/riscv/mm/init.c > > >> +++ b/arch/riscv/mm/init.c > > >> @@ -662,13 +662,12 @@ void __init create_pgd_mapping(pgd_t *pgdp, > > >> static uintptr_t __init best_map_size(phys_addr_t pa, uintptr_t va, > > >> phys_addr_t size) > > >> { > > >> - if (!(pa & (PGDIR_SIZE - 1)) && !(va & (PGDIR_SIZE - 1)) && size > > >> >= PGDIR_SIZE) > > >> - return PGDIR_SIZE; > > >> - > > >> - if (!(pa & (P4D_SIZE - 1)) && !(va & (P4D_SIZE - 1)) && size >= > > >> P4D_SIZE) > > >> + if (pgtable_l5_enabled && > > >> + !(pa & (P4D_SIZE - 1)) && !(va & (P4D_SIZE - 1)) && size >= > > >> P4D_SIZE) > > >> return P4D_SIZE; > > >> > > >> - if (!(pa & (PUD_SIZE - 1)) && !(va & (PUD_SIZE - 1)) && size >= > > >> PUD_SIZE) > > >> + if (pgtable_l4_enabled && > > >> + !(pa & (PUD_SIZE - 1)) && !(va & (PUD_SIZE - 1)) && size >= > > >> PUD_SIZE) > > >> return PUD_SIZE; > > >> > > >> if (!(pa & (PMD_SIZE - 1)) && !(va & (PMD_SIZE - 1)) && size >= > > >> PMD_SIZE) > > >> > > >> > > >> Thanks, > > >> > > >> Alex > > >> > > > > > > > -- > Best Regards > Guo Ren > > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv 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 21531C001DC for ; Mon, 31 Jul 2023 03:25:28 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=opbngritQxGK64nCnsySnG6sOVEBL4NIoZepDllypwg=; b=VVNeRtlQ1xgl5O 91DAPajJ6CParwiFYXM0k0KC6thSPTSf3RqFRFo5xbsRZAIAjGbQYQYHEtdoD6msyF120mYOU5f18 dqms2Myk0Up3KY83icpINB60xtgy6eojsSLFr+vf48BvKjBV9g+LO3vctKaapCRrRrs4Dy7gGHwHQ VmJR+FwWvI8jTwbQHEoTuTiE9NkqGre7RjQWVrap9E7GCQbJbgM4IU+VA7w3e02J42FOOUfb5zEEI mR7Lc5RmbQUTAnm01zEyeao0LZsF039Q1uTPXBMy57FFSJd5quZpnUbqXL6iXzDVt0GBH8MdPfYzb RubIkcXJC5o5NyxANg1w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qQJX6-00Dg3q-2j; Mon, 31 Jul 2023 03:25:20 +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 1qQJX2-00Dg2k-2w for linux-riscv@lists.infradead.org; Mon, 31 Jul 2023 03:25: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 106A560CEE; Mon, 31 Jul 2023 03:25:16 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BB690C433C8; Mon, 31 Jul 2023 03:25:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1690773915; bh=NyOtGJ9ScDpXnEDjAz0B65c6xIYaJN3eVi8UQRLZtCA=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=FZUJZ433YqwFs7OmHN5j88kuYjtPB27QdQWjHHCqJ/Q17SWW13ciuHxFd64qhh2QT KCfdS0ORDnAMzK1dFk3ZbWvVLocUkCqbZY2ZZfO4zw5+xWP9P9cTdELes0EUpVutE9 qajPKK7NRr2OnJPD6T9Npv7Yj798EdUl0Ss+J9wikL/+xtHV9JQ0FSlBfaGCikT+8N Kf4MFDP3xeh6TY3KQmJkt4Fj+ZwBV4CmS9EqY4YbaAUkWccy7Z5yWr1fQ4yU//EjEK nOQU5ldm/+CHWBZMvyIgCkn5Bh1+GeifUtS5ZDWni/yENXYvbMyKipYlqbV0af3Nuy uwRcwcKP9d6Nw== Date: Sun, 30 Jul 2023 23:25:03 -0400 From: Guo Ren To: Alexandre Ghiti , palmer@rivosinc.com Cc: paul.walmsley@sifive.com, zong.li@sifive.com, atishp@atishpatra.org, jszhang@kernel.org, bjorn@kernel.org, xingxg2008@163.com, linux-arch@vger.kernel.org, linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, Guo Ren , Alexandre Ghiti Subject: Re: [PATCH V4] riscv: kexec: Fixup synchronization problem between init_mm and active_mm Message-ID: References: <20230714103659.3146949-1-guoren@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230730_202517_064467_B22C4197 X-CRM114-Status: GOOD ( 60.59 ) 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 T24gRnJpLCBKdWwgMjEsIDIwMjMgYXQgMDg6MTQ6NDJQTSAtMDQwMCwgR3VvIFJlbiB3cm90ZToK PiBPbiBUaHUsIEp1bCAyMCwgMjAyMyBhdCA0OjI44oCvQU0gQWxleGFuZHJlIEdoaXRpIDxhbGV4 QGdoaXRpLmZyPiB3cm90ZToKPiA+Cj4gPgo+ID4gT24gMTgvMDcvMjAyMyAxNDozMCwgR3VvIFJl biB3cm90ZToKPiA+ID4gT24gTW9uLCBKdWwgMTcsIDIwMjMgYXQgOToxN+KAr1BNIEFsZXhhbmRy ZSBHaGl0aSA8YWxleEBnaGl0aS5mcj4gd3JvdGU6Cj4gPiA+Pgo+ID4gPj4gT24gMTQvMDcvMjAy MyAxMjozNiwgZ3VvcmVuQGtlcm5lbC5vcmcgd3JvdGU6Cj4gPiA+Pj4gRnJvbTogR3VvIFJlbiA8 Z3VvcmVuQGxpbnV4LmFsaWJhYmEuY29tPgo+ID4gPj4+Cj4gPiA+Pj4gVGhlIG1hY2hpbmVfa2V4 ZWMoKSB1c2VzIHNldF9tZW1vcnlfeCB0byBtb2RpZnkgdGhlIGRpcmVjdCBtYXBwaW5nCj4gPiA+ Pj4gYXR0cmlidXRlcyBmcm9tIFJXIHRvIFJXWC4gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24g b2Ygc2V0X21lbW9yeV94Cj4gPiA+Pj4gZG9lcyBub3Qgc3BsaXQgaHVnZXBhZ2VzIGluIHRoZSBs aW5lYXIgbWFwcGluZyBhbmQgdGhlbiB3aGVuIGEgUEdECj4gPiA+Pj4gbWFwcGluZyBpcyB1c2Vk LCB0aGUgd2hvbGUgUEdEIGlzIG1hcmtlZCBhcyBleGVjdXRhYmxlLiBCdXQgY2hhbmdpbmcKPiA+ ID4+PiB0aGUgcGVybWlzc2lvbnMgYXQgdGhlIFBHRCBsZXZlbCBtdXN0IGJlIHByb3BhZ2F0ZWQg dG8gYWxsIHRoZSBwYWdlCj4gPiA+Pj4gdGFibGVzLiBXaGVuIGtleGVjIGp1bXBzIGludG8gY29u dHJvbF9idWZmZXIsIHRoZSBpbnN0cnVjdGlvbiBwYWdlCj4gPiA+Pj4gZmF1bHQgaGFwcGVucywg YW5kIHRoZXJlIGlzIG5vIG1pbm9yX3BhZ2VmYXVsdCBmb3IgaXQsIHRoZW4gcGFuaWMuCj4gPiA+ Pj4KPiA+ID4+PiBUaGUgYnVnIGlzIGZvdW5kIG9uIGFuIE1NVV9zdjM5IG1hY2hpbmUsIGFuZCB0 aGUgZGlyZWN0IG1hcHBpbmcgdXNlZCBhCj4gPiA+Pj4gMUdCIFBVRCwgdGhlIHBnZCBlbnRyaWVz LiBIZXJlIGlzIHRoZSBidWcgb3V0cHV0Ogo+ID4gPj4+Cj4gPiA+Pj4gICAga2V4ZWNfY29yZTog U3RhcnRpbmcgbmV3IGtlcm5lbAo+ID4gPj4+ICAgIFdpbGwgY2FsbCBuZXcga2VybmVsIGF0IDAw MzAwMDAwIGZyb20gaGFydCBpZCAwCj4gPiA+Pj4gICAgRkRUIGltYWdlIGF0IDc0N2M3MDAwCj4g PiA+Pj4gICAgQnllLi4uCj4gPiA+Pj4gICAgVW5hYmxlIHRvIGhhbmRsZSBrZXJuZWwgcGFnaW5n IHJlcXVlc3QgYXQgdmlydHVhbCBhZGRyZXNzIGZmZmZmZmRhMjNiMGQwMDAKPiA+ID4+PiAgICBP b3BzIFsjMV0KPiA+ID4+PiAgICBNb2R1bGVzIGxpbmtlZCBpbjoKPiA+ID4+PiAgICBDUFU6IDAg UElEOiA1MyBDb21tOiB1aW5pdCBOb3QgdGFpbnRlZCA2LjQuMC1yYzYgIzE1Cj4gPiA+Pj4gICAg SGFyZHdhcmUgbmFtZTogU29waGdvIE1hbmdvIChEVCkKPiA+ID4+PiAgICBlcGMgOiAweGZmZmZm ZmRhMjNiMGQwMDAKPiA+ID4+PiAgICAgcmEgOiBtYWNoaW5lX2tleGVjKzB4YTYvMHhiMAo+ID4g Pj4+ICAgIGVwYyA6IGZmZmZmZmRhMjNiMGQwMDAgcmEgOiBmZmZmZmZmZjgwMDA4MjcyIHNwIDog ZmZmZmZmYzgwYzE3M2QxMAo+ID4gPj4+ICAgICBncCA6IGZmZmZmZmZmODE1MGUxZTAgdHAgOiBm ZmZmZmZkOTA3M2QyYzQwIHQwIDogMDAwMDAwMDAwMDAwMDAwMAo+ID4gPj4+ICAgICB0MSA6IDAw MDAwMDAwMDAwMDAwNDIgdDIgOiA2NTY3NjE2ZDY5MjA1NDQ0IHMwIDogZmZmZmZmYzgwYzE3M2Q1 MAo+ID4gPj4+ICAgICBzMSA6IGZmZmZmZmQ5MDc2YzQ4MDAgYTAgOiBmZmZmZmZkOTA3NmM0ODAw IGExIDogMDAwMDAwMDAwMDMwMDAwMAo+ID4gPj4+ICAgICBhMiA6IDAwMDAwMDAwNzQ3YzcwMDAg YTMgOiAwMDAwMDAwMDAwMDAwMDAwIGE0IDogZmZmZmZmZDgwMDAwMDAwMAo+ID4gPj4+ICAgICBh NSA6IDAwMDAwMDAwMDAwMDAwMDAgYTYgOiBmZmZmZmZkOTAzNjE5YzQwIGE3IDogZmZmZmZmZmZm ZmZmZmZmZgo+ID4gPj4+ICAgICBzMiA6IGZmZmZmZmRhMjNiMGQwMDAgczMgOiAwMDAwMDAwMDAw MzAwMDAwIHM0IDogMDAwMDAwMDA3NDdjNzAwMAo+ID4gPj4+ICAgICBzNSA6IDAwMDAwMDAwMDAw MDAwMDAgczYgOiAwMDAwMDAwMDAwMDAwMDAwIHM3IDogMDAwMDAwMDAwMDAwMDAwMAo+ID4gPj4+ ICAgICBzOCA6IDAwMDAwMDAwMDAwMDAwMDAgczkgOiAwMDAwMDAwMDAwMDAwMDAwIHMxMDogMDAw MDAwMDAwMDAwMDAwMAo+ID4gPj4+ICAgICBzMTE6IDAwMDAwMDNmOTQwMDAxYTAgdDMgOiBmZmZm ZmZmZjgxNTM1MWFmIHQ0IDogZmZmZmZmZmY4MTUzNTFhZgo+ID4gPj4+ICAgICB0NSA6IGZmZmZm ZmZmODE1MzUxYjAgdDYgOiBmZmZmZmZjODBjMTczYjUwCj4gPiA+Pj4gICAgc3RhdHVzOiAwMDAw MDAwMjAwMDAwMTAwIGJhZGFkZHI6IGZmZmZmZmRhMjNiMGQwMDAgY2F1c2U6IDAwMDAwMDAwMDAw MDAwMGMKPiA+ID4+Pgo+ID4gPj4+IEdpdmVuIHRoZSBjdXJyZW50IGZsYXcgaW4gdGhlIHNldF9t ZW1vcnlfeCBpbXBsZW1lbnRhdGlvbiwgdGhlIHNpbXBsZXN0Cj4gPiA+Pj4gc29sdXRpb24gaXMg dG8gZml4IG1hY2hpbmVfa2V4ZWMoKSB0byByZW1hcCBjb250cm9sIGNvZGUgcGFnZSBvdXRzaWRl Cj4gPiA+Pj4gdGhlIGxpbmVhciBtYXBwaW5nLiBCZWNhdXNlIHRoZSBjb250cm9sIGNvZGUgYnVm ZmVyIHdhcyBtb3ZlZCBmcm9tIHRoZQo+ID4gPj4+IGRpcmVjdCBtYXBwaW5nIGFyZWEgdG8gdGhl IHZtYWxsb2MgbG9jYXRpb24sIHdlIG5lZWQgYW4gYWRkaXRpb25hbAo+ID4gPj4+IHZhX3ZhX29m ZnNldCB0byBmaXggdXAgdmFfcGFfb2Zmc2V0Lgo+ID4gPj4+Cj4gPiA+Pj4gRml4ZXM6IDMzMzUw NjhmODcyMSAoInJpc2N2OiBVc2UgUFVEL1A0RC9QR0QgcGFnZXMgZm9yIHRoZSBsaW5lYXIgbWFw cGluZyIpCj4gPiA+Pj4gUmV2aWV3ZWQtYnk6IEFsZXhhbmRyZSBHaGl0aSA8YWxleGdoaXRpQHJp dm9zaW5jLmNvbT4KPiA+ID4+PiBSZXBvcnRlZC1ieTogWGluZyBYaWFvR3VhbmcgPHhpbmd4ZzIw MDhAMTYzLmNvbT4KPiA+ID4+PiBTaWduZWQtb2ZmLWJ5OiBHdW8gUmVuIDxndW9yZW5AbGludXgu YWxpYmFiYS5jb20+Cj4gPiA+Pj4gU2lnbmVkLW9mZi1ieTogR3VvIFJlbiA8Z3VvcmVuQGtlcm5l bC5vcmc+Cj4gPiA+Pj4gLS0tCj4gPiA+Pj4gQ2hhbmdlbG9nOgo+ID4gPj4+IFY0Ogo+ID4gPj4+ ICAgIC0gRml4dXAgdmFfcGFfb2Zmc2V0IHdpdGggYWRkaXRpb25hbCB2YV92YV9vZmZzZXQuCj4g PiA+Pj4gICAgLSBBZGQgUmVwb3J0ZWQtYnkgdGFnLgo+ID4gPj4+Cj4gPiA+Pj4gVjM6Cj4gPiA+ Pj4gICAgLSBSZXN1bWUgc2V0X21lbW9yeV94IHRvIHNldCB0aGUgX1BBR0VfRVhFQyBhdHRyaWJ1 dGUKPiA+ID4+PiAgICAtIE9wdGltaXplIHRoZSBjb21taXQgbG9nIHdpdGggQWxleGFuZHJlIGFk dmljZQo+ID4gPj4+Cj4gPiA+Pj4gVjI6Cj4gPiA+Pj4gICAgLSBVc2Ugdm1fbWFwX3JhbSBpbnN0 ZWFkIG9mIG1vZGlmeWluZyBzZXRfbWVtb3J5X3gKPiA+ID4+PiAgICAtIENvcnJlY3QgRml4ZXMg dGFnCj4gPiA+Pj4gLS0tCj4gPiA+Pj4gICAgYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rZXhlYy5o ICAgIHwgIDEgKwo+ID4gPj4+ICAgIGFyY2gvcmlzY3Yva2VybmVsL21hY2hpbmVfa2V4ZWMuYyB8 IDE4ICsrKysrKysrKysrKysrKy0tLQo+ID4gPj4+ICAgIDIgZmlsZXMgY2hhbmdlZCwgMTYgaW5z ZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKPiA+ID4+Pgo+ID4gPj4+IGRpZmYgLS1naXQgYS9h cmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2tleGVjLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2tl eGVjLmgKPiA+ID4+PiBpbmRleCAyYjU2NzY5Y2I1MzAuLjE3NDU2ZTkxNDc2ZSAxMDA2NDQKPiA+ ID4+PiAtLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2tleGVjLmgKPiA+ID4+PiArKysgYi9h cmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2tleGVjLmgKPiA+ID4+PiBAQCAtNDEsNiArNDEsNyBAQCBj cmFzaF9zZXR1cF9yZWdzKHN0cnVjdCBwdF9yZWdzICpuZXdyZWdzLAo+ID4gPj4+ICAgIHN0cnVj dCBraW1hZ2VfYXJjaCB7Cj4gPiA+Pj4gICAgICAgIHZvaWQgKmZkdDsgLyogRm9yIENPTkZJR19L RVhFQ19GSUxFICovCj4gPiA+Pj4gICAgICAgIHVuc2lnbmVkIGxvbmcgZmR0X2FkZHI7Cj4gPiA+ Pj4gKyAgICAgdm9pZCAqY29udHJvbF9jb2RlX2J1ZmZlcjsKPiA+ID4+PiAgICB9Owo+ID4gPj4+ Cj4gPiA+Pj4gICAgZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmlzY3Zfa2V4ZWNfcmVsb2Nh dGVbXTsKPiA+ID4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvbWFjaGluZV9rZXhl Yy5jIGIvYXJjaC9yaXNjdi9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCj4gPiA+Pj4gaW5kZXggMmQx MzliNzI0YmM4Li42MGMxZWYzYzIyMzIgMTAwNjQ0Cj4gPiA+Pj4gLS0tIGEvYXJjaC9yaXNjdi9r ZXJuZWwvbWFjaGluZV9rZXhlYy5jCj4gPiA+Pj4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvbWFj aGluZV9rZXhlYy5jCj4gPiA+Pj4gQEAgLTg2LDcgKzg2LDE0IEBAIG1hY2hpbmVfa2V4ZWNfcHJl cGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKPiA+ID4+Pgo+ID4gPj4+ICAgICAgICAvKiBDb3B5 IHRoZSBhc3NlbWJsZXIgY29kZSBmb3IgcmVsb2NhdGlvbiB0byB0aGUgY29udHJvbCBwYWdlICov Cj4gPiA+Pj4gICAgICAgIGlmIChpbWFnZS0+dHlwZSAhPSBLRVhFQ19UWVBFX0NSQVNIKSB7Cj4g PiA+Pj4gLSAgICAgICAgICAgICBjb250cm9sX2NvZGVfYnVmZmVyID0gcGFnZV9hZGRyZXNzKGlt YWdlLT5jb250cm9sX2NvZGVfcGFnZSk7Cj4gPiA+Pj4gKyAgICAgICAgICAgICBjb250cm9sX2Nv ZGVfYnVmZmVyID0gdm1fbWFwX3JhbSgmaW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlLAo+ID4gPj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VYRUNfQ09O VFJPTF9QQUdFX1NJWkUvUEFHRV9TSVpFLAo+ID4gPj4+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgTlVNQV9OT19OT0RFKTsKPiA+ID4+PiArICAgICAgICAg ICAgIGlmIChjb250cm9sX2NvZGVfYnVmZmVyID09IE5VTEwpIHsKPiA+ID4+PiArICAgICAgICAg ICAgICAgICAgICAgcHJfZXJyKCJGYWlsZWQgdG8gdm1fbWFwIGNvbnRyb2wgcGFnZVxuIik7Cj4g PiA+Pj4gKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ID4gPj4+ICsgICAg ICAgICAgICAgfQo+ID4gPj4+ICsKPiA+ID4+PiAgICAgICAgICAgICAgICBjb250cm9sX2NvZGVf YnVmZmVyX3N6ID0gcGFnZV9zaXplKGltYWdlLT5jb250cm9sX2NvZGVfcGFnZSk7Cj4gPiA+Pj4K PiA+ID4+PiAgICAgICAgICAgICAgICBpZiAodW5saWtlbHkocmlzY3Zfa2V4ZWNfcmVsb2NhdGVf c2l6ZSA+IGNvbnRyb2xfY29kZV9idWZmZXJfc3opKSB7Cj4gPiA+Pj4gQEAgLTk5LDYgKzEwNiw4 IEBAIG1hY2hpbmVfa2V4ZWNfcHJlcGFyZShzdHJ1Y3Qga2ltYWdlICppbWFnZSkKPiA+ID4+Pgo+ ID4gPj4+ICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhlIGNvbnRyb2wgcGFnZSBleGVjdXRhYmxl ICovCj4gPiA+Pj4gICAgICAgICAgICAgICAgc2V0X21lbW9yeV94KCh1bnNpZ25lZCBsb25nKSBj b250cm9sX2NvZGVfYnVmZmVyLCAxKTsKPiA+ID4+PiArCj4gPiA+Pj4gKyAgICAgICAgICAgICBp bnRlcm5hbC0+Y29udHJvbF9jb2RlX2J1ZmZlciA9IGNvbnRyb2xfY29kZV9idWZmZXI7Cj4gPiA+ Pj4gICAgICAgIH0KPiA+ID4+Pgo+ID4gPj4+ICAgICAgICByZXR1cm4gMDsKPiA+ID4+PiBAQCAt MjExLDcgKzIyMCwxMCBAQCBtYWNoaW5lX2tleGVjKHN0cnVjdCBraW1hZ2UgKmltYWdlKQo+ID4g Pj4+ICAgICAgICB1bnNpZ25lZCBsb25nIHRoaXNfY3B1X2lkID0gX19zbXBfcHJvY2Vzc29yX2lk KCk7Cj4gPiA+Pj4gICAgICAgIHVuc2lnbmVkIGxvbmcgdGhpc19oYXJ0X2lkID0gY3B1aWRfdG9f aGFydGlkX21hcCh0aGlzX2NwdV9pZCk7Cj4gPiA+Pj4gICAgICAgIHVuc2lnbmVkIGxvbmcgZmR0 X2FkZHIgPSBpbnRlcm5hbC0+ZmR0X2FkZHI7Cj4gPiA+Pj4gLSAgICAgdm9pZCAqY29udHJvbF9j b2RlX2J1ZmZlciA9IHBhZ2VfYWRkcmVzcyhpbWFnZS0+Y29udHJvbF9jb2RlX3BhZ2UpOwo+ID4g Pj4+ICsgICAgIHZvaWQgKmNvbnRyb2xfY29kZV9idWZmZXIgPSBpbnRlcm5hbC0+Y29udHJvbF9j b2RlX2J1ZmZlcjsKPiA+ID4+PiArICAgICB1bnNpZ25lZCBsb25nIHZhX3ZhX29mZnNldCA9Cj4g PiA+Pj4gKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBwYWdlX2FkZHJlc3Mo aW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlKQo+ID4gPj4+ICsgICAgICAgICAgICAgICAgICAgLSAo dW5zaWduZWQgbG9uZykgY29udHJvbF9jb2RlX2J1ZmZlcjsKPiA+ID4+PiAgICAgICAgcmlzY3Zf a2V4ZWNfbWV0aG9kIGtleGVjX21ldGhvZCA9IE5VTEw7Cj4gPiA+Pj4KPiA+ID4+PiAgICAjaWZk ZWYgQ09ORklHX1NNUAo+ID4gPj4+IEBAIC0yMzQsNiArMjQ2LDYgQEAgbWFjaGluZV9rZXhlYyhz dHJ1Y3Qga2ltYWdlICppbWFnZSkKPiA+ID4+PiAgICAgICAgLyogSnVtcCB0byB0aGUgcmVsb2Nh dGlvbiBjb2RlICovCj4gPiA+Pj4gICAgICAgIHByX25vdGljZSgiQnllLi4uXG4iKTsKPiA+ID4+ PiAgICAgICAga2V4ZWNfbWV0aG9kKGZpcnN0X2luZF9lbnRyeSwganVtcF9hZGRyLCBmZHRfYWRk ciwKPiA+ID4+PiAtICAgICAgICAgICAgICAgICAgdGhpc19oYXJ0X2lkLCBrZXJuZWxfbWFwLnZh X3BhX29mZnNldCk7Cj4gPiA+Pj4gKyAgICAgICAgICAgICAgICAgIHRoaXNfaGFydF9pZCwga2Vy bmVsX21hcC52YV9wYV9vZmZzZXQgLSB2YV92YV9vZmZzZXQpOwo+ID4gPj4+ICAgICAgICB1bnJl YWNoYWJsZSgpOwo+ID4gPj4+ICAgIH0KPiA+ID4+Cj4gPiA+PiBJIHN0YXJ0ZWQgd29ya2luZyBv biB0aGUgc2V0X21lbW9yeSBmaXggYW5kIHRoZSBmaXJzdCB0aGluZyB0byBkbyBpcyB0bwo+ID4g Pj4gcHJldmVudCB0aGUgdXNlIG9mIFBHRCBtYXBwaW5nLCBpdCdzIHRvbyBjdW1iZXJzb21lIHRv IHByb3BhZ2F0ZSBjaGFuZ2VzCj4gPiA+PiBhdCB0aGlzIGxldmVsOiBJSVJDIHg4NiBrZWVwcyBh IGxpc3Qgb2YgcGFnZSB0YWJsZXMgdG8gZ28gdGhyb3VnaAo+ID4gPj4gd2hlbmV2ZXIgdGhhdCBo YXBwZW5zLCB0aGF0J3Mgd2h5IEJqb3JuIHByZS1hbGxvY2F0ZWQgYWxsIHRoZSBQR0QKPiA+ID4+ IGVudHJpZXMgdG8gY292ZXIgdGhlIHZtYWxsb2MgcmVnaW9uLgo+ID4gPj4KPiA+ID4+IFNvLCB0 byBtZSwgdGhlIHNpbXBsZSBmaXggZm9yIHRoaXMgaXNzdWUgaXMgdG8gcHJldmVudCB0aGUgdXNl IG9mIFBHRAo+ID4gPj4gbWFwcGluZy4gV2hhdCBkbyB5b3UgdGhpbms/IERvZXMgdGhlIGZvbGxv d2luZyBwYXRjaCB3b3JrPwo+ID4gPiBUaGUgUEdEIG1hcHBpbmcgaXMgbmVjZXNzYXJ5IChlc3Bl Y2lhbGx5IGZvciBTdjMyLCBTdjM5KSwgYW5kIGl0IGhhcwo+ID4gPiBiZWVuIHNvbHZlZCB1bmRl ciB5b3VyIGZpcnN0IGFkdmljZS4gSSB0aGluayBsaW1pdCBzZXRfbWVtb3J5X3ggdXNhZ2UKPiA+ ID4gaXMgdGhlIHNtYXJ0IGNob2ljZSBmb3Igbm93Lgo+ID4KPiA+Cj4gPiBJZiB3ZSB1c2UgUEdE IG1hcHBpbmdzLCB3ZSB3b24ndCBiZSBhYmxlIHRvIGNoYW5nZSB0aGUgcHJvdGVjdGlvbnMgb3IK PiA+IHJlbW92ZSBwYWdlcyBmcm9tIHRoZSBsaW5lYXIgbWFwcGluZyBhcyB3ZSBkb24ndCBoYXZl IGEgbWVhbnMgdG8KPiA+IHN5bmNocm9uaXplIGFsbCB0aGUgcGFnZSB0YWJsZXMuIFJlbW92aW5n IHBhZ2VzIGZyb20gdGhlIGxpbmVhciBtYXBwaW5nCj4gPiBpcyB1c2VkIGZvciBleGFtcGxlIGZv ciBtZW1mZF9zZWNyZXQgYW5kIGNlcnRhaW5seSBvdGhlciB0aGluZ3Mgc28gdGhhdAo+ID4gbWVh bnMgdXNpbmcgUEdEIG1hcHBpbmdzIHdpbGwgYnJlYWsgYSBmZXcgdGhpbmdzLgo+ID4KPiA+IFRo ZSBiZW5lZml0cyBvZiBQR0QgbWFwcGluZ3MgZm9yIHRoZSBsaW5lYXIgbWFwcGluZyB3YXMgbm90 IHByb3ZlbiwgYW5kCj4gV2UgbmVlZCBQR0QgbWFwcGluZ3MgZm9yIFN2MzIuIGxpbmVyIG1hcHBp bmcgd2l0aCA0S0Igd291bGQgY2F1c2UgYQo+IHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhcCBp biB0aGUgc21hbGwgY29yZSAobWVtc2V0IHN0cmlkZSB3aXRoIDRLQiwKPiBQVFcgd2l0aCBldmVy eSBzdG9yZSkuCj4gCj4gPiBldmVuIGlmIEkgYWdyZWUgd2Ugc2hvdWxkIGRvIG91ciBiZXN0IHRv IGtlZXAgdGhlIGxhcmdlc3QgbWFwcGluZwo+ID4gcG9zc2libGUganVzdCBpbiBjYXNlLCBpbXBs ZW1lbnRpbmcgYSBwYWdlIHRhYmxlIHN5bmNocm9uaXphdGlvbiBzZWVtcwo+ID4gdmVyeSBjdW1i ZXJzb21lICh4ODYgZG9lcyB0aGF0IHRob3VnaCkuCj4gPgo+ID4gSSdtIG5vdCBvcHBvc2VkIHRv IHlvdXIgc29sdXRpb24sIGJ1dDoKSGkgQWxleGFuZHJlICYgUGFsbWVyLAoKVGhpcyBwYXRjaCBp cyBhYm91dCBmaXhpbmcgdGhlIHByb2JsZW0gb2Yga2V4ZWMsIG5vdCBzb2x2aW5nIHRoZSBsYXJn ZXIKc2NhbGUgb2Ygc2V0X21lbW9yeV94L3BnZF9tYXBwaW5nIHByb2JsZW1zLiBBbmQgb25seSBs aW1pdGluZyB0aGUKY2hhbmdlcyBpbiB0aGUgY29udHJvbCBidWZmZXIgcGFnZSBpcyBhbHNvIG5l Y2Vzc2FyeS4gS2V4ZWMgc2hvdWxkbid0Cm1vZGlmeSBkaXJlY3QgbWFwcGluZyBhdHRyaWJ1dGVz LgoKSGVyZSBpcyB0aGUgZmxvdyBvZiBzZzIwNDI6CnpzYmwgLT4gb3BlbnNiaSAtPiBsaW51eC1i b290IChrZXhlYyBib290IG5leHQgc3RhZ2UpIC0+IGxpbnV4Cih1YnVudHUvRmVkb3JhKQoKQ291 bGQgd2UgbWVyZ2UgdGhpcyBwYXRjaCBmaXJzdD8KCkJlc3QgUmVnYXJkcwogR3VvIFJlbgoKPiA+ Cj4gPiAtIGVpdGhlciB3ZSByZW1vdmUgdGhlIFBHRCBtYXBwaW5ncywgYW5kIHlvdXIgcHJvYmxl bSBpcyBmaXhlZCwKPiBUaGlzIHBhdGNoIGxpbWl0cyBjb250cm9sX2J1ZmZlcl9jb2RlIGludG8g YSA0S0IgcGFnZSBtYXBwaW5nIGVudHJ5LiBJCj4gZG9uJ3QgdGhpbmsgdGhleSBhcmUgdGhlIHNh bWUgc29sdXRpb24sIGV2ZW4geW91IHJlbW92ZSB0aGUgUEdECj4gbWFwcGluZ3MuCj4gCj4gPgo+ ID4gLSBvciB3ZSBrZWVwIFBHRCBtYXBwaW5ncywgaW1wbGVtZW50IGEgcGFnZSB0YWJsZSBzeW5j aHJvbml6YXRpb24sIGFuZAo+ID4geW91ciBwcm9ibGVtIGlzIGZpeGVkLgo+IFdlIG5lZWQgeW91 ciBzeW5jaHJvbml6YXRpb24sIGJ1dCBub3QgZm9yIHRoaXMgY2FzZS4KPiAKPiA+Cj4gPiBBbmQg c2luY2Ugd2UgbmVlZCB0byBmaXggdGhpcyBsYXJnZXIgcHJvYmxlbSwgSSBkb24ndCBzZWUgdGhl IHBvaW50IG9mCj4gPiB0aGlzIHdvcmthcm91bmQuCj4gVGhpcyBwYXRjaCBpcyBmb3Iga2V4ZWMu IFNlZSB0aXRsZSByaXNjdjoga2V4ZWM6IHRhZy4KPiAKPiBBbmQgSSBkb24ndCB0aGluayB5b3Vy IGxhcmdlciBwcm9ibGVtIG5lZWRzIHRvIGJlIGZpeGVkLiBJIGFncmVlIHdpdGgKPiB5b3VyIGZp cnN0IHBvaW50IHRoYXQgc2ltcGx5IGxpbWl0IHRoZSB1c2FnZSBvZiBzZXRfbWVtb3J5X3guCj4g Cj4gPgo+ID4gVGhhbmtzLAo+ID4KPiA+IEFsZXgKPiA+Cj4gPgo+ID4gPgo+ID4gPgo+ID4gPj4K PiA+ID4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L21tL2luaXQuYyBiL2FyY2gvcmlzY3YvbW0v aW5pdC5jCj4gPiA+PiBpbmRleCA3MGZiMzE5NjBiNjMuLjZkZDEyNDQzYmZhNCAxMDA2NDQKPiA+ ID4+IC0tLSBhL2FyY2gvcmlzY3YvbW0vaW5pdC5jCj4gPiA+PiArKysgYi9hcmNoL3Jpc2N2L21t L2luaXQuYwo+ID4gPj4gQEAgLTY2MiwxMyArNjYyLDEyIEBAIHZvaWQgX19pbml0IGNyZWF0ZV9w Z2RfbWFwcGluZyhwZ2RfdCAqcGdkcCwKPiA+ID4+ICAgIHN0YXRpYyB1aW50cHRyX3QgX19pbml0 IGJlc3RfbWFwX3NpemUocGh5c19hZGRyX3QgcGEsIHVpbnRwdHJfdCB2YSwKPiA+ID4+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzX2FkZHJfdCBzaXplKQo+ID4g Pj4gICAgewo+ID4gPj4gLSAgICAgICBpZiAoIShwYSAmIChQR0RJUl9TSVpFIC0gMSkpICYmICEo dmEgJiAoUEdESVJfU0laRSAtIDEpKSAmJiBzaXplCj4gPiA+PiAgID49IFBHRElSX1NJWkUpCj4g PiA+PiAtICAgICAgICAgICAgICAgcmV0dXJuIFBHRElSX1NJWkU7Cj4gPiA+PiAtCj4gPiA+PiAt ICAgICAgIGlmICghKHBhICYgKFA0RF9TSVpFIC0gMSkpICYmICEodmEgJiAoUDREX1NJWkUgLSAx KSkgJiYgc2l6ZSA+PQo+ID4gPj4gUDREX1NJWkUpCj4gPiA+PiArICAgICAgIGlmIChwZ3RhYmxl X2w1X2VuYWJsZWQgJiYKPiA+ID4+ICsgICAgICAgICAgICEocGEgJiAoUDREX1NJWkUgLSAxKSkg JiYgISh2YSAmIChQNERfU0laRSAtIDEpKSAmJiBzaXplID49Cj4gPiA+PiBQNERfU0laRSkKPiA+ ID4+ICAgICAgICAgICAgICAgICAgIHJldHVybiBQNERfU0laRTsKPiA+ID4+Cj4gPiA+PiAtICAg ICAgIGlmICghKHBhICYgKFBVRF9TSVpFIC0gMSkpICYmICEodmEgJiAoUFVEX1NJWkUgLSAxKSkg JiYgc2l6ZSA+PQo+ID4gPj4gUFVEX1NJWkUpCj4gPiA+PiArICAgICAgIGlmIChwZ3RhYmxlX2w0 X2VuYWJsZWQgJiYKPiA+ID4+ICsgICAgICAgICAgICEocGEgJiAoUFVEX1NJWkUgLSAxKSkgJiYg ISh2YSAmIChQVURfU0laRSAtIDEpKSAmJiBzaXplID49Cj4gPiA+PiBQVURfU0laRSkKPiA+ID4+ ICAgICAgICAgICAgICAgICAgIHJldHVybiBQVURfU0laRTsKPiA+ID4+Cj4gPiA+PiAgICAgICAg ICAgaWYgKCEocGEgJiAoUE1EX1NJWkUgLSAxKSkgJiYgISh2YSAmIChQTURfU0laRSAtIDEpKSAm JiBzaXplID49Cj4gPiA+PiBQTURfU0laRSkKPiA+ID4+Cj4gPiA+Pgo+ID4gPj4gVGhhbmtzLAo+ ID4gPj4KPiA+ID4+IEFsZXgKPiA+ID4+Cj4gPiA+Cj4gCj4gCj4gCj4gLS0gCj4gQmVzdCBSZWdh cmRzCj4gIEd1byBSZW4KPiAKPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwo+IGxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdAo+IGxpbnV4LXJpc2N2QGxpc3Rz LmluZnJhZGVhZC5vcmcKPiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LXJpc2N2CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpsaW51eC1yaXNjdiBtYWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFk ZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4 LXJpc2N2Cg==