From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Return-Path: From: Laurent Pinchart To: Jose Abreu Cc: Fabio Estevam , Laurent Pinchart , Ulrich Hecht , Russell King - ARM Linux , dri-devel@lists.freedesktop.org, Kieran Bingham , linux-renesas-soc@vger.kernel.org, Andy Yan , Vladimir Zapolskiy Subject: Re: [PATCH 13/22] drm: bridge: dw-hdmi: Replace device type with platform quirks Date: Mon, 05 Dec 2016 14:44:31 +0200 Message-ID: <3943396.h8sK50Smmc@avalon> In-Reply-To: References: <1480635817-1258-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1576280.tBdiYM6mm0@avalon> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" List-ID: Hi Jose, On Monday 05 Dec 2016 12:31:30 Jose Abreu wrote: > On 05-12-2016 11:32, Laurent Pinchart wrote: > > On Monday 05 Dec 2016 10:50:19 Jose Abreu wrote: > >> On 02-12-2016 15:43, Laurent Pinchart wrote: > >>> On Friday 02 Dec 2016 14:24:01 Russell King - ARM Linux wrote: > >>>> On Fri, Dec 02, 2016 at 01:43:28AM +0200, Laurent Pinchart wrote: > >>>>> From: Kieran Bingham > >>>>> > >>>>> The dw-hdmi driver declares a dev_type to distinguish platform > >>>>> specific changes. Replace this with a quirk field, so that the > >>>>> platform can specify the required quirks for the driver, rather than > >>>>> the driver becoming conditional on multiple platforms. > >>>>> > >>>>> As part of this, we rename the dw-hdmi 'spare' which is defined as the > >>>>> SVSRET bit in later documentation. > >>>> > >>>> I'd really prefer that we did not go down the broken route of adding > >>>> a set of "quirk" flags - look at what a mess SDHCI has become through > >>>> allowing that kind of practice. > >>>> > >>>> I'd much rather we find a saner structure to this - and we know that > >>>> the hardware has ID registers in it which can be used (so far) to > >>>> identify the buggy hardware. > >>> > >>> I'd much prefer something that would allow runtime identification of the > >>> device and the corresponding actions to be taken. However, the amount of > >>> documentation we have on the DWC HDMI TX IP core (and the associated > >>> PHY) is pretty limited, given that Synopsys doesn't make the > >>> documentation available publicly. Changes made to the IP core by > >>> integrators could complicate this further. I'm trying to gather as much > >>> information as possible to make clean the code up, for instance by > >>> trying to identify the PHYs used on the various platforms we support. > >>> Progress is slow on that front, there isn't enough leaked information > >>> available online :-) I haven't given up though, but I'll need more time. > >>> > >>> I don't like quirks much either. They are however already used today, > >>> even if we trigger them through dev_type instead of quirk flags. This > >>> patch came from a previous version found in a BSP that simply sprinkled > >>> several if (hdmi-> dev_type == RCAR_HDMI) through the code. For > >>> instance, > >>> > >>> - if (hdmi->dev_type == RK3288_HDMI) > >>> + if (hdmi->dev_type == RK3288_HDMI || hdmi->dev_type == RCAR_HDMI) > >>> dw_hdmi_phy_enable_spare(hdmi, 1); > >>> > >>> which I think is worse than flags as it would quickly degenerate to > >>> spaghetti code. > >>> > >>> For this specific case, we've managed to identify that on Renesas > >>> platforms the bit set by this function is called SVSRET. Its usage isn't > >>> clear yet, but I suspect it to control one of the PHY input control > >>> signals, like the other bits in the same register. I'm trying to get > >>> more information to clean the implementation further, hopefully with a > >>> way to determine whether the signal is used based on PHY identification. > >> > >> SVSRET is a low power mode consumption and is a PHY input signal > >> as you suggested. > > > > Thank you for the confirmation. Would you happen to know what SVSRET > > stands for ? > > Have no info about that. Sorry. > > >> Most of the configurable input signals of the PHY are available by the > >> controller regbank. I don't think it is possible to detect this at > >> runtime, I think you have at least to hardcode which version of the PHY > >> you are using. > >> > >> I would suggest that maybe all the PHY logic should be extracted and then > >> use callbacks to glue controller and phy. Then, depending on the PHY you > >> could use empty stubs if, for example, a given PHY did not support > >> SVSRET. Still, I don't know if this is the best option. What I do know is > >> that there are a large number of PHY's with different flavors that can > >> use the same controller. The controller has different versions also, and > >> each version can have quirks but I think it would be easier to manage > >> this driver if we had a clear distinction between PHY and controller. > > > > Agreed, I'd like to go in that direction. What makes it quite difficult is > > the lack of documentation about the PHYs :-) I've found six different PHY > > types that can be identified by the CONFIG2_ID register: > > > > Bits | Field | Description > > -------------------------------------------------------------------------- > > 7-0 | phytype | PHY interface > > | | 0x00: Legacy PHY (HDMI TX PHY) > > | | 0xb2: MHL PHY + HEAC PHY > > | | 0xc2: MHL PHY > > | | 0xe2: HDMI 3D TX PHY + HEAC PHY > > | | 0xf2: HDMI 3D TX PHY > > | | 0xf3: HDMI2 TX PHY > > > > I'm sure there's more than that. In particular I wonder how external > > vendor PHYs are identified. > > 0xFE. Thank you. That's the value reported by Allwinner platforms, which expose their PHY control registers through APB instead of the internal I2C bus. It all starts making sense :-) > > I'm also wondering whether there's a need to keep support for the legacy > > PHY signals (ENTMDS and PDZ in the PHY_CONF0 register). As far as I > > understand they're not used by the Gen2 PHYs (including the external > > vendor PHYs), but I can't confirm that without more documentation > > (although I could test that on the platforms I have access to). > > You are correct. Not available on Gen2 and on external phys. Thank you. > >>> This is all work in progress, and if anyone has access to any > >>> documentation and can provide additional information I'll be grateful. > >>> > >>>>> Signed-off-by: Kieran Bingham > >>>>> > >>>>> Signed-off-by: Laurent Pinchart > >>>>> > >>>>> --- > >>>>> > >>>>> drivers/gpu/drm/bridge/dw-hdmi.c | 14 ++++++-------- > >>>>> drivers/gpu/drm/bridge/dw-hdmi.h | 4 ++-- > >>>>> drivers/gpu/drm/imx/dw_hdmi-imx.c | 3 +-- > >>>>> drivers/gpu/drm/rockchip/dw_hdmi-rockchip.c | 2 +- > >>>>> include/drm/bridge/dw_hdmi.h | 12 +++++------- > >>>>> 5 files changed, 15 insertions(+), 20 deletions(-) -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 13/22] drm: bridge: dw-hdmi: Replace device type with platform quirks Date: Mon, 05 Dec 2016 14:44:31 +0200 Message-ID: <3943396.h8sK50Smmc@avalon> References: <1480635817-1258-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1576280.tBdiYM6mm0@avalon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [IPv6:2001:4b98:dc2:45:216:3eff:febb:480d]) by gabe.freedesktop.org (Postfix) with ESMTPS id E91D56E221 for ; Mon, 5 Dec 2016 12:44:11 +0000 (UTC) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jose Abreu Cc: Fabio Estevam , Laurent Pinchart , Russell King - ARM Linux , dri-devel@lists.freedesktop.org, Kieran Bingham , linux-renesas-soc@vger.kernel.org, Ulrich Hecht , Andy Yan , Vladimir Zapolskiy List-Id: dri-devel@lists.freedesktop.org SGkgSm9zZSwKCk9uIE1vbmRheSAwNSBEZWMgMjAxNiAxMjozMTozMCBKb3NlIEFicmV1IHdyb3Rl Ogo+IE9uIDA1LTEyLTIwMTYgMTE6MzIsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBPbiBN b25kYXkgMDUgRGVjIDIwMTYgMTA6NTA6MTkgSm9zZSBBYnJldSB3cm90ZToKPiA+PiBPbiAwMi0x Mi0yMDE2IDE1OjQzLCBMYXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4+PiBPbiBGcmlkYXkgMDIg RGVjIDIwMTYgMTQ6MjQ6MDEgUnVzc2VsbCBLaW5nIC0gQVJNIExpbnV4IHdyb3RlOgo+ID4+Pj4g T24gRnJpLCBEZWMgMDIsIDIwMTYgYXQgMDE6NDM6MjhBTSArMDIwMCwgTGF1cmVudCBQaW5jaGFy dCB3cm90ZToKPiA+Pj4+PiBGcm9tOiBLaWVyYW4gQmluZ2hhbSA8a2llcmFuLmJpbmdoYW0rcmVu ZXNhc0BpZGVhc29uYm9hcmQuY29tPgo+ID4+Pj4+IAo+ID4+Pj4+IFRoZSBkdy1oZG1pIGRyaXZl ciBkZWNsYXJlcyBhIGRldl90eXBlIHRvIGRpc3Rpbmd1aXNoIHBsYXRmb3JtCj4gPj4+Pj4gc3Bl Y2lmaWMgY2hhbmdlcy4gUmVwbGFjZSB0aGlzIHdpdGggYSBxdWlyayBmaWVsZCwgc28gdGhhdCB0 aGUKPiA+Pj4+PiBwbGF0Zm9ybSBjYW4gc3BlY2lmeSB0aGUgcmVxdWlyZWQgcXVpcmtzIGZvciB0 aGUgZHJpdmVyLCByYXRoZXIgdGhhbgo+ID4+Pj4+IHRoZSBkcml2ZXIgYmVjb21pbmcgY29uZGl0 aW9uYWwgb24gbXVsdGlwbGUgcGxhdGZvcm1zLgo+ID4+Pj4+IAo+ID4+Pj4+IEFzIHBhcnQgb2Yg dGhpcywgd2UgcmVuYW1lIHRoZSBkdy1oZG1pICdzcGFyZScgd2hpY2ggaXMgZGVmaW5lZCBhcyB0 aGUKPiA+Pj4+PiBTVlNSRVQgYml0IGluIGxhdGVyIGRvY3VtZW50YXRpb24uCj4gPj4+PiAKPiA+ Pj4+IEknZCByZWFsbHkgcHJlZmVyIHRoYXQgd2UgZGlkIG5vdCBnbyBkb3duIHRoZSBicm9rZW4g cm91dGUgb2YgYWRkaW5nCj4gPj4+PiBhIHNldCBvZiAicXVpcmsiIGZsYWdzIC0gbG9vayBhdCB3 aGF0IGEgbWVzcyBTREhDSSBoYXMgYmVjb21lIHRocm91Z2gKPiA+Pj4+IGFsbG93aW5nIHRoYXQg a2luZCBvZiBwcmFjdGljZS4KPiA+Pj4+IAo+ID4+Pj4gSSdkIG11Y2ggcmF0aGVyIHdlIGZpbmQg YSBzYW5lciBzdHJ1Y3R1cmUgdG8gdGhpcyAtIGFuZCB3ZSBrbm93IHRoYXQKPiA+Pj4+IHRoZSBo YXJkd2FyZSBoYXMgSUQgcmVnaXN0ZXJzIGluIGl0IHdoaWNoIGNhbiBiZSB1c2VkIChzbyBmYXIp IHRvCj4gPj4+PiBpZGVudGlmeSB0aGUgYnVnZ3kgaGFyZHdhcmUuCj4gPj4+IAo+ID4+PiBJJ2Qg bXVjaCBwcmVmZXIgc29tZXRoaW5nIHRoYXQgd291bGQgYWxsb3cgcnVudGltZSBpZGVudGlmaWNh dGlvbiBvZiB0aGUKPiA+Pj4gZGV2aWNlIGFuZCB0aGUgY29ycmVzcG9uZGluZyBhY3Rpb25zIHRv IGJlIHRha2VuLiBIb3dldmVyLCB0aGUgYW1vdW50IG9mCj4gPj4+IGRvY3VtZW50YXRpb24gd2Ug aGF2ZSBvbiB0aGUgRFdDIEhETUkgVFggSVAgY29yZSAoYW5kIHRoZSBhc3NvY2lhdGVkCj4gPj4+ IFBIWSkgaXMgcHJldHR5IGxpbWl0ZWQsIGdpdmVuIHRoYXQgU3lub3BzeXMgZG9lc24ndCBtYWtl IHRoZQo+ID4+PiBkb2N1bWVudGF0aW9uIGF2YWlsYWJsZSBwdWJsaWNseS4gQ2hhbmdlcyBtYWRl IHRvIHRoZSBJUCBjb3JlIGJ5Cj4gPj4+IGludGVncmF0b3JzIGNvdWxkIGNvbXBsaWNhdGUgdGhp cyBmdXJ0aGVyLiBJJ20gdHJ5aW5nIHRvIGdhdGhlciBhcyBtdWNoCj4gPj4+IGluZm9ybWF0aW9u IGFzIHBvc3NpYmxlIHRvIG1ha2UgY2xlYW4gdGhlIGNvZGUgdXAsIGZvciBpbnN0YW5jZSBieQo+ ID4+PiB0cnlpbmcgdG8gaWRlbnRpZnkgdGhlIFBIWXMgdXNlZCBvbiB0aGUgdmFyaW91cyBwbGF0 Zm9ybXMgd2Ugc3VwcG9ydC4KPiA+Pj4gUHJvZ3Jlc3MgaXMgc2xvdyBvbiB0aGF0IGZyb250LCB0 aGVyZSBpc24ndCBlbm91Z2ggbGVha2VkIGluZm9ybWF0aW9uCj4gPj4+IGF2YWlsYWJsZSBvbmxp bmUgOi0pIEkgaGF2ZW4ndCBnaXZlbiB1cCB0aG91Z2gsIGJ1dCBJJ2xsIG5lZWQgbW9yZSB0aW1l Lgo+ID4+PiAKPiA+Pj4gSSBkb24ndCBsaWtlIHF1aXJrcyBtdWNoIGVpdGhlci4gVGhleSBhcmUg aG93ZXZlciBhbHJlYWR5IHVzZWQgdG9kYXksCj4gPj4+IGV2ZW4gaWYgd2UgdHJpZ2dlciB0aGVt IHRocm91Z2ggZGV2X3R5cGUgaW5zdGVhZCBvZiBxdWlyayBmbGFncy4gVGhpcwo+ID4+PiBwYXRj aCBjYW1lIGZyb20gYSBwcmV2aW91cyB2ZXJzaW9uIGZvdW5kIGluIGEgQlNQIHRoYXQgc2ltcGx5 IHNwcmlua2xlZAo+ID4+PiBzZXZlcmFsIGlmIChoZG1pLT4gZGV2X3R5cGUgPT0gUkNBUl9IRE1J KSB0aHJvdWdoIHRoZSBjb2RlLiBGb3IKPiA+Pj4gaW5zdGFuY2UsCj4gPj4+IAo+ID4+PiAtCWlm IChoZG1pLT5kZXZfdHlwZSA9PSBSSzMyODhfSERNSSkKPiA+Pj4gKwlpZiAoaGRtaS0+ZGV2X3R5 cGUgPT0gUkszMjg4X0hETUkgfHwgaGRtaS0+ZGV2X3R5cGUgPT0gUkNBUl9IRE1JKQo+ID4+PiAJ CWR3X2hkbWlfcGh5X2VuYWJsZV9zcGFyZShoZG1pLCAxKTsKPiA+Pj4gCj4gPj4+IHdoaWNoIEkg dGhpbmsgaXMgd29yc2UgdGhhbiBmbGFncyBhcyBpdCB3b3VsZCBxdWlja2x5IGRlZ2VuZXJhdGUg dG8KPiA+Pj4gc3BhZ2hldHRpIGNvZGUuCj4gPj4+IAo+ID4+PiBGb3IgdGhpcyBzcGVjaWZpYyBj YXNlLCB3ZSd2ZSBtYW5hZ2VkIHRvIGlkZW50aWZ5IHRoYXQgb24gUmVuZXNhcwo+ID4+PiBwbGF0 Zm9ybXMgdGhlIGJpdCBzZXQgYnkgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgU1ZTUkVULiBJdHMg dXNhZ2UgaXNuJ3QKPiA+Pj4gY2xlYXIgeWV0LCBidXQgSSBzdXNwZWN0IGl0IHRvIGNvbnRyb2wg b25lIG9mIHRoZSBQSFkgaW5wdXQgY29udHJvbAo+ID4+PiBzaWduYWxzLCBsaWtlIHRoZSBvdGhl ciBiaXRzIGluIHRoZSBzYW1lIHJlZ2lzdGVyLiBJJ20gdHJ5aW5nIHRvIGdldAo+ID4+PiBtb3Jl IGluZm9ybWF0aW9uIHRvIGNsZWFuIHRoZSBpbXBsZW1lbnRhdGlvbiBmdXJ0aGVyLCBob3BlZnVs bHkgd2l0aCBhCj4gPj4+IHdheSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgc2lnbmFsIGlzIHVz ZWQgYmFzZWQgb24gUEhZIGlkZW50aWZpY2F0aW9uLgo+ID4+IAo+ID4+IFNWU1JFVCBpcyBhIGxv dyBwb3dlciBtb2RlIGNvbnN1bXB0aW9uIGFuZCBpcyBhIFBIWSBpbnB1dCBzaWduYWwKPiA+PiBh cyB5b3Ugc3VnZ2VzdGVkLgo+ID4gCj4gPiBUaGFuayB5b3UgZm9yIHRoZSBjb25maXJtYXRpb24u IFdvdWxkIHlvdSBoYXBwZW4gdG8ga25vdyB3aGF0IFNWU1JFVAo+ID4gc3RhbmRzIGZvciA/Cj4g Cj4gSGF2ZSBubyBpbmZvIGFib3V0IHRoYXQuIFNvcnJ5Lgo+IAo+ID4+IE1vc3Qgb2YgdGhlIGNv bmZpZ3VyYWJsZSBpbnB1dCBzaWduYWxzIG9mIHRoZSBQSFkgYXJlIGF2YWlsYWJsZSBieSB0aGUK PiA+PiBjb250cm9sbGVyIHJlZ2JhbmsuIEkgZG9uJ3QgdGhpbmsgaXQgaXMgcG9zc2libGUgdG8g ZGV0ZWN0IHRoaXMgYXQKPiA+PiBydW50aW1lLCBJIHRoaW5rIHlvdSBoYXZlIGF0IGxlYXN0IHRv IGhhcmRjb2RlIHdoaWNoIHZlcnNpb24gb2YgdGhlIFBIWQo+ID4+IHlvdSBhcmUgdXNpbmcuCj4g Pj4gCj4gPj4gSSB3b3VsZCBzdWdnZXN0IHRoYXQgbWF5YmUgYWxsIHRoZSBQSFkgbG9naWMgc2hv dWxkIGJlIGV4dHJhY3RlZCBhbmQgdGhlbgo+ID4+IHVzZSBjYWxsYmFja3MgdG8gZ2x1ZSBjb250 cm9sbGVyIGFuZCBwaHkuIFRoZW4sIGRlcGVuZGluZyBvbiB0aGUgUEhZIHlvdQo+ID4+IGNvdWxk IHVzZSBlbXB0eSBzdHVicyBpZiwgZm9yIGV4YW1wbGUsIGEgZ2l2ZW4gUEhZIGRpZCBub3Qgc3Vw cG9ydAo+ID4+IFNWU1JFVC4gU3RpbGwsIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIHRoZSBiZXN0 IG9wdGlvbi4gV2hhdCBJIGRvIGtub3cgaXMKPiA+PiB0aGF0IHRoZXJlIGFyZSBhIGxhcmdlIG51 bWJlciBvZiBQSFkncyB3aXRoIGRpZmZlcmVudCBmbGF2b3JzIHRoYXQgY2FuCj4gPj4gdXNlIHRo ZSBzYW1lIGNvbnRyb2xsZXIuIFRoZSBjb250cm9sbGVyIGhhcyBkaWZmZXJlbnQgdmVyc2lvbnMg YWxzbywgYW5kCj4gPj4gZWFjaCB2ZXJzaW9uIGNhbiBoYXZlIHF1aXJrcyBidXQgSSB0aGluayBp dCB3b3VsZCBiZSBlYXNpZXIgdG8gbWFuYWdlCj4gPj4gdGhpcyBkcml2ZXIgaWYgd2UgaGFkIGEg Y2xlYXIgZGlzdGluY3Rpb24gYmV0d2VlbiBQSFkgYW5kIGNvbnRyb2xsZXIuCj4gPiAKPiA+IEFn cmVlZCwgSSdkIGxpa2UgdG8gZ28gaW4gdGhhdCBkaXJlY3Rpb24uIFdoYXQgbWFrZXMgaXQgcXVp dGUgZGlmZmljdWx0IGlzCj4gPiB0aGUgbGFjayBvZiBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBQ SFlzIDotKSBJJ3ZlIGZvdW5kIHNpeCBkaWZmZXJlbnQgUEhZCj4gPiB0eXBlcyB0aGF0IGNhbiBi ZSBpZGVudGlmaWVkIGJ5IHRoZSBDT05GSUcyX0lEIHJlZ2lzdGVyOgo+ID4gCj4gPiBCaXRzICAg IHwgRmllbGQgICAgICAgICAJfCBEZXNjcmlwdGlvbgo+ID4gLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ IDctMCAgICAgfCBwaHl0eXBlICAgICAgIAl8IFBIWSBpbnRlcmZhY2UKPiA+ICAgICAgICAgfCAg ICAgICAgICAgICAgIAl8IDB4MDA6IExlZ2FjeSBQSFkgKEhETUkgVFggUEhZKQo+ID4gICAgICAg ICB8ICAgICAgICAgICAgICAgCXwgMHhiMjogTUhMIFBIWSArIEhFQUMgUEhZCj4gPiAgICAgICAg IHwgICAgICAgICAgICAgICAJfCAweGMyOiBNSEwgUEhZCj4gPiAgICAgICAgIHwgICAgICAgICAg ICAgICAJfCAweGUyOiBIRE1JIDNEIFRYIFBIWSArIEhFQUMgUEhZCj4gPiAgICAgICAgIHwgICAg ICAgICAgICAgICAJfCAweGYyOiBIRE1JIDNEIFRYIFBIWQo+ID4gICAgICAgICB8ICAgICAgICAg ICAgICAgCXwgMHhmMzogSERNSTIgVFggUEhZCj4gPiAKPiA+IEknbSBzdXJlIHRoZXJlJ3MgbW9y ZSB0aGFuIHRoYXQuIEluIHBhcnRpY3VsYXIgSSB3b25kZXIgaG93IGV4dGVybmFsCj4gPiB2ZW5k b3IgUEhZcyBhcmUgaWRlbnRpZmllZC4KPiAKPiAweEZFLgoKVGhhbmsgeW91LiBUaGF0J3MgdGhl IHZhbHVlIHJlcG9ydGVkIGJ5IEFsbHdpbm5lciBwbGF0Zm9ybXMsIHdoaWNoIGV4cG9zZSAKdGhl aXIgUEhZIGNvbnRyb2wgcmVnaXN0ZXJzIHRocm91Z2ggQVBCIGluc3RlYWQgb2YgdGhlIGludGVy bmFsIEkyQyBidXMuIEl0IAphbGwgc3RhcnRzIG1ha2luZyBzZW5zZSA6LSkKCj4gPiBJJ20gYWxz byB3b25kZXJpbmcgd2hldGhlciB0aGVyZSdzIGEgbmVlZCB0byBrZWVwIHN1cHBvcnQgZm9yIHRo ZSBsZWdhY3kKPiA+IFBIWSBzaWduYWxzIChFTlRNRFMgYW5kIFBEWiBpbiB0aGUgUEhZX0NPTkYw IHJlZ2lzdGVyKS4gQXMgZmFyIGFzIEkKPiA+IHVuZGVyc3RhbmQgdGhleSdyZSBub3QgdXNlZCBi eSB0aGUgR2VuMiBQSFlzIChpbmNsdWRpbmcgdGhlIGV4dGVybmFsCj4gPiB2ZW5kb3IgUEhZcyks IGJ1dCBJIGNhbid0IGNvbmZpcm0gdGhhdCB3aXRob3V0IG1vcmUgZG9jdW1lbnRhdGlvbgo+ID4g KGFsdGhvdWdoIEkgY291bGQgdGVzdCB0aGF0IG9uIHRoZSBwbGF0Zm9ybXMgSSBoYXZlIGFjY2Vz cyB0bykuCj4gCj4gWW91IGFyZSBjb3JyZWN0LiBOb3QgYXZhaWxhYmxlIG9uIEdlbjIgYW5kIG9u IGV4dGVybmFsIHBoeXMuCgpUaGFuayB5b3UuCgo+ID4+PiBUaGlzIGlzIGFsbCB3b3JrIGluIHBy b2dyZXNzLCBhbmQgaWYgYW55b25lIGhhcyBhY2Nlc3MgdG8gYW55Cj4gPj4+IGRvY3VtZW50YXRp b24gYW5kIGNhbiBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gSSdsbCBiZSBncmF0ZWZ1 bC4KPiA+Pj4gCj4gPj4+Pj4gU2lnbmVkLW9mZi1ieTogS2llcmFuIEJpbmdoYW0KPiA+Pj4+PiA8 a2llcmFuLmJpbmdoYW0rcmVuZXNhc0BpZGVhc29uYm9hcmQuY29tPgo+ID4+Pj4+IFNpZ25lZC1v ZmYtYnk6IExhdXJlbnQgUGluY2hhcnQKPiA+Pj4+PiA8bGF1cmVudC5waW5jaGFydCtyZW5lc2Fz QGlkZWFzb25ib2FyZC5jb20+Cj4gPj4+Pj4gLS0tCj4gPj4+Pj4gCj4gPj4+Pj4gIGRyaXZlcnMv Z3B1L2RybS9icmlkZ2UvZHctaGRtaS5jICAgICAgICAgICAgfCAxNCArKysrKystLS0tLS0tLQo+ ID4+Pj4+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3LWhkbWkuaCAgICAgICAgICAgIHwgIDQg KystLQo+ID4+Pj4+ICBkcml2ZXJzL2dwdS9kcm0vaW14L2R3X2hkbWktaW14LmMgICAgICAgICAg IHwgIDMgKy0tCj4gPj4+Pj4gIGRyaXZlcnMvZ3B1L2RybS9yb2NrY2hpcC9kd19oZG1pLXJvY2tj aGlwLmMgfCAgMiArLQo+ID4+Pj4+ICBpbmNsdWRlL2RybS9icmlkZ2UvZHdfaGRtaS5oICAgICAg ICAgICAgICAgIHwgMTIgKysrKystLS0tLS0tCj4gPj4+Pj4gIDUgZmlsZXMgY2hhbmdlZCwgMTUg aW5zZXJ0aW9ucygrKSwgMjAgZGVsZXRpb25zKC0pCgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGlu Y2hhcnQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=