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=-7.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT 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 CD7EEC43381 for ; Thu, 21 Feb 2019 12:23:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 92A6D2086C for ; Thu, 21 Feb 2019 12:23:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="BUn2D8Wj" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726113AbfBUMXR (ORCPT ); Thu, 21 Feb 2019 07:23:17 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:34366 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725814AbfBUMXR (ORCPT ); Thu, 21 Feb 2019 07:23:17 -0500 Received: from pendragon.ideasonboard.com (dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi [IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id EF0F6255; Thu, 21 Feb 2019 13:23:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1550751795; bh=GKBgYnKnBU11QpI2BE+fe6xrIR7p1f9uyEHoIV/nBXA=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=BUn2D8Wj6K1JudmnO/PFHFZ23ddz+Tt2NYJmckvaTQ+LAl8Xodx4T/KtRtokMbFHf VCaE+S20cUJLulJUaKq4K1hFez3xJlxBnVdLcb8jMu8HGksahMzL5bjSS1ZI0veAIM 9KACjgrdnq7ynbteiFFw61glE3ChvbMYLcVISTSA= Date: Thu, 21 Feb 2019 14:23:10 +0200 From: Laurent Pinchart To: Brian Starkey Cc: Laurent Pinchart , Liviu Dudau , nd , Kieran Bingham , "dri-devel@lists.freedesktop.org" , "linux-media@vger.kernel.org" Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Message-ID: <20190221122310.GM3451@pendragon.ideasonboard.com> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> <20190221082317.GB3451@pendragon.ideasonboard.com> <20190221095019.rht64aylk52jqe5r@DESKTOP-E1NTVVP.localdomain> <20190221100257.GD3451@pendragon.ideasonboard.com> <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org Hi Brian, On Thu, Feb 21, 2019 at 12:19:13PM +0000, Brian Starkey wrote: > On Thu, Feb 21, 2019 at 12:02:57PM +0200, Laurent Pinchart wrote: > > On Thu, Feb 21, 2019 at 09:50:19AM +0000, Brian Starkey wrote: > >> On Thu, Feb 21, 2019 at 10:23:17AM +0200, Laurent Pinchart wrote: > >>> On Mon, Feb 18, 2019 at 12:22:58PM +0000, Brian Starkey wrote: > >>>> On Sun, Feb 17, 2019 at 04:48:45AM +0200, Laurent Pinchart wrote: > >>>>> Hello, > >>>>> > >>>>> This patch series implements display writeback support for the R-Car > >>>>> Gen3 platforms in the VSP1 driver. > >>>>> > >>>>> DRM/KMS provides a writeback API through a special type of writeback > >>>>> connectors. This series takes a different approach by exposing writeback > >>>>> as a V4L2 device. While there is nothing fundamentally wrong with > >>>>> writeback connectors, display for R-Car Gen3 platforms relies on the > >>>>> VSP1 driver behind the scene, which already implements V4L2 support. > >>>>> Enabling writeback through V4L2 is thus significantly easier in this > >>>>> case. > >>>> > >>>> How does this look to an application? (I'm entirely ignorant about > >>>> R-Car). They are interacting with the DRM device, and then need to > >>>> open and configure a v4l2 device to get the writeback? Can the process > >>>> which isn't controlling the DRM device independently capture the > >>>> screen output? > >>>> > >>>> I didn't see any major complication to implementing this as a > >>>> writeback connector. If you want/need to use the vb2_queue, couldn't > >>>> you just do that entirely from within the kernel? > >>>> > >>>> Honestly (predictably?), to me it seems like a bad idea to introduce a > >>>> second, non-compatible interface for display writeback. Any > >>>> application interested in display writeback (e.g. compositors) will > >>>> need to implement both in order to support all HW. drm_hwcomposer > >>>> already supports writeback via DRM writeback connectors. > >>>> > >>>> While I can see the advantages of having writeback exposed via v4l2 > >>>> for streaming use-cases, I think it would be better to have it done in > >>>> such a way that it works for all writeback connectors, rather than > >>>> being VSP1-specific. That would allow any application to choose > >>>> whichever method is most appropriate for their use-case, without > >>>> limiting themselves to a subset of hardware. > >>> > >>> So I gave writeback connectors a go, and it wasn't very pretty. > >> > >> Sorry you didn't have a good time :-( > > > > No worries. That was to be expected with such young code :-) > > > >>> There writeback support in the DRM core leaks jobs, > >> > >> Is this the cleanup on check fail, or something else? > > > > Yes, that's the problem. I have patches for it that I will post soon. > > > >> One possible pitfall is that you must set the job in the connector > >> state to NULL after you call drm_writeback_queue_job(). The API there > >> could easily be changed to pass in the connector_state and clear it in > >> drm_writeback_queue_job() instead of relying on drivers to do it. > > > > I also have a patch for that :-) > > > >>> and is missing support for > >>> the equivalent of .prepare_fb()/.cleanup_fb(), which requires per-job > >>> driver-specific data. I'm working on these issues and will submit > >>> patches. > >> > >> Hm, yes that didn't occur to me; we don't have a prepare_fb callback. > >> > >>> In the meantime, I need to test my implementation, so I need a command > >>> line application that will let me exercise the API. I assume you've > >>> tested your code, haven't you ? :-) Could you tell me how I can test > >>> writeback ? > >> > >> Indeed, there's igts on the list which I wrote and tested: > >> > >> https://patchwork.kernel.org/patch/10764975/ > > > > Will you get these merged ? Pushing everybody to use the writeback > > connector API without any test is mainline isn't nice, it almost makes > > me want to go back to V4L2. > > I wasn't trying to be pushy - I only shared my opinion that I didn't > think it was a good idea to introduce a second display writeback API, > when we already have one. You're entirely entitled to ignore my > opinion. I agree we should aim for a single API. My preference would have been for V4L2 universally, but now that we have writeback connectors upstream, the choice has been made, so we should stick to it. > The tests have been available since the very early versions of the > writeback series. I don't know what's blocking them from merging, I > haven't been tracking it very closely. > > If you'd be happy to provide your review and test on them, that may > help the process along? Now that I've sent an entirely untested patch series out, this is next on my list :-) > > igt test cases are nice to have, but what I need now is a tool to > > execise the API manually, similar to modetest, with command line > > parameters to configure the device, and the ability to capture frames to > > disk using writeback. How did you perform such tests when you developed > > writeback support ? > > I used a pre-existing internal tool which does exactly that. Any hope of sharing the sources ? > I appreciate that we don't have upstream tooling for writeback. As you > say, it's a young API (well, not by date, but certainly by usage). > > I also do appreciate you taking the time to consider it, identifying > issues which we did not, and for fixing them. The only way it stops > being a young API, with bugs and no tooling, is if people adopt it. If the developers who initially pushed the API upstream without an open-source test tool could spend a bit of time on this issue, I'm sure it would help too :-) > >> And there's support in drm_hwcomposer (though I must admit I haven't > >> personally run the drm_hwc code): > >> > >> https://gitlab.freedesktop.org/drm-hwcomposer/drm-hwcomposer/merge_requests/3 > > > > That won't help me much as I don't have an android port for the R-Car > > boards. > > > >> I'm afraid I haven't really touched any of the writeback code for a > >> couple of years - Liviu picked that up. He's on holiday until Monday, > >> but he should be able to help with the status of the igts. > >> > >> Hope that helps, > >> > >>>>> The writeback pixel format is restricted to RGB, due to the VSP1 > >>>>> outputting RGB to the display and lacking a separate colour space > >>>>> conversion unit for writeback. The resolution can be freely picked by > >>>>> will result in cropping or composing, not scaling. > >>>>> > >>>>> Writeback requests are queued to the hardware on page flip (atomic > >>>>> flush), and complete at the next vblank. This means that a queued > >>>>> writeback buffer will not be processed until the next page flip, but > >>>>> once it starts being written to by the VSP, it will complete at the next > >>>>> vblank regardless of whether another page flip occurs at that time. > >>>> > >>>> This sounds the same as mali-dp, and so fits directly with the > >>>> semantics of writeback connectors. > >>>> > >>>>> The code is based on a merge of the media master branch, the drm-next > >>>>> branch and the R-Car DT next branch. For convenience patches can be > >>>>> found at > >>>>> > >>>>> git://linuxtv.org/pinchartl/media.git v4l2/vsp1/writeback > >>>>> > >>>>> Kieran Bingham (2): > >>>>> Revert "[media] v4l: vsp1: Supply frames to the DU continuously" > >>>>> media: vsp1: Provide a writeback video device > >>>>> > >>>>> Laurent Pinchart (5): > >>>>> media: vsp1: wpf: Fix partition configuration for display pipelines > >>>>> media: vsp1: Replace leftover occurrence of fragment with body > >>>>> media: vsp1: Fix addresses of display-related registers for VSP-DL > >>>>> media: vsp1: Refactor vsp1_video_complete_buffer() for later reuse > >>>>> media: vsp1: Replace the display list internal flag with a flags field > >>>>> > >>>>> drivers/media/platform/vsp1/vsp1_dl.c | 118 ++++++++++++-- > >>>>> drivers/media/platform/vsp1/vsp1_dl.h | 6 +- > >>>>> drivers/media/platform/vsp1/vsp1_drm.c | 24 ++- > >>>>> drivers/media/platform/vsp1/vsp1_drv.c | 17 +- > >>>>> drivers/media/platform/vsp1/vsp1_pipe.c | 5 + > >>>>> drivers/media/platform/vsp1/vsp1_pipe.h | 6 + > >>>>> drivers/media/platform/vsp1/vsp1_regs.h | 6 +- > >>>>> drivers/media/platform/vsp1/vsp1_rwpf.h | 2 + > >>>>> drivers/media/platform/vsp1/vsp1_video.c | 198 +++++++++++++++++++---- > >>>>> drivers/media/platform/vsp1/vsp1_video.h | 6 + > >>>>> drivers/media/platform/vsp1/vsp1_wpf.c | 65 ++++++-- > >>>>> 11 files changed, 378 insertions(+), 75 deletions(-) -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v4 0/7] VSP1: Display writeback support Date: Thu, 21 Feb 2019 14:23:10 +0200 Message-ID: <20190221122310.GM3451@pendragon.ideasonboard.com> References: <20190217024852.23328-1-laurent.pinchart+renesas@ideasonboard.com> <20190218122257.o5blxfs7jo5xu7ge@DESKTOP-E1NTVVP.localdomain> <20190221082317.GB3451@pendragon.ideasonboard.com> <20190221095019.rht64aylk52jqe5r@DESKTOP-E1NTVVP.localdomain> <20190221100257.GD3451@pendragon.ideasonboard.com> <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1588089518 for ; Thu, 21 Feb 2019 12:23:17 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190221121913.l7e5zlitcfpvkupi@DESKTOP-E1NTVVP.localdomain> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Brian Starkey Cc: Laurent Pinchart , Liviu Dudau , Kieran Bingham , "dri-devel@lists.freedesktop.org" , nd , "linux-media@vger.kernel.org" List-Id: dri-devel@lists.freedesktop.org SGkgQnJpYW4sCgpPbiBUaHUsIEZlYiAyMSwgMjAxOSBhdCAxMjoxOToxM1BNICswMDAwLCBCcmlh biBTdGFya2V5IHdyb3RlOgo+IE9uIFRodSwgRmViIDIxLCAyMDE5IGF0IDEyOjAyOjU3UE0gKzAy MDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBPbiBUaHUsIEZlYiAyMSwgMjAxOSBhdCAw OTo1MDoxOUFNICswMDAwLCBCcmlhbiBTdGFya2V5IHdyb3RlOgo+ID4+IE9uIFRodSwgRmViIDIx LCAyMDE5IGF0IDEwOjIzOjE3QU0gKzAyMDAsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPj4+ IE9uIE1vbiwgRmViIDE4LCAyMDE5IGF0IDEyOjIyOjU4UE0gKzAwMDAsIEJyaWFuIFN0YXJrZXkg d3JvdGU6Cj4gPj4+PiBPbiBTdW4sIEZlYiAxNywgMjAxOSBhdCAwNDo0ODo0NUFNICswMjAwLCBM YXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4+Pj4+IEhlbGxvLAo+ID4+Pj4+IAo+ID4+Pj4+IFRo aXMgcGF0Y2ggc2VyaWVzIGltcGxlbWVudHMgZGlzcGxheSB3cml0ZWJhY2sgc3VwcG9ydCBmb3Ig dGhlIFItQ2FyCj4gPj4+Pj4gR2VuMyBwbGF0Zm9ybXMgaW4gdGhlIFZTUDEgZHJpdmVyLgo+ID4+ Pj4+IAo+ID4+Pj4+IERSTS9LTVMgcHJvdmlkZXMgYSB3cml0ZWJhY2sgQVBJIHRocm91Z2ggYSBz cGVjaWFsIHR5cGUgb2Ygd3JpdGViYWNrCj4gPj4+Pj4gY29ubmVjdG9ycy4gVGhpcyBzZXJpZXMg dGFrZXMgYSBkaWZmZXJlbnQgYXBwcm9hY2ggYnkgZXhwb3Npbmcgd3JpdGViYWNrCj4gPj4+Pj4g YXMgYSBWNEwyIGRldmljZS4gV2hpbGUgdGhlcmUgaXMgbm90aGluZyBmdW5kYW1lbnRhbGx5IHdy b25nIHdpdGgKPiA+Pj4+PiB3cml0ZWJhY2sgY29ubmVjdG9ycywgZGlzcGxheSBmb3IgUi1DYXIg R2VuMyBwbGF0Zm9ybXMgcmVsaWVzIG9uIHRoZQo+ID4+Pj4+IFZTUDEgZHJpdmVyIGJlaGluZCB0 aGUgc2NlbmUsIHdoaWNoIGFscmVhZHkgaW1wbGVtZW50cyBWNEwyIHN1cHBvcnQuCj4gPj4+Pj4g RW5hYmxpbmcgd3JpdGViYWNrIHRocm91Z2ggVjRMMiBpcyB0aHVzIHNpZ25pZmljYW50bHkgZWFz aWVyIGluIHRoaXMKPiA+Pj4+PiBjYXNlLgo+ID4+Pj4gCj4gPj4+PiBIb3cgZG9lcyB0aGlzIGxv b2sgdG8gYW4gYXBwbGljYXRpb24/IChJJ20gZW50aXJlbHkgaWdub3JhbnQgYWJvdXQKPiA+Pj4+ IFItQ2FyKS4gVGhleSBhcmUgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgRFJNIGRldmljZSwgYW5kIHRo ZW4gbmVlZCB0bwo+ID4+Pj4gb3BlbiBhbmQgY29uZmlndXJlIGEgdjRsMiBkZXZpY2UgdG8gZ2V0 IHRoZSB3cml0ZWJhY2s/IENhbiB0aGUgcHJvY2Vzcwo+ID4+Pj4gd2hpY2ggaXNuJ3QgY29udHJv bGxpbmcgdGhlIERSTSBkZXZpY2UgaW5kZXBlbmRlbnRseSBjYXB0dXJlIHRoZQo+ID4+Pj4gc2Ny ZWVuIG91dHB1dD8KPiA+Pj4+IAo+ID4+Pj4gSSBkaWRuJ3Qgc2VlIGFueSBtYWpvciBjb21wbGlj YXRpb24gdG8gaW1wbGVtZW50aW5nIHRoaXMgYXMgYQo+ID4+Pj4gd3JpdGViYWNrIGNvbm5lY3Rv ci4gSWYgeW91IHdhbnQvbmVlZCB0byB1c2UgdGhlIHZiMl9xdWV1ZSwgY291bGRuJ3QKPiA+Pj4+ IHlvdSBqdXN0IGRvIHRoYXQgZW50aXJlbHkgZnJvbSB3aXRoaW4gdGhlIGtlcm5lbD8KPiA+Pj4+ IAo+ID4+Pj4gSG9uZXN0bHkgKHByZWRpY3RhYmx5PyksIHRvIG1lIGl0IHNlZW1zIGxpa2UgYSBi YWQgaWRlYSB0byBpbnRyb2R1Y2UgYQo+ID4+Pj4gc2Vjb25kLCBub24tY29tcGF0aWJsZSBpbnRl cmZhY2UgZm9yIGRpc3BsYXkgd3JpdGViYWNrLiBBbnkKPiA+Pj4+IGFwcGxpY2F0aW9uIGludGVy ZXN0ZWQgaW4gZGlzcGxheSB3cml0ZWJhY2sgKGUuZy4gY29tcG9zaXRvcnMpIHdpbGwKPiA+Pj4+ IG5lZWQgdG8gaW1wbGVtZW50IGJvdGggaW4gb3JkZXIgdG8gc3VwcG9ydCBhbGwgSFcuIGRybV9o d2NvbXBvc2VyCj4gPj4+PiBhbHJlYWR5IHN1cHBvcnRzIHdyaXRlYmFjayB2aWEgRFJNIHdyaXRl YmFjayBjb25uZWN0b3JzLgo+ID4+Pj4gCj4gPj4+PiBXaGlsZSBJIGNhbiBzZWUgdGhlIGFkdmFu dGFnZXMgb2YgaGF2aW5nIHdyaXRlYmFjayBleHBvc2VkIHZpYSB2NGwyCj4gPj4+PiBmb3Igc3Ry ZWFtaW5nIHVzZS1jYXNlcywgSSB0aGluayBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBpdCBk b25lIGluCj4gPj4+PiBzdWNoIGEgd2F5IHRoYXQgaXQgd29ya3MgZm9yIGFsbCB3cml0ZWJhY2sg Y29ubmVjdG9ycywgcmF0aGVyIHRoYW4KPiA+Pj4+IGJlaW5nIFZTUDEtc3BlY2lmaWMuIFRoYXQg d291bGQgYWxsb3cgYW55IGFwcGxpY2F0aW9uIHRvIGNob29zZQo+ID4+Pj4gd2hpY2hldmVyIG1l dGhvZCBpcyBtb3N0IGFwcHJvcHJpYXRlIGZvciB0aGVpciB1c2UtY2FzZSwgd2l0aG91dAo+ID4+ Pj4gbGltaXRpbmcgdGhlbXNlbHZlcyB0byBhIHN1YnNldCBvZiBoYXJkd2FyZS4KPiA+Pj4gCj4g Pj4+IFNvIEkgZ2F2ZSB3cml0ZWJhY2sgY29ubmVjdG9ycyBhIGdvLCBhbmQgaXQgd2Fzbid0IHZl cnkgcHJldHR5Lgo+ID4+IAo+ID4+IFNvcnJ5IHlvdSBkaWRuJ3QgaGF2ZSBhIGdvb2QgdGltZSA6 LSgKPiA+IAo+ID4gTm8gd29ycmllcy4gVGhhdCB3YXMgdG8gYmUgZXhwZWN0ZWQgd2l0aCBzdWNo IHlvdW5nIGNvZGUgOi0pCj4gPiAKPiA+Pj4gVGhlcmUgd3JpdGViYWNrIHN1cHBvcnQgaW4gdGhl IERSTSBjb3JlIGxlYWtzIGpvYnMsCj4gPj4gCj4gPj4gSXMgdGhpcyB0aGUgY2xlYW51cCBvbiBj aGVjayBmYWlsLCBvciBzb21ldGhpbmcgZWxzZT8KPiA+IAo+ID4gWWVzLCB0aGF0J3MgdGhlIHBy b2JsZW0uIEkgaGF2ZSBwYXRjaGVzIGZvciBpdCB0aGF0IEkgd2lsbCBwb3N0IHNvb24uCj4gPiAK PiA+PiBPbmUgcG9zc2libGUgcGl0ZmFsbCBpcyB0aGF0IHlvdSBtdXN0IHNldCB0aGUgam9iIGlu IHRoZSBjb25uZWN0b3IKPiA+PiBzdGF0ZSB0byBOVUxMIGFmdGVyIHlvdSBjYWxsIGRybV93cml0 ZWJhY2tfcXVldWVfam9iKCkuIFRoZSBBUEkgdGhlcmUKPiA+PiBjb3VsZCBlYXNpbHkgYmUgY2hh bmdlZCB0byBwYXNzIGluIHRoZSBjb25uZWN0b3Jfc3RhdGUgYW5kIGNsZWFyIGl0IGluCj4gPj4g ZHJtX3dyaXRlYmFja19xdWV1ZV9qb2IoKSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gZHJpdmVycyB0 byBkbyBpdC4KPiA+IAo+ID4gSSBhbHNvIGhhdmUgYSBwYXRjaCBmb3IgdGhhdCA6LSkKPiA+IAo+ ID4+PiBhbmQgaXMgbWlzc2luZyBzdXBwb3J0IGZvcgo+ID4+PiB0aGUgZXF1aXZhbGVudCBvZiAu cHJlcGFyZV9mYigpLy5jbGVhbnVwX2ZiKCksIHdoaWNoIHJlcXVpcmVzIHBlci1qb2IKPiA+Pj4g ZHJpdmVyLXNwZWNpZmljIGRhdGEuIEknbSB3b3JraW5nIG9uIHRoZXNlIGlzc3VlcyBhbmQgd2ls bCBzdWJtaXQKPiA+Pj4gcGF0Y2hlcy4KPiA+PiAKPiA+PiBIbSwgeWVzIHRoYXQgZGlkbid0IG9j Y3VyIHRvIG1lOyB3ZSBkb24ndCBoYXZlIGEgcHJlcGFyZV9mYiBjYWxsYmFjay4KPiA+PiAKPiA+ Pj4gSW4gdGhlIG1lYW50aW1lLCBJIG5lZWQgdG8gdGVzdCBteSBpbXBsZW1lbnRhdGlvbiwgc28g SSBuZWVkIGEgY29tbWFuZAo+ID4+PiBsaW5lIGFwcGxpY2F0aW9uIHRoYXQgd2lsbCBsZXQgbWUg ZXhlcmNpc2UgdGhlIEFQSS4gSSBhc3N1bWUgeW91J3ZlCj4gPj4+IHRlc3RlZCB5b3VyIGNvZGUs IGhhdmVuJ3QgeW91ID8gOi0pIENvdWxkIHlvdSB0ZWxsIG1lIGhvdyBJIGNhbiB0ZXN0Cj4gPj4+ IHdyaXRlYmFjayA/Cj4gPj4gCj4gPj4gSW5kZWVkLCB0aGVyZSdzIGlndHMgb24gdGhlIGxpc3Qg d2hpY2ggSSB3cm90ZSBhbmQgdGVzdGVkOgo+ID4+IAo+ID4+IGh0dHBzOi8vcGF0Y2h3b3JrLmtl cm5lbC5vcmcvcGF0Y2gvMTA3NjQ5NzUvCj4gPiAKPiA+IFdpbGwgeW91IGdldCB0aGVzZSBtZXJn ZWQgPyBQdXNoaW5nIGV2ZXJ5Ym9keSB0byB1c2UgdGhlIHdyaXRlYmFjawo+ID4gY29ubmVjdG9y IEFQSSB3aXRob3V0IGFueSB0ZXN0IGlzIG1haW5saW5lIGlzbid0IG5pY2UsIGl0IGFsbW9zdCBt YWtlcwo+ID4gbWUgd2FudCB0byBnbyBiYWNrIHRvIFY0TDIuCj4gCj4gSSB3YXNuJ3QgdHJ5aW5n IHRvIGJlIHB1c2h5IC0gSSBvbmx5IHNoYXJlZCBteSBvcGluaW9uIHRoYXQgSSBkaWRuJ3QKPiB0 aGluayBpdCB3YXMgYSBnb29kIGlkZWEgdG8gaW50cm9kdWNlIGEgc2Vjb25kIGRpc3BsYXkgd3Jp dGViYWNrIEFQSSwKPiB3aGVuIHdlIGFscmVhZHkgaGF2ZSBvbmUuIFlvdSdyZSBlbnRpcmVseSBl bnRpdGxlZCB0byBpZ25vcmUgbXkKPiBvcGluaW9uLgoKSSBhZ3JlZSB3ZSBzaG91bGQgYWltIGZv ciBhIHNpbmdsZSBBUEkuIE15IHByZWZlcmVuY2Ugd291bGQgaGF2ZSBiZWVuCmZvciBWNEwyIHVu aXZlcnNhbGx5LCBidXQgbm93IHRoYXQgd2UgaGF2ZSB3cml0ZWJhY2sgY29ubmVjdG9ycwp1cHN0 cmVhbSwgdGhlIGNob2ljZSBoYXMgYmVlbiBtYWRlLCBzbyB3ZSBzaG91bGQgc3RpY2sgdG8gaXQu Cgo+IFRoZSB0ZXN0cyBoYXZlIGJlZW4gYXZhaWxhYmxlIHNpbmNlIHRoZSB2ZXJ5IGVhcmx5IHZl cnNpb25zIG9mIHRoZQo+IHdyaXRlYmFjayBzZXJpZXMuIEkgZG9uJ3Qga25vdyB3aGF0J3MgYmxv Y2tpbmcgdGhlbSBmcm9tIG1lcmdpbmcsIEkKPiBoYXZlbid0IGJlZW4gdHJhY2tpbmcgaXQgdmVy eSBjbG9zZWx5Lgo+IAo+IElmIHlvdSdkIGJlIGhhcHB5IHRvIHByb3ZpZGUgeW91ciByZXZpZXcg YW5kIHRlc3Qgb24gdGhlbSwgdGhhdCBtYXkKPiBoZWxwIHRoZSBwcm9jZXNzIGFsb25nPwoKTm93 IHRoYXQgSSd2ZSBzZW50IGFuIGVudGlyZWx5IHVudGVzdGVkIHBhdGNoIHNlcmllcyBvdXQsIHRo aXMgaXMgbmV4dApvbiBteSBsaXN0IDotKQoKPiA+IGlndCB0ZXN0IGNhc2VzIGFyZSBuaWNlIHRv IGhhdmUsIGJ1dCB3aGF0IEkgbmVlZCBub3cgaXMgYSB0b29sIHRvCj4gPiBleGVjaXNlIHRoZSBB UEkgbWFudWFsbHksIHNpbWlsYXIgdG8gbW9kZXRlc3QsIHdpdGggY29tbWFuZCBsaW5lCj4gPiBw YXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0aGUgZGV2aWNlLCBhbmQgdGhlIGFiaWxpdHkgdG8gY2Fw dHVyZSBmcmFtZXMgdG8KPiA+IGRpc2sgdXNpbmcgd3JpdGViYWNrLiBIb3cgZGlkIHlvdSBwZXJm b3JtIHN1Y2ggdGVzdHMgd2hlbiB5b3UgZGV2ZWxvcGVkCj4gPiB3cml0ZWJhY2sgc3VwcG9ydCA/ Cj4gCj4gSSB1c2VkIGEgcHJlLWV4aXN0aW5nIGludGVybmFsIHRvb2wgd2hpY2ggZG9lcyBleGFj dGx5IHRoYXQuCgpBbnkgaG9wZSBvZiBzaGFyaW5nIHRoZSBzb3VyY2VzID8KCj4gSSBhcHByZWNp YXRlIHRoYXQgd2UgZG9uJ3QgaGF2ZSB1cHN0cmVhbSB0b29saW5nIGZvciB3cml0ZWJhY2suIEFz IHlvdQo+IHNheSwgaXQncyBhIHlvdW5nIEFQSSAod2VsbCwgbm90IGJ5IGRhdGUsIGJ1dCBjZXJ0 YWlubHkgYnkgdXNhZ2UpLgo+IAo+IEkgYWxzbyBkbyBhcHByZWNpYXRlIHlvdSB0YWtpbmcgdGhl IHRpbWUgdG8gY29uc2lkZXIgaXQsIGlkZW50aWZ5aW5nCj4gaXNzdWVzIHdoaWNoIHdlIGRpZCBu b3QsIGFuZCBmb3IgZml4aW5nIHRoZW0uIFRoZSBvbmx5IHdheSBpdCBzdG9wcwo+IGJlaW5nIGEg eW91bmcgQVBJLCB3aXRoIGJ1Z3MgYW5kIG5vIHRvb2xpbmcsIGlzIGlmIHBlb3BsZSBhZG9wdCBp dC4KCklmIHRoZSBkZXZlbG9wZXJzIHdobyBpbml0aWFsbHkgcHVzaGVkIHRoZSBBUEkgdXBzdHJl YW0gd2l0aG91dCBhbgpvcGVuLXNvdXJjZSB0ZXN0IHRvb2wgY291bGQgc3BlbmQgYSBiaXQgb2Yg dGltZSBvbiB0aGlzIGlzc3VlLCBJJ20gc3VyZQppdCB3b3VsZCBoZWxwIHRvbyA6LSkKCj4gPj4g QW5kIHRoZXJlJ3Mgc3VwcG9ydCBpbiBkcm1faHdjb21wb3NlciAodGhvdWdoIEkgbXVzdCBhZG1p dCBJIGhhdmVuJ3QKPiA+PiBwZXJzb25hbGx5IHJ1biB0aGUgZHJtX2h3YyBjb2RlKToKPiA+PiAK PiA+PiBodHRwczovL2dpdGxhYi5mcmVlZGVza3RvcC5vcmcvZHJtLWh3Y29tcG9zZXIvZHJtLWh3 Y29tcG9zZXIvbWVyZ2VfcmVxdWVzdHMvMwo+ID4gCj4gPiBUaGF0IHdvbid0IGhlbHAgbWUgbXVj aCBhcyBJIGRvbid0IGhhdmUgYW4gYW5kcm9pZCBwb3J0IGZvciB0aGUgUi1DYXIKPiA+IGJvYXJk cy4KPiA+IAo+ID4+IEknbSBhZnJhaWQgSSBoYXZlbid0IHJlYWxseSB0b3VjaGVkIGFueSBvZiB0 aGUgd3JpdGViYWNrIGNvZGUgZm9yIGEKPiA+PiBjb3VwbGUgb2YgeWVhcnMgLSBMaXZpdSBwaWNr ZWQgdGhhdCB1cC4gSGUncyBvbiBob2xpZGF5IHVudGlsIE1vbmRheSwKPiA+PiBidXQgaGUgc2hv dWxkIGJlIGFibGUgdG8gaGVscCB3aXRoIHRoZSBzdGF0dXMgb2YgdGhlIGlndHMuCj4gPj4gCj4g Pj4gSG9wZSB0aGF0IGhlbHBzLAo+ID4+IAo+ID4+Pj4+IFRoZSB3cml0ZWJhY2sgcGl4ZWwgZm9y bWF0IGlzIHJlc3RyaWN0ZWQgdG8gUkdCLCBkdWUgdG8gdGhlIFZTUDEKPiA+Pj4+PiBvdXRwdXR0 aW5nIFJHQiB0byB0aGUgZGlzcGxheSBhbmQgbGFja2luZyBhIHNlcGFyYXRlIGNvbG91ciBzcGFj ZQo+ID4+Pj4+IGNvbnZlcnNpb24gdW5pdCBmb3Igd3JpdGViYWNrLiBUaGUgcmVzb2x1dGlvbiBj YW4gYmUgZnJlZWx5IHBpY2tlZCBieQo+ID4+Pj4+IHdpbGwgcmVzdWx0IGluIGNyb3BwaW5nIG9y IGNvbXBvc2luZywgbm90IHNjYWxpbmcuCj4gPj4+Pj4gCj4gPj4+Pj4gV3JpdGViYWNrIHJlcXVl c3RzIGFyZSBxdWV1ZWQgdG8gdGhlIGhhcmR3YXJlIG9uIHBhZ2UgZmxpcCAoYXRvbWljCj4gPj4+ Pj4gZmx1c2gpLCBhbmQgY29tcGxldGUgYXQgdGhlIG5leHQgdmJsYW5rLiBUaGlzIG1lYW5zIHRo YXQgYSBxdWV1ZWQKPiA+Pj4+PiB3cml0ZWJhY2sgYnVmZmVyIHdpbGwgbm90IGJlIHByb2Nlc3Nl ZCB1bnRpbCB0aGUgbmV4dCBwYWdlIGZsaXAsIGJ1dAo+ID4+Pj4+IG9uY2UgaXQgc3RhcnRzIGJl aW5nIHdyaXR0ZW4gdG8gYnkgdGhlIFZTUCwgaXQgd2lsbCBjb21wbGV0ZSBhdCB0aGUgbmV4dAo+ ID4+Pj4+IHZibGFuayByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW5vdGhlciBwYWdlIGZsaXAgb2Nj dXJzIGF0IHRoYXQgdGltZS4KPiA+Pj4+IAo+ID4+Pj4gVGhpcyBzb3VuZHMgdGhlIHNhbWUgYXMg bWFsaS1kcCwgYW5kIHNvIGZpdHMgZGlyZWN0bHkgd2l0aCB0aGUKPiA+Pj4+IHNlbWFudGljcyBv ZiB3cml0ZWJhY2sgY29ubmVjdG9ycy4KPiA+Pj4+IAo+ID4+Pj4+IFRoZSBjb2RlIGlzIGJhc2Vk IG9uIGEgbWVyZ2Ugb2YgdGhlIG1lZGlhIG1hc3RlciBicmFuY2gsIHRoZSBkcm0tbmV4dAo+ID4+ Pj4+IGJyYW5jaCBhbmQgdGhlIFItQ2FyIERUIG5leHQgYnJhbmNoLiBGb3IgY29udmVuaWVuY2Ug cGF0Y2hlcyBjYW4gYmUKPiA+Pj4+PiBmb3VuZCBhdAo+ID4+Pj4+IAo+ID4+Pj4+IAlnaXQ6Ly9s aW51eHR2Lm9yZy9waW5jaGFydGwvbWVkaWEuZ2l0IHY0bDIvdnNwMS93cml0ZWJhY2sKPiA+Pj4+ PiAKPiA+Pj4+PiBLaWVyYW4gQmluZ2hhbSAoMik6Cj4gPj4+Pj4gICBSZXZlcnQgIlttZWRpYV0g djRsOiB2c3AxOiBTdXBwbHkgZnJhbWVzIHRvIHRoZSBEVSBjb250aW51b3VzbHkiCj4gPj4+Pj4g ICBtZWRpYTogdnNwMTogUHJvdmlkZSBhIHdyaXRlYmFjayB2aWRlbyBkZXZpY2UKPiA+Pj4+PiAK PiA+Pj4+PiBMYXVyZW50IFBpbmNoYXJ0ICg1KToKPiA+Pj4+PiAgIG1lZGlhOiB2c3AxOiB3cGY6 IEZpeCBwYXJ0aXRpb24gY29uZmlndXJhdGlvbiBmb3IgZGlzcGxheSBwaXBlbGluZXMKPiA+Pj4+ PiAgIG1lZGlhOiB2c3AxOiBSZXBsYWNlIGxlZnRvdmVyIG9jY3VycmVuY2Ugb2YgZnJhZ21lbnQg d2l0aCBib2R5Cj4gPj4+Pj4gICBtZWRpYTogdnNwMTogRml4IGFkZHJlc3NlcyBvZiBkaXNwbGF5 LXJlbGF0ZWQgcmVnaXN0ZXJzIGZvciBWU1AtREwKPiA+Pj4+PiAgIG1lZGlhOiB2c3AxOiBSZWZh Y3RvciB2c3AxX3ZpZGVvX2NvbXBsZXRlX2J1ZmZlcigpIGZvciBsYXRlciByZXVzZQo+ID4+Pj4+ ICAgbWVkaWE6IHZzcDE6IFJlcGxhY2UgdGhlIGRpc3BsYXkgbGlzdCBpbnRlcm5hbCBmbGFnIHdp dGggYSBmbGFncyBmaWVsZAo+ID4+Pj4+IAo+ID4+Pj4+ICBkcml2ZXJzL21lZGlhL3BsYXRmb3Jt L3ZzcDEvdnNwMV9kbC5jICAgIHwgMTE4ICsrKysrKysrKysrKy0tCj4gPj4+Pj4gIGRyaXZlcnMv bWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2RsLmggICAgfCAgIDYgKy0KPiA+Pj4+PiAgZHJpdmVy cy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJtLmMgICB8ICAyNCArKy0KPiA+Pj4+PiAgZHJp dmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJ2LmMgICB8ICAxNyArLQo+ID4+Pj4+ICBk cml2ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9waXBlLmMgIHwgICA1ICsKPiA+Pj4+PiAg ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcGlwZS5oICB8ICAgNiArCj4gPj4+Pj4g IGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3JlZ3MuaCAgfCAgIDYgKy0KPiA+Pj4+ PiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfcndwZi5oICB8ICAgMiArCj4gPj4+ Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX3ZpZGVvLmMgfCAxOTggKysrKysr KysrKysrKysrKysrKy0tLS0KPiA+Pj4+PiAgZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3Zz cDFfdmlkZW8uaCB8ICAgNiArCj4gPj4+Pj4gIGRyaXZlcnMvbWVkaWEvcGxhdGZvcm0vdnNwMS92 c3AxX3dwZi5jICAgfCAgNjUgKysrKysrLS0KPiA+Pj4+PiAgMTEgZmlsZXMgY2hhbmdlZCwgMzc4 IGluc2VydGlvbnMoKyksIDc1IGRlbGV0aW9ucygtKQoKLS0gClJlZ2FyZHMsCgpMYXVyZW50IFBp bmNoYXJ0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==