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 X-Spam-Level: X-Spam-Status: No, score=-3.3 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD98EC33CA9 for ; Mon, 13 Jan 2020 19:02:59 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 869A9214AF for ; Mon, 13 Jan 2020 19:02:59 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PtbTMiUE" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 869A9214AF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:54538 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ir4zK-0008CS-J4 for qemu-devel@archiver.kernel.org; Mon, 13 Jan 2020 14:02:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:33069) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ir4yQ-0007ii-Nd for qemu-devel@nongnu.org; Mon, 13 Jan 2020 14:02:04 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ir4yO-0006EG-MY for qemu-devel@nongnu.org; Mon, 13 Jan 2020 14:02:02 -0500 Received: from mail-lf1-x143.google.com ([2a00:1450:4864:20::143]:36941) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ir4yO-0006Cn-Be for qemu-devel@nongnu.org; Mon, 13 Jan 2020 14:02:00 -0500 Received: by mail-lf1-x143.google.com with SMTP id b15so7707953lfc.4 for ; Mon, 13 Jan 2020 11:02:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=6++MrcCBmrVxPhrUnlMDVibQ7hwF8CWrqhrWWkblI9c=; b=PtbTMiUE/Fav3osb1BGGCxgiEaPqd+zywdMwCgiSxqo71To3O5mk5v7GxoX9rX1oC5 WXZWZEzZlyLcFGRc56JK4rW0B8UVYdQ9abAo0fujgxU/mcyVcLKd0jBn2gtld/GZPhux 4gyes/P2dP61dwC9rYleMWjYy6FiSur7hhGxdui6MnvK1ZQFquDql3gRqYJHrjezBgwH pifXBwVev/1ni/cQxQqVJJ9niir23KV9PBGUybkmpDZyejaM5N6uif+71aI8JAyRAKM6 w57AFBTTiQDkt8qraUHykQnXxpCEnFD4WtVXVHILn3JbSkAPTK/btCqiv9p1VlPSyiKw Rz+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=6++MrcCBmrVxPhrUnlMDVibQ7hwF8CWrqhrWWkblI9c=; b=SnEwc1wh5gKiMHjVSLiN0OByu+Y7DZuR2WuObS4346VQHlJi3ehy4WRRln7u0i3ADq 5DwZBd7Uw5ZPdLPeF+W5CqEb2rP26B4Z2hRAorqPRiqv1SP1hIW1izLCL247WfwiT24Q TBQtM1klVDCTozXrQ3uICjPoU4XHOEIIEiLd8OSMK6yc/H99nAyVPCTtDMwVSdmZosKs 16+2yhHIwR6VdLDZ2AdAQYInaDORfUHISYaNuzkMhsNOjn0pGM+3/trsoA2MwCuTu8D8 0kNU8G7sV4GvW3+NWstoAg82dd3fcCttN7+FSzEvsSQkR+8OXdbI8M5yc2V63fS6YSH7 pbvg== X-Gm-Message-State: APjAAAUcX+tpXavkgQEsTcu9HfxlIYmo7uGz/gTCz0AH5J9EoH3oCbeq +UhlKQkGqva0xR/Go0jbExDk5jztTX/Y0sGhR6M= X-Google-Smtp-Source: APXvYqw+g2vrAm9cX7AKpyLZVnr+yOD4d87+gCmZ7HeFY1maN99qm3O85Pz18oxwtUipoT6e0XyY2nr9OF39AJqVUGo= X-Received: by 2002:ac2:4add:: with SMTP id m29mr10353482lfp.190.1578942118569; Mon, 13 Jan 2020 11:01:58 -0800 (PST) MIME-Version: 1.0 References: <20190311180216.18811-1-jandryuk@gmail.com> <20190311180216.18811-7-jandryuk@gmail.com> <57dc1083d20a469785f05a2e5250a820@AMSPEX02CL02.citrite.net> <20190322030936.fkiajz5ifgaejkd4@MacBook-Air-de-Roger.local> In-Reply-To: From: Jason Andryuk Date: Mon, 13 Jan 2020 14:01:47 -0500 Message-ID: Subject: Re: [Xen-devel] [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE To: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4864:20::143 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Andrew Cooper , "marmarek@invisiblethingslab.com" , "qemu-devel@nongnu.org" , Simon Gaiser , Paul Durrant , Anthony Perard , "xen-devel@lists.xenproject.org" Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" On Fri, Mar 22, 2019 at 3:43 PM Jason Andryuk wrote: > > On Thu, Mar 21, 2019 at 11:09 PM Roger Pau Monn=C3=A9 wrote: > > > > On Wed, Mar 20, 2019 at 01:28:47PM -0400, Jason Andryuk wrote: > > > On Fri, Mar 15, 2019 at 12:28 PM Andrew Cooper > > > wrote: > > > > > > > > On 15/03/2019 09:17, Paul Durrant wrote: > > > > >> -----Original Message----- > > > > >> From: Jason Andryuk [mailto:jandryuk@gmail.com] > > > > >> Sent: 14 March 2019 18:16 > > > > >> To: Paul Durrant > > > > >> Cc: qemu-devel@nongnu.org; xen-devel@lists.xenproject.org; marma= rek@invisiblethingslab.com; Simon > > > > >> Gaiser ; Stefano Stabellini ; Anthony Perard > > > > >> > > > > >> Subject: Re: [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_= PAGE_SIZE > > > > >> > > > > >> On Wed, Mar 13, 2019 at 11:09 AM Paul Durrant wrote: > > > > >>>> -----Original Message----- > > > > >>>> From: Jason Andryuk [mailto:jandryuk@gmail.com] > > > > >>>> Sent: 11 March 2019 18:02 > > > > >>>> To: qemu-devel@nongnu.org > > > > >>>> Cc: xen-devel@lists.xenproject.org; marmarek@invisiblethingsla= b.com; Simon Gaiser > > > > >>>> ; Jason Andryuk ; Stefano Stabellini > > > > >>>> ; Anthony Perard ; Paul Durrant > > > > >>>> > > > > >>>> Subject: [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PA= GE_SIZE > > > > >>>> > > > > >>>> From: Simon Gaiser > > > > >>>> > > > > >>>> If a pci memory region has a size < XEN_PAGE_SIZE it can get l= ocated at > > > > >>>> an address which is not page aligned. > > > > >>> IIRC the PCI spec says that the minimum memory region size shou= ld be at least 4k. Should we even be > > > > >> tolerating BARs smaller than that? > > > > >>> Paul > > > > >>> > > > > >> Hi, Paul. > > > > >> > > > > >> Simon found this, so it affects a real device. Simon, do you re= call > > > > >> which device was affected? > > > > >> > > > > >> I think BARs only need to be power-of-two size and aligned, and = 4k is > > > > >> not a minimum. 16bytes may be a minimum, but I don't know what = the > > > > >> spec says. > > > > >> > > > > >> On an Ivy Bridge system, here are some of the devices with BARs = smaller than 4K: > > > > >> 00:16.0 Communication controller: Intel Corporation 7 Series/C21= 0 > > > > >> Series Chipset Family MEI Controller #1 (rev 04) > > > > >> Memory at d0735000 (64-bit, non-prefetchable) [disabled] [siz= e=3D16] > > > > >> 00:1d.0 USB controller: Intel Corporation 7 Series/C210 Series C= hipset > > > > >> Family USB Enhanced Host Controller #1 (rev 04) (prog-if 20 [EHC= I]) > > > > >> Memory at d0739000 (32-bit, non-prefetchable) [disabled] [siz= e=3D1K] > > > > >> 00:1f.3 SMBus: Intel Corporation 7 Series/C210 Series Chipset Fa= mily > > > > >> SMBus Controller (rev 04) > > > > >> Memory at d0734000 (64-bit, non-prefetchable) [disabled] [siz= e=3D256] > > > > >> 02:00.0 System peripheral: JMicron Technology Corp. SD/MMC Host > > > > >> Controller (rev 30) > > > > >> Memory at d0503000 (32-bit, non-prefetchable) [disabled] [siz= e=3D256] > > > > >> > > > > >> These examples are all 4K aligned, so this is not an issue on th= is machine. > > > > >> > > > > >> Reviewing the code, I'm now wondering if the following in > > > > >> hw/xen/xen_pt.c:xen_pt_region_update is wrong: rc =3D > > > > >> xc_domain_memory_mapping(xen_xc, xen_domid, > > > > >> XEN_PFN(guest_addr + XC_PAG= E_SIZE - 1), > > > > >> XEN_PFN(machine_addr + XC_P= AGE_SIZE - 1), > > > > >> XEN_PFN(size + XC_PAGE_SIZE= - 1), > > > > >> op); > > > > >> > > > > >> If a bar of size 0x100 is at 0xd0500800, then the machine_addr p= assed > > > > >> in would be 0xd0501000 which is past the actual location. Shoul= d the > > > > >> call arguments just be XEN_PFN(guest_addr) & XEN_PFN(machine_add= r)? > > > > >> > > > > >> BARs smaller than a page would also be a problem if BARs for dif= ferent > > > > >> devices shared the same page. > > > > > Exactly. We cannot pass them through with any degree of safety (n= ot that passthrough of an arbitrary device is a particularly safe thing to = do anyway). The xen-pt code would instead need to trap those BARs and perfo= rm the accesses to the real BAR itself. Ultimately though I think we should= be retiring the xen-pt code in favour of a standalone emulator. > > > > > > > > It doesn't matter if the BAR is smaller than 4k, if there are holes= next > > > > to it. > > > > > > > > Do we know what the case is in practice for these USB controllers? > > > > > > > > If the worst comes to the worst, we can re-enumerate the PCI bus to > > > > ensure that all bars smaller than 4k still have 4k alignment betwee= n > > > > them. That way we can safely pass them through even when they are = smaller. > > > > > > Andrew, thanks for checking the spec on the minimum BAR size. > > > > > > Dropping the Round PCI region patch from QMEU, the guest HVM will hav= e: > > > > > > 00:06.0 SD Host controller: Ricoh Co Ltd PCIe SDXC/MMC Host Controlle= r (rev 07) > > > Memory at f2028800 (32-bit, non-prefetchable) [size=3D256] > > > 00:07.0 USB controller: NEC Corporation uPD720200 USB 3.0 Host > > > Controller (rev 04) (prog-if 30 [XHCI]) > > > Memory at f2024000 (64-bit, non-prefetchable) [size=3D8K] > > > 00:08.0 USB controller: Intel Corporation 6 Series/C200 Series Chipse= t > > > Family USB Enhanced Host Controller #2 (rev 05) (prog-if 20 [EHCI]) > > > Memory at f2028000 (32-bit, non-prefetchable) [size=3D1K] > > > 00:09.0 USB controller: Intel Corporation 6 Series/C200 Series Chipse= t > > > Family USB Enhanced Host Controller #1 (rev 05) (prog-if 20 [EHCI]) > > > Memory at f2028400 (32-bit, non-prefetchable) [size=3D1K] > > > > > > 00:09.0, 00:08.0 & 00:06.0 all share the same page. Only 00:08.0 is > > > working. With some added debugging output, you'll see that the same > > > page* is used for three of the BARs. > > > > > > [00:06.0] mapping guest_addr 0xf2028800 gfn 0xf2028 to maddr > > > 0xe1a30000 mfn 0xe1a30 > > > [00:07.0] mapping guest_addr 0xf2024000 gfn 0xf2024 to maddr > > > 0xe0800000 mfn 0xe0800 > > > [00:09.0] mapping guest_addr 0xf2028400 gfn 0xf2028 to maddr > > > 0xe1900000 mfn 0xe1900 > > > [00:08.0] mapping guest_addr 0xf2028000 gfn 0xf2028 to maddr > > > 0xe1a2f000 mfn 0xe1a2f > > > > The patch below should prevent hvmloader from placing multiple BARs on > > the same page, could you give it a try? > > > > Note that this is not going to prevent the guest from moving those > > BARs around and place them in the same page, thus breaking the initial > > placement done by hvmloader. > > > > Thanks, Roger. > > Hi, Roger. > > I've minimally tested this. Yes, this patch seems to place small BARs > into separate pages. The linux stubdom and QEMU then use the spacing > as provided by hvmloader. Roger, Would you mind submitting this patch to Xen? Thanks, Jason > > > > ---8<--- > > diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/= pci.c > > index 0b708bf578..c433b34cd6 100644 > > --- a/tools/firmware/hvmloader/pci.c > > +++ b/tools/firmware/hvmloader/pci.c > > @@ -489,6 +489,10 @@ void pci_setup(void) > > > > resource->base =3D base; > > > > + if ( (bar_data & PCI_BASE_ADDRESS_SPACE) =3D=3D > > + PCI_BASE_ADDRESS_SPACE_MEMORY ) > > + resource->base =3D ROUNDUP(resource->base, PAGE_SIZE); > > + > > pci_writel(devfn, bar_reg, bar_data); > > if (using_64bar) > > pci_writel(devfn, bar_reg + 4, bar_data_upper); > > diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader= /util.h > > index 7bca6418d2..b5554b5844 100644 > > --- a/tools/firmware/hvmloader/util.h > > +++ b/tools/firmware/hvmloader/util.h > > @@ -51,6 +51,8 @@ void __bug(char *file, int line) __attribute__((noret= urn)); > > #define MB(mb) (mb##ULL << 20) > > #define GB(gb) (gb##ULL << 30) > > > > +#define ROUNDUP(x, a) (((x) + (a) - 1) & ~((a) - 1)) > > + > > static inline int test_bit(unsigned int b, const void *p) > > { > > return !!(((const uint8_t *)p)[b>>3] & (1u<<(b&7))); > > 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 X-Spam-Level: X-Spam-Status: No, score=-3.3 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D4150C33CA9 for ; Mon, 13 Jan 2020 19:02:22 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 90A8A214AF for ; Mon, 13 Jan 2020 19:02:22 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PtbTMiUE" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 90A8A214AF Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ir4yP-0002Ua-Nt; Mon, 13 Jan 2020 19:02:01 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ir4yP-0002UV-0O for xen-devel@lists.xenproject.org; Mon, 13 Jan 2020 19:02:01 +0000 X-Inumbo-ID: 2cccbc1e-3637-11ea-a2eb-bc764e2007e4 Received: from mail-lf1-x141.google.com (unknown [2a00:1450:4864:20::141]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 2cccbc1e-3637-11ea-a2eb-bc764e2007e4; Mon, 13 Jan 2020 19:01:59 +0000 (UTC) Received: by mail-lf1-x141.google.com with SMTP id i23so7689849lfo.7 for ; Mon, 13 Jan 2020 11:01:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=6++MrcCBmrVxPhrUnlMDVibQ7hwF8CWrqhrWWkblI9c=; b=PtbTMiUE/Fav3osb1BGGCxgiEaPqd+zywdMwCgiSxqo71To3O5mk5v7GxoX9rX1oC5 WXZWZEzZlyLcFGRc56JK4rW0B8UVYdQ9abAo0fujgxU/mcyVcLKd0jBn2gtld/GZPhux 4gyes/P2dP61dwC9rYleMWjYy6FiSur7hhGxdui6MnvK1ZQFquDql3gRqYJHrjezBgwH pifXBwVev/1ni/cQxQqVJJ9niir23KV9PBGUybkmpDZyejaM5N6uif+71aI8JAyRAKM6 w57AFBTTiQDkt8qraUHykQnXxpCEnFD4WtVXVHILn3JbSkAPTK/btCqiv9p1VlPSyiKw Rz+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=6++MrcCBmrVxPhrUnlMDVibQ7hwF8CWrqhrWWkblI9c=; b=X+1hzyW9qFGAfo84/RUxAKtSd82knfMA+a/2kA+Xk7i2ikTsU2T/73shLZHbElxcjN ZUg+WcHprWYuMiyLoF/SeENN/VXu0hShsmz2x1isEnGowXr01w+UOaDZL+Y3Qp8tOvou vtSEA2R65BgyLsFFn8wBTnJ0pLPnYPtRE0f/9/lk++RE+8ok0bftbcbcKf8f6k4BJ913 h3Hqka3AItkOsqWLbP4RMxyX0zl08TLVyz2Y7icjM7FBETwnbQNWl5pO4xpBPa0kS+iI b0bmQuhcCEGztj0mvailxy0vVQj3Fp+TsHSVYf3YXEG0iXqCUTBQrhjYEr3pULoIs0af mNRg== X-Gm-Message-State: APjAAAX7LUT6xiUwOClQLQ5lkr24OnWQFiDLJytWScFwOqrkjWP5vFcq dsPmZgY24p2qL4h++cuuSRuAV3MFjI9Kdwqn0bk= X-Google-Smtp-Source: APXvYqw+g2vrAm9cX7AKpyLZVnr+yOD4d87+gCmZ7HeFY1maN99qm3O85Pz18oxwtUipoT6e0XyY2nr9OF39AJqVUGo= X-Received: by 2002:ac2:4add:: with SMTP id m29mr10353482lfp.190.1578942118569; Mon, 13 Jan 2020 11:01:58 -0800 (PST) MIME-Version: 1.0 References: <20190311180216.18811-1-jandryuk@gmail.com> <20190311180216.18811-7-jandryuk@gmail.com> <57dc1083d20a469785f05a2e5250a820@AMSPEX02CL02.citrite.net> <20190322030936.fkiajz5ifgaejkd4@MacBook-Air-de-Roger.local> In-Reply-To: From: Jason Andryuk Date: Mon, 13 Jan 2020 14:01:47 -0500 Message-ID: To: =?UTF-8?Q?Roger_Pau_Monn=C3=A9?= Subject: Re: [Xen-devel] [PATCH 6/6] xen-pt: Round pci regions sizes to XEN_PAGE_SIZE X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Stefano Stabellini , Andrew Cooper , "marmarek@invisiblethingslab.com" , "qemu-devel@nongnu.org" , Simon Gaiser , Paul Durrant , Anthony Perard , "xen-devel@lists.xenproject.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" T24gRnJpLCBNYXIgMjIsIDIwMTkgYXQgMzo0MyBQTSBKYXNvbiBBbmRyeXVrIDxqYW5kcnl1a0Bn bWFpbC5jb20+IHdyb3RlOgo+Cj4gT24gVGh1LCBNYXIgMjEsIDIwMTkgYXQgMTE6MDkgUE0gUm9n ZXIgUGF1IE1vbm7DqSA8cm9nZXIucGF1QGNpdHJpeC5jb20+IHdyb3RlOgo+ID4KPiA+IE9uIFdl ZCwgTWFyIDIwLCAyMDE5IGF0IDAxOjI4OjQ3UE0gLTA0MDAsIEphc29uIEFuZHJ5dWsgd3JvdGU6 Cj4gPiA+IE9uIEZyaSwgTWFyIDE1LCAyMDE5IGF0IDEyOjI4IFBNIEFuZHJldyBDb29wZXIKPiA+ ID4gPGFuZHJldy5jb29wZXIzQGNpdHJpeC5jb20+IHdyb3RlOgo+ID4gPiA+Cj4gPiA+ID4gT24g MTUvMDMvMjAxOSAwOToxNywgUGF1bCBEdXJyYW50IHdyb3RlOgo+ID4gPiA+ID4+IC0tLS0tT3Jp Z2luYWwgTWVzc2FnZS0tLS0tCj4gPiA+ID4gPj4gRnJvbTogSmFzb24gQW5kcnl1ayBbbWFpbHRv OmphbmRyeXVrQGdtYWlsLmNvbV0KPiA+ID4gPiA+PiBTZW50OiAxNCBNYXJjaCAyMDE5IDE4OjE2 Cj4gPiA+ID4gPj4gVG86IFBhdWwgRHVycmFudCA8UGF1bC5EdXJyYW50QGNpdHJpeC5jb20+Cj4g PiA+ID4gPj4gQ2M6IHFlbXUtZGV2ZWxAbm9uZ251Lm9yZzsgeGVuLWRldmVsQGxpc3RzLnhlbnBy b2plY3Qub3JnOyBtYXJtYXJla0BpbnZpc2libGV0aGluZ3NsYWIuY29tOyBTaW1vbgo+ID4gPiA+ ID4+IEdhaXNlciA8c2ltb25AaW52aXNpYmxldGhpbmdzbGFiLmNvbT47IFN0ZWZhbm8gU3RhYmVs bGluaSA8c3N0YWJlbGxpbmlAa2VybmVsLm9yZz47IEFudGhvbnkgUGVyYXJkCj4gPiA+ID4gPj4g PGFudGhvbnkucGVyYXJkQGNpdHJpeC5jb20+Cj4gPiA+ID4gPj4gU3ViamVjdDogUmU6IFtQQVRD SCA2LzZdIHhlbi1wdDogUm91bmQgcGNpIHJlZ2lvbnMgc2l6ZXMgdG8gWEVOX1BBR0VfU0laRQo+ ID4gPiA+ID4+Cj4gPiA+ID4gPj4gT24gV2VkLCBNYXIgMTMsIDIwMTkgYXQgMTE6MDkgQU0gUGF1 bCBEdXJyYW50IDxQYXVsLkR1cnJhbnRAY2l0cml4LmNvbT4gd3JvdGU6Cj4gPiA+ID4gPj4+PiAt LS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+ID4gPiA+ID4+Pj4gRnJvbTogSmFzb24gQW5kcnl1 ayBbbWFpbHRvOmphbmRyeXVrQGdtYWlsLmNvbV0KPiA+ID4gPiA+Pj4+IFNlbnQ6IDExIE1hcmNo IDIwMTkgMTg6MDIKPiA+ID4gPiA+Pj4+IFRvOiBxZW11LWRldmVsQG5vbmdudS5vcmcKPiA+ID4g PiA+Pj4+IENjOiB4ZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmc7IG1hcm1hcmVrQGludmlz aWJsZXRoaW5nc2xhYi5jb207IFNpbW9uIEdhaXNlcgo+ID4gPiA+ID4+Pj4gPHNpbW9uQGludmlz aWJsZXRoaW5nc2xhYi5jb20+OyBKYXNvbiBBbmRyeXVrIDxqYW5kcnl1a0BnbWFpbC5jb20+OyBT dGVmYW5vIFN0YWJlbGxpbmkKPiA+ID4gPiA+Pj4+IDxzc3RhYmVsbGluaUBrZXJuZWwub3JnPjsg QW50aG9ueSBQZXJhcmQgPGFudGhvbnkucGVyYXJkQGNpdHJpeC5jb20+OyBQYXVsIER1cnJhbnQK PiA+ID4gPiA+Pj4+IDxQYXVsLkR1cnJhbnRAY2l0cml4LmNvbT4KPiA+ID4gPiA+Pj4+IFN1Ympl Y3Q6IFtQQVRDSCA2LzZdIHhlbi1wdDogUm91bmQgcGNpIHJlZ2lvbnMgc2l6ZXMgdG8gWEVOX1BB R0VfU0laRQo+ID4gPiA+ID4+Pj4KPiA+ID4gPiA+Pj4+IEZyb206IFNpbW9uIEdhaXNlciA8c2lt b25AaW52aXNpYmxldGhpbmdzbGFiLmNvbT4KPiA+ID4gPiA+Pj4+Cj4gPiA+ID4gPj4+PiBJZiBh IHBjaSBtZW1vcnkgcmVnaW9uIGhhcyBhIHNpemUgPCBYRU5fUEFHRV9TSVpFIGl0IGNhbiBnZXQg bG9jYXRlZCBhdAo+ID4gPiA+ID4+Pj4gYW4gYWRkcmVzcyB3aGljaCBpcyBub3QgcGFnZSBhbGln bmVkLgo+ID4gPiA+ID4+PiBJSVJDIHRoZSBQQ0kgc3BlYyBzYXlzIHRoYXQgdGhlIG1pbmltdW0g bWVtb3J5IHJlZ2lvbiBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCA0ay4gU2hvdWxkIHdlIGV2ZW4g YmUKPiA+ID4gPiA+PiB0b2xlcmF0aW5nIEJBUnMgc21hbGxlciB0aGFuIHRoYXQ/Cj4gPiA+ID4g Pj4+ICAgUGF1bAo+ID4gPiA+ID4+Pgo+ID4gPiA+ID4+IEhpLCBQYXVsLgo+ID4gPiA+ID4+Cj4g PiA+ID4gPj4gU2ltb24gZm91bmQgdGhpcywgc28gaXQgYWZmZWN0cyBhIHJlYWwgZGV2aWNlLiAg U2ltb24sIGRvIHlvdSByZWNhbGwKPiA+ID4gPiA+PiB3aGljaCBkZXZpY2Ugd2FzIGFmZmVjdGVk Pwo+ID4gPiA+ID4+Cj4gPiA+ID4gPj4gSSB0aGluayBCQVJzIG9ubHkgbmVlZCB0byBiZSBwb3dl ci1vZi10d28gc2l6ZSBhbmQgYWxpZ25lZCwgYW5kIDRrIGlzCj4gPiA+ID4gPj4gbm90IGEgbWlu aW11bS4gIDE2Ynl0ZXMgbWF5IGJlIGEgbWluaW11bSwgYnV0IEkgZG9uJ3Qga25vdyB3aGF0IHRo ZQo+ID4gPiA+ID4+IHNwZWMgc2F5cy4KPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IE9uIGFuIEl2eSBC cmlkZ2Ugc3lzdGVtLCBoZXJlIGFyZSBzb21lIG9mIHRoZSBkZXZpY2VzIHdpdGggQkFScyBzbWFs bGVyIHRoYW4gNEs6Cj4gPiA+ID4gPj4gMDA6MTYuMCBDb21tdW5pY2F0aW9uIGNvbnRyb2xsZXI6 IEludGVsIENvcnBvcmF0aW9uIDcgU2VyaWVzL0MyMTAKPiA+ID4gPiA+PiBTZXJpZXMgQ2hpcHNl dCBGYW1pbHkgTUVJIENvbnRyb2xsZXIgIzEgKHJldiAwNCkKPiA+ID4gPiA+PiAgICBNZW1vcnkg YXQgZDA3MzUwMDAgKDY0LWJpdCwgbm9uLXByZWZldGNoYWJsZSkgW2Rpc2FibGVkXSBbc2l6ZT0x Nl0KPiA+ID4gPiA+PiAwMDoxZC4wIFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlvbiA3 IFNlcmllcy9DMjEwIFNlcmllcyBDaGlwc2V0Cj4gPiA+ID4gPj4gRmFtaWx5IFVTQiBFbmhhbmNl ZCBIb3N0IENvbnRyb2xsZXIgIzEgKHJldiAwNCkgKHByb2ctaWYgMjAgW0VIQ0ldKQo+ID4gPiA+ ID4+ICAgIE1lbW9yeSBhdCBkMDczOTAwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbZGlz YWJsZWRdIFtzaXplPTFLXQo+ID4gPiA+ID4+IDAwOjFmLjMgU01CdXM6IEludGVsIENvcnBvcmF0 aW9uIDcgU2VyaWVzL0MyMTAgU2VyaWVzIENoaXBzZXQgRmFtaWx5Cj4gPiA+ID4gPj4gU01CdXMg Q29udHJvbGxlciAocmV2IDA0KQo+ID4gPiA+ID4+ICAgIE1lbW9yeSBhdCBkMDczNDAwMCAoNjQt Yml0LCBub24tcHJlZmV0Y2hhYmxlKSBbZGlzYWJsZWRdIFtzaXplPTI1Nl0KPiA+ID4gPiA+PiAw MjowMC4wIFN5c3RlbSBwZXJpcGhlcmFsOiBKTWljcm9uIFRlY2hub2xvZ3kgQ29ycC4gU0QvTU1D IEhvc3QKPiA+ID4gPiA+PiBDb250cm9sbGVyIChyZXYgMzApCj4gPiA+ID4gPj4gICAgTWVtb3J5 IGF0IGQwNTAzMDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUpIFtkaXNhYmxlZF0gW3NpemU9 MjU2XQo+ID4gPiA+ID4+Cj4gPiA+ID4gPj4gVGhlc2UgZXhhbXBsZXMgYXJlIGFsbCA0SyBhbGln bmVkLCBzbyB0aGlzIGlzIG5vdCBhbiBpc3N1ZSBvbiB0aGlzIG1hY2hpbmUuCj4gPiA+ID4gPj4K PiA+ID4gPiA+PiBSZXZpZXdpbmcgdGhlIGNvZGUsIEknbSBub3cgd29uZGVyaW5nIGlmIHRoZSBm b2xsb3dpbmcgaW4KPiA+ID4gPiA+PiBody94ZW4veGVuX3B0LmM6eGVuX3B0X3JlZ2lvbl91cGRh dGUgaXMgd3Jvbmc6ICAgICAgICByYyA9Cj4gPiA+ID4gPj4geGNfZG9tYWluX21lbW9yeV9tYXBw aW5nKHhlbl94YywgeGVuX2RvbWlkLAo+ID4gPiA+ID4+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBYRU5fUEZOKGd1ZXN0X2FkZHIgKyBYQ19QQUdFX1NJWkUgLSAxKSwKPiA+ ID4gPiA+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEVOX1BGTihtYWNo aW5lX2FkZHIgKyBYQ19QQUdFX1NJWkUgLSAxKSwKPiA+ID4gPiA+PiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgWEVOX1BGTihzaXplICsgWENfUEFHRV9TSVpFIC0gMSksCj4g PiA+ID4gPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wKTsKPiA+ID4g PiA+Pgo+ID4gPiA+ID4+IElmIGEgYmFyIG9mIHNpemUgMHgxMDAgaXMgYXQgMHhkMDUwMDgwMCwg dGhlbiB0aGUgbWFjaGluZV9hZGRyIHBhc3NlZAo+ID4gPiA+ID4+IGluIHdvdWxkIGJlIDB4ZDA1 MDEwMDAgd2hpY2ggaXMgcGFzdCB0aGUgYWN0dWFsIGxvY2F0aW9uLiAgU2hvdWxkIHRoZQo+ID4g PiA+ID4+IGNhbGwgYXJndW1lbnRzIGp1c3QgYmUgWEVOX1BGTihndWVzdF9hZGRyKSAmIFhFTl9Q Rk4obWFjaGluZV9hZGRyKT8KPiA+ID4gPiA+Pgo+ID4gPiA+ID4+IEJBUnMgc21hbGxlciB0aGFu IGEgcGFnZSB3b3VsZCBhbHNvIGJlIGEgcHJvYmxlbSBpZiBCQVJzIGZvciBkaWZmZXJlbnQKPiA+ ID4gPiA+PiBkZXZpY2VzIHNoYXJlZCB0aGUgc2FtZSBwYWdlLgo+ID4gPiA+ID4gRXhhY3RseS4g V2UgY2Fubm90IHBhc3MgdGhlbSB0aHJvdWdoIHdpdGggYW55IGRlZ3JlZSBvZiBzYWZldHkgKG5v dCB0aGF0IHBhc3N0aHJvdWdoIG9mIGFuIGFyYml0cmFyeSBkZXZpY2UgaXMgYSBwYXJ0aWN1bGFy bHkgc2FmZSB0aGluZyB0byBkbyBhbnl3YXkpLiBUaGUgeGVuLXB0IGNvZGUgd291bGQgaW5zdGVh ZCBuZWVkIHRvIHRyYXAgdGhvc2UgQkFScyBhbmQgcGVyZm9ybSB0aGUgYWNjZXNzZXMgdG8gdGhl IHJlYWwgQkFSIGl0c2VsZi4gVWx0aW1hdGVseSB0aG91Z2ggSSB0aGluayB3ZSBzaG91bGQgYmUg cmV0aXJpbmcgdGhlIHhlbi1wdCBjb2RlIGluIGZhdm91ciBvZiBhIHN0YW5kYWxvbmUgZW11bGF0 b3IuCj4gPiA+ID4KPiA+ID4gPiBJdCBkb2Vzbid0IG1hdHRlciBpZiB0aGUgQkFSIGlzIHNtYWxs ZXIgdGhhbiA0aywgaWYgdGhlcmUgYXJlIGhvbGVzIG5leHQKPiA+ID4gPiB0byBpdC4KPiA+ID4g Pgo+ID4gPiA+IERvIHdlIGtub3cgd2hhdCB0aGUgY2FzZSBpcyBpbiBwcmFjdGljZSBmb3IgdGhl c2UgVVNCIGNvbnRyb2xsZXJzPwo+ID4gPiA+Cj4gPiA+ID4gSWYgdGhlIHdvcnN0IGNvbWVzIHRv IHRoZSB3b3JzdCwgd2UgY2FuIHJlLWVudW1lcmF0ZSB0aGUgUENJIGJ1cyB0bwo+ID4gPiA+IGVu c3VyZSB0aGF0IGFsbCBiYXJzIHNtYWxsZXIgdGhhbiA0ayBzdGlsbCBoYXZlIDRrIGFsaWdubWVu dCBiZXR3ZWVuCj4gPiA+ID4gdGhlbS4gIFRoYXQgd2F5IHdlIGNhbiBzYWZlbHkgcGFzcyB0aGVt IHRocm91Z2ggZXZlbiB3aGVuIHRoZXkgYXJlIHNtYWxsZXIuCj4gPiA+Cj4gPiA+IEFuZHJldywg dGhhbmtzIGZvciBjaGVja2luZyB0aGUgc3BlYyBvbiB0aGUgbWluaW11bSBCQVIgc2l6ZS4KPiA+ ID4KPiA+ID4gRHJvcHBpbmcgdGhlIFJvdW5kIFBDSSByZWdpb24gcGF0Y2ggZnJvbSBRTUVVLCB0 aGUgZ3Vlc3QgSFZNIHdpbGwgaGF2ZToKPiA+ID4KPiA+ID4gMDA6MDYuMCBTRCBIb3N0IGNvbnRy b2xsZXI6IFJpY29oIENvIEx0ZCBQQ0llIFNEWEMvTU1DIEhvc3QgQ29udHJvbGxlciAocmV2IDA3 KQo+ID4gPiAgICAgTWVtb3J5IGF0IGYyMDI4ODAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUp IFtzaXplPTI1Nl0KPiA+ID4gMDA6MDcuMCBVU0IgY29udHJvbGxlcjogTkVDIENvcnBvcmF0aW9u IHVQRDcyMDIwMCBVU0IgMy4wIEhvc3QKPiA+ID4gQ29udHJvbGxlciAocmV2IDA0KSAocHJvZy1p ZiAzMCBbWEhDSV0pCj4gPiA+ICAgICBNZW1vcnkgYXQgZjIwMjQwMDAgKDY0LWJpdCwgbm9uLXBy ZWZldGNoYWJsZSkgW3NpemU9OEtdCj4gPiA+IDAwOjA4LjAgVVNCIGNvbnRyb2xsZXI6IEludGVs IENvcnBvcmF0aW9uIDYgU2VyaWVzL0MyMDAgU2VyaWVzIENoaXBzZXQKPiA+ID4gRmFtaWx5IFVT QiBFbmhhbmNlZCBIb3N0IENvbnRyb2xsZXIgIzIgKHJldiAwNSkgKHByb2ctaWYgMjAgW0VIQ0ld KQo+ID4gPiAgICAgTWVtb3J5IGF0IGYyMDI4MDAwICgzMi1iaXQsIG5vbi1wcmVmZXRjaGFibGUp IFtzaXplPTFLXQo+ID4gPiAwMDowOS4wIFVTQiBjb250cm9sbGVyOiBJbnRlbCBDb3Jwb3JhdGlv biA2IFNlcmllcy9DMjAwIFNlcmllcyBDaGlwc2V0Cj4gPiA+IEZhbWlseSBVU0IgRW5oYW5jZWQg SG9zdCBDb250cm9sbGVyICMxIChyZXYgMDUpIChwcm9nLWlmIDIwIFtFSENJXSkKPiA+ID4gICAg IE1lbW9yeSBhdCBmMjAyODQwMCAoMzItYml0LCBub24tcHJlZmV0Y2hhYmxlKSBbc2l6ZT0xS10K PiA+ID4KPiA+ID4gMDA6MDkuMCwgMDA6MDguMCAmIDAwOjA2LjAgYWxsIHNoYXJlIHRoZSBzYW1l IHBhZ2UuICBPbmx5IDAwOjA4LjAgaXMKPiA+ID4gd29ya2luZy4gIFdpdGggc29tZSBhZGRlZCBk ZWJ1Z2dpbmcgb3V0cHV0LCB5b3UnbGwgc2VlIHRoYXQgdGhlIHNhbWUKPiA+ID4gcGFnZSogaXMg dXNlZCBmb3IgdGhyZWUgb2YgdGhlIEJBUnMuCj4gPiA+Cj4gPiA+IFswMDowNi4wXSBtYXBwaW5n IGd1ZXN0X2FkZHIgMHhmMjAyODgwMCBnZm4gMHhmMjAyOCB0byBtYWRkcgo+ID4gPiAweGUxYTMw MDAwIG1mbiAweGUxYTMwCj4gPiA+IFswMDowNy4wXSBtYXBwaW5nIGd1ZXN0X2FkZHIgMHhmMjAy NDAwMCBnZm4gMHhmMjAyNCB0byBtYWRkcgo+ID4gPiAweGUwODAwMDAwIG1mbiAweGUwODAwCj4g PiA+IFswMDowOS4wXSBtYXBwaW5nIGd1ZXN0X2FkZHIgMHhmMjAyODQwMCBnZm4gMHhmMjAyOCB0 byBtYWRkcgo+ID4gPiAweGUxOTAwMDAwIG1mbiAweGUxOTAwCj4gPiA+IFswMDowOC4wXSBtYXBw aW5nIGd1ZXN0X2FkZHIgMHhmMjAyODAwMCBnZm4gMHhmMjAyOCB0byBtYWRkcgo+ID4gPiAweGUx YTJmMDAwIG1mbiAweGUxYTJmCj4gPgo+ID4gVGhlIHBhdGNoIGJlbG93IHNob3VsZCBwcmV2ZW50 IGh2bWxvYWRlciBmcm9tIHBsYWNpbmcgbXVsdGlwbGUgQkFScyBvbgo+ID4gdGhlIHNhbWUgcGFn ZSwgY291bGQgeW91IGdpdmUgaXQgYSB0cnk/Cj4gPgo+ID4gTm90ZSB0aGF0IHRoaXMgaXMgbm90 IGdvaW5nIHRvIHByZXZlbnQgdGhlIGd1ZXN0IGZyb20gbW92aW5nIHRob3NlCj4gPiBCQVJzIGFy b3VuZCBhbmQgcGxhY2UgdGhlbSBpbiB0aGUgc2FtZSBwYWdlLCB0aHVzIGJyZWFraW5nIHRoZSBp bml0aWFsCj4gPiBwbGFjZW1lbnQgZG9uZSBieSBodm1sb2FkZXIuCj4gPgo+ID4gVGhhbmtzLCBS b2dlci4KPgo+IEhpLCBSb2dlci4KPgo+IEkndmUgbWluaW1hbGx5IHRlc3RlZCB0aGlzLiAgWWVz LCB0aGlzIHBhdGNoIHNlZW1zIHRvIHBsYWNlIHNtYWxsIEJBUnMKPiBpbnRvIHNlcGFyYXRlIHBh Z2VzLiAgVGhlIGxpbnV4IHN0dWJkb20gYW5kIFFFTVUgdGhlbiB1c2UgdGhlIHNwYWNpbmcKPiBh cyBwcm92aWRlZCBieSBodm1sb2FkZXIuCgpSb2dlciwKCldvdWxkIHlvdSBtaW5kIHN1Ym1pdHRp bmcgdGhpcyBwYXRjaCB0byBYZW4/CgpUaGFua3MsCkphc29uCgo+Cj4KPiA+IC0tLTg8LS0tCj4g PiBkaWZmIC0tZ2l0IGEvdG9vbHMvZmlybXdhcmUvaHZtbG9hZGVyL3BjaS5jIGIvdG9vbHMvZmly bXdhcmUvaHZtbG9hZGVyL3BjaS5jCj4gPiBpbmRleCAwYjcwOGJmNTc4Li5jNDMzYjM0Y2Q2IDEw MDY0NAo+ID4gLS0tIGEvdG9vbHMvZmlybXdhcmUvaHZtbG9hZGVyL3BjaS5jCj4gPiArKysgYi90 b29scy9maXJtd2FyZS9odm1sb2FkZXIvcGNpLmMKPiA+IEBAIC00ODksNiArNDg5LDEwIEBAIHZv aWQgcGNpX3NldHVwKHZvaWQpCj4gPgo+ID4gICAgICAgICAgcmVzb3VyY2UtPmJhc2UgPSBiYXNl Owo+ID4KPiA+ICsgICAgICAgIGlmICggKGJhcl9kYXRhICYgUENJX0JBU0VfQUREUkVTU19TUEFD RSkgPT0KPiA+ICsgICAgICAgICAgICAgUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUlkgKQo+ ID4gKyAgICAgICAgICAgIHJlc291cmNlLT5iYXNlID0gUk9VTkRVUChyZXNvdXJjZS0+YmFzZSwg UEFHRV9TSVpFKTsKPiA+ICsKPiA+ICAgICAgICAgIHBjaV93cml0ZWwoZGV2Zm4sIGJhcl9yZWcs IGJhcl9kYXRhKTsKPiA+ICAgICAgICAgIGlmICh1c2luZ182NGJhcikKPiA+ICAgICAgICAgICAg ICBwY2lfd3JpdGVsKGRldmZuLCBiYXJfcmVnICsgNCwgYmFyX2RhdGFfdXBwZXIpOwo+ID4gZGlm ZiAtLWdpdCBhL3Rvb2xzL2Zpcm13YXJlL2h2bWxvYWRlci91dGlsLmggYi90b29scy9maXJtd2Fy ZS9odm1sb2FkZXIvdXRpbC5oCj4gPiBpbmRleCA3YmNhNjQxOGQyLi5iNTU1NGI1ODQ0IDEwMDY0 NAo+ID4gLS0tIGEvdG9vbHMvZmlybXdhcmUvaHZtbG9hZGVyL3V0aWwuaAo+ID4gKysrIGIvdG9v bHMvZmlybXdhcmUvaHZtbG9hZGVyL3V0aWwuaAo+ID4gQEAgLTUxLDYgKzUxLDggQEAgdm9pZCBf X2J1ZyhjaGFyICpmaWxlLCBpbnQgbGluZSkgX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKTsKPiA+ ICAjZGVmaW5lIE1CKG1iKSAobWIjI1VMTCA8PCAyMCkKPiA+ICAjZGVmaW5lIEdCKGdiKSAoZ2Ij I1VMTCA8PCAzMCkKPiA+Cj4gPiArI2RlZmluZSBST1VORFVQKHgsIGEpICgoKHgpICsgKGEpIC0g MSkgJiB+KChhKSAtIDEpKQo+ID4gKwo+ID4gIHN0YXRpYyBpbmxpbmUgaW50IHRlc3RfYml0KHVu c2lnbmVkIGludCBiLCBjb25zdCB2b2lkICpwKQo+ID4gIHsKPiA+ICAgICAgcmV0dXJuICEhKCgo Y29uc3QgdWludDhfdCAqKXApW2I+PjNdICYgKDF1PDwoYiY3KSkpOwo+ID4KCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxp c3QKWGVuLWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHBzOi8vbGlzdHMueGVucHJvamVj dC5vcmcvbWFpbG1hbi9saXN0aW5mby94ZW4tZGV2ZWw=