From mboxrd@z Thu Jan 1 00:00:00 1970 From: ville.syrjala@linux.intel.com (Ville =?iso-8859-1?Q?Syrj=E4l=E4?=) Date: Wed, 22 Feb 2017 17:30:36 +0200 Subject: [BUG] hdlcd gets confused about base address In-Reply-To: <20170222151542.GA937@e110455-lin.cambridge.arm.com> References: <20161118233733.GP1041@n2100.armlinux.org.uk> <20170220121603.GA1132@n2100.armlinux.org.uk> <20170220175331.GC963@e110455-lin.cambridge.arm.com> <20170220180558.GB31595@intel.com> <20170222151542.GA937@e110455-lin.cambridge.arm.com> Message-ID: <20170222153036.GI31595@intel.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, Feb 22, 2017 at 03:15:42PM +0000, Liviu Dudau wrote: > Hi Ville, > > On Mon, Feb 20, 2017 at 08:05:58PM +0200, Ville Syrj?l? wrote: > > On Mon, Feb 20, 2017 at 05:53:31PM +0000, Liviu Dudau wrote: > > > Hi Russell, > > > > > > On Mon, Feb 20, 2017 at 12:16:03PM +0000, Russell King - ARM Linux wrote: > > > > On Fri, Nov 18, 2016 at 11:37:33PM +0000, Russell King - ARM Linux wrote: > > > > > Something I also noticed is this: > > > > > > > > > > scanout_start = gem->paddr + plane->state->fb->offsets[0] + > > > > > plane->state->crtc_y * plane->state->fb->pitches[0] + > > > > > plane->state->crtc_x * bpp / 8; > > > > > > > > > > Surely this should be using src_[xy] (which are the position in the > > > > > source - iow, memory, and not crtc_[xy] which is the position on the > > > > > CRTC displayed window. To put it another way, the src_* define the > > > > > region of the source material that is mapped onto a rectangular area > > > > > on the display defined by crtc_*. > > > > > > > > This problem still exists... > > > > > > Sorry, looks like this fell through the cracks of us trying to fix the > > > other issues you were seeing. I'm attaching a patch, please let me know > > > if this works for you. > > > > > > Best regards, > > > Liviu > > > > > > > > > > > -- > > > > RMK's Patch system: http://www.armlinux.org.uk/developer/patches/ > > > > FTTC broadband for 0.8mile line: currently at 9.6Mbps down 400kbps up > > > > according to speedtest.net. > > > > > >From a495d262cb91fdeccb00685646ddb71774c18e7e Mon Sep 17 00:00:00 2001 > > > From: Liviu Dudau > > > Date: Mon, 20 Feb 2017 17:44:42 +0000 > > > Subject: [PATCH] arm: hdlcd: Fix the calculation of scanout start address > > > > > > The framebuffer start address uses the CRTC's x,y position rather > > > than the source framebuffer's. Fix that. > > > > > > Reported-by: Russell King > > > Signed-off-by: Liviu Dudau > > > --- > > > drivers/gpu/drm/arm/hdlcd_crtc.c | 11 +++++------ > > > 1 file changed, 5 insertions(+), 6 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > > > index 798a3cc480a2..4c1ab73d9e07 100644 > > > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > > > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > > > @@ -244,21 +244,20 @@ static void hdlcd_plane_atomic_update(struct drm_plane *plane, > > > struct drm_framebuffer *fb = plane->state->fb; > > > struct hdlcd_drm_private *hdlcd; > > > struct drm_gem_cma_object *gem; > > > - u32 src_w, src_h, dest_w, dest_h; > > > + u32 src_x, src_y, dest_w, dest_h; > > > dma_addr_t scanout_start; > > > > > > if (!fb) > > > return; > > > > > > - src_w = plane->state->src_w >> 16; > > > - src_h = plane->state->src_h >> 16; > > > + src_x = plane->state->src_x >> 16; > > > + src_y = plane->state->src_y >> 16; > > While still waiting for your reply to Russell's comments ... > > > > > This stuff should be using the clipped coordinates, not the user > > coordinates. And it doesn't look like this guy is even calling the > > clip helper thing. > > That's right, the code I believe predates the existence of the clip helper > thing (me reads it as "drm_plane_helper_check_state"), and I have not got > around to update the code here. Before I do that I would like to get a bit > more clarification on what you mean by the clipped coordinates, given > that HDLCD doesn't support dirty buffer updates. The requirement to handle out of bounds plane coordinates correctly was always there even before the helper existed. It's just that most people who wrote new drivers neglected to read the reference code (i915). Granted, it would be better to have actual documentation, and now that we have the clipped coordinates in the core state and we have some helpers we should have a sensible place for said documentation as well. > > > > > malidp seems to be calling that thing, but it still doesn't > > manage to program the hw with the right coordinates from what > > I can see. > > would like more clarity on what the right coordinates should be. state->src and state->dst Well, that's assuming that you can't directly feed negative/large coordinates to your hardware. > > > > > /me feels a bit like a broken record... > > Sorry, I was not aware of your previous interventions on the subject of "right > coordinates". Could you please point me in the right direction, if it is not > much trouble? > > Best regards, > Liviu > > > > > > dest_w = plane->state->crtc_w; > > > dest_h = plane->state->crtc_h; > > > gem = drm_fb_cma_get_gem_obj(fb, 0); > > > scanout_start = gem->paddr + fb->offsets[0] + > > > - plane->state->crtc_y * fb->pitches[0] + > > > - plane->state->crtc_x * > > > - fb->format->cpp[0]; > > > + src_y * fb->pitches[0] + > > > + src_x * fb->format->cpp[0]; > > > > > > hdlcd = plane->dev->dev_private; > > > hdlcd_write(hdlcd, HDLCD_REG_FB_LINE_LENGTH, fb->pitches[0]); > > > -- > > > 2.11.0 > > > > > > > > _______________________________________________ > > > dri-devel mailing list > > > dri-devel at lists.freedesktop.org > > > https://lists.freedesktop.org/mailman/listinfo/dri-devel > > > > > > -- > > Ville Syrj?l? > > Intel OTC > > -- > ==================== > | I would like to | > | fix the world, | > | but they're not | > | giving me the | > \ source code! / > --------------- > ?\_(?)_/? -- Ville Syrj?l? Intel OTC From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [BUG] hdlcd gets confused about base address Date: Wed, 22 Feb 2017 17:30:36 +0200 Message-ID: <20170222153036.GI31595@intel.com> References: <20161118233733.GP1041@n2100.armlinux.org.uk> <20170220121603.GA1132@n2100.armlinux.org.uk> <20170220175331.GC963@e110455-lin.cambridge.arm.com> <20170220180558.GB31595@intel.com> <20170222151542.GA937@e110455-lin.cambridge.arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3A53B6E838 for ; Wed, 22 Feb 2017 15:31:03 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20170222151542.GA937@e110455-lin.cambridge.arm.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Liviu Dudau Cc: linux-arm-kernel@lists.infradead.org, Mali DP Maintainers , Russell King - ARM Linux , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBGZWIgMjIsIDIwMTcgYXQgMDM6MTU6NDJQTSArMDAwMCwgTGl2aXUgRHVkYXUgd3Jv dGU6Cj4gSGkgVmlsbGUsCj4gCj4gT24gTW9uLCBGZWIgMjAsIDIwMTcgYXQgMDg6MDU6NThQTSAr MDIwMCwgVmlsbGUgU3lyasOkbMOkIHdyb3RlOgo+ID4gT24gTW9uLCBGZWIgMjAsIDIwMTcgYXQg MDU6NTM6MzFQTSArMDAwMCwgTGl2aXUgRHVkYXUgd3JvdGU6Cj4gPiA+IEhpIFJ1c3NlbGwsCj4g PiA+IAo+ID4gPiBPbiBNb24sIEZlYiAyMCwgMjAxNyBhdCAxMjoxNjowM1BNICswMDAwLCBSdXNz ZWxsIEtpbmcgLSBBUk0gTGludXggd3JvdGU6Cj4gPiA+ID4gT24gRnJpLCBOb3YgMTgsIDIwMTYg YXQgMTE6Mzc6MzNQTSArMDAwMCwgUnVzc2VsbCBLaW5nIC0gQVJNIExpbnV4IHdyb3RlOgo+ID4g PiA+ID4gU29tZXRoaW5nIEkgYWxzbyBub3RpY2VkIGlzIHRoaXM6Cj4gPiA+ID4gPiAKPiA+ID4g PiA+ICAgICAgICAgc2Nhbm91dF9zdGFydCA9IGdlbS0+cGFkZHIgKyBwbGFuZS0+c3RhdGUtPmZi LT5vZmZzZXRzWzBdICsKPiA+ID4gPiA+ICAgICAgICAgICAgICAgICBwbGFuZS0+c3RhdGUtPmNy dGNfeSAqIHBsYW5lLT5zdGF0ZS0+ZmItPnBpdGNoZXNbMF0gKwo+ID4gPiA+ID4gICAgICAgICAg ICAgICAgIHBsYW5lLT5zdGF0ZS0+Y3J0Y194ICogYnBwIC8gODsKPiA+ID4gPiA+IAo+ID4gPiA+ ID4gU3VyZWx5IHRoaXMgc2hvdWxkIGJlIHVzaW5nIHNyY19beHldICh3aGljaCBhcmUgdGhlIHBv c2l0aW9uIGluIHRoZQo+ID4gPiA+ID4gc291cmNlIC0gaW93LCBtZW1vcnksIGFuZCBub3QgY3J0 Y19beHldIHdoaWNoIGlzIHRoZSBwb3NpdGlvbiBvbiB0aGUKPiA+ID4gPiA+IENSVEMgZGlzcGxh eWVkIHdpbmRvdy4gIFRvIHB1dCBpdCBhbm90aGVyIHdheSwgdGhlIHNyY18qIGRlZmluZSB0aGUK PiA+ID4gPiA+IHJlZ2lvbiBvZiB0aGUgc291cmNlIG1hdGVyaWFsIHRoYXQgaXMgbWFwcGVkIG9u dG8gYSByZWN0YW5ndWxhciBhcmVhCj4gPiA+ID4gPiBvbiB0aGUgZGlzcGxheSBkZWZpbmVkIGJ5 IGNydGNfKi4KPiA+ID4gPiAKPiA+ID4gPiBUaGlzIHByb2JsZW0gc3RpbGwgZXhpc3RzLi4uCj4g PiA+IAo+ID4gPiBTb3JyeSwgbG9va3MgbGlrZSB0aGlzIGZlbGwgdGhyb3VnaCB0aGUgY3JhY2tz IG9mIHVzIHRyeWluZyB0byBmaXggdGhlCj4gPiA+IG90aGVyIGlzc3VlcyB5b3Ugd2VyZSBzZWVp bmcuIEknbSBhdHRhY2hpbmcgYSBwYXRjaCwgcGxlYXNlIGxldCBtZSBrbm93Cj4gPiA+IGlmIHRo aXMgd29ya3MgZm9yIHlvdS4KPiA+ID4gCj4gPiA+IEJlc3QgcmVnYXJkcywKPiA+ID4gTGl2aXUK PiA+ID4gCj4gPiA+ID4gCj4gPiA+ID4gLS0gCj4gPiA+ID4gUk1LJ3MgUGF0Y2ggc3lzdGVtOiBo dHRwOi8vd3d3LmFybWxpbnV4Lm9yZy51ay9kZXZlbG9wZXIvcGF0Y2hlcy8KPiA+ID4gPiBGVFRD IGJyb2FkYmFuZCBmb3IgMC44bWlsZSBsaW5lOiBjdXJyZW50bHkgYXQgOS42TWJwcyBkb3duIDQw MGticHMgdXAKPiA+ID4gPiBhY2NvcmRpbmcgdG8gc3BlZWR0ZXN0Lm5ldC4KPiA+IAo+ID4gPiA+ RnJvbSBhNDk1ZDI2MmNiOTFmZGVjY2IwMDY4NTY0NmRkYjcxNzc0YzE4ZTdlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQo+ID4gPiBGcm9tOiBMaXZpdSBEdWRhdSA8TGl2aXUuRHVkYXVAYXJtLmNv bT4KPiA+ID4gRGF0ZTogTW9uLCAyMCBGZWIgMjAxNyAxNzo0NDo0MiArMDAwMAo+ID4gPiBTdWJq ZWN0OiBbUEFUQ0hdIGFybTogaGRsY2Q6IEZpeCB0aGUgY2FsY3VsYXRpb24gb2Ygc2Nhbm91dCBz dGFydCBhZGRyZXNzCj4gPiA+IAo+ID4gPiBUaGUgZnJhbWVidWZmZXIgc3RhcnQgYWRkcmVzcyB1 c2VzIHRoZSBDUlRDJ3MgeCx5IHBvc2l0aW9uIHJhdGhlcgo+ID4gPiB0aGFuIHRoZSBzb3VyY2Ug ZnJhbWVidWZmZXIncy4gRml4IHRoYXQuCj4gPiA+IAo+ID4gPiBSZXBvcnRlZC1ieTogUnVzc2Vs bCBLaW5nIDxybWsra2VybmVsQGFybWxpbnV4Lm9yZy51az4KPiA+ID4gU2lnbmVkLW9mZi1ieTog TGl2aXUgRHVkYXUgPExpdml1LkR1ZGF1QGFybS5jb20+Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVy cy9ncHUvZHJtL2FybS9oZGxjZF9jcnRjLmMgfCAxMSArKysrKy0tLS0tLQo+ID4gPiAgMSBmaWxl IGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKPiA+ID4gCj4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYXJtL2hkbGNkX2NydGMuYyBiL2RyaXZlcnMvZ3B1 L2RybS9hcm0vaGRsY2RfY3J0Yy5jCj4gPiA+IGluZGV4IDc5OGEzY2M0ODBhMi4uNGMxYWI3M2Q5 ZTA3IDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYXJtL2hkbGNkX2NydGMuYwo+ ID4gPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYXJtL2hkbGNkX2NydGMuYwo+ID4gPiBAQCAtMjQ0 LDIxICsyNDQsMjAgQEAgc3RhdGljIHZvaWQgaGRsY2RfcGxhbmVfYXRvbWljX3VwZGF0ZShzdHJ1 Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiA+ID4gIAlzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpmYiA9 IHBsYW5lLT5zdGF0ZS0+ZmI7Cj4gPiA+ICAJc3RydWN0IGhkbGNkX2RybV9wcml2YXRlICpoZGxj ZDsKPiA+ID4gIAlzdHJ1Y3QgZHJtX2dlbV9jbWFfb2JqZWN0ICpnZW07Cj4gPiA+IC0JdTMyIHNy Y193LCBzcmNfaCwgZGVzdF93LCBkZXN0X2g7Cj4gPiA+ICsJdTMyIHNyY194LCBzcmNfeSwgZGVz dF93LCBkZXN0X2g7Cj4gPiA+ICAJZG1hX2FkZHJfdCBzY2Fub3V0X3N0YXJ0Owo+ID4gPiAgCj4g PiA+ICAJaWYgKCFmYikKPiA+ID4gIAkJcmV0dXJuOwo+ID4gPiAgCj4gPiA+IC0Jc3JjX3cgPSBw bGFuZS0+c3RhdGUtPnNyY193ID4+IDE2Owo+ID4gPiAtCXNyY19oID0gcGxhbmUtPnN0YXRlLT5z cmNfaCA+PiAxNjsKPiA+ID4gKwlzcmNfeCA9IHBsYW5lLT5zdGF0ZS0+c3JjX3ggPj4gMTY7Cj4g PiA+ICsJc3JjX3kgPSBwbGFuZS0+c3RhdGUtPnNyY195ID4+IDE2Owo+IAo+IFdoaWxlIHN0aWxs IHdhaXRpbmcgZm9yIHlvdXIgcmVwbHkgdG8gUnVzc2VsbCdzIGNvbW1lbnRzIC4uLgo+IAo+ID4g Cj4gPiBUaGlzIHN0dWZmIHNob3VsZCBiZSB1c2luZyB0aGUgY2xpcHBlZCBjb29yZGluYXRlcywg bm90IHRoZSB1c2VyCj4gPiBjb29yZGluYXRlcy4gQW5kIGl0IGRvZXNuJ3QgbG9vayBsaWtlIHRo aXMgZ3V5IGlzIGV2ZW4gY2FsbGluZyB0aGUKPiA+IGNsaXAgaGVscGVyIHRoaW5nLgo+IAo+IFRo YXQncyByaWdodCwgdGhlIGNvZGUgSSBiZWxpZXZlIHByZWRhdGVzIHRoZSBleGlzdGVuY2Ugb2Yg dGhlIGNsaXAgaGVscGVyCj4gdGhpbmcgKG1lIHJlYWRzIGl0IGFzICJkcm1fcGxhbmVfaGVscGVy X2NoZWNrX3N0YXRlIiksIGFuZCBJIGhhdmUgbm90IGdvdAo+IGFyb3VuZCB0byB1cGRhdGUgdGhl IGNvZGUgaGVyZS4gQmVmb3JlIEkgZG8gdGhhdCBJIHdvdWxkIGxpa2UgdG8gZ2V0IGEgYml0Cj4g bW9yZSBjbGFyaWZpY2F0aW9uIG9uIHdoYXQgeW91IG1lYW4gYnkgdGhlIGNsaXBwZWQgY29vcmRp bmF0ZXMsIGdpdmVuCj4gdGhhdCBIRExDRCBkb2Vzbid0IHN1cHBvcnQgZGlydHkgYnVmZmVyIHVw ZGF0ZXMuCgpUaGUgcmVxdWlyZW1lbnQgdG8gaGFuZGxlIG91dCBvZiBib3VuZHMgcGxhbmUgY29v cmRpbmF0ZXMgY29ycmVjdGx5CndhcyBhbHdheXMgdGhlcmUgZXZlbiBiZWZvcmUgdGhlIGhlbHBl ciBleGlzdGVkLiBJdCdzIGp1c3QgdGhhdCBtb3N0CnBlb3BsZSB3aG8gd3JvdGUgbmV3IGRyaXZl cnMgbmVnbGVjdGVkIHRvIHJlYWQgdGhlIHJlZmVyZW5jZSBjb2RlIChpOTE1KS4KR3JhbnRlZCwg aXQgd291bGQgYmUgYmV0dGVyIHRvIGhhdmUgYWN0dWFsIGRvY3VtZW50YXRpb24sIGFuZCBub3cg dGhhdAp3ZSBoYXZlIHRoZSBjbGlwcGVkIGNvb3JkaW5hdGVzIGluIHRoZSBjb3JlIHN0YXRlIGFu ZCB3ZSBoYXZlIHNvbWUKaGVscGVycyB3ZSBzaG91bGQgaGF2ZSBhIHNlbnNpYmxlIHBsYWNlIGZv ciBzYWlkIGRvY3VtZW50YXRpb24gYXMgd2VsbC4KCj4gCj4gPiAKPiA+IG1hbGlkcCBzZWVtcyB0 byBiZSBjYWxsaW5nIHRoYXQgdGhpbmcsIGJ1dCBpdCBzdGlsbCBkb2Vzbid0Cj4gPiBtYW5hZ2Ug dG8gcHJvZ3JhbSB0aGUgaHcgd2l0aCB0aGUgcmlnaHQgY29vcmRpbmF0ZXMgZnJvbSB3aGF0Cj4g PiBJIGNhbiBzZWUuCj4gCj4gd291bGQgbGlrZSBtb3JlIGNsYXJpdHkgb24gd2hhdCB0aGUgcmln aHQgY29vcmRpbmF0ZXMgc2hvdWxkIGJlLgoKc3RhdGUtPnNyYyBhbmQgc3RhdGUtPmRzdAoKV2Vs bCwgdGhhdCdzIGFzc3VtaW5nIHRoYXQgeW91IGNhbid0IGRpcmVjdGx5IGZlZWQgbmVnYXRpdmUv bGFyZ2UKY29vcmRpbmF0ZXMgdG8geW91ciBoYXJkd2FyZS4KCj4gCj4gPiAKPiA+IC9tZSBmZWVs cyBhIGJpdCBsaWtlIGEgYnJva2VuIHJlY29yZC4uLgo+IAo+IFNvcnJ5LCBJIHdhcyBub3QgYXdh cmUgb2YgeW91ciBwcmV2aW91cyBpbnRlcnZlbnRpb25zIG9uIHRoZSBzdWJqZWN0IG9mICJyaWdo dAo+IGNvb3JkaW5hdGVzIi4gQ291bGQgeW91IHBsZWFzZSBwb2ludCBtZSBpbiB0aGUgcmlnaHQg ZGlyZWN0aW9uLCBpZiBpdCBpcyBub3QKPiBtdWNoIHRyb3VibGU/Cj4gCj4gQmVzdCByZWdhcmRz LAo+IExpdml1Cj4gCj4gPiAKPiA+ID4gIAlkZXN0X3cgPSBwbGFuZS0+c3RhdGUtPmNydGNfdzsK PiA+ID4gIAlkZXN0X2ggPSBwbGFuZS0+c3RhdGUtPmNydGNfaDsKPiA+ID4gIAlnZW0gPSBkcm1f ZmJfY21hX2dldF9nZW1fb2JqKGZiLCAwKTsKPiA+ID4gIAlzY2Fub3V0X3N0YXJ0ID0gZ2VtLT5w YWRkciArIGZiLT5vZmZzZXRzWzBdICsKPiA+ID4gLQkJcGxhbmUtPnN0YXRlLT5jcnRjX3kgKiBm Yi0+cGl0Y2hlc1swXSArCj4gPiA+IC0JCXBsYW5lLT5zdGF0ZS0+Y3J0Y194ICoKPiA+ID4gLQkJ ZmItPmZvcm1hdC0+Y3BwWzBdOwo+ID4gPiArCQlzcmNfeSAqIGZiLT5waXRjaGVzWzBdICsKPiA+ ID4gKwkJc3JjX3ggKglmYi0+Zm9ybWF0LT5jcHBbMF07Cj4gPiA+ICAKPiA+ID4gIAloZGxjZCA9 IHBsYW5lLT5kZXYtPmRldl9wcml2YXRlOwo+ID4gPiAgCWhkbGNkX3dyaXRlKGhkbGNkLCBIRExD RF9SRUdfRkJfTElORV9MRU5HVEgsIGZiLT5waXRjaGVzWzBdKTsKPiA+ID4gLS0gCj4gPiA+IDIu MTEuMAo+ID4gPiAKPiA+IAo+ID4gPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwo+ID4gPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gPiA+IGRyaS1kZXZl bEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiA+ID4gaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwKPiA+IAo+ID4gCj4gPiAtLSAKPiA+IFZpbGxl IFN5cmrDpGzDpAo+ID4gSW50ZWwgT1RDCj4gCj4gLS0gCj4gPT09PT09PT09PT09PT09PT09PT0K PiB8IEkgd291bGQgbGlrZSB0byB8Cj4gfCBmaXggdGhlIHdvcmxkLCAgfAo+IHwgYnV0IHRoZXkn cmUgbm90IHwKPiB8IGdpdmluZyBtZSB0aGUgICB8Cj4gIFwgc291cmNlIGNvZGUhICAvCj4gICAt LS0tLS0tLS0tLS0tLS0KPiAgICAgwq9cXyjjg4QpXy/CrwoKLS0gClZpbGxlIFN5cmrDpGzDpApJ bnRlbCBPVEMKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K ZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==