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=-6.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham 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 1E13FC432C3 for ; Tue, 19 Nov 2019 20:47:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CC4C32068F for ; Tue, 19 Nov 2019 20:47:13 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="PDaDSt5m" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727226AbfKSUrM (ORCPT ); Tue, 19 Nov 2019 15:47:12 -0500 Received: from mail-lj1-f196.google.com ([209.85.208.196]:36071 "EHLO mail-lj1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726948AbfKSUrM (ORCPT ); Tue, 19 Nov 2019 15:47:12 -0500 Received: by mail-lj1-f196.google.com with SMTP id k15so24925203lja.3 for ; Tue, 19 Nov 2019 12:47:10 -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; bh=FJHDhSz96rX+U1YKjsKvqDT6TMhjc0Z5MVvn+jp8PL0=; b=PDaDSt5myIGBjLvN+zxjsXi93pR1rcikvPyGZYNfNlVUb7UheFtCtKD9ItlFojQWBn Yie/mtIMetfC5WH/Wo+ZU/YP7AQDjZ7+ZBPDZ+wcfxJBgmwYbrHIVNimsU8ShmxZ27zB 26FbwVx66udwz5eRhacjG79k0qzmHgrD/BG2RN7k+ne2KTGiUtDswT4B14DSZ8C+5qjm PD9De67v4uaEsRzzsILQlBQmfwBoFtLv+GwtKP/xOD8mMvwQsgFUBzSd9jmV8uI8eU8s 4d22DJhsEXBANS3sU+l1J7nVRiZxSN0Q1yxIeYCMteDvqsDfb2CXTRTNE0ITMdHMsJnP 8PTw== 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; bh=FJHDhSz96rX+U1YKjsKvqDT6TMhjc0Z5MVvn+jp8PL0=; b=idc6O1LIU03o162etGW0hpjJTKxCqd2H715rATYjqtBJQagor0lmXyRq4/pqYmOXLU KUSYvQU9CMKjIMuqLpTMPSeV/eoJ8bJ3VJS/SzRMNLjLxIgDKrvuYBD8ZggpiQV5XuBj 5m33llC2v73yyeB6n8IJ78v3OzUmB0eqzqk6rNYF5+UrlgezE3YnJTrZIAQUWTprH29i 9w8QINo+83zbmgsdZJVEyqorrCj36RchOq1UQmk1bn1WOWXX94zufZK89pHrT4XAZC47 9t7zPXkjNkYYqMlZTzqev7JGClr13qWAXFojphk7pEsRJyT4V5CbjK1kOEeOkXiUJzH3 HVXw== X-Gm-Message-State: APjAAAUn1i3Gug0lGBgjaJzNzr585bMb4vkNy0f4b2rydktiWfscdEDF Vkfe0bjG96JVcMb/M3uIEtk0vEavYy+OVd5smU4= X-Google-Smtp-Source: APXvYqxld12vSKGxx0xWMJpDxIXCpLumsMRx1Jmf7ZCUdHBfWBJDgPGCB1BD8WfaO2tr20FF6jfR0ITcyAal7miQ3Mw= X-Received: by 2002:a2e:a410:: with SMTP id p16mr5620272ljn.46.1574196429101; Tue, 19 Nov 2019 12:47:09 -0800 (PST) MIME-Version: 1.0 References: <20191107153048.843881-1-paul.kocialkowski@bootlin.com> <20191112151157.GD4506@aptenodytes> <20191112155012.GE4506@aptenodytes> <20191119141151.GB2001@aptenodytes> In-Reply-To: <20191119141151.GB2001@aptenodytes> From: Patrik Jakobsson Date: Tue, 19 Nov 2019 21:46:57 +0100 Message-ID: Subject: Re: [PATCH] drm/gma500: Fixup fbdev stolen size usage evaluation To: Paul Kocialkowski Cc: dri-devel , linux-kernel , David Airlie , Daniel Vetter , Thomas Petazzoni , James Hilliard Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Nov 19, 2019 at 3:11 PM Paul Kocialkowski wrote: > > Hi, > > On Wed 13 Nov 19, 11:04, Patrik Jakobsson wrote: > > On Tue, Nov 12, 2019 at 4:50 PM Paul Kocialkowski > > wrote: > > > > > > Hi, > > > > > > On Tue 12 Nov 19, 16:11, Paul Kocialkowski wrote: > > > > Hi, > > > > > > > > On Tue 12 Nov 19, 11:20, Patrik Jakobsson wrote: > > > > > On Thu, Nov 7, 2019 at 4:30 PM Paul Kocialkowski > > > > > wrote: > > > > > > > > > > > > psbfb_probe performs an evaluation of the required size from the stolen > > > > > > GTT memory, but gets it wrong in two distinct ways: > > > > > > - The resulting size must be page-size-aligned; > > > > > > - The size to allocate is derived from the surface dimensions, not the fb > > > > > > dimensions. > > > > > > > > > > > > When two connectors are connected with different modes, the smallest will > > > > > > be stored in the fb dimensions, but the size that needs to be allocated must > > > > > > match the largest (surface) dimensions. This is what is used in the actual > > > > > > allocation code. > > > > > > > > > > > > Fix this by correcting the evaluation to conform to the two points above. > > > > > > It allows correctly switching to 16bpp when one connector is e.g. 1920x1080 > > > > > > and the other is 1024x768. > > > > > > > > > > > > Signed-off-by: Paul Kocialkowski > > > > > > --- > > > > > > drivers/gpu/drm/gma500/framebuffer.c | 8 ++++++-- > > > > > > 1 file changed, 6 insertions(+), 2 deletions(-) > > > > > > > > > > > > diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c > > > > > > index 218f3bb15276..90237abee088 100644 > > > > > > --- a/drivers/gpu/drm/gma500/framebuffer.c > > > > > > +++ b/drivers/gpu/drm/gma500/framebuffer.c > > > > > > @@ -462,6 +462,7 @@ static int psbfb_probe(struct drm_fb_helper *helper, > > > > > > container_of(helper, struct psb_fbdev, psb_fb_helper); > > > > > > struct drm_device *dev = psb_fbdev->psb_fb_helper.dev; > > > > > > struct drm_psb_private *dev_priv = dev->dev_private; > > > > > > + unsigned int fb_size; > > > > > > int bytespp; > > > > > > > > > > > > bytespp = sizes->surface_bpp / 8; > > > > > > @@ -471,8 +472,11 @@ static int psbfb_probe(struct drm_fb_helper *helper, > > > > > > /* If the mode will not fit in 32bit then switch to 16bit to get > > > > > > a console on full resolution. The X mode setting server will > > > > > > allocate its own 32bit GEM framebuffer */ > > > > > > - if (ALIGN(sizes->fb_width * bytespp, 64) * sizes->fb_height > > > > > > > - dev_priv->vram_stolen_size) { > > > > > > + fb_size = ALIGN(sizes->surface_width * bytespp, 64) * > > > > > > + sizes->surface_height; > > > > > > + fb_size = ALIGN(fb_size, PAGE_SIZE); > > > > > > + > > > > > > + if (fb_size > dev_priv->vram_stolen_size) { > > > > > > > > > > psb_gtt_alloc_range() already aligns by PAGE_SIZE for us. Looks like > > > > > we align a couple of times extra for luck. This needs cleaning up > > > > > instead of adding even more aligns. > > > > > > > > I'm not sure this is really for luck. As far as I can see, we need to do it > > > > properly for this size estimation since it's the final size that will be > > > > allocated (and thus needs to be available in whole). > > > > Ok now I understand what you meant. Actually vram_stolen_size is > > always page aligned so fb_size doesn't need any page alignment here. > > I'm a bit confused here, what about the case where: > unaligned fb_size < dev_priv->vram_stolen_size but > aligned fb_size > dev_priv->vram_stolen_size ? That can never happen since aligning fb_size will never cross a page boundary, and stolen_size is always on a page boundary. Not sure how to explain it on a good way but: If stolen_size = 4096, then fb_size is only more than stolen_size if it is actually > 4096 regardless if we align it or not. > > Granted, it's a corner case, but I don't follow the logic of comparing aligned > and unaligned sizes: it feels a bit like comparing two values of different > units. We can keep it if you think it makes the code more readable. > > > There is also no need to align for psbfb_create() since it also takes > > care of this. > > > > > > > > > > For the other times there is explicit alignment, they seem justified too: > > > > - in psb_gem_create: it is common to pass the aligned size when creating the > > > > associated GEM object with drm_gem_object_init, even though it's probably not > > > > crucial given that this is not where allocation actually happens; > > > > - in psbfb_create: the full size is apparently only really used to memset 0 > > > > the allocated buffer. I think this makes sense for security reasons (and not > > > > leak previous contents in the additional space required for alignment). > > > > What I would prefer is to have a single place where the alignment is > > made so any hardware requirements would be transparent to the rest of > > the code. > > Mhh, I thought that psbfb_create needs to be aware of the alignment in the > form of the pitch_lines variable to decide which 2d accel method can be used or > not (depending on associated alignment requirements). I guess this makes for > another reason to ditch the accelerated 2d accel support. I was only thinking of the size alignment. Yes, ditching 2D would make life easier in this regard. > > > Best would be if alignment is only made in psb_gtt_alloc_range() and > > then store the actual size in struct gtt_range. That way we can just > > pass along that value to memset() and drm_gem_object_init() without > > caring about how it is adjusted. > > > > > > > > > > What strikes me however is that each call to psb_gtt_alloc_range takes the > > > > alignment as a parameter when it's really always PAGE_SIZE, so it should > > > > probably just be hardcoded in the call to allocate_resource. > > > > This is a remnant from trying to add support for 2D and/or overlay > > planes (don't really remember). Doesn't matter if it stays or goes > > away. > > > > > > > > > > What do you think? > > > > I suppose most of this is outside the scope of what you're trying to > > do so we can just leave it as is and I can clean it up later. > > I guess my main change here was to switch from sizes->fb_width/height to > sizes->surface_width/height anyway, yes. I can totally live without the > final PAGE_SIZE align for fb_size too (even though I think it makes sense). > > Feel free to let me know what you'd like to receive as a v2 here and I'll do > that :) Let's keep it as it is with the motivation that it increases readability. Applied to drm-misc-next. Thanks > > > > > > > > > > Your size calculation looks correct and indeed makes my 1024x600 + > > > > > 1920x1080 setup actually display something, but for some reason I get > > > > > an incorrect panning on the smaller screen and stale data on the > > > > > surface only visible by the larger CRTC. Any idea what's going on? > > > > > > > > I'm not seeing this immediately, but I definitely have something strange > > > > after having printed more lines than the smallest display can handle or > > > > scrolling, where more than the actual size of the fb is used. > > > > > > > > Maybe this is related to using the PowerVR-accelerated fb ops, that aren't > > > > quite ready for this use case? > > > > > > > > I'll give it a try with psbfb_roll_ops and psbfb_unaccel_ops instead to see > > > > if it changes something for me. Maybe it would help for you too? > > > > > > Some quick feedback about that: > > > - psbfb_unaccel_ops gives a correct result where the scrolling area is bound > > > to the smallest display; > > > > Yes, this also works correctly for me. > > > > > - psbfb_roll_ops gives a working scrolling but bound to the largest display > > > (so the current shell line becomes invisible on the smallest one eventually); > > > > It's not panning at all for me. I never really found gtt rolling to be > > useful. It's a neat trick but I didn't have a problem with console > > scrolling speed to begin with. I might just remove it. > > Yeah, I also don't understand what the hype of accelerating fbdev ops is about. > I guess it could have been useful back when there were serious users of fbdev in > userspace (aka directfb) but that's not really where things are going today. > For console usage, I also find the software method fast enough. > > > > - psbfb_ops gives the same issue as above and seems to add artifacts on top. > > > > Did you try this on CDV? There's only 2D acceleration on Poulsbo and Oaktrail. > > I tried this one on Poulsbo (the other gma500 platform I have around). > > > > > > > There's probably limited interest in working on that aspect on our side though. > > > I'd be interested to know if it affects the issue you're seeing though. > > > > Focus on your requirements and I'll look at the rest. > > Sounds good to me, thanks a lot! I'll do according to what you'd like for a v2. > > Cheers, > > Paul > > > -Patrik > > > > > > > > Cheers, > > > > > > Paul > > > > > > > I suspect that the generic implementation is already bullet-proof for these > > > > kinds of use case. > > > > > > > > Cheers and thanks for the feedback, > > > > > > > > Paul > > > > > > > > > > > > > > > sizes->surface_bpp = 16; > > > > > > sizes->surface_depth = 16; > > > > > > } > > > > > > -- > > > > > > 2.23.0 > > > > > > > > > > > > > > -- > > > > Paul Kocialkowski, Bootlin > > > > Embedded Linux and kernel engineering > > > > https://bootlin.com > > > > > > > > > > > > -- > > > Paul Kocialkowski, Bootlin > > > Embedded Linux and kernel engineering > > > https://bootlin.com > > -- > Paul Kocialkowski, Bootlin > Embedded Linux and kernel engineering > https://bootlin.com 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=-6.5 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham 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 BC08CC432C0 for ; Tue, 19 Nov 2019 20:47:12 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 99ED62068F for ; Tue, 19 Nov 2019 20:47:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 99ED62068F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D1B636E2E1; Tue, 19 Nov 2019 20:47:11 +0000 (UTC) Received: from mail-lj1-x241.google.com (mail-lj1-x241.google.com [IPv6:2a00:1450:4864:20::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id E59896E2E1 for ; Tue, 19 Nov 2019 20:47:10 +0000 (UTC) Received: by mail-lj1-x241.google.com with SMTP id g3so24895504ljl.11 for ; Tue, 19 Nov 2019 12:47:10 -0800 (PST) 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; bh=FJHDhSz96rX+U1YKjsKvqDT6TMhjc0Z5MVvn+jp8PL0=; b=A7TCVD3AWajm4lNdLJYySzmaVRFmCotXWp9O1/57hJbhEtc9VeAOpY56dMCFTmcYNe MqW64w/sJaAA0eCaN7kVwOQbf4xBx9EDOIW/8JuP30FVm57u9ugAWdddfg64cCSYThWd WejpIPDWzUbk2R6OzMC3bNeJtFwdOyyhLzbxtBstiGIM/KCMTsnsbjaBf1s0mE1j4IXj 0MAPiSJw2sUHXRmFoZ5pYXFHAJKBNVUfjHcUYzXae/LOvWYCQoQLhODSHKQOPLgEeBd4 uPu4EThpC5O3mEvRlKb6xYXCGFpnq3TrBm6ZwY99wFq9CdotHBVI65h30OvkBrsrx3cW ggzw== X-Gm-Message-State: APjAAAWPpjZtn4+f2YeslnrF6Vr/Axbl8OvbJHhu0cUmIpDciWFvZpxL NkxcnTJo+HFGim7MPE+UGjAWOBw7eYZSjuQRcQE= X-Google-Smtp-Source: APXvYqxld12vSKGxx0xWMJpDxIXCpLumsMRx1Jmf7ZCUdHBfWBJDgPGCB1BD8WfaO2tr20FF6jfR0ITcyAal7miQ3Mw= X-Received: by 2002:a2e:a410:: with SMTP id p16mr5620272ljn.46.1574196429101; Tue, 19 Nov 2019 12:47:09 -0800 (PST) MIME-Version: 1.0 References: <20191107153048.843881-1-paul.kocialkowski@bootlin.com> <20191112151157.GD4506@aptenodytes> <20191112155012.GE4506@aptenodytes> <20191119141151.GB2001@aptenodytes> In-Reply-To: <20191119141151.GB2001@aptenodytes> From: Patrik Jakobsson Date: Tue, 19 Nov 2019 21:46:57 +0100 Message-ID: Subject: Re: [PATCH] drm/gma500: Fixup fbdev stolen size usage evaluation To: Paul Kocialkowski X-Mailman-Original-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; bh=FJHDhSz96rX+U1YKjsKvqDT6TMhjc0Z5MVvn+jp8PL0=; b=PDaDSt5myIGBjLvN+zxjsXi93pR1rcikvPyGZYNfNlVUb7UheFtCtKD9ItlFojQWBn Yie/mtIMetfC5WH/Wo+ZU/YP7AQDjZ7+ZBPDZ+wcfxJBgmwYbrHIVNimsU8ShmxZ27zB 26FbwVx66udwz5eRhacjG79k0qzmHgrD/BG2RN7k+ne2KTGiUtDswT4B14DSZ8C+5qjm PD9De67v4uaEsRzzsILQlBQmfwBoFtLv+GwtKP/xOD8mMvwQsgFUBzSd9jmV8uI8eU8s 4d22DJhsEXBANS3sU+l1J7nVRiZxSN0Q1yxIeYCMteDvqsDfb2CXTRTNE0ITMdHMsJnP 8PTw== X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Thomas Petazzoni , David Airlie , linux-kernel , dri-devel , James Hilliard Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191119204657.3w6FJp2OQndGvSSqVZ-kxB7CkJiMGVN6JpokCA_JMoM@z> T24gVHVlLCBOb3YgMTksIDIwMTkgYXQgMzoxMSBQTSBQYXVsIEtvY2lhbGtvd3NraQo8cGF1bC5r b2NpYWxrb3dza2lAYm9vdGxpbi5jb20+IHdyb3RlOgo+Cj4gSGksCj4KPiBPbiBXZWQgMTMgTm92 IDE5LCAxMTowNCwgUGF0cmlrIEpha29ic3NvbiB3cm90ZToKPiA+IE9uIFR1ZSwgTm92IDEyLCAy MDE5IGF0IDQ6NTAgUE0gUGF1bCBLb2NpYWxrb3dza2kKPiA+IDxwYXVsLmtvY2lhbGtvd3NraUBi b290bGluLmNvbT4gd3JvdGU6Cj4gPiA+Cj4gPiA+IEhpLAo+ID4gPgo+ID4gPiBPbiBUdWUgMTIg Tm92IDE5LCAxNjoxMSwgUGF1bCBLb2NpYWxrb3dza2kgd3JvdGU6Cj4gPiA+ID4gSGksCj4gPiA+ ID4KPiA+ID4gPiBPbiBUdWUgMTIgTm92IDE5LCAxMToyMCwgUGF0cmlrIEpha29ic3NvbiB3cm90 ZToKPiA+ID4gPiA+IE9uIFRodSwgTm92IDcsIDIwMTkgYXQgNDozMCBQTSBQYXVsIEtvY2lhbGtv d3NraQo+ID4gPiA+ID4gPHBhdWwua29jaWFsa293c2tpQGJvb3RsaW4uY29tPiB3cm90ZToKPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gcHNiZmJfcHJvYmUgcGVyZm9ybXMgYW4gZXZhbHVhdGlvbiBv ZiB0aGUgcmVxdWlyZWQgc2l6ZSBmcm9tIHRoZSBzdG9sZW4KPiA+ID4gPiA+ID4gR1RUIG1lbW9y eSwgYnV0IGdldHMgaXQgd3JvbmcgaW4gdHdvIGRpc3RpbmN0IHdheXM6Cj4gPiA+ID4gPiA+IC0g VGhlIHJlc3VsdGluZyBzaXplIG11c3QgYmUgcGFnZS1zaXplLWFsaWduZWQ7Cj4gPiA+ID4gPiA+ IC0gVGhlIHNpemUgdG8gYWxsb2NhdGUgaXMgZGVyaXZlZCBmcm9tIHRoZSBzdXJmYWNlIGRpbWVu c2lvbnMsIG5vdCB0aGUgZmIKPiA+ID4gPiA+ID4gICBkaW1lbnNpb25zLgo+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiBXaGVuIHR3byBjb25uZWN0b3JzIGFyZSBjb25uZWN0ZWQgd2l0aCBkaWZmZXJl bnQgbW9kZXMsIHRoZSBzbWFsbGVzdCB3aWxsCj4gPiA+ID4gPiA+IGJlIHN0b3JlZCBpbiB0aGUg ZmIgZGltZW5zaW9ucywgYnV0IHRoZSBzaXplIHRoYXQgbmVlZHMgdG8gYmUgYWxsb2NhdGVkIG11 c3QKPiA+ID4gPiA+ID4gbWF0Y2ggdGhlIGxhcmdlc3QgKHN1cmZhY2UpIGRpbWVuc2lvbnMuIFRo aXMgaXMgd2hhdCBpcyB1c2VkIGluIHRoZSBhY3R1YWwKPiA+ID4gPiA+ID4gYWxsb2NhdGlvbiBj b2RlLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBGaXggdGhpcyBieSBjb3JyZWN0aW5nIHRoZSBl dmFsdWF0aW9uIHRvIGNvbmZvcm0gdG8gdGhlIHR3byBwb2ludHMgYWJvdmUuCj4gPiA+ID4gPiA+ IEl0IGFsbG93cyBjb3JyZWN0bHkgc3dpdGNoaW5nIHRvIDE2YnBwIHdoZW4gb25lIGNvbm5lY3Rv ciBpcyBlLmcuIDE5MjB4MTA4MAo+ID4gPiA+ID4gPiBhbmQgdGhlIG90aGVyIGlzIDEwMjR4NzY4 Lgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBQYXVsIEtvY2lhbGtvd3Nr aSA8cGF1bC5rb2NpYWxrb3dza2lAYm9vdGxpbi5jb20+Cj4gPiA+ID4gPiA+IC0tLQo+ID4gPiA+ ID4gPiAgZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9mcmFtZWJ1ZmZlci5jIHwgOCArKysrKystLQo+ ID4gPiA+ID4gPiAgMSBmaWxlIGNoYW5nZWQsIDYgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMo LSkKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9n bWE1MDAvZnJhbWVidWZmZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZnJhbWVidWZmZXIu Ywo+ID4gPiA+ID4gPiBpbmRleCAyMThmM2JiMTUyNzYuLjkwMjM3YWJlZTA4OCAxMDA2NDQKPiA+ ID4gPiA+ID4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9mcmFtZWJ1ZmZlci5jCj4gPiA+ ID4gPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZnJhbWVidWZmZXIuYwo+ID4gPiA+ ID4gPiBAQCAtNDYyLDYgKzQ2Miw3IEBAIHN0YXRpYyBpbnQgcHNiZmJfcHJvYmUoc3RydWN0IGRy bV9mYl9oZWxwZXIgKmhlbHBlciwKPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgIGNvbnRhaW5l cl9vZihoZWxwZXIsIHN0cnVjdCBwc2JfZmJkZXYsIHBzYl9mYl9oZWxwZXIpOwo+ID4gPiA+ID4g PiAgICAgICAgIHN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBwc2JfZmJkZXYtPnBzYl9mYl9oZWxw ZXIuZGV2Owo+ID4gPiA+ID4gPiAgICAgICAgIHN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9w cml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKPiA+ID4gPiA+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQg ZmJfc2l6ZTsKPiA+ID4gPiA+ID4gICAgICAgICBpbnQgYnl0ZXNwcDsKPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gICAgICAgICBieXRlc3BwID0gc2l6ZXMtPnN1cmZhY2VfYnBwIC8gODsKPiA+ID4g PiA+ID4gQEAgLTQ3MSw4ICs0NzIsMTEgQEAgc3RhdGljIGludCBwc2JmYl9wcm9iZShzdHJ1Y3Qg ZHJtX2ZiX2hlbHBlciAqaGVscGVyLAo+ID4gPiA+ID4gPiAgICAgICAgIC8qIElmIHRoZSBtb2Rl IHdpbGwgbm90IGZpdCBpbiAzMmJpdCB0aGVuIHN3aXRjaCB0byAxNmJpdCB0byBnZXQKPiA+ID4g PiA+ID4gICAgICAgICAgICBhIGNvbnNvbGUgb24gZnVsbCByZXNvbHV0aW9uLiBUaGUgWCBtb2Rl IHNldHRpbmcgc2VydmVyIHdpbGwKPiA+ID4gPiA+ID4gICAgICAgICAgICBhbGxvY2F0ZSBpdHMg b3duIDMyYml0IEdFTSBmcmFtZWJ1ZmZlciAqLwo+ID4gPiA+ID4gPiAtICAgICAgIGlmIChBTElH TihzaXplcy0+ZmJfd2lkdGggKiBieXRlc3BwLCA2NCkgKiBzaXplcy0+ZmJfaGVpZ2h0ID4KPiA+ ID4gPiA+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgZGV2X3ByaXYtPnZyYW1fc3RvbGVuX3Np emUpIHsKPiA+ID4gPiA+ID4gKyAgICAgICBmYl9zaXplID0gQUxJR04oc2l6ZXMtPnN1cmZhY2Vf d2lkdGggKiBieXRlc3BwLCA2NCkgKgo+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICBzaXpl cy0+c3VyZmFjZV9oZWlnaHQ7Cj4gPiA+ID4gPiA+ICsgICAgICAgZmJfc2l6ZSA9IEFMSUdOKGZi X3NpemUsIFBBR0VfU0laRSk7Cj4gPiA+ID4gPiA+ICsKPiA+ID4gPiA+ID4gKyAgICAgICBpZiAo ZmJfc2l6ZSA+IGRldl9wcml2LT52cmFtX3N0b2xlbl9zaXplKSB7Cj4gPiA+ID4gPgo+ID4gPiA+ ID4gcHNiX2d0dF9hbGxvY19yYW5nZSgpIGFscmVhZHkgYWxpZ25zIGJ5IFBBR0VfU0laRSBmb3Ig dXMuIExvb2tzIGxpa2UKPiA+ID4gPiA+IHdlIGFsaWduIGEgY291cGxlIG9mIHRpbWVzIGV4dHJh IGZvciBsdWNrLiBUaGlzIG5lZWRzIGNsZWFuaW5nIHVwCj4gPiA+ID4gPiBpbnN0ZWFkIG9mIGFk ZGluZyBldmVuIG1vcmUgYWxpZ25zLgo+ID4gPiA+Cj4gPiA+ID4gSSdtIG5vdCBzdXJlIHRoaXMg aXMgcmVhbGx5IGZvciBsdWNrLiBBcyBmYXIgYXMgSSBjYW4gc2VlLCB3ZSBuZWVkIHRvIGRvIGl0 Cj4gPiA+ID4gcHJvcGVybHkgZm9yIHRoaXMgc2l6ZSBlc3RpbWF0aW9uIHNpbmNlIGl0J3MgdGhl IGZpbmFsIHNpemUgdGhhdCB3aWxsIGJlCj4gPiA+ID4gYWxsb2NhdGVkIChhbmQgdGh1cyBuZWVk cyB0byBiZSBhdmFpbGFibGUgaW4gd2hvbGUpLgo+ID4KPiA+IE9rIG5vdyBJIHVuZGVyc3RhbmQg d2hhdCB5b3UgbWVhbnQuIEFjdHVhbGx5IHZyYW1fc3RvbGVuX3NpemUgaXMKPiA+IGFsd2F5cyBw YWdlIGFsaWduZWQgc28gZmJfc2l6ZSBkb2Vzbid0IG5lZWQgYW55IHBhZ2UgYWxpZ25tZW50IGhl cmUuCj4KPiBJJ20gYSBiaXQgY29uZnVzZWQgaGVyZSwgd2hhdCBhYm91dCB0aGUgY2FzZSB3aGVy ZToKPiB1bmFsaWduZWQgZmJfc2l6ZSA8IGRldl9wcml2LT52cmFtX3N0b2xlbl9zaXplIGJ1dAo+ IGFsaWduZWQgZmJfc2l6ZSA+IGRldl9wcml2LT52cmFtX3N0b2xlbl9zaXplID8KClRoYXQgY2Fu IG5ldmVyIGhhcHBlbiBzaW5jZSBhbGlnbmluZyBmYl9zaXplIHdpbGwgbmV2ZXIgY3Jvc3MgYSBw YWdlCmJvdW5kYXJ5LCBhbmQgc3RvbGVuX3NpemUgaXMgYWx3YXlzIG9uIGEgcGFnZSBib3VuZGFy eS4gTm90IHN1cmUgaG93CnRvIGV4cGxhaW4gaXQgb24gYSBnb29kIHdheSBidXQ6CklmIHN0b2xl bl9zaXplID0gNDA5NiwgdGhlbiBmYl9zaXplIGlzIG9ubHkgbW9yZSB0aGFuIHN0b2xlbl9zaXpl IGlmCml0IGlzIGFjdHVhbGx5ID4gNDA5NiByZWdhcmRsZXNzIGlmIHdlIGFsaWduIGl0IG9yIG5v dC4KCj4KPiBHcmFudGVkLCBpdCdzIGEgY29ybmVyIGNhc2UsIGJ1dCBJIGRvbid0IGZvbGxvdyB0 aGUgbG9naWMgb2YgY29tcGFyaW5nIGFsaWduZWQKPiBhbmQgdW5hbGlnbmVkIHNpemVzOiBpdCBm ZWVscyBhIGJpdCBsaWtlIGNvbXBhcmluZyB0d28gdmFsdWVzIG9mIGRpZmZlcmVudAo+IHVuaXRz LgoKV2UgY2FuIGtlZXAgaXQgaWYgeW91IHRoaW5rIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVh ZGFibGUuCgo+Cj4gPiBUaGVyZSBpcyBhbHNvIG5vIG5lZWQgdG8gYWxpZ24gZm9yIHBzYmZiX2Ny ZWF0ZSgpIHNpbmNlIGl0IGFsc28gdGFrZXMKPiA+IGNhcmUgb2YgdGhpcy4KPiA+Cj4gPiA+ID4K PiA+ID4gPiBGb3IgdGhlIG90aGVyIHRpbWVzIHRoZXJlIGlzIGV4cGxpY2l0IGFsaWdubWVudCwg dGhleSBzZWVtIGp1c3RpZmllZCB0b286Cj4gPiA+ID4gLSBpbiBwc2JfZ2VtX2NyZWF0ZTogaXQg aXMgY29tbW9uIHRvIHBhc3MgdGhlIGFsaWduZWQgc2l6ZSB3aGVuIGNyZWF0aW5nIHRoZQo+ID4g PiA+ICAgYXNzb2NpYXRlZCBHRU0gb2JqZWN0IHdpdGggZHJtX2dlbV9vYmplY3RfaW5pdCwgZXZl biB0aG91Z2ggaXQncyBwcm9iYWJseSBub3QKPiA+ID4gPiAgIGNydWNpYWwgZ2l2ZW4gdGhhdCB0 aGlzIGlzIG5vdCB3aGVyZSBhbGxvY2F0aW9uIGFjdHVhbGx5IGhhcHBlbnM7Cj4gPiA+ID4gLSBp biBwc2JmYl9jcmVhdGU6IHRoZSBmdWxsIHNpemUgaXMgYXBwYXJlbnRseSBvbmx5IHJlYWxseSB1 c2VkIHRvIG1lbXNldCAwCj4gPiA+ID4gICB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gSSB0aGluayB0 aGlzIG1ha2VzIHNlbnNlIGZvciBzZWN1cml0eSByZWFzb25zIChhbmQgbm90Cj4gPiA+ID4gICBs ZWFrIHByZXZpb3VzIGNvbnRlbnRzIGluIHRoZSBhZGRpdGlvbmFsIHNwYWNlIHJlcXVpcmVkIGZv ciBhbGlnbm1lbnQpLgo+ID4KPiA+IFdoYXQgSSB3b3VsZCBwcmVmZXIgaXMgdG8gaGF2ZSBhIHNp bmdsZSBwbGFjZSB3aGVyZSB0aGUgYWxpZ25tZW50IGlzCj4gPiBtYWRlIHNvIGFueSBoYXJkd2Fy ZSByZXF1aXJlbWVudHMgd291bGQgYmUgdHJhbnNwYXJlbnQgdG8gdGhlIHJlc3Qgb2YKPiA+IHRo ZSBjb2RlLgo+Cj4gTWhoLCBJIHRob3VnaHQgdGhhdCBwc2JmYl9jcmVhdGUgbmVlZHMgdG8gYmUg YXdhcmUgb2YgdGhlIGFsaWdubWVudCBpbiB0aGUKPiBmb3JtIG9mIHRoZSBwaXRjaF9saW5lcyB2 YXJpYWJsZSB0byBkZWNpZGUgd2hpY2ggMmQgYWNjZWwgbWV0aG9kIGNhbiBiZSB1c2VkIG9yCj4g bm90IChkZXBlbmRpbmcgb24gYXNzb2NpYXRlZCBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzKS4gSSBn dWVzcyB0aGlzIG1ha2VzIGZvcgo+IGFub3RoZXIgcmVhc29uIHRvIGRpdGNoIHRoZSBhY2NlbGVy YXRlZCAyZCBhY2NlbCBzdXBwb3J0LgoKSSB3YXMgb25seSB0aGlua2luZyBvZiB0aGUgc2l6ZSBh bGlnbm1lbnQuIFllcywgZGl0Y2hpbmcgMkQgd291bGQgbWFrZQpsaWZlIGVhc2llciBpbiB0aGlz IHJlZ2FyZC4KCj4KPiA+IEJlc3Qgd291bGQgYmUgaWYgYWxpZ25tZW50IGlzIG9ubHkgbWFkZSBp biBwc2JfZ3R0X2FsbG9jX3JhbmdlKCkgYW5kCj4gPiB0aGVuIHN0b3JlIHRoZSBhY3R1YWwgc2l6 ZSBpbiBzdHJ1Y3QgZ3R0X3JhbmdlLiBUaGF0IHdheSB3ZSBjYW4ganVzdAo+ID4gcGFzcyBhbG9u ZyB0aGF0IHZhbHVlIHRvIG1lbXNldCgpIGFuZCBkcm1fZ2VtX29iamVjdF9pbml0KCkgd2l0aG91 dAo+ID4gY2FyaW5nIGFib3V0IGhvdyBpdCBpcyBhZGp1c3RlZC4KPiA+Cj4gPiA+ID4KPiA+ID4g PiBXaGF0IHN0cmlrZXMgbWUgaG93ZXZlciBpcyB0aGF0IGVhY2ggY2FsbCB0byBwc2JfZ3R0X2Fs bG9jX3JhbmdlIHRha2VzIHRoZQo+ID4gPiA+IGFsaWdubWVudCBhcyBhIHBhcmFtZXRlciB3aGVu IGl0J3MgcmVhbGx5IGFsd2F5cyBQQUdFX1NJWkUsIHNvIGl0IHNob3VsZAo+ID4gPiA+IHByb2Jh Ymx5IGp1c3QgYmUgaGFyZGNvZGVkIGluIHRoZSBjYWxsIHRvIGFsbG9jYXRlX3Jlc291cmNlLgo+ ID4KPiA+IFRoaXMgaXMgYSByZW1uYW50IGZyb20gdHJ5aW5nIHRvIGFkZCBzdXBwb3J0IGZvciAy RCBhbmQvb3Igb3ZlcmxheQo+ID4gcGxhbmVzIChkb24ndCByZWFsbHkgcmVtZW1iZXIpLiBEb2Vz bid0IG1hdHRlciBpZiBpdCBzdGF5cyBvciBnb2VzCj4gPiBhd2F5Lgo+ID4KPiA+ID4gPgo+ID4g PiA+IFdoYXQgZG8geW91IHRoaW5rPwo+ID4KPiA+IEkgc3VwcG9zZSBtb3N0IG9mIHRoaXMgaXMg b3V0c2lkZSB0aGUgc2NvcGUgb2Ygd2hhdCB5b3UncmUgdHJ5aW5nIHRvCj4gPiBkbyBzbyB3ZSBj YW4ganVzdCBsZWF2ZSBpdCBhcyBpcyBhbmQgSSBjYW4gY2xlYW4gaXQgdXAgbGF0ZXIuCj4KPiBJ IGd1ZXNzIG15IG1haW4gY2hhbmdlIGhlcmUgd2FzIHRvIHN3aXRjaCBmcm9tIHNpemVzLT5mYl93 aWR0aC9oZWlnaHQgdG8KPiBzaXplcy0+c3VyZmFjZV93aWR0aC9oZWlnaHQgYW55d2F5LCB5ZXMu IEkgY2FuIHRvdGFsbHkgbGl2ZSB3aXRob3V0IHRoZQo+IGZpbmFsIFBBR0VfU0laRSBhbGlnbiBm b3IgZmJfc2l6ZSB0b28gKGV2ZW4gdGhvdWdoIEkgdGhpbmsgaXQgbWFrZXMgc2Vuc2UpLgo+Cj4g RmVlbCBmcmVlIHRvIGxldCBtZSBrbm93IHdoYXQgeW91J2QgbGlrZSB0byByZWNlaXZlIGFzIGEg djIgaGVyZSBhbmQgSSdsbCBkbwo+IHRoYXQgOikKCkxldCdzIGtlZXAgaXQgYXMgaXQgaXMgd2l0 aCB0aGUgbW90aXZhdGlvbiB0aGF0IGl0IGluY3JlYXNlcyByZWFkYWJpbGl0eS4KCkFwcGxpZWQg dG8gZHJtLW1pc2MtbmV4dC4KVGhhbmtzCgo+Cj4gPiA+ID4KPiA+ID4gPiA+IFlvdXIgc2l6ZSBj YWxjdWxhdGlvbiBsb29rcyBjb3JyZWN0IGFuZCBpbmRlZWQgbWFrZXMgbXkgMTAyNHg2MDAgKwo+ ID4gPiA+ID4gMTkyMHgxMDgwIHNldHVwIGFjdHVhbGx5IGRpc3BsYXkgc29tZXRoaW5nLCBidXQg Zm9yIHNvbWUgcmVhc29uIEkgZ2V0Cj4gPiA+ID4gPiBhbiBpbmNvcnJlY3QgcGFubmluZyBvbiB0 aGUgc21hbGxlciBzY3JlZW4gYW5kIHN0YWxlIGRhdGEgb24gdGhlCj4gPiA+ID4gPiBzdXJmYWNl IG9ubHkgdmlzaWJsZSBieSB0aGUgbGFyZ2VyIENSVEMuIEFueSBpZGVhIHdoYXQncyBnb2luZyBv bj8KPiA+ID4gPgo+ID4gPiA+IEknbSBub3Qgc2VlaW5nIHRoaXMgaW1tZWRpYXRlbHksIGJ1dCBJ IGRlZmluaXRlbHkgaGF2ZSBzb21ldGhpbmcgc3RyYW5nZQo+ID4gPiA+IGFmdGVyIGhhdmluZyBw cmludGVkIG1vcmUgbGluZXMgdGhhbiB0aGUgc21hbGxlc3QgZGlzcGxheSBjYW4gaGFuZGxlIG9y Cj4gPiA+ID4gc2Nyb2xsaW5nLCB3aGVyZSBtb3JlIHRoYW4gdGhlIGFjdHVhbCBzaXplIG9mIHRo ZSBmYiBpcyB1c2VkLgo+ID4gPiA+Cj4gPiA+ID4gTWF5YmUgdGhpcyBpcyByZWxhdGVkIHRvIHVz aW5nIHRoZSBQb3dlclZSLWFjY2VsZXJhdGVkIGZiIG9wcywgdGhhdCBhcmVuJ3QKPiA+ID4gPiBx dWl0ZSByZWFkeSBmb3IgdGhpcyB1c2UgY2FzZT8KPiA+ID4gPgo+ID4gPiA+IEknbGwgZ2l2ZSBp dCBhIHRyeSB3aXRoIHBzYmZiX3JvbGxfb3BzIGFuZCBwc2JmYl91bmFjY2VsX29wcyBpbnN0ZWFk IHRvIHNlZQo+ID4gPiA+IGlmIGl0IGNoYW5nZXMgc29tZXRoaW5nIGZvciBtZS4gTWF5YmUgaXQg d291bGQgaGVscCBmb3IgeW91IHRvbz8KPiA+ID4KPiA+ID4gU29tZSBxdWljayBmZWVkYmFjayBh Ym91dCB0aGF0Ogo+ID4gPiAtIHBzYmZiX3VuYWNjZWxfb3BzIGdpdmVzIGEgY29ycmVjdCByZXN1 bHQgd2hlcmUgdGhlIHNjcm9sbGluZyBhcmVhIGlzIGJvdW5kCj4gPiA+ICAgdG8gdGhlIHNtYWxs ZXN0IGRpc3BsYXk7Cj4gPgo+ID4gWWVzLCB0aGlzIGFsc28gd29ya3MgY29ycmVjdGx5IGZvciBt ZS4KPiA+Cj4gPiA+IC0gcHNiZmJfcm9sbF9vcHMgZ2l2ZXMgYSB3b3JraW5nIHNjcm9sbGluZyBi dXQgYm91bmQgdG8gdGhlIGxhcmdlc3QgZGlzcGxheQo+ID4gPiAgIChzbyB0aGUgY3VycmVudCBz aGVsbCBsaW5lIGJlY29tZXMgaW52aXNpYmxlIG9uIHRoZSBzbWFsbGVzdCBvbmUgZXZlbnR1YWxs eSk7Cj4gPgo+ID4gSXQncyBub3QgcGFubmluZyBhdCBhbGwgZm9yIG1lLiBJIG5ldmVyIHJlYWxs eSBmb3VuZCBndHQgcm9sbGluZyB0byBiZQo+ID4gdXNlZnVsLiBJdCdzIGEgbmVhdCB0cmljayBi dXQgSSBkaWRuJ3QgaGF2ZSBhIHByb2JsZW0gd2l0aCBjb25zb2xlCj4gPiBzY3JvbGxpbmcgc3Bl ZWQgdG8gYmVnaW4gd2l0aC4gSSBtaWdodCBqdXN0IHJlbW92ZSBpdC4KPgo+IFllYWgsIEkgYWxz byBkb24ndCB1bmRlcnN0YW5kIHdoYXQgdGhlIGh5cGUgb2YgYWNjZWxlcmF0aW5nIGZiZGV2IG9w cyBpcyBhYm91dC4KPiBJIGd1ZXNzIGl0IGNvdWxkIGhhdmUgYmVlbiB1c2VmdWwgYmFjayB3aGVu IHRoZXJlIHdlcmUgc2VyaW91cyB1c2VycyBvZiBmYmRldiBpbgo+IHVzZXJzcGFjZSAoYWthIGRp cmVjdGZiKSBidXQgdGhhdCdzIG5vdCByZWFsbHkgd2hlcmUgdGhpbmdzIGFyZSBnb2luZyB0b2Rh eS4KPiBGb3IgY29uc29sZSB1c2FnZSwgSSBhbHNvIGZpbmQgdGhlIHNvZnR3YXJlIG1ldGhvZCBm YXN0IGVub3VnaC4KPgo+ID4gPiAtIHBzYmZiX29wcyBnaXZlcyB0aGUgc2FtZSBpc3N1ZSBhcyBh Ym92ZSBhbmQgc2VlbXMgdG8gYWRkIGFydGlmYWN0cyBvbiB0b3AuCj4gPgo+ID4gRGlkIHlvdSB0 cnkgdGhpcyBvbiBDRFY/IFRoZXJlJ3Mgb25seSAyRCBhY2NlbGVyYXRpb24gb24gUG91bHNibyBh bmQgT2FrdHJhaWwuCj4KPiBJIHRyaWVkIHRoaXMgb25lIG9uIFBvdWxzYm8gKHRoZSBvdGhlciBn bWE1MDAgcGxhdGZvcm0gSSBoYXZlIGFyb3VuZCkuCj4KPiA+ID4KPiA+ID4gVGhlcmUncyBwcm9i YWJseSBsaW1pdGVkIGludGVyZXN0IGluIHdvcmtpbmcgb24gdGhhdCBhc3BlY3Qgb24gb3VyIHNp ZGUgdGhvdWdoLgo+ID4gPiBJJ2QgYmUgaW50ZXJlc3RlZCB0byBrbm93IGlmIGl0IGFmZmVjdHMg dGhlIGlzc3VlIHlvdSdyZSBzZWVpbmcgdGhvdWdoLgo+ID4KPiA+IEZvY3VzIG9uIHlvdXIgcmVx dWlyZW1lbnRzIGFuZCBJJ2xsIGxvb2sgYXQgdGhlIHJlc3QuCj4KPiBTb3VuZHMgZ29vZCB0byBt ZSwgdGhhbmtzIGEgbG90ISBJJ2xsIGRvIGFjY29yZGluZyB0byB3aGF0IHlvdSdkIGxpa2UgZm9y IGEgdjIuCj4KPiBDaGVlcnMsCj4KPiBQYXVsCj4KPiA+IC1QYXRyaWsKPiA+Cj4gPiA+Cj4gPiA+ IENoZWVycywKPiA+ID4KPiA+ID4gUGF1bAo+ID4gPgo+ID4gPiA+IEkgc3VzcGVjdCB0aGF0IHRo ZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGlzIGFscmVhZHkgYnVsbGV0LXByb29mIGZvciB0aGVz ZQo+ID4gPiA+IGtpbmRzIG9mIHVzZSBjYXNlLgo+ID4gPiA+Cj4gPiA+ID4gQ2hlZXJzIGFuZCB0 aGFua3MgZm9yIHRoZSBmZWVkYmFjaywKPiA+ID4gPgo+ID4gPiA+IFBhdWwKPiA+ID4gPgo+ID4g PiA+ID4KPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICBzaXplcy0+c3VyZmFjZV9icHAgPSAx NjsKPiA+ID4gPiA+ID4gICAgICAgICAgICAgICAgICBzaXplcy0+c3VyZmFjZV9kZXB0aCA9IDE2 Owo+ID4gPiA+ID4gPiAgICAgICAgICB9Cj4gPiA+ID4gPiA+IC0tCj4gPiA+ID4gPiA+IDIuMjMu MAo+ID4gPiA+ID4gPgo+ID4gPiA+Cj4gPiA+ID4gLS0KPiA+ID4gPiBQYXVsIEtvY2lhbGtvd3Nr aSwgQm9vdGxpbgo+ID4gPiA+IEVtYmVkZGVkIExpbnV4IGFuZCBrZXJuZWwgZW5naW5lZXJpbmcK PiA+ID4gPiBodHRwczovL2Jvb3RsaW4uY29tCj4gPiA+Cj4gPiA+Cj4gPiA+Cj4gPiA+IC0tCj4g PiA+IFBhdWwgS29jaWFsa293c2tpLCBCb290bGluCj4gPiA+IEVtYmVkZGVkIExpbnV4IGFuZCBr ZXJuZWwgZW5naW5lZXJpbmcKPiA+ID4gaHR0cHM6Ly9ib290bGluLmNvbQo+Cj4gLS0KPiBQYXVs IEtvY2lhbGtvd3NraSwgQm9vdGxpbgo+IEVtYmVkZGVkIExpbnV4IGFuZCBrZXJuZWwgZW5naW5l ZXJpbmcKPiBodHRwczovL2Jvb3RsaW4uY29tCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbA==