From mboxrd@z Thu Jan 1 00:00:00 1970 From: Chao Du Date: Fri, 1 Mar 2024 17:23:32 +0800 (GMT+08:00) Subject: [PATCH v2 1/3] RISC-V: KVM: Implement kvm_arch_vcpu_ioctl_set_guest_debug() In-Reply-To: References: <20240301013545.10403-1-duchao@eswincomputing.com> <20240301013545.10403-2-duchao@eswincomputing.com> <1f31ec16.1447.18df8b97f73.Coremail.duchao@eswincomputing.com> <698f58e.1490.18df8e9084f.Coremail.duchao@eswincomputing.com> <1d6d446.14cc.18df9162000.Coremail.duchao@eswincomputing.com> Message-ID: <31123602.14fa.18df953753c.Coremail.duchao@eswincomputing.com> List-Id: To: kvm-riscv@lists.infradead.org MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit On 2024-03-01 17:22, Anup Patel wrote: > > On Fri, Mar 1, 2024 at 1:46?PM Chao Du wrote: > > > > Thanks Anup. > > Let me try to summarize the changes in next revision: > > > > 1. Use BIT(). > > 2. In kvm_arch_vcpu_ioctl_set_guest_debug(), do below things: > > if (dbg->control & KVM_GUESTDBG_ENABLE) { > > vcpu->guest_debug = dbg->control; > > } else { > > vcpu->guest_debug = 0; > > } > > Since, kvm_arch_vcpu_ioctl_set_guest_debug() is called multiple times > at runtime, this should be: > > if (dbg->control & KVM_GUESTDBG_ENABLE) { > vcpu->guest_debug = dbg->control; > vcpu->arch.cfg.hedeleg &= ~BIT(EXC_BREAKPOINT); > } else { > vcpu->guest_debug = 0; > vcpu->arch.cfg.hedeleg |= BIT(EXC_BREAKPOINT); > } > > > 3. In kvm_riscv_vcpu_setup_config(), do below things: > > cfg->hedeleg = KVM_HEDELEG_DEFAULT; // with BIT(EXC_BREAKPOINT) > > if (vcpu->guest_debug) > > cfg->hedeleg &= ~BIT(EXC_BREAKPOINT); > > > > Will prepare a PATCH v3 accordingly. I thought it over, maybe we should do this: - In kvm_arch_vcpu_ioctl_set_guest_debug(): if (dbg->control & KVM_GUESTDBG_ENABLE) { vcpu->guest_debug = dbg->control; vcpu->arch.cfg.hedeleg = KVM_HEDELEG_DEFAULT & (~BIT(EXC_BREAKPOINT)); } else { vcpu->guest_debug = 0; vcpu->arch.cfg.hedeleg = KVM_HEDELEG_DEFAULT; } - In kvm_riscv_vcpu_setup_config(): if (!vcpu->guest_debug) cfg->hedeleg = KVM_HEDELEG_DEFAULT; which is similar with my original changes, but clear the bit EXC_BREAKPOINT explicitly. Could you please confirm ? > > Yes, please send v3. > > Thanks, > Anup > > > On 2024-03-01 16:11, Anup Patel wrote: > > > > > > On Fri, Mar 1, 2024 at 12:57?PM Chao Du wrote: > > > > > > > > On 2024-03-01 15:29, Anup Patel wrote: > > > > > > > > > > On Fri, Mar 1, 2024 at 12:05?PM Chao Du wrote: > > > > > > > > > > > > On 2024-03-01 13:00, Anup Patel wrote: > > > > > > > > > > > > > > On Fri, Mar 1, 2024 at 7:08?AM Chao Du wrote: > > > > > > > > > > > > > > > > kvm_vm_ioctl_check_extension(): Return 1 if KVM_CAP_SET_GUEST_DEBUG is > > > > > > > > been checked. > > > > > > > > > > > > > > > > kvm_arch_vcpu_ioctl_set_guest_debug(): Update the guest_debug flags > > > > > > > > from userspace accordingly. Route the breakpoint exceptions to HS mode > > > > > > > > if the VCPU is being debugged by userspace, by clearing the > > > > > > > > corresponding bit in hedeleg. Write the actual CSR in > > > > > > > > kvm_arch_vcpu_load(). > > > > > > > > > > > > > > > > Signed-off-by: Chao Du > > > > > > > > --- > > > > > > > > arch/riscv/include/asm/kvm_host.h | 17 +++++++++++++++++ > > > > > > > > arch/riscv/include/uapi/asm/kvm.h | 1 + > > > > > > > > arch/riscv/kvm/main.c | 18 ++---------------- > > > > > > > > arch/riscv/kvm/vcpu.c | 15 +++++++++++++-- > > > > > > > > arch/riscv/kvm/vm.c | 1 + > > > > > > > > 5 files changed, 34 insertions(+), 18 deletions(-) > > > > > > > > > > > > > > > > diff --git a/arch/riscv/include/asm/kvm_host.h b/arch/riscv/include/asm/kvm_host.h > > > > > > > > index 484d04a92fa6..9ee3f03ba5d1 100644 > > > > > > > > --- a/arch/riscv/include/asm/kvm_host.h > > > > > > > > +++ b/arch/riscv/include/asm/kvm_host.h > > > > > > > > @@ -43,6 +43,22 @@ > > > > > > > > KVM_ARCH_REQ_FLAGS(5, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) > > > > > > > > #define KVM_REQ_STEAL_UPDATE KVM_ARCH_REQ(6) > > > > > > > > > > > > > > > > +#define KVM_HEDELEG_DEFAULT ((_AC(1, UL) << EXC_INST_MISALIGNED) | \ > > > > > > > > + (_AC(1, UL) << EXC_BREAKPOINT) | \ > > > > > > > > + (_AC(1, UL) << EXC_SYSCALL) | \ > > > > > > > > + (_AC(1, UL) << EXC_INST_PAGE_FAULT) | \ > > > > > > > > + (_AC(1, UL) << EXC_LOAD_PAGE_FAULT) | \ > > > > > > > > + (_AC(1, UL) << EXC_STORE_PAGE_FAULT)) > > > > > > > > > > > > > > Use BIT(xyz) here. For example: BIT(EXC_INST_MISALIGNED) > > > > > > > > > > > > Thanks, I will use BIT() instead in next revision. > > > > > > > > > > > > > > > > > > > > > > > > > > Also, BIT(EXC_BREAKPOINT) should not be part of KVM_HEDELEG_DEFAULT. > > > > > > > > > > > > I think the bit EXC_BREAKPOINT should be set by default, like what you > > > > > > already did in kvm_arch_hardware_enable(). Then the VS could get the ebreak > > > > > > and handle it accordingly. > > > > > > > > > > > > If the guest_debug is enabled, ebreak instructions are inserted by the > > > > > > userspace(QEMU). So KVM should 'intercept' the ebreak and exit to QEMU. > > > > > > Bit EXC_BREAKPOINT should be cleared in this case. > > > > > > > > > > If EXC_BREAKPOINT is delegated by default then it is not consistent with > > > > > vcpu->guest_debug which is not enabled by default. > > > > > > > > To enable the guest_debug corresponding to NOT delegate the EXC_BREAKPOINT. > > > > They are somehow 'opposite'. > > > > > > > > This 'kvm_guest_debug' feature is different from "debug in the guest". > > > > The later requires the delegation of EXC_BREAKPOINT. > > > > The former does not. > > > > > > In which case your below code is totally misleading. > > > > > > + if (dbg->control & KVM_GUESTDBG_ENABLE) { > > > + vcpu->guest_debug = dbg->control; > > > + vcpu->arch.cfg.hedeleg = KVM_HEDELEG_GUEST_DEBUG; > > > + } else { > > > + vcpu->guest_debug = 0; > > > + vcpu->arch.cfg.hedeleg = KVM_HEDELEG_DEFAULT; > > > + } > > > > > > This should have been: > > > > > > + if (dbg->control & KVM_GUESTDBG_ENABLE) { > > > + vcpu->guest_debug = dbg->control; > > > + vcpu->arch.cfg.hedeleg &= ~BIT(EXC_BREAKPOINT); > > > + } else { > > > + vcpu->guest_debug = 0; > > > + vcpu->arch.cfg.hedeleg |= BIT(EXC_BREAKPOINT); > > > + } > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > +#define KVM_HEDELEG_GUEST_DEBUG ((_AC(1, UL) << EXC_INST_MISALIGNED) | \ > > > > > > > > + (_AC(1, UL) << EXC_SYSCALL) | \ > > > > > > > > + (_AC(1, UL) << EXC_INST_PAGE_FAULT) | \ > > > > > > > > + (_AC(1, UL) << EXC_LOAD_PAGE_FAULT) | \ > > > > > > > > + (_AC(1, UL) << EXC_STORE_PAGE_FAULT)) > > > > > > > > > > > > > > No need for KVM_HEDELEG_GUEST_DEBUG, see below. > > > > > > > > > > > > > > > + > > > > > > > > +#define KVM_HIDELEG_DEFAULT ((_AC(1, UL) << IRQ_VS_SOFT) | \ > > > > > > > > + (_AC(1, UL) << IRQ_VS_TIMER) | \ > > > > > > > > + (_AC(1, UL) << IRQ_VS_EXT)) > > > > > > > > + > > > > > > > > > > > > > > Same as above, use BIT(xyz) here. > > > > > > > > > > > > > > > enum kvm_riscv_hfence_type { > > > > > > > > KVM_RISCV_HFENCE_UNKNOWN = 0, > > > > > > > > KVM_RISCV_HFENCE_GVMA_VMID_GPA, > > > > > > > > @@ -169,6 +185,7 @@ struct kvm_vcpu_csr { > > > > > > > > struct kvm_vcpu_config { > > > > > > > > u64 henvcfg; > > > > > > > > u64 hstateen0; > > > > > > > > + unsigned long hedeleg; > > > > > > > > }; > > > > > > > > > > > > > > > > struct kvm_vcpu_smstateen_csr { > > > > > > > > diff --git a/arch/riscv/include/uapi/asm/kvm.h b/arch/riscv/include/uapi/asm/kvm.h > > > > > > > > index 7499e88a947c..39f4f4b9dede 100644 > > > > > > > > --- a/arch/riscv/include/uapi/asm/kvm.h > > > > > > > > +++ b/arch/riscv/include/uapi/asm/kvm.h > > > > > > > > @@ -17,6 +17,7 @@ > > > > > > > > > > > > > > > > #define __KVM_HAVE_IRQ_LINE > > > > > > > > #define __KVM_HAVE_READONLY_MEM > > > > > > > > +#define __KVM_HAVE_GUEST_DEBUG > > > > > > > > > > > > > > > > #define KVM_COALESCED_MMIO_PAGE_OFFSET 1 > > > > > > > > > > > > > > > > diff --git a/arch/riscv/kvm/main.c b/arch/riscv/kvm/main.c > > > > > > > > index 225a435d9c9a..bab2ec34cd87 100644 > > > > > > > > --- a/arch/riscv/kvm/main.c > > > > > > > > +++ b/arch/riscv/kvm/main.c > > > > > > > > @@ -22,22 +22,8 @@ long kvm_arch_dev_ioctl(struct file *filp, > > > > > > > > > > > > > > > > int kvm_arch_hardware_enable(void) > > > > > > > > { > > > > > > > > - unsigned long hideleg, hedeleg; > > > > > > > > - > > > > > > > > - hedeleg = 0; > > > > > > > > - hedeleg |= (1UL << EXC_INST_MISALIGNED); > > > > > > > > - hedeleg |= (1UL << EXC_BREAKPOINT); > > > > > > > > - hedeleg |= (1UL << EXC_SYSCALL); > > > > > > > > - hedeleg |= (1UL << EXC_INST_PAGE_FAULT); > > > > > > > > - hedeleg |= (1UL << EXC_LOAD_PAGE_FAULT); > > > > > > > > - hedeleg |= (1UL << EXC_STORE_PAGE_FAULT); > > > > > > > > - csr_write(CSR_HEDELEG, hedeleg); > > > > > > > > - > > > > > > > > - hideleg = 0; > > > > > > > > - hideleg |= (1UL << IRQ_VS_SOFT); > > > > > > > > - hideleg |= (1UL << IRQ_VS_TIMER); > > > > > > > > - hideleg |= (1UL << IRQ_VS_EXT); > > > > > > > > - csr_write(CSR_HIDELEG, hideleg); > > > > > > > > + csr_write(CSR_HEDELEG, KVM_HEDELEG_DEFAULT); > > > > > > > > + csr_write(CSR_HIDELEG, KVM_HIDELEG_DEFAULT); > > > > > > > > > > > > > > > > /* VS should access only the time counter directly. Everything else should trap */ > > > > > > > > csr_write(CSR_HCOUNTEREN, 0x02); > > > > > > > > diff --git a/arch/riscv/kvm/vcpu.c b/arch/riscv/kvm/vcpu.c > > > > > > > > index b5ca9f2e98ac..242076c2227f 100644 > > > > > > > > --- a/arch/riscv/kvm/vcpu.c > > > > > > > > +++ b/arch/riscv/kvm/vcpu.c > > > > > > > > @@ -475,8 +475,15 @@ int kvm_arch_vcpu_ioctl_set_mpstate(struct kvm_vcpu *vcpu, > > > > > > > > int kvm_arch_vcpu_ioctl_set_guest_debug(struct kvm_vcpu *vcpu, > > > > > > > > struct kvm_guest_debug *dbg) > > > > > > > > { > > > > > > > > - /* TODO; To be implemented later. */ > > > > > > > > - return -EINVAL; > > > > > > > > > > > > > > if (vcpu->arch.ran_atleast_once) > > > > > > > return -EBUSY; > > > > > > > > > > > > If we enabled the guest_debug in QEMU side, then the KVM_SET_GUEST_DEBUG ioctl > > > > > > will come before the first KVM_RUN. This will always cause an ERROR. > > > > > > > > > > The check ensures that KVM user space can only enable/disable > > > > > guest debug before the VCPU is run. I don't see why this would > > > > > fail for QEMU. > > > > > > > > In the current implementation of GDB and QEMU, the userspace will enable/disable > > > > guest_debug frequently during the debugging (almost every step). > > > > The sequence should like: > > > > > > > > KVM_SET_GUEST_DEBUG enable > > > > KVM_RUN > > > > KVM_SET_GUEST_DEBUG disable > > > > KVM_SET_GUEST_DEBUG enable > > > > KVM_RUN > > > > KVM_SET_GUEST_DEBUG disable > > > > KVM_SET_GUEST_DEBUG enable > > > > KVM_RUN > > > > KVM_SET_GUEST_DEBUG disable > > > > ... > > > > > > Fair enough, no need to check "ran_atleast_once" > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > + if (dbg->control & KVM_GUESTDBG_ENABLE) { > > > > > > > > + vcpu->guest_debug = dbg->control; > > > > > > > > + vcpu->arch.cfg.hedeleg = KVM_HEDELEG_GUEST_DEBUG; > > > > > > > > + } else { > > > > > > > > + vcpu->guest_debug = 0; > > > > > > > > + vcpu->arch.cfg.hedeleg = KVM_HEDELEG_DEFAULT; > > > > > > > > + } > > > > > > > > > > > > > > Don't update vcpu->arch.cfg.hedeleg here since it should be only done > > > > > > > in kvm_riscv_vcpu_setup_config(). > > > > > > > > > > > > > > > + > > > > > > > > + return 0; > > > > > > > > } > > > > > > > > > > > > > > > > static void kvm_riscv_vcpu_setup_config(struct kvm_vcpu *vcpu) > > > > > > > > @@ -505,6 +512,9 @@ static void kvm_riscv_vcpu_setup_config(struct kvm_vcpu *vcpu) > > > > > > > > if (riscv_isa_extension_available(isa, SMSTATEEN)) > > > > > > > > cfg->hstateen0 |= SMSTATEEN0_SSTATEEN0; > > > > > > > > } > > > > > > > > + > > > > > > > > + if (!vcpu->guest_debug) > > > > > > > > + cfg->hedeleg = KVM_HEDELEG_DEFAULT; > > > > > > > > > > > > > > This should be: > > > > > > > > > > > > > > cfg->hedeleg = KVM_HEDELEG_DEFAULT; > > > > > > > if (vcpu->guest_debug) > > > > > > > cfg->hedeleg |= BIT(EXC_BREAKPOINT); > > > > > > > > > > > > Like above, here the logic should be: > > > > > > > > > > > > cfg->hedeleg = KVM_HEDELEG_DEFAULT; // with BIT(EXC_BREAKPOINT) > > > > > > if (vcpu->guest_debug) > > > > > > cfg->hedeleg &= ~BIT(EXC_BREAKPOINT); > > > > > > > > > > > > Another approach is: > > > > > > initialize the cfg->hedeleg as KVM_HEDELEG_DEFAULT during kvm_arch_vcpu_create(). > > > > > > Besides that, only update the cfg->hedeleg in kvm_arch_vcpu_ioctl_set_guest_debug(). > > > > > > > > > > I disagree. We should handle hedeleg just like we handle henvcfg. > > > > > > > > OK, let's only update the cfg->hedeleg in kvm_riscv_vcpu_setup_config(). > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > } > > > > > > > > > > > > > > > > void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > > > > > > > > @@ -519,6 +529,7 @@ void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) > > > > > > > > csr_write(CSR_VSEPC, csr->vsepc); > > > > > > > > csr_write(CSR_VSCAUSE, csr->vscause); > > > > > > > > csr_write(CSR_VSTVAL, csr->vstval); > > > > > > > > + csr_write(CSR_HEDELEG, cfg->hedeleg); > > > > > > > > csr_write(CSR_HVIP, csr->hvip); > > > > > > > > csr_write(CSR_VSATP, csr->vsatp); > > > > > > > > csr_write(CSR_HENVCFG, cfg->henvcfg); > > > > > > > > diff --git a/arch/riscv/kvm/vm.c b/arch/riscv/kvm/vm.c > > > > > > > > index ce58bc48e5b8..7396b8654f45 100644 > > > > > > > > --- a/arch/riscv/kvm/vm.c > > > > > > > > +++ b/arch/riscv/kvm/vm.c > > > > > > > > @@ -186,6 +186,7 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext) > > > > > > > > case KVM_CAP_READONLY_MEM: > > > > > > > > case KVM_CAP_MP_STATE: > > > > > > > > case KVM_CAP_IMMEDIATE_EXIT: > > > > > > > > + case KVM_CAP_SET_GUEST_DEBUG: > > > > > > > > r = 1; > > > > > > > > break; > > > > > > > > case KVM_CAP_NR_VCPUS: > > > > > > > > -- > > > > > > > > 2.17.1 > > > > > > > > > > > > > > > > > > > > > > Regards, > > > > > > > Anup > > > > > > > > > > > > Thanks, > > > > > > Chao > > > > > > > > > > Regards, > > > > > Anup > > > > > > > > Thanks, > > > > Chao > > > > -- > > > > kvm-riscv mailing list > > > > kvm-riscv at lists.infradead.org > > > > http://lists.infradead.org/mailman/listinfo/kvm-riscv > > > > > > Regards, > > > Anup From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from sgoci-sdnproxy-4.icoremail.net (sgoci-sdnproxy-4.icoremail.net [129.150.39.64]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BB0A21E886 for ; Fri, 1 Mar 2024 09:23:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=129.150.39.64 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709285045; cv=none; b=S1ai5FCZk3yMrEf3evEE8sI6pJ6yhe5OiafCbQI3m/Hoga0h2QKZMNZDPvgiHhlHER9xzCxM6CL0uvpTBPla4n62lYC3IPGqzE9GqftkZfOVYbvUATcxkV8TMPJKaY7/xvzcGnnVAR0SbTU1N+FQRlyDu1c+o+rt+xN9+/0+COY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1709285045; c=relaxed/simple; bh=NsdHkplAxzdHOKdD9oEpRQbHv8B1L3drzopUh10NV/E=; h=Date:From:To:Cc:Subject:In-Reply-To:References:Content-Type: MIME-Version:Message-ID; b=a5i3Dler2WhT8jQqDFEJ8qD9N2aC6lSkCff+ZTqmq8SNIXxFpMl8vIDjmBumVVrZRAbsUBNs87hdc9Gt+hYfxs+gIXLlBmvHGrp6QRoKLPyvcKW1K3ZKVLu18xkXHjFmys4zCdSXeybr2o+CwkZZ1qV/Z+mnLJu1J12TJjt+rj4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=eswincomputing.com; spf=pass smtp.mailfrom=eswincomputing.com; arc=none smtp.client-ip=129.150.39.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=eswincomputing.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=eswincomputing.com Received: from duchao$eswincomputing.com ( [10.64.113.11] ) by ajax-webmail-app2 (Coremail) ; Fri, 1 Mar 2024 17:23:32 +0800 (GMT+08:00) Date: Fri, 1 Mar 2024 17:23:32 +0800 (GMT+08:00) X-CM-HeaderCharset: UTF-8 From: "Chao Du" To: "Anup Patel" Cc: "Anup Patel" , kvm@vger.kernel.org, kvm-riscv@lists.infradead.org, atishp@atishpatra.org, pbonzini@redhat.com, shuah@kernel.org, dbarboza@ventanamicro.com, paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, duchao713@qq.com Subject: Re: [PATCH v2 1/3] RISC-V: KVM: Implement kvm_arch_vcpu_ioctl_set_guest_debug() X-Priority: 3 X-Mailer: Coremail Webmail Server Version XT6.0.3 build 20220420(169d3f8c) Copyright (c) 2002-2024 www.mailtech.cn mispb-72143050-eaf5-4703-89e0-86624513b4ce-eswincomputing.com In-Reply-To: References: <20240301013545.10403-1-duchao@eswincomputing.com> <20240301013545.10403-2-duchao@eswincomputing.com> <1f31ec16.1447.18df8b97f73.Coremail.duchao@eswincomputing.com> <698f58e.1490.18df8e9084f.Coremail.duchao@eswincomputing.com> <1d6d446.14cc.18df9162000.Coremail.duchao@eswincomputing.com> Content-Transfer-Encoding: base64 Content-Type: text/plain; charset=UTF-8 Precedence: bulk X-Mailing-List: kvm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <31123602.14fa.18df953753c.Coremail.duchao@eswincomputing.com> X-Coremail-Locale: en_US X-CM-TRANSID:TQJkCgDHVdSUnuFlBjUdAA--.10113W X-CM-SenderInfo: xgxfxt3r6h245lqf0zpsxwx03jof0z/1tbiAQEDDGXgo4QmvgABs0 X-Coremail-Antispam: 1Ur529EdanIXcx71UUUUU7IcSsGvfJ3iIAIbVAYjsxI4VWDJw CS07vEb4IE77IF4wCS07vE1I0E4x80FVAKz4kxMIAIbVAFxVCaYxvI4VCIwcAKzIAtYxBI daVFxhVjvjDU= T24gMjAyNC0wMy0wMSAxNzoyMiwgQW51cCBQYXRlbCA8YW51cEBicmFpbmZhdWx0Lm9yZz4gd3Jv dGU6Cj4gCj4gT24gRnJpLCBNYXIgMSwgMjAyNCBhdCAxOjQ24oCvUE0gQ2hhbyBEdSA8ZHVjaGFv QGVzd2luY29tcHV0aW5nLmNvbT4gd3JvdGU6Cj4gPgo+ID4gVGhhbmtzIEFudXAuCj4gPiBMZXQg bWUgdHJ5IHRvIHN1bW1hcml6ZSB0aGUgY2hhbmdlcyBpbiBuZXh0IHJldmlzaW9uOgo+ID4KPiA+ IDEuIFVzZSBCSVQoKS4KPiA+IDIuIEluIGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2d1ZXN0X2Rl YnVnKCksIGRvIGJlbG93IHRoaW5nczoKPiA+ICAgICAgICBpZiAoZGJnLT5jb250cm9sICYgS1ZN X0dVRVNUREJHX0VOQUJMRSkgewo+ID4gICAgICAgICAgICAgICAgdmNwdS0+Z3Vlc3RfZGVidWcg PSBkYmctPmNvbnRyb2w7Cj4gPiAgICAgICAgfSBlbHNlIHsKPiA+ICAgICAgICAgICAgICAgIHZj cHUtPmd1ZXN0X2RlYnVnID0gMDsKPiA+ICAgICAgICB9Cj4gCj4gU2luY2UsIGt2bV9hcmNoX3Zj cHVfaW9jdGxfc2V0X2d1ZXN0X2RlYnVnKCkgaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzCj4gYXQg cnVudGltZSwgdGhpcyBzaG91bGQgYmU6Cj4gCj4gICAgICAgICBpZiAoZGJnLT5jb250cm9sICYg S1ZNX0dVRVNUREJHX0VOQUJMRSkgewo+ICAgICAgICAgICAgICAgICB2Y3B1LT5ndWVzdF9kZWJ1 ZyA9IGRiZy0+Y29udHJvbDsKPiAgICAgICAgICAgICAgICAgdmNwdS0+YXJjaC5jZmcuaGVkZWxl ZyAmPSB+QklUKEVYQ19CUkVBS1BPSU5UKTsKPiAgICAgICAgIH0gZWxzZSB7Cj4gICAgICAgICAg ICAgICAgIHZjcHUtPmd1ZXN0X2RlYnVnID0gMDsKPiAgICAgICAgICAgICAgICAgdmNwdS0+YXJj aC5jZmcuaGVkZWxlZyB8PSBCSVQoRVhDX0JSRUFLUE9JTlQpOwo+ICAgICAgICAgfQo+IAo+ID4g My4gSW4ga3ZtX3Jpc2N2X3ZjcHVfc2V0dXBfY29uZmlnKCksIGRvIGJlbG93IHRoaW5nczoKPiA+ ICAgICAgICBjZmctPmhlZGVsZWcgPSBLVk1fSEVERUxFR19ERUZBVUxUOyAvLyB3aXRoIEJJVChF WENfQlJFQUtQT0lOVCkKPiA+ICAgICAgICBpZiAodmNwdS0+Z3Vlc3RfZGVidWcpCj4gPiAgICAg ICAgICAgICAgICBjZmctPmhlZGVsZWcgJj0gfkJJVChFWENfQlJFQUtQT0lOVCk7Cj4gPgo+ID4g V2lsbCBwcmVwYXJlIGEgUEFUQ0ggdjMgYWNjb3JkaW5nbHkuCgpJIHRob3VnaHQgaXQgb3Zlciwg bWF5YmUgd2Ugc2hvdWxkIGRvIHRoaXM6CgotIEluIGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2d1 ZXN0X2RlYnVnKCk6CiAgICAgICBpZiAoZGJnLT5jb250cm9sICYgS1ZNX0dVRVNUREJHX0VOQUJM RSkgewogICAgICAgICAgICAgICB2Y3B1LT5ndWVzdF9kZWJ1ZyA9IGRiZy0+Y29udHJvbDsKICAg ICAgICAgICAgICAgdmNwdS0+YXJjaC5jZmcuaGVkZWxlZyA9IEtWTV9IRURFTEVHX0RFRkFVTFQg JiAofkJJVChFWENfQlJFQUtQT0lOVCkpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAg dmNwdS0+Z3Vlc3RfZGVidWcgPSAwOwogICAgICAgICAgICAgICB2Y3B1LT5hcmNoLmNmZy5oZWRl bGVnID0gS1ZNX0hFREVMRUdfREVGQVVMVDsKICAgICAgIH0KLSBJbiBrdm1fcmlzY3ZfdmNwdV9z ZXR1cF9jb25maWcoKToKICAgICAgIGlmICghdmNwdS0+Z3Vlc3RfZGVidWcpCiAgICAgICAgICAg ICAgIGNmZy0+aGVkZWxlZyA9IEtWTV9IRURFTEVHX0RFRkFVTFQ7Cgp3aGljaCBpcyBzaW1pbGFy IHdpdGggbXkgb3JpZ2luYWwgY2hhbmdlcywgYnV0IGNsZWFyIHRoZSBiaXQgRVhDX0JSRUFLUE9J TlQgZXhwbGljaXRseS4KCkNvdWxkIHlvdSBwbGVhc2UgY29uZmlybSA/Cgo+IAo+IFllcywgcGxl YXNlIHNlbmQgdjMuCj4gCj4gVGhhbmtzLAo+IEFudXAKPiAKPiA+IE9uIDIwMjQtMDMtMDEgMTY6 MTEsIEFudXAgUGF0ZWwgPGFwYXRlbEB2ZW50YW5hbWljcm8uY29tPiB3cm90ZToKPiA+ID4KPiA+ ID4gT24gRnJpLCBNYXIgMSwgMjAyNCBhdCAxMjo1N+KAr1BNIENoYW8gRHUgPGR1Y2hhb0Blc3dp bmNvbXB1dGluZy5jb20+IHdyb3RlOgo+ID4gPiA+Cj4gPiA+ID4gT24gMjAyNC0wMy0wMSAxNToy OSwgQW51cCBQYXRlbCA8YW51cEBicmFpbmZhdWx0Lm9yZz4gd3JvdGU6Cj4gPiA+ID4gPgo+ID4g PiA+ID4gT24gRnJpLCBNYXIgMSwgMjAyNCBhdCAxMjowNeKAr1BNIENoYW8gRHUgPGR1Y2hhb0Bl c3dpbmNvbXB1dGluZy5jb20+IHdyb3RlOgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBPbiAyMDI0 LTAzLTAxIDEzOjAwLCBBbnVwIFBhdGVsIDxhbnVwQGJyYWluZmF1bHQub3JnPiB3cm90ZToKPiA+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IE9uIEZyaSwgTWFyIDEsIDIwMjQgYXQgNzowOOKAr0FN IENoYW8gRHUgPGR1Y2hhb0Blc3dpbmNvbXB1dGluZy5jb20+IHdyb3RlOgo+ID4gPiA+ID4gPiA+ ID4KPiA+ID4gPiA+ID4gPiA+IGt2bV92bV9pb2N0bF9jaGVja19leHRlbnNpb24oKTogUmV0dXJu IDEgaWYgS1ZNX0NBUF9TRVRfR1VFU1RfREVCVUcgaXMKPiA+ID4gPiA+ID4gPiA+IGJlZW4gY2hl Y2tlZC4KPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBrdm1fYXJjaF92Y3B1X2lvY3Rs X3NldF9ndWVzdF9kZWJ1ZygpOiBVcGRhdGUgdGhlIGd1ZXN0X2RlYnVnIGZsYWdzCj4gPiA+ID4g PiA+ID4gPiBmcm9tIHVzZXJzcGFjZSBhY2NvcmRpbmdseS4gUm91dGUgdGhlIGJyZWFrcG9pbnQg ZXhjZXB0aW9ucyB0byBIUyBtb2RlCj4gPiA+ID4gPiA+ID4gPiBpZiB0aGUgVkNQVSBpcyBiZWlu ZyBkZWJ1Z2dlZCBieSB1c2Vyc3BhY2UsIGJ5IGNsZWFyaW5nIHRoZQo+ID4gPiA+ID4gPiA+ID4g Y29ycmVzcG9uZGluZyBiaXQgaW4gaGVkZWxlZy4gV3JpdGUgdGhlIGFjdHVhbCBDU1IgaW4KPiA+ ID4gPiA+ID4gPiA+IGt2bV9hcmNoX3ZjcHVfbG9hZCgpLgo+ID4gPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IENoYW8gRHUgPGR1Y2hhb0Blc3dpbmNvbXB1dGluZy5j b20+Cj4gPiA+ID4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ID4gPiA+ICBhcmNoL3Jpc2N2L2luY2x1 ZGUvYXNtL2t2bV9ob3N0LmggfCAxNyArKysrKysrKysrKysrKysrKwo+ID4gPiA+ID4gPiA+ID4g IGFyY2gvcmlzY3YvaW5jbHVkZS91YXBpL2FzbS9rdm0uaCB8ICAxICsKPiA+ID4gPiA+ID4gPiA+ ICBhcmNoL3Jpc2N2L2t2bS9tYWluLmMgICAgICAgICAgICAgfCAxOCArKy0tLS0tLS0tLS0tLS0t LS0KPiA+ID4gPiA+ID4gPiA+ICBhcmNoL3Jpc2N2L2t2bS92Y3B1LmMgICAgICAgICAgICAgfCAx NSArKysrKysrKysrKysrLS0KPiA+ID4gPiA+ID4gPiA+ICBhcmNoL3Jpc2N2L2t2bS92bS5jICAg ICAgICAgICAgICAgfCAgMSArCj4gPiA+ID4gPiA+ID4gPiAgNSBmaWxlcyBjaGFuZ2VkLCAzNCBp bnNlcnRpb25zKCspLCAxOCBkZWxldGlvbnMoLSkKPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCj4gPiA+ID4gPiA+ID4gPiBpbmRleCA0ODRk MDRhOTJmYTYuLjllZTNmMDNiYTVkMSAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+IC0tLSBhL2FyY2gv cmlzY3YvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAo+ID4gPiA+ID4gPiA+ID4gKysrIGIvYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCj4gPiA+ID4gPiA+ID4gPiBAQCAtNDMsNiArNDMs MjIgQEAKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgS1ZNX0FSQ0hfUkVRX0ZMQUdTKDUsIEtWTV9S RVFVRVNUX1dBSVQgfCBLVk1fUkVRVUVTVF9OT19XQUtFVVApCj4gPiA+ID4gPiA+ID4gPiAgI2Rl ZmluZSBLVk1fUkVRX1NURUFMX1VQREFURSAgICAgICAgICAgS1ZNX0FSQ0hfUkVRKDYpCj4gPiA+ ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gKyNkZWZpbmUgS1ZNX0hFREVMRUdfREVGQVVMVCAg ICAgICAgICAgICgoX0FDKDEsIFVMKSA8PCBFWENfSU5TVF9NSVNBTElHTkVEKSB8IFwKPiA+ID4g PiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9BQygx LCBVTCkgPDwgRVhDX0JSRUFLUE9JTlQpIHwgXAo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0FDKDEsIFVMKSA8PCBFWENfU1lTQ0FMTCkg fCBcCj4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChfQUMoMSwgVUwpIDw8IEVYQ19JTlNUX1BBR0VfRkFVTFQpIHwgXAo+ID4gPiA+ID4gPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0FDKDEsIFVMKSA8 PCBFWENfTE9BRF9QQUdFX0ZBVUxUKSB8IFwKPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9BQygxLCBVTCkgPDwgRVhDX1NUT1JFX1BBR0Vf RkFVTFQpKQo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gVXNlIEJJVCh4eXopIGhlcmUuIEZv ciBleGFtcGxlOiBCSVQoRVhDX0lOU1RfTUlTQUxJR05FRCkKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gVGhhbmtzLCBJIHdpbGwgdXNlIEJJVCgpIGluc3RlYWQgaW4gbmV4dCByZXZpc2lvbi4KPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEFsc28sIEJJ VChFWENfQlJFQUtQT0lOVCkgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mIEtWTV9IRURFTEVHX0RFRkFV TFQuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEkgdGhpbmsgdGhlIGJpdCBFWENfQlJFQUtQT0lO VCBzaG91bGQgYmUgc2V0IGJ5IGRlZmF1bHQsIGxpa2Ugd2hhdCB5b3UKPiA+ID4gPiA+ID4gYWxy ZWFkeSBkaWQgaW4ga3ZtX2FyY2hfaGFyZHdhcmVfZW5hYmxlKCkuIFRoZW4gdGhlIFZTIGNvdWxk IGdldCB0aGUgZWJyZWFrCj4gPiA+ID4gPiA+IGFuZCBoYW5kbGUgaXQgYWNjb3JkaW5nbHkuCj4g PiA+ID4gPiA+Cj4gPiA+ID4gPiA+IElmIHRoZSBndWVzdF9kZWJ1ZyBpcyBlbmFibGVkLCBlYnJl YWsgaW5zdHJ1Y3Rpb25zIGFyZSBpbnNlcnRlZCBieSB0aGUKPiA+ID4gPiA+ID4gdXNlcnNwYWNl KFFFTVUpLiBTbyBLVk0gc2hvdWxkICdpbnRlcmNlcHQnIHRoZSBlYnJlYWsgYW5kIGV4aXQgdG8g UUVNVS4KPiA+ID4gPiA+ID4gQml0IEVYQ19CUkVBS1BPSU5UIHNob3VsZCBiZSBjbGVhcmVkIGlu IHRoaXMgY2FzZS4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBJZiBFWENfQlJFQUtQT0lOVCBpcyBkZWxl Z2F0ZWQgYnkgZGVmYXVsdCB0aGVuIGl0IGlzIG5vdCBjb25zaXN0ZW50IHdpdGgKPiA+ID4gPiA+ IHZjcHUtPmd1ZXN0X2RlYnVnIHdoaWNoIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQuCj4gPiA+ ID4KPiA+ID4gPiBUbyBlbmFibGUgdGhlIGd1ZXN0X2RlYnVnIGNvcnJlc3BvbmRpbmcgdG8gTk9U IGRlbGVnYXRlIHRoZSBFWENfQlJFQUtQT0lOVC4KPiA+ID4gPiBUaGV5IGFyZSBzb21laG93ICdv cHBvc2l0ZScuCj4gPiA+ID4KPiA+ID4gPiBUaGlzICdrdm1fZ3Vlc3RfZGVidWcnIGZlYXR1cmUg aXMgZGlmZmVyZW50IGZyb20gImRlYnVnIGluIHRoZSBndWVzdCIuCj4gPiA+ID4gVGhlIGxhdGVy IHJlcXVpcmVzIHRoZSBkZWxlZ2F0aW9uIG9mIEVYQ19CUkVBS1BPSU5ULgo+ID4gPiA+IFRoZSBm b3JtZXIgZG9lcyBub3QuCj4gPiA+Cj4gPiA+IEluIHdoaWNoIGNhc2UgeW91ciBiZWxvdyBjb2Rl IGlzIHRvdGFsbHkgbWlzbGVhZGluZy4KPiA+ID4KPiA+ID4gKyAgICAgICBpZiAoZGJnLT5jb250 cm9sICYgS1ZNX0dVRVNUREJHX0VOQUJMRSkgewo+ID4gPiArICAgICAgICAgICAgICAgdmNwdS0+ Z3Vlc3RfZGVidWcgPSBkYmctPmNvbnRyb2w7Cj4gPiA+ICsgICAgICAgICAgICAgICB2Y3B1LT5h cmNoLmNmZy5oZWRlbGVnID0gS1ZNX0hFREVMRUdfR1VFU1RfREVCVUc7Cj4gPiA+ICsgICAgICAg fSBlbHNlIHsKPiA+ID4gKyAgICAgICAgICAgICAgIHZjcHUtPmd1ZXN0X2RlYnVnID0gMDsKPiA+ ID4gKyAgICAgICAgICAgICAgIHZjcHUtPmFyY2guY2ZnLmhlZGVsZWcgPSBLVk1fSEVERUxFR19E RUZBVUxUOwo+ID4gPiArICAgICAgIH0KPiA+ID4KPiA+ID4gVGhpcyBzaG91bGQgaGF2ZSBiZWVu Ogo+ID4gPgo+ID4gPiArICAgICAgIGlmIChkYmctPmNvbnRyb2wgJiBLVk1fR1VFU1REQkdfRU5B QkxFKSB7Cj4gPiA+ICsgICAgICAgICAgICAgICB2Y3B1LT5ndWVzdF9kZWJ1ZyA9IGRiZy0+Y29u dHJvbDsKPiA+ID4gKyAgICAgICAgICAgICAgIHZjcHUtPmFyY2guY2ZnLmhlZGVsZWcgJj0gfkJJ VChFWENfQlJFQUtQT0lOVCk7Cj4gPiA+ICsgICAgICAgfSBlbHNlIHsKPiA+ID4gKyAgICAgICAg ICAgICAgIHZjcHUtPmd1ZXN0X2RlYnVnID0gMDsKPiA+ID4gKyAgICAgICAgICAgICAgIHZjcHUt PmFyY2guY2ZnLmhlZGVsZWcgfD0gQklUKEVYQ19CUkVBS1BPSU5UKTsKPiA+ID4gKyAgICAgICB9 Cj4gPiA+Cj4gPiA+ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gPiA+ICsjZGVmaW5lIEtWTV9IRURFTEVHX0dVRVNUX0RFQlVHICAgICAgICAgICAgICAg ICgoX0FDKDEsIFVMKSA8PCBFWENfSU5TVF9NSVNBTElHTkVEKSB8IFwKPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9BQygxLCBVTCkgPDwg RVhDX1NZU0NBTEwpIHwgXAo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoX0FDKDEsIFVMKSA8PCBFWENfSU5TVF9QQUdFX0ZBVUxUKSB8IFwK PiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KF9BQygxLCBVTCkgPDwgRVhDX0xPQURfUEFHRV9GQVVMVCkgfCBcCj4gPiA+ID4gPiA+ID4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfQUMoMSwgVUwpIDw8IEVY Q19TVE9SRV9QQUdFX0ZBVUxUKSkKPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IE5vIG5lZWQg Zm9yIEtWTV9IRURFTEVHX0dVRVNUX0RFQlVHLCBzZWUgYmVsb3cuCj4gPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ICsjZGVmaW5lIEtWTV9ISURFTEVHX0RFRkFV TFQgICAgICAgICAgICAoKF9BQygxLCBVTCkgPDwgSVJRX1ZTX1NPRlQpIHwgXAo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoX0FDKDEsIFVM KSA8PCBJUlFfVlNfVElNRVIpIHwgXAo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoX0FDKDEsIFVMKSA8PCBJUlFfVlNfRVhUKSkKPiA+ID4g PiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IFNhbWUgYXMgYWJvdmUsIHVz ZSBCSVQoeHl6KSBoZXJlLgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiAgZW51bSBrdm1f cmlzY3ZfaGZlbmNlX3R5cGUgewo+ID4gPiA+ID4gPiA+ID4gICAgICAgICBLVk1fUklTQ1ZfSEZF TkNFX1VOS05PV04gPSAwLAo+ID4gPiA+ID4gPiA+ID4gICAgICAgICBLVk1fUklTQ1ZfSEZFTkNF X0dWTUFfVk1JRF9HUEEsCj4gPiA+ID4gPiA+ID4gPiBAQCAtMTY5LDYgKzE4NSw3IEBAIHN0cnVj dCBrdm1fdmNwdV9jc3Igewo+ID4gPiA+ID4gPiA+ID4gIHN0cnVjdCBrdm1fdmNwdV9jb25maWcg ewo+ID4gPiA+ID4gPiA+ID4gICAgICAgICB1NjQgaGVudmNmZzsKPiA+ID4gPiA+ID4gPiA+ICAg ICAgICAgdTY0IGhzdGF0ZWVuMDsKPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgdW5zaWduZWQgbG9u ZyBoZWRlbGVnOwo+ID4gPiA+ID4gPiA+ID4gIH07Cj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiA+ID4gIHN0cnVjdCBrdm1fdmNwdV9zbXN0YXRlZW5fY3NyIHsKPiA+ID4gPiA+ID4gPiA+IGRp ZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvdWFwaS9hc20va3ZtLmggYi9hcmNoL3Jpc2N2 L2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKPiA+ID4gPiA+ID4gPiA+IGluZGV4IDc0OTllODhhOTQ3 Yy4uMzlmNGY0YjlkZWRlIDEwMDY0NAo+ID4gPiA+ID4gPiA+ID4gLS0tIGEvYXJjaC9yaXNjdi9p bmNsdWRlL3VhcGkvYXNtL2t2bS5oCj4gPiA+ID4gPiA+ID4gPiArKysgYi9hcmNoL3Jpc2N2L2lu Y2x1ZGUvdWFwaS9hc20va3ZtLmgKPiA+ID4gPiA+ID4gPiA+IEBAIC0xNyw2ICsxNyw3IEBACj4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gICNkZWZpbmUgX19LVk1fSEFWRV9JUlFfTElO RQo+ID4gPiA+ID4gPiA+ID4gICNkZWZpbmUgX19LVk1fSEFWRV9SRUFET05MWV9NRU0KPiA+ID4g PiA+ID4gPiA+ICsjZGVmaW5lIF9fS1ZNX0hBVkVfR1VFU1RfREVCVUcKPiA+ID4gPiA+ID4gPiA+ Cj4gPiA+ID4gPiA+ID4gPiAgI2RlZmluZSBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQg MQo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2 L2t2bS9tYWluLmMgYi9hcmNoL3Jpc2N2L2t2bS9tYWluLmMKPiA+ID4gPiA+ID4gPiA+IGluZGV4 IDIyNWE0MzVkOWM5YS4uYmFiMmVjMzRjZDg3IDEwMDY0NAo+ID4gPiA+ID4gPiA+ID4gLS0tIGEv YXJjaC9yaXNjdi9rdm0vbWFpbi5jCj4gPiA+ID4gPiA+ID4gPiArKysgYi9hcmNoL3Jpc2N2L2t2 bS9tYWluLmMKPiA+ID4gPiA+ID4gPiA+IEBAIC0yMiwyMiArMjIsOCBAQCBsb25nIGt2bV9hcmNo X2Rldl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiAgaW50IGt2bV9hcmNoX2hhcmR3YXJlX2VuYWJsZSh2b2lkKQo+ID4gPiA+ID4gPiA+ID4g IHsKPiA+ID4gPiA+ID4gPiA+IC0gICAgICAgdW5zaWduZWQgbG9uZyBoaWRlbGVnLCBoZWRlbGVn Owo+ID4gPiA+ID4gPiA+ID4gLQo+ID4gPiA+ID4gPiA+ID4gLSAgICAgICBoZWRlbGVnID0gMDsK PiA+ID4gPiA+ID4gPiA+IC0gICAgICAgaGVkZWxlZyB8PSAoMVVMIDw8IEVYQ19JTlNUX01JU0FM SUdORUQpOwo+ID4gPiA+ID4gPiA+ID4gLSAgICAgICBoZWRlbGVnIHw9ICgxVUwgPDwgRVhDX0JS RUFLUE9JTlQpOwo+ID4gPiA+ID4gPiA+ID4gLSAgICAgICBoZWRlbGVnIHw9ICgxVUwgPDwgRVhD X1NZU0NBTEwpOwo+ID4gPiA+ID4gPiA+ID4gLSAgICAgICBoZWRlbGVnIHw9ICgxVUwgPDwgRVhD X0lOU1RfUEFHRV9GQVVMVCk7Cj4gPiA+ID4gPiA+ID4gPiAtICAgICAgIGhlZGVsZWcgfD0gKDFV TCA8PCBFWENfTE9BRF9QQUdFX0ZBVUxUKTsKPiA+ID4gPiA+ID4gPiA+IC0gICAgICAgaGVkZWxl ZyB8PSAoMVVMIDw8IEVYQ19TVE9SRV9QQUdFX0ZBVUxUKTsKPiA+ID4gPiA+ID4gPiA+IC0gICAg ICAgY3NyX3dyaXRlKENTUl9IRURFTEVHLCBoZWRlbGVnKTsKPiA+ID4gPiA+ID4gPiA+IC0KPiA+ ID4gPiA+ID4gPiA+IC0gICAgICAgaGlkZWxlZyA9IDA7Cj4gPiA+ID4gPiA+ID4gPiAtICAgICAg IGhpZGVsZWcgfD0gKDFVTCA8PCBJUlFfVlNfU09GVCk7Cj4gPiA+ID4gPiA+ID4gPiAtICAgICAg IGhpZGVsZWcgfD0gKDFVTCA8PCBJUlFfVlNfVElNRVIpOwo+ID4gPiA+ID4gPiA+ID4gLSAgICAg ICBoaWRlbGVnIHw9ICgxVUwgPDwgSVJRX1ZTX0VYVCk7Cj4gPiA+ID4gPiA+ID4gPiAtICAgICAg IGNzcl93cml0ZShDU1JfSElERUxFRywgaGlkZWxlZyk7Cj4gPiA+ID4gPiA+ID4gPiArICAgICAg IGNzcl93cml0ZShDU1JfSEVERUxFRywgS1ZNX0hFREVMRUdfREVGQVVMVCk7Cj4gPiA+ID4gPiA+ ID4gPiArICAgICAgIGNzcl93cml0ZShDU1JfSElERUxFRywgS1ZNX0hJREVMRUdfREVGQVVMVCk7 Cj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gICAgICAgICAvKiBWUyBzaG91bGQgYWNj ZXNzIG9ubHkgdGhlIHRpbWUgY291bnRlciBkaXJlY3RseS4gRXZlcnl0aGluZyBlbHNlIHNob3Vs ZCB0cmFwICovCj4gPiA+ID4gPiA+ID4gPiAgICAgICAgIGNzcl93cml0ZShDU1JfSENPVU5URVJF TiwgMHgwMik7Cj4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rdm0vdmNw dS5jIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5jCj4gPiA+ID4gPiA+ID4gPiBpbmRleCBiNWNhOWYy ZTk4YWMuLjI0MjA3NmMyMjI3ZiAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+IC0tLSBhL2FyY2gvcmlz Y3Yva3ZtL3ZjcHUuYwo+ID4gPiA+ID4gPiA+ID4gKysrIGIvYXJjaC9yaXNjdi9rdm0vdmNwdS5j Cj4gPiA+ID4gPiA+ID4gPiBAQCAtNDc1LDggKzQ3NSwxNSBAQCBpbnQga3ZtX2FyY2hfdmNwdV9p b2N0bF9zZXRfbXBzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCj4gPiA+ID4gPiA+ID4gPiAg aW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2d1ZXN0X2RlYnVnKHN0cnVjdCBrdm1fdmNwdSAq dmNwdSwKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnICpkYmcpCj4gPiA+ID4gPiA+ID4gPiAgewo+ID4g PiA+ID4gPiA+ID4gLSAgICAgICAvKiBUT0RPOyBUbyBiZSBpbXBsZW1lbnRlZCBsYXRlci4gKi8K PiA+ID4gPiA+ID4gPiA+IC0gICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gPiBpZiAodmNwdS0+YXJjaC5yYW5fYXRsZWFzdF9vbmNlKQo+ID4gPiA+ID4gPiA+ ICAgICAgICAgcmV0dXJuIC1FQlVTWTsKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSWYgd2UgZW5h YmxlZCB0aGUgZ3Vlc3RfZGVidWcgaW4gUUVNVSBzaWRlLCB0aGVuIHRoZSBLVk1fU0VUX0dVRVNU X0RFQlVHIGlvY3RsCj4gPiA+ID4gPiA+IHdpbGwgY29tZSBiZWZvcmUgdGhlIGZpcnN0IEtWTV9S VU4uIFRoaXMgd2lsbCBhbHdheXMgY2F1c2UgYW4gRVJST1IuCj4gPiA+ID4gPgo+ID4gPiA+ID4g VGhlIGNoZWNrIGVuc3VyZXMgdGhhdCBLVk0gdXNlciBzcGFjZSBjYW4gb25seSBlbmFibGUvZGlz YWJsZQo+ID4gPiA+ID4gZ3Vlc3QgZGVidWcgYmVmb3JlIHRoZSBWQ1BVIGlzIHJ1bi4gSSBkb24n dCBzZWUgd2h5IHRoaXMgd291bGQKPiA+ID4gPiA+IGZhaWwgZm9yIFFFTVUuCj4gPiA+ID4KPiA+ ID4gPiBJbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBHREIgYW5kIFFFTVUsIHRoZSB1 c2Vyc3BhY2Ugd2lsbCBlbmFibGUvZGlzYWJsZQo+ID4gPiA+IGd1ZXN0X2RlYnVnIGZyZXF1ZW50 bHkgZHVyaW5nIHRoZSBkZWJ1Z2dpbmcgKGFsbW9zdCBldmVyeSBzdGVwKS4KPiA+ID4gPiBUaGUg c2VxdWVuY2Ugc2hvdWxkIGxpa2U6Cj4gPiA+ID4KPiA+ID4gPiBLVk1fU0VUX0dVRVNUX0RFQlVH IGVuYWJsZQo+ID4gPiA+IEtWTV9SVU4KPiA+ID4gPiBLVk1fU0VUX0dVRVNUX0RFQlVHIGRpc2Fi bGUKPiA+ID4gPiBLVk1fU0VUX0dVRVNUX0RFQlVHIGVuYWJsZQo+ID4gPiA+IEtWTV9SVU4KPiA+ ID4gPiBLVk1fU0VUX0dVRVNUX0RFQlVHIGRpc2FibGUKPiA+ID4gPiBLVk1fU0VUX0dVRVNUX0RF QlVHIGVuYWJsZQo+ID4gPiA+IEtWTV9SVU4KPiA+ID4gPiBLVk1fU0VUX0dVRVNUX0RFQlVHIGRp c2FibGUKPiA+ID4gPiAuLi4KPiA+ID4KPiA+ID4gRmFpciBlbm91Z2gsIG5vIG5lZWQgdG8gY2hl Y2sgInJhbl9hdGxlYXN0X29uY2UiCj4gPiA+Cj4gPiA+ID4KPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gKyAgICAgICBpZiAo ZGJnLT5jb250cm9sICYgS1ZNX0dVRVNUREJHX0VOQUJMRSkgewo+ID4gPiA+ID4gPiA+ID4gKyAg ICAgICAgICAgICAgIHZjcHUtPmd1ZXN0X2RlYnVnID0gZGJnLT5jb250cm9sOwo+ID4gPiA+ID4g PiA+ID4gKyAgICAgICAgICAgICAgIHZjcHUtPmFyY2guY2ZnLmhlZGVsZWcgPSBLVk1fSEVERUxF R19HVUVTVF9ERUJVRzsKPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgfSBlbHNlIHsKPiA+ID4gPiA+ ID4gPiA+ICsgICAgICAgICAgICAgICB2Y3B1LT5ndWVzdF9kZWJ1ZyA9IDA7Cj4gPiA+ID4gPiA+ ID4gPiArICAgICAgICAgICAgICAgdmNwdS0+YXJjaC5jZmcuaGVkZWxlZyA9IEtWTV9IRURFTEVH X0RFRkFVTFQ7Cj4gPiA+ID4gPiA+ID4gPiArICAgICAgIH0KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+IERvbid0IHVwZGF0ZSB2Y3B1LT5hcmNoLmNmZy5oZWRlbGVnIGhlcmUgc2luY2UgaXQg c2hvdWxkIGJlIG9ubHkgZG9uZQo+ID4gPiA+ID4gPiA+IGluIGt2bV9yaXNjdl92Y3B1X3NldHVw X2NvbmZpZygpLgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4g PiArICAgICAgIHJldHVybiAwOwo+ID4gPiA+ID4gPiA+ID4gIH0KPiA+ID4gPiA+ID4gPiA+Cj4g PiA+ID4gPiA+ID4gPiAgc3RhdGljIHZvaWQga3ZtX3Jpc2N2X3ZjcHVfc2V0dXBfY29uZmlnKHN0 cnVjdCBrdm1fdmNwdSAqdmNwdSkKPiA+ID4gPiA+ID4gPiA+IEBAIC01MDUsNiArNTEyLDkgQEAg c3RhdGljIHZvaWQga3ZtX3Jpc2N2X3ZjcHVfc2V0dXBfY29uZmlnKHN0cnVjdCBrdm1fdmNwdSAq dmNwdSkKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgICBpZiAocmlzY3ZfaXNhX2V4dGVu c2lvbl9hdmFpbGFibGUoaXNhLCBTTVNUQVRFRU4pKQo+ID4gPiA+ID4gPiA+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgY2ZnLT5oc3RhdGVlbjAgfD0gU01TVEFURUVOMF9TU1RBVEVFTjA7Cj4g PiA+ID4gPiA+ID4gPiAgICAgICAgIH0KPiA+ID4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gPiA+ ICsgICAgICAgaWYgKCF2Y3B1LT5ndWVzdF9kZWJ1ZykKPiA+ID4gPiA+ID4gPiA+ICsgICAgICAg ICAgICAgICBjZmctPmhlZGVsZWcgPSBLVk1fSEVERUxFR19ERUZBVUxUOwo+ID4gPiA+ID4gPiA+ Cj4gPiA+ID4gPiA+ID4gVGhpcyBzaG91bGQgYmU6Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4g PiBjZmctPmhlZGVsZWcgPSBLVk1fSEVERUxFR19ERUZBVUxUOwo+ID4gPiA+ID4gPiA+IGlmICh2 Y3B1LT5ndWVzdF9kZWJ1ZykKPiA+ID4gPiA+ID4gPiAgICAgICAgIGNmZy0+aGVkZWxlZyB8PSBC SVQoRVhDX0JSRUFLUE9JTlQpOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBMaWtlIGFib3ZlLCBo ZXJlIHRoZSBsb2dpYyBzaG91bGQgYmU6Cj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IGNmZy0+aGVk ZWxlZyA9IEtWTV9IRURFTEVHX0RFRkFVTFQ7IC8vIHdpdGggQklUKEVYQ19CUkVBS1BPSU5UKQo+ ID4gPiA+ID4gPiBpZiAodmNwdS0+Z3Vlc3RfZGVidWcpCj4gPiA+ID4gPiA+ICAgICAgICAgY2Zn LT5oZWRlbGVnICY9IH5CSVQoRVhDX0JSRUFLUE9JTlQpOwo+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiBBbm90aGVyIGFwcHJvYWNoIGlzOgo+ID4gPiA+ID4gPiBpbml0aWFsaXplIHRoZSBjZmctPmhl ZGVsZWcgYXMgS1ZNX0hFREVMRUdfREVGQVVMVCBkdXJpbmcga3ZtX2FyY2hfdmNwdV9jcmVhdGUo KS4KPiA+ID4gPiA+ID4gQmVzaWRlcyB0aGF0LCBvbmx5IHVwZGF0ZSB0aGUgY2ZnLT5oZWRlbGVn IGluIGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X2d1ZXN0X2RlYnVnKCkuCj4gPiA+ID4gPgo+ID4g PiA+ID4gSSBkaXNhZ3JlZS4gV2Ugc2hvdWxkIGhhbmRsZSBoZWRlbGVnIGp1c3QgbGlrZSB3ZSBo YW5kbGUgaGVudmNmZy4KPiA+ID4gPgo+ID4gPiA+IE9LLCBsZXQncyBvbmx5IHVwZGF0ZSB0aGUg Y2ZnLT5oZWRlbGVnIGluIGt2bV9yaXNjdl92Y3B1X3NldHVwX2NvbmZpZygpLgo+ID4gPiA+Cj4g PiA+ID4gPgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiAgfQo+ID4g PiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ICB2b2lkIGt2bV9hcmNoX3ZjcHVfbG9hZChzdHJ1 Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCj4gPiA+ID4gPiA+ID4gPiBAQCAtNTE5LDYgKzUy OSw3IEBAIHZvaWQga3ZtX2FyY2hfdmNwdV9sb2FkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50 IGNwdSkKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgY3NyX3dyaXRlKENTUl9WU0VQQywgY3NyLT52 c2VwYyk7Cj4gPiA+ID4gPiA+ID4gPiAgICAgICAgIGNzcl93cml0ZShDU1JfVlNDQVVTRSwgY3Ny LT52c2NhdXNlKTsKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgY3NyX3dyaXRlKENTUl9WU1RWQUws IGNzci0+dnN0dmFsKTsKPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgY3NyX3dyaXRlKENTUl9IRURF TEVHLCBjZmctPmhlZGVsZWcpOwo+ID4gPiA+ID4gPiA+ID4gICAgICAgICBjc3Jfd3JpdGUoQ1NS X0hWSVAsIGNzci0+aHZpcCk7Cj4gPiA+ID4gPiA+ID4gPiAgICAgICAgIGNzcl93cml0ZShDU1Jf VlNBVFAsIGNzci0+dnNhdHApOwo+ID4gPiA+ID4gPiA+ID4gICAgICAgICBjc3Jfd3JpdGUoQ1NS X0hFTlZDRkcsIGNmZy0+aGVudmNmZyk7Cj4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvYXJj aC9yaXNjdi9rdm0vdm0uYyBiL2FyY2gvcmlzY3Yva3ZtL3ZtLmMKPiA+ID4gPiA+ID4gPiA+IGlu ZGV4IGNlNThiYzQ4ZTViOC4uNzM5NmI4NjU0ZjQ1IDEwMDY0NAo+ID4gPiA+ID4gPiA+ID4gLS0t IGEvYXJjaC9yaXNjdi9rdm0vdm0uYwo+ID4gPiA+ID4gPiA+ID4gKysrIGIvYXJjaC9yaXNjdi9r dm0vdm0uYwo+ID4gPiA+ID4gPiA+ID4gQEAgLTE4Niw2ICsxODYsNyBAQCBpbnQga3ZtX3ZtX2lv Y3RsX2NoZWNrX2V4dGVuc2lvbihzdHJ1Y3Qga3ZtICprdm0sIGxvbmcgZXh0KQo+ID4gPiA+ID4g PiA+ID4gICAgICAgICBjYXNlIEtWTV9DQVBfUkVBRE9OTFlfTUVNOgo+ID4gPiA+ID4gPiA+ID4g ICAgICAgICBjYXNlIEtWTV9DQVBfTVBfU1RBVEU6Cj4gPiA+ID4gPiA+ID4gPiAgICAgICAgIGNh c2UgS1ZNX0NBUF9JTU1FRElBVEVfRVhJVDoKPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgY2FzZSBL Vk1fQ0FQX1NFVF9HVUVTVF9ERUJVRzoKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgICBy ID0gMTsKPiA+ID4gPiA+ID4gPiA+ICAgICAgICAgICAgICAgICBicmVhazsKPiA+ID4gPiA+ID4g PiA+ICAgICAgICAgY2FzZSBLVk1fQ0FQX05SX1ZDUFVTOgo+ID4gPiA+ID4gPiA+ID4gLS0KPiA+ ID4gPiA+ID4gPiA+IDIuMTcuMQo+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ ID4gPiA+IFJlZ2FyZHMsCj4gPiA+ID4gPiA+ID4gQW51cAo+ID4gPiA+ID4gPgo+ID4gPiA+ID4g PiBUaGFua3MsCj4gPiA+ID4gPiA+IENoYW8KPiA+ID4gPiA+Cj4gPiA+ID4gPiBSZWdhcmRzLAo+ ID4gPiA+ID4gQW51cAo+ID4gPiA+Cj4gPiA+ID4gVGhhbmtzLAo+ID4gPiA+IENoYW8KPiA+ID4g PiAtLQo+ID4gPiA+IGt2bS1yaXNjdiBtYWlsaW5nIGxpc3QKPiA+ID4gPiBrdm0tcmlzY3ZAbGlz dHMuaW5mcmFkZWFkLm9yZwo+ID4gPiA+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxt YW4vbGlzdGluZm8va3ZtLXJpc2N2Cj4gPiA+Cj4gPiA+IFJlZ2FyZHMsCj4gPiA+IEFudXAK