From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 816A312E46 for ; Fri, 10 Nov 2023 09:47:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="D2bXB3Bb" Received: from madras.collabora.co.uk (madras.collabora.co.uk [46.235.227.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AA3CC250AD for ; Fri, 10 Nov 2023 01:47:55 -0800 (PST) Received: from localhost (cola.collaboradmins.com [195.201.22.229]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: bbrezillon) by madras.collabora.co.uk (Postfix) with ESMTPSA id C56ED66073EF; Fri, 10 Nov 2023 09:47:53 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1699609674; bh=9v8ERUxib776BgthWEgOR4Rdi9JK7Ze5AX6GgNkbrYg=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=D2bXB3Bb5ngfck8o5JTnqvd17k4yJ705vylfd/zS0SmSwWw0gWBa9zii735rViqRm qK1Pr5GYMaRwU9YfpY8PxpYc4TydbhuOjM8a5uQlHiRpNFkvFtV6cVmjvgypK7jliP gbuFgCIOydCoDZO5zYxGimPkiirg0rkBLBZws6A6FemImZL/FokU0YpW9yi2u5+AwX z+HLp42pw/vAGP8e2pefMntlIWjeGaXEsgTl9R05aTifDpKLvY/LJJUbY2etEy5rny hsKG8DHh+kLCKSnymsDkk1TVBKxHmQAsPOIlTk7GAC+zHPghfcm/nTbSEUoOrIgp10 EdkjRBNzNX/tA== Date: Fri, 10 Nov 2023 10:47:50 +0100 From: Boris Brezillon To: Gaurav Kohli Cc: Rob Clark , Steven Price , Joerg Roedel , , Will Deacon , Robin Murphy , , Subject: Re: [PATCH 0/2] iommu: Allow passing custom allocators to pgtable drivers Message-ID: <20231110104750.198b6967@collabora.com> In-Reply-To: <84277a5c-a33f-a412-6dec-2ab786b1a47d@quicinc.com> References: <20230809121744.2341454-1-boris.brezillon@collabora.com> <84277a5c-a33f-a412-6dec-2ab786b1a47d@quicinc.com> Organization: Collabora X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-redhat-linux-gnu) Precedence: bulk X-Mailing-List: linux-arm-msm@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Hi Gaurav, On Tue, 7 Nov 2023 17:22:39 +0530 Gaurav Kohli wrote: > On 10/24/2023 2:32 AM, Rob Clark wrote: > > On Wed, Sep 20, 2023 at 6:12=E2=80=AFAM Steven Price wrote: =20 > >> > >> On 09/08/2023 13:17, Boris Brezillon wrote: =20 > >>> Hello, > >>> > >>> This patchset is an attempt at making page table allocation > >>> customizable. This is useful to some GPU drivers for various reasons: > >>> > >>> - speed-up upcoming page table allocations by managing a pool of free > >>> pages > >>> - batch page table allocation instead of allocating one page at a time > >>> - pre-reserve pages for page tables needed for map/unmap operations a= nd > >>> return the unused page tables to some pool > >>> > >>> The first and last reasons are particularly important for GPU drivers > >>> wanting to implement asynchronous VM_BIND. Asynchronous VM_BIND requi= res > >>> that any page table needed for a map/unmap operation to succeed be > >>> allocated at VM_BIND job creation time. At the time of the job creati= on, > >>> we don't know what the VM will look like when we get to execute the > >>> map/unmap, and can't guess how many page tables we will need. Because > >>> of that, we have to over-provision page tables for the worst case > >>> scenario (page table tree is empty), which means we will allocate/free > >>> a lot. Having pool a pool of free pages is crucial if we want to > >>> speed-up VM_BIND requests. > >>> > >>> A real example of how such custom allocators can be used is available > >>> here[1]. v2 of the Panthor driver is approaching submission, and I > >>> figured I'd try to upstream the dependencies separately, which is > >>> why I submit this series now, even though the user of this new API > >>> will come afterwards. If you'd prefer to have those patches submitted > >>> along with the Panthor driver, let me know. > >>> > >>> This approach has been discussed with Robin, and is hopefully not too > >>> far from what he had in mind. =20 > >> > >> The alternative would be to embed a cache of pages into the IOMMU > >> framework, however kmem_cache sadly doesn't seem to support the > >> 'reserve' of pages concept that we need. mempools could be a solution > >> but the mempool would need to be created by the IOMMU framework as the > >> alloc/free functions are specified when creating the pool. So it would > >> be a much bigger change (to drivers/iommu). > >> > >> So, given that so far it's just Panthor this seems like the right > >> approach for now - when/if other drivers want the same functionality > >> then it might make sense to revisit the idea of doing the caching with= in > >> the IOMMU framework. =20 > >=20 > > I have some plans to use this as well for drm/msm.. but the reasons > > and requirements are basically the same as for panthor. I think I > > prefer the custom allocator approach, rather than tying this to IOMMU > > framework. (But ofc custom allocators, I guess, does not prevent the > > iommu driver from doing it's own caching.) > >=20 > > BR, > > -R > > =20 >=20 > We have also posted one RFC patch series which is based on this current=20 > patches by Boris and helping us to define our custom alloc and free=20 > pgtable call. For our side usecase we have a requirement to create=20 > pgtable from HLOS and then share it to different entity(VMID) and=20 > basically that also requires few smc calls and for that we need > custom alloc/free callbacks. >=20 > https://lore.kernel.org/all/20231101071144.16309-1-quic_gkohli@quicinc.co= m/ >=20 >=20 > So custom allocator and free ops is helping for us also. Is there any=20 > plan to merge these patches from Boris. Sorry for the late reply. I just sent a v2, but I forgot to add your Tested-by :-/. Feel free to add it back. Regards, Boris 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id D92DBC4332F for ; Fri, 10 Nov 2023 09:48:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XQxQ52I+XC3Ucvpl5a0Xd0edhxDyiO/TBLHgW/XoLF4=; b=db/tLdisXVBE+B ssO5w1e0/V+dNuepzqQGswvXjoJd8pEsVvkVyT4uPOasvsN6Iqs59gelR/SAvQmNuQprPCX+xfZQ4 WyfMowThCeD6Cp/YPC6/Zq3x7T7lwxd2eamQ3wIkhurAVMSy01JgOAxzQNymRJ6E3eyfh7FIC6bnQ GrGxN0KEtBCXW27tGYApp/bjndy3zUhRrTDNoKcK9mOCHzExSxspSrgJPEblnlmA/gFQ8p7GnLXnZ PTdfLTRXouUNRsJBftKWhLs1oWEA6/2suayUy17tQuN6wgnNECVIy1vSizcDdI5E03gUL0WOhMcX8 n388DA52nYK6fQBSTLUw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r1O7K-008EPm-1O; Fri, 10 Nov 2023 09:47:58 +0000 Received: from madras.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e5ab]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r1O7H-008EOl-2K for linux-arm-kernel@lists.infradead.org; Fri, 10 Nov 2023 09:47:57 +0000 Received: from localhost (cola.collaboradmins.com [195.201.22.229]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: bbrezillon) by madras.collabora.co.uk (Postfix) with ESMTPSA id C56ED66073EF; Fri, 10 Nov 2023 09:47:53 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1699609674; bh=9v8ERUxib776BgthWEgOR4Rdi9JK7Ze5AX6GgNkbrYg=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=D2bXB3Bb5ngfck8o5JTnqvd17k4yJ705vylfd/zS0SmSwWw0gWBa9zii735rViqRm qK1Pr5GYMaRwU9YfpY8PxpYc4TydbhuOjM8a5uQlHiRpNFkvFtV6cVmjvgypK7jliP gbuFgCIOydCoDZO5zYxGimPkiirg0rkBLBZws6A6FemImZL/FokU0YpW9yi2u5+AwX z+HLp42pw/vAGP8e2pefMntlIWjeGaXEsgTl9R05aTifDpKLvY/LJJUbY2etEy5rny hsKG8DHh+kLCKSnymsDkk1TVBKxHmQAsPOIlTk7GAC+zHPghfcm/nTbSEUoOrIgp10 EdkjRBNzNX/tA== Date: Fri, 10 Nov 2023 10:47:50 +0100 From: Boris Brezillon To: Gaurav Kohli Cc: Rob Clark , Steven Price , Joerg Roedel , , Will Deacon , Robin Murphy , , Subject: Re: [PATCH 0/2] iommu: Allow passing custom allocators to pgtable drivers Message-ID: <20231110104750.198b6967@collabora.com> In-Reply-To: <84277a5c-a33f-a412-6dec-2ab786b1a47d@quicinc.com> References: <20230809121744.2341454-1-boris.brezillon@collabora.com> <84277a5c-a33f-a412-6dec-2ab786b1a47d@quicinc.com> Organization: Collabora X-Mailer: Claws Mail 4.1.1 (GTK 3.24.38; x86_64-redhat-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231110_014756_018129_CB37E2D3 X-CRM114-Status: GOOD ( 38.02 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgR2F1cmF2LAoKT24gVHVlLCA3IE5vdiAyMDIzIDE3OjIyOjM5ICswNTMwCkdhdXJhdiBLb2hs aSA8cXVpY19na29obGlAcXVpY2luYy5jb20+IHdyb3RlOgoKPiBPbiAxMC8yNC8yMDIzIDI6MzIg QU0sIFJvYiBDbGFyayB3cm90ZToKPiA+IE9uIFdlZCwgU2VwIDIwLCAyMDIzIGF0IDY6MTLigK9B TSBTdGV2ZW4gUHJpY2UgPHN0ZXZlbi5wcmljZUBhcm0uY29tPiB3cm90ZTogIAo+ID4+Cj4gPj4g T24gMDkvMDgvMjAyMyAxMzoxNywgQm9yaXMgQnJlemlsbG9uIHdyb3RlOiAgCj4gPj4+IEhlbGxv LAo+ID4+Pgo+ID4+PiBUaGlzIHBhdGNoc2V0IGlzIGFuIGF0dGVtcHQgYXQgbWFraW5nIHBhZ2Ug dGFibGUgYWxsb2NhdGlvbgo+ID4+PiBjdXN0b21pemFibGUuIFRoaXMgaXMgdXNlZnVsIHRvIHNv bWUgR1BVIGRyaXZlcnMgZm9yIHZhcmlvdXMgcmVhc29uczoKPiA+Pj4KPiA+Pj4gLSBzcGVlZC11 cCB1cGNvbWluZyBwYWdlIHRhYmxlIGFsbG9jYXRpb25zIGJ5IG1hbmFnaW5nIGEgcG9vbCBvZiBm cmVlCj4gPj4+ICAgIHBhZ2VzCj4gPj4+IC0gYmF0Y2ggcGFnZSB0YWJsZSBhbGxvY2F0aW9uIGlu c3RlYWQgb2YgYWxsb2NhdGluZyBvbmUgcGFnZSBhdCBhIHRpbWUKPiA+Pj4gLSBwcmUtcmVzZXJ2 ZSBwYWdlcyBmb3IgcGFnZSB0YWJsZXMgbmVlZGVkIGZvciBtYXAvdW5tYXAgb3BlcmF0aW9ucyBh bmQKPiA+Pj4gICAgcmV0dXJuIHRoZSB1bnVzZWQgcGFnZSB0YWJsZXMgdG8gc29tZSBwb29sCj4g Pj4+Cj4gPj4+IFRoZSBmaXJzdCBhbmQgbGFzdCByZWFzb25zIGFyZSBwYXJ0aWN1bGFybHkgaW1w b3J0YW50IGZvciBHUFUgZHJpdmVycwo+ID4+PiB3YW50aW5nIHRvIGltcGxlbWVudCBhc3luY2hy b25vdXMgVk1fQklORC4gQXN5bmNocm9ub3VzIFZNX0JJTkQgcmVxdWlyZXMKPiA+Pj4gdGhhdCBh bnkgcGFnZSB0YWJsZSBuZWVkZWQgZm9yIGEgbWFwL3VubWFwIG9wZXJhdGlvbiB0byBzdWNjZWVk IGJlCj4gPj4+IGFsbG9jYXRlZCBhdCBWTV9CSU5EIGpvYiBjcmVhdGlvbiB0aW1lLiBBdCB0aGUg dGltZSBvZiB0aGUgam9iIGNyZWF0aW9uLAo+ID4+PiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIFZN IHdpbGwgbG9vayBsaWtlIHdoZW4gd2UgZ2V0IHRvIGV4ZWN1dGUgdGhlCj4gPj4+IG1hcC91bm1h cCwgYW5kIGNhbid0IGd1ZXNzIGhvdyBtYW55IHBhZ2UgdGFibGVzIHdlIHdpbGwgbmVlZC4gQmVj YXVzZQo+ID4+PiBvZiB0aGF0LCB3ZSBoYXZlIHRvIG92ZXItcHJvdmlzaW9uIHBhZ2UgdGFibGVz IGZvciB0aGUgd29yc3QgY2FzZQo+ID4+PiBzY2VuYXJpbyAocGFnZSB0YWJsZSB0cmVlIGlzIGVt cHR5KSwgd2hpY2ggbWVhbnMgd2Ugd2lsbCBhbGxvY2F0ZS9mcmVlCj4gPj4+IGEgbG90LiBIYXZp bmcgcG9vbCBhIHBvb2wgb2YgZnJlZSBwYWdlcyBpcyBjcnVjaWFsIGlmIHdlIHdhbnQgdG8KPiA+ Pj4gc3BlZWQtdXAgVk1fQklORCByZXF1ZXN0cy4KPiA+Pj4KPiA+Pj4gQSByZWFsIGV4YW1wbGUg b2YgaG93IHN1Y2ggY3VzdG9tIGFsbG9jYXRvcnMgY2FuIGJlIHVzZWQgaXMgYXZhaWxhYmxlCj4g Pj4+IGhlcmVbMV0uIHYyIG9mIHRoZSBQYW50aG9yIGRyaXZlciBpcyBhcHByb2FjaGluZyBzdWJt aXNzaW9uLCBhbmQgSQo+ID4+PiBmaWd1cmVkIEknZCB0cnkgdG8gdXBzdHJlYW0gdGhlIGRlcGVu ZGVuY2llcyBzZXBhcmF0ZWx5LCB3aGljaCBpcwo+ID4+PiB3aHkgSSBzdWJtaXQgdGhpcyBzZXJp ZXMgbm93LCBldmVuIHRob3VnaCB0aGUgdXNlciBvZiB0aGlzIG5ldyBBUEkKPiA+Pj4gd2lsbCBj b21lIGFmdGVyd2FyZHMuIElmIHlvdSdkIHByZWZlciB0byBoYXZlIHRob3NlIHBhdGNoZXMgc3Vi bWl0dGVkCj4gPj4+IGFsb25nIHdpdGggdGhlIFBhbnRob3IgZHJpdmVyLCBsZXQgbWUga25vdy4K PiA+Pj4KPiA+Pj4gVGhpcyBhcHByb2FjaCBoYXMgYmVlbiBkaXNjdXNzZWQgd2l0aCBSb2Jpbiwg YW5kIGlzIGhvcGVmdWxseSBub3QgdG9vCj4gPj4+IGZhciBmcm9tIHdoYXQgaGUgaGFkIGluIG1p bmQuICAKPiA+Pgo+ID4+IFRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBlbWJlZCBhIGNhY2hl IG9mIHBhZ2VzIGludG8gdGhlIElPTU1VCj4gPj4gZnJhbWV3b3JrLCBob3dldmVyIGttZW1fY2Fj aGUgc2FkbHkgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgdGhlCj4gPj4gJ3Jlc2VydmUnIG9mIHBh Z2VzIGNvbmNlcHQgdGhhdCB3ZSBuZWVkLiBtZW1wb29scyBjb3VsZCBiZSBhIHNvbHV0aW9uCj4g Pj4gYnV0IHRoZSBtZW1wb29sIHdvdWxkIG5lZWQgdG8gYmUgY3JlYXRlZCBieSB0aGUgSU9NTVUg ZnJhbWV3b3JrIGFzIHRoZQo+ID4+IGFsbG9jL2ZyZWUgZnVuY3Rpb25zIGFyZSBzcGVjaWZpZWQg d2hlbiBjcmVhdGluZyB0aGUgcG9vbC4gU28gaXQgd291bGQKPiA+PiBiZSBhIG11Y2ggYmlnZ2Vy IGNoYW5nZSAodG8gZHJpdmVycy9pb21tdSkuCj4gPj4KPiA+PiBTbywgZ2l2ZW4gdGhhdCBzbyBm YXIgaXQncyBqdXN0IFBhbnRob3IgdGhpcyBzZWVtcyBsaWtlIHRoZSByaWdodAo+ID4+IGFwcHJv YWNoIGZvciBub3cgLSB3aGVuL2lmIG90aGVyIGRyaXZlcnMgd2FudCB0aGUgc2FtZSBmdW5jdGlv bmFsaXR5Cj4gPj4gdGhlbiBpdCBtaWdodCBtYWtlIHNlbnNlIHRvIHJldmlzaXQgdGhlIGlkZWEg b2YgZG9pbmcgdGhlIGNhY2hpbmcgd2l0aGluCj4gPj4gdGhlIElPTU1VIGZyYW1ld29yay4gIAo+ ID4gCj4gPiBJIGhhdmUgc29tZSBwbGFucyB0byB1c2UgdGhpcyBhcyB3ZWxsIGZvciBkcm0vbXNt Li4gYnV0IHRoZSByZWFzb25zCj4gPiBhbmQgcmVxdWlyZW1lbnRzIGFyZSBiYXNpY2FsbHkgdGhl IHNhbWUgYXMgZm9yIHBhbnRob3IuICBJIHRoaW5rIEkKPiA+IHByZWZlciB0aGUgY3VzdG9tIGFs bG9jYXRvciBhcHByb2FjaCwgcmF0aGVyIHRoYW4gdHlpbmcgdGhpcyB0byBJT01NVQo+ID4gZnJh bWV3b3JrLiAgKEJ1dCBvZmMgY3VzdG9tIGFsbG9jYXRvcnMsIEkgZ3Vlc3MsIGRvZXMgbm90IHBy ZXZlbnQgdGhlCj4gPiBpb21tdSBkcml2ZXIgZnJvbSBkb2luZyBpdCdzIG93biBjYWNoaW5nLikK PiA+IAo+ID4gQlIsCj4gPiAtUgo+ID4gICAKPiAKPiBXZSBoYXZlIGFsc28gcG9zdGVkIG9uZSBS RkMgcGF0Y2ggc2VyaWVzIHdoaWNoIGlzIGJhc2VkIG9uIHRoaXMgY3VycmVudCAKPiBwYXRjaGVz IGJ5IEJvcmlzIGFuZCBoZWxwaW5nIHVzIHRvIGRlZmluZSBvdXIgY3VzdG9tIGFsbG9jIGFuZCBm cmVlIAo+IHBndGFibGUgY2FsbC4gRm9yIG91ciBzaWRlIHVzZWNhc2Ugd2UgaGF2ZSBhIHJlcXVp cmVtZW50IHRvIGNyZWF0ZSAKPiBwZ3RhYmxlIGZyb20gSExPUyBhbmQgdGhlbiBzaGFyZSBpdCB0 byBkaWZmZXJlbnQgZW50aXR5KFZNSUQpIGFuZCAKPiBiYXNpY2FsbHkgdGhhdCBhbHNvIHJlcXVp cmVzIGZldyBzbWMgY2FsbHMgYW5kIGZvciB0aGF0IHdlIG5lZWQKPiBjdXN0b20gYWxsb2MvZnJl ZSBjYWxsYmFja3MuCj4gCj4gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvYWxsLzIwMjMxMTAxMDcx MTQ0LjE2MzA5LTEtcXVpY19na29obGlAcXVpY2luYy5jb20vCj4gCj4gCj4gU28gY3VzdG9tIGFs bG9jYXRvciBhbmQgZnJlZSBvcHMgaXMgaGVscGluZyBmb3IgdXMgYWxzby4gSXMgdGhlcmUgYW55 IAo+IHBsYW4gdG8gbWVyZ2UgdGhlc2UgcGF0Y2hlcyBmcm9tIEJvcmlzLgoKU29ycnkgZm9yIHRo ZSBsYXRlIHJlcGx5LiBJIGp1c3Qgc2VudCBhIHYyLCBidXQgSSBmb3Jnb3QgdG8gYWRkIHlvdXIK VGVzdGVkLWJ5IDotLy4gRmVlbCBmcmVlIHRvIGFkZCBpdCBiYWNrLgoKUmVnYXJkcywKCkJvcmlz CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1h cm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5v cmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0t a2VybmVsCg==