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=-8.2 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 E7B2BC5DF60 for ; Tue, 5 Nov 2019 16:03:43 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (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 C07EE2190F for ; Tue, 5 Nov 2019 16:03:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="hfsRp11j"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="fWKglK2C" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org C07EE2190F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=armlinux.org.uk Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 89D7D1690; Tue, 5 Nov 2019 17:02:50 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 89D7D1690 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1572969820; bh=ftAerVbtTtffl+VhNYG+Sw26MAmN2mIXYuWp2/ukFLc=; h=Date:From:To:References:In-Reply-To:Cc:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=hfsRp11jHQSVmzlXzqR5woiBud6ppPW8fryLuFKNpXPT9fATwLYEtwCv+MJ+DJS8r Phgv012edXzixeePFGSbqz3FgmfkecNNackMCmVoIq9hOLglHkQmiB0eX236fLYPx4 hWggPGig3KQ7yI/cAJOYaPpyGDjR+APhBNAD5PzA= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id D367FF80446; Tue, 5 Nov 2019 17:02:49 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 75AE8F8049B; Tue, 5 Nov 2019 17:02:48 +0100 (CET) Received: from pandora.armlinux.org.uk (pandora.armlinux.org.uk [IPv6:2001:4d48:ad52:3201:214:fdff:fe10:1be6]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 00765F8015B for ; Tue, 5 Nov 2019 17:02:44 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 00765F8015B Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="fWKglK2C" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Sender:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=3A67beG499Qjnu8L2mluta/n+EQVRnQ+d0RfOYtLWSQ=; b=fWKglK2Cdl8Drdn2SBn1a4HLG mg+AK8OzXfftlF45ImFOPHxl81fMFRixPvUJvWX1DRI/XDdLb1rFMYNFd7yjz8LuCNNM01rl7GeGr sciB9RDPFuhQyEdTAVVpkeqrakWOo857paPha5QFDbfsQT/tWSFD0gMPVNzghC/3tedCR9MJKFek9 DLM+NbKXsuzR0dHDCRx+VpbIZYo0GsVC6iZ46QOybTFPyelIoRRXDX9Lp9hLpA2XuuJVo4zMxPNBW sNqF5kiAXbUh7TTgoYdJWLc/BbAuqauS6v5kwEFdfYUvd5M1g0SCdxGjyzV89ZRlHcj+zIGkbbq0q lpoYV3zgg==; Received: from shell.armlinux.org.uk ([2002:4e20:1eda:1:5054:ff:fe00:4ec]:59712) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1iS1Hj-0007L3-Gb; Tue, 05 Nov 2019 16:02:23 +0000 Received: from linux by shell.armlinux.org.uk with local (Exim 4.92) (envelope-from ) id 1iS1Hb-0003Bt-Et; Tue, 05 Nov 2019 16:02:15 +0000 Date: Tue, 5 Nov 2019 16:02:15 +0000 From: Russell King - ARM Linux admin To: Neil Armstrong Message-ID: <20191105160215.GQ25745@shell.armlinux.org.uk> References: <6ad19121-c0e3-d278-2943-ff93ef80353b@baylibre.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <6ad19121-c0e3-d278-2943-ff93ef80353b@baylibre.com> User-Agent: Mutt/1.10.1 (2018-07-13) Cc: Jernej Skrabec , Jonas Karlman , Takashi Iwai , alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, Andrzej Hajda , Laurent Pinchart , Philipp Zabel Subject: Re: [alsa-devel] Incorrect buffer handling in dw-hdmi bridge audio X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" On Tue, Nov 05, 2019 at 09:07:43AM +0100, Neil Armstrong wrote: > Hi, > > On 05/11/2019 08:55, Takashi Iwai wrote: > > Hi, > > > > while recently working on the ALSA memory allocator API cleanup, I > > noticed that dw-hdmi bridge driver seems doing weird about the buffer > > management. It pre-allocates the usual device buffers fully at the > > probe time, while each stream allocates the buffer via the vmalloc > > helpers and replaces with it at each open. > > > > I guess it's no expected behavior? It's basically a full waste of > > resources, and the vmalloc buffer isn't guaranteed to work well for > > mmap on every architecture. > > > > Below is the patch to address it. Can anyone check whether this still > > works? > > I don't have the setup to check, but this has been pushed by Russell I Added in CC. > > I also added the imx maintainer since it's (AFAIK) only used on iMX SoCs. > > Neil > > > > > Since I have a cleanup series and this is involved, I'd like to take > > the fix through my tree once after it's confirmed (and get ACK if > > possible). > > > > > > Thanks! > > > > Takashi > > > > -- 8< -- > > From: Takashi Iwai > > Subject: [PATCH] drm/bridge: dw-hdmi: Fix the incorrect buffer allocations > > > > The driver sets up the buffer preallocation with SNDRV_DMA_TYPE_DEV, > > while it re-allocates and releases vmalloc pages. This is not only a > > lot of waste resources but also causes the mmap malfunction. > > > > Change / drop the vmalloc-related code and use the standard buffer > > allocation / release code instead. I think getting rid of the vmalloc code here is a mistake - I seem to remember using the standard buffer allocation causes failures, due to memory fragmentation. Since the hardware is limited to DMA from at most one page, there is no reason for this driver to require contiguous pages, hence why it's using - and should use - vmalloc pages. vmalloc is way kinder to the MM subsystem than trying to request large order contiguous pages. So, NAK on this patch. > > > > Signed-off-by: Takashi Iwai > > --- > > drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c | 6 ++---- > > 1 file changed, 2 insertions(+), 4 deletions(-) > > > > diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c > > index 2b7539701b42..8fe7a6e8ff94 100644 > > --- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c > > +++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi-ahb-audio.c > > @@ -384,15 +384,14 @@ static int dw_hdmi_close(struct snd_pcm_substream *substream) > > > > static int dw_hdmi_hw_free(struct snd_pcm_substream *substream) > > { > > - return snd_pcm_lib_free_vmalloc_buffer(substream); > > + return snd_pcm_lib_free_pages(substream); > > } > > > > static int dw_hdmi_hw_params(struct snd_pcm_substream *substream, > > struct snd_pcm_hw_params *params) > > { > > /* Allocate the PCM runtime buffer, which is exposed to userspace. */ > > - return snd_pcm_lib_alloc_vmalloc_buffer(substream, > > - params_buffer_bytes(params)); > > + return snd_pcm_lib_malloc_pages(substream, params_buffer_bytes(params)); > > } > > > > static int dw_hdmi_prepare(struct snd_pcm_substream *substream) > > @@ -511,7 +510,6 @@ static const struct snd_pcm_ops snd_dw_hdmi_ops = { > > .prepare = dw_hdmi_prepare, > > .trigger = dw_hdmi_trigger, > > .pointer = dw_hdmi_pointer, > > - .page = snd_pcm_lib_get_vmalloc_page, > > }; > > > > static int snd_dw_hdmi_probe(struct platform_device *pdev) > > > > -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up According to speedtest.net: 11.9Mbps down 500kbps up _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org https://mailman.alsa-project.org/mailman/listinfo/alsa-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux admin Subject: Re: Incorrect buffer handling in dw-hdmi bridge audio Date: Tue, 5 Nov 2019 16:02:15 +0000 Message-ID: <20191105160215.GQ25745@shell.armlinux.org.uk> References: <6ad19121-c0e3-d278-2943-ff93ef80353b@baylibre.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from pandora.armlinux.org.uk (pandora.armlinux.org.uk [IPv6:2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by gabe.freedesktop.org (Postfix) with ESMTPS id 459D66EAD3 for ; Tue, 5 Nov 2019 16:02:41 +0000 (UTC) Content-Disposition: inline In-Reply-To: <6ad19121-c0e3-d278-2943-ff93ef80353b@baylibre.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Neil Armstrong Cc: Jernej Skrabec , Jonas Karlman , alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, Laurent Pinchart List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBOb3YgMDUsIDIwMTkgYXQgMDk6MDc6NDNBTSArMDEwMCwgTmVpbCBBcm1zdHJvbmcg d3JvdGU6Cj4gSGksCj4gCj4gT24gMDUvMTEvMjAxOSAwODo1NSwgVGFrYXNoaSBJd2FpIHdyb3Rl Ogo+ID4gSGksCj4gPiAKPiA+IHdoaWxlIHJlY2VudGx5IHdvcmtpbmcgb24gdGhlIEFMU0EgbWVt b3J5IGFsbG9jYXRvciBBUEkgY2xlYW51cCwgSQo+ID4gbm90aWNlZCB0aGF0IGR3LWhkbWkgYnJp ZGdlIGRyaXZlciBzZWVtcyBkb2luZyB3ZWlyZCBhYm91dCB0aGUgYnVmZmVyCj4gPiBtYW5hZ2Vt ZW50LiAgSXQgcHJlLWFsbG9jYXRlcyB0aGUgdXN1YWwgZGV2aWNlIGJ1ZmZlcnMgZnVsbHkgYXQg dGhlCj4gPiBwcm9iZSB0aW1lLCB3aGlsZSBlYWNoIHN0cmVhbSBhbGxvY2F0ZXMgdGhlIGJ1ZmZl ciB2aWEgdGhlIHZtYWxsb2MKPiA+IGhlbHBlcnMgYW5kIHJlcGxhY2VzIHdpdGggaXQgYXQgZWFj aCBvcGVuLgo+ID4gCj4gPiBJIGd1ZXNzIGl0J3Mgbm8gZXhwZWN0ZWQgYmVoYXZpb3I/ICBJdCdz IGJhc2ljYWxseSBhIGZ1bGwgd2FzdGUgb2YKPiA+IHJlc291cmNlcywgYW5kIHRoZSB2bWFsbG9j IGJ1ZmZlciBpc24ndCBndWFyYW50ZWVkIHRvIHdvcmsgd2VsbCBmb3IKPiA+IG1tYXAgb24gZXZl cnkgYXJjaGl0ZWN0dXJlLgo+ID4gCj4gPiBCZWxvdyBpcyB0aGUgcGF0Y2ggdG8gYWRkcmVzcyBp dC4gIENhbiBhbnlvbmUgY2hlY2sgd2hldGhlciB0aGlzIHN0aWxsCj4gPiB3b3Jrcz8KPiAKPiBJ IGRvbid0IGhhdmUgdGhlIHNldHVwIHRvIGNoZWNrLCBidXQgdGhpcyBoYXMgYmVlbiBwdXNoZWQg YnkgUnVzc2VsbCBJIEFkZGVkIGluIENDLgo+IAo+IEkgYWxzbyBhZGRlZCB0aGUgaW14IG1haW50 YWluZXIgc2luY2UgaXQncyAoQUZBSUspIG9ubHkgdXNlZCBvbiBpTVggU29Dcy4KPiAKPiBOZWls Cj4gCj4gPiAKPiA+IFNpbmNlIEkgaGF2ZSBhIGNsZWFudXAgc2VyaWVzIGFuZCB0aGlzIGlzIGlu dm9sdmVkLCBJJ2QgbGlrZSB0byB0YWtlCj4gPiB0aGUgZml4IHRocm91Z2ggbXkgdHJlZSBvbmNl IGFmdGVyIGl0J3MgY29uZmlybWVkIChhbmQgZ2V0IEFDSyBpZgo+ID4gcG9zc2libGUpLgo+ID4g Cj4gPiAKPiA+IFRoYW5rcyEKPiA+IAo+ID4gVGFrYXNoaQo+ID4gCj4gPiAtLSA4PCAtLQo+ID4g RnJvbTogVGFrYXNoaSBJd2FpIDx0aXdhaUBzdXNlLmRlPgo+ID4gU3ViamVjdDogW1BBVENIXSBk cm0vYnJpZGdlOiBkdy1oZG1pOiBGaXggdGhlIGluY29ycmVjdCBidWZmZXIgYWxsb2NhdGlvbnMK PiA+IAo+ID4gVGhlIGRyaXZlciBzZXRzIHVwIHRoZSBidWZmZXIgcHJlYWxsb2NhdGlvbiB3aXRo IFNORFJWX0RNQV9UWVBFX0RFViwKPiA+IHdoaWxlIGl0IHJlLWFsbG9jYXRlcyBhbmQgcmVsZWFz ZXMgdm1hbGxvYyBwYWdlcy4gIFRoaXMgaXMgbm90IG9ubHkgYQo+ID4gbG90IG9mIHdhc3RlIHJl c291cmNlcyBidXQgYWxzbyBjYXVzZXMgdGhlIG1tYXAgbWFsZnVuY3Rpb24uCj4gPiAKPiA+IENo YW5nZSAvIGRyb3AgdGhlIHZtYWxsb2MtcmVsYXRlZCBjb2RlIGFuZCB1c2UgdGhlIHN0YW5kYXJk IGJ1ZmZlcgo+ID4gYWxsb2NhdGlvbiAvIHJlbGVhc2UgY29kZSBpbnN0ZWFkLgoKSSB0aGluayBn ZXR0aW5nIHJpZCBvZiB0aGUgdm1hbGxvYyBjb2RlIGhlcmUgaXMgYSBtaXN0YWtlIC0gSSBzZWVt IHRvCnJlbWVtYmVyIHVzaW5nIHRoZSBzdGFuZGFyZCBidWZmZXIgYWxsb2NhdGlvbiBjYXVzZXMg ZmFpbHVyZXMsIGR1ZSB0bwptZW1vcnkgZnJhZ21lbnRhdGlvbi4gIFNpbmNlIHRoZSBoYXJkd2Fy ZSBpcyBsaW1pdGVkIHRvIERNQSBmcm9tIGF0Cm1vc3Qgb25lIHBhZ2UsIHRoZXJlIGlzIG5vIHJl YXNvbiBmb3IgdGhpcyBkcml2ZXIgdG8gcmVxdWlyZSBjb250aWd1b3VzCnBhZ2VzLCBoZW5jZSB3 aHkgaXQncyB1c2luZyAtIGFuZCBzaG91bGQgdXNlIC0gdm1hbGxvYyBwYWdlcy4gIHZtYWxsb2MK aXMgd2F5IGtpbmRlciB0byB0aGUgTU0gc3Vic3lzdGVtIHRoYW4gdHJ5aW5nIHRvIHJlcXVlc3Qg bGFyZ2Ugb3JkZXIKY29udGlndW91cyBwYWdlcy4KClNvLCBOQUsgb24gdGhpcyBwYXRjaC4KCj4g PiAKPiA+IFNpZ25lZC1vZmYtYnk6IFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KPiA+IC0t LQo+ID4gIGRyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3BzeXMvZHctaGRtaS1haGItYXVkaW8u YyB8IDYgKystLS0tCj4gPiAgMSBmaWxlIGNoYW5nZWQsIDIgaW5zZXJ0aW9ucygrKSwgNCBkZWxl dGlvbnMoLSkKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lu b3BzeXMvZHctaGRtaS1haGItYXVkaW8uYyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3Bz eXMvZHctaGRtaS1haGItYXVkaW8uYwo+ID4gaW5kZXggMmI3NTM5NzAxYjQyLi44ZmU3YTZlOGZm OTQgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3N5bm9wc3lzL2R3LWhk bWktYWhiLWF1ZGlvLmMKPiA+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc3lub3BzeXMv ZHctaGRtaS1haGItYXVkaW8uYwo+ID4gQEAgLTM4NCwxNSArMzg0LDE0IEBAIHN0YXRpYyBpbnQg ZHdfaGRtaV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKPiA+ICAK PiA+ICBzdGF0aWMgaW50IGR3X2hkbWlfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0g KnN1YnN0cmVhbSkKPiA+ICB7Cj4gPiAtCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3ZtYWxsb2Nf YnVmZmVyKHN1YnN0cmVhbSk7Cj4gPiArCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1 YnN0cmVhbSk7Cj4gPiAgfQo+ID4gIAo+ID4gIHN0YXRpYyBpbnQgZHdfaGRtaV9od19wYXJhbXMo c3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCj4gPiAgCXN0cnVjdCBzbmRfcGNt X2h3X3BhcmFtcyAqcGFyYW1zKQo+ID4gIHsKPiA+ICAJLyogQWxsb2NhdGUgdGhlIFBDTSBydW50 aW1lIGJ1ZmZlciwgd2hpY2ggaXMgZXhwb3NlZCB0byB1c2Vyc3BhY2UuICovCj4gPiAtCXJldHVy biBzbmRfcGNtX2xpYl9hbGxvY192bWFsbG9jX2J1ZmZlcihzdWJzdHJlYW0sCj4gPiAtCQkJCQkJ cGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKPiA+ICsJcmV0dXJuIHNuZF9wY21fbGliX21h bGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7Cj4gPiAg fQo+ID4gIAo+ID4gIHN0YXRpYyBpbnQgZHdfaGRtaV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1 YnN0cmVhbSAqc3Vic3RyZWFtKQo+ID4gQEAgLTUxMSw3ICs1MTAsNiBAQCBzdGF0aWMgY29uc3Qg c3RydWN0IHNuZF9wY21fb3BzIHNuZF9kd19oZG1pX29wcyA9IHsKPiA+ICAJLnByZXBhcmUgPSBk d19oZG1pX3ByZXBhcmUsCj4gPiAgCS50cmlnZ2VyID0gZHdfaGRtaV90cmlnZ2VyLAo+ID4gIAku cG9pbnRlciA9IGR3X2hkbWlfcG9pbnRlciwKPiA+IC0JLnBhZ2UgPSBzbmRfcGNtX2xpYl9nZXRf dm1hbGxvY19wYWdlLAo+ID4gIH07Cj4gPiAgCj4gPiAgc3RhdGljIGludCBzbmRfZHdfaGRtaV9w cm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ID4gCj4gCj4gCgotLSAKUk1LJ3Mg UGF0Y2ggc3lzdGVtOiBodHRwczovL3d3dy5hcm1saW51eC5vcmcudWsvZGV2ZWxvcGVyL3BhdGNo ZXMvCkZUVEMgYnJvYWRiYW5kIGZvciAwLjhtaWxlIGxpbmUgaW4gc3VidXJiaWE6IHN5bmMgYXQg MTIuMU1icHMgZG93biA2MjJrYnBzIHVwCkFjY29yZGluZyB0byBzcGVlZHRlc3QubmV0OiAxMS45 TWJwcyBkb3duIDUwMGticHMgdXAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRl c2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8v ZHJpLWRldmVs