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=-1.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,SPF_PASS 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 76E84C10F11 for ; Wed, 10 Apr 2019 20:45:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 2C59D21741 for ; Wed, 10 Apr 2019 20:45:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554929137; bh=px7U9x0mLoBLBqMhq8XW+g+Q3qd7cPBMdlw/mG7xJKo=; h=Date:From:To:cc:Subject:In-Reply-To:References:List-ID:From; b=DVSG6FrGAXksFJv1gB5eE4z7aNf3fgWtwJAnABkpK2p5tfN9omeW9EEAK85jQzO2U Vy+Rb65UvF6ko55ANdFUqKdvXNLYBpr4Vabm77bYc+HkEa6qa4NyHePPewrAg+5iA7 mDg2/8M4aiupwaGM2vnu3hKd/BWpV7ZkADRLEV3A= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726599AbfDJUpf (ORCPT ); Wed, 10 Apr 2019 16:45:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:58694 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725782AbfDJUpf (ORCPT ); Wed, 10 Apr 2019 16:45:35 -0400 Received: from localhost (c-67-164-102-47.hsd1.ca.comcast.net [67.164.102.47]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9E88020830; Wed, 10 Apr 2019 20:45:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554929133; bh=px7U9x0mLoBLBqMhq8XW+g+Q3qd7cPBMdlw/mG7xJKo=; h=Date:From:To:cc:Subject:In-Reply-To:References:From; b=AmQN83vmKb1z/AX2SC1Wfy8efQU+dEKiqszeBTCQhF/PTU+zM3JFdRt3kkL3I5jJv CPYuo/rIMKwWTI3rqqvem5uvqkDy4OEhqSFMD7l3zIer1UW74Xlbjsmg16bdq8Yfut DP5pAz/3mSCRsMvI4+gP/e0tBx14WYZ655lvWp2s= Date: Wed, 10 Apr 2019 13:45:29 -0700 (PDT) From: Stefano Stabellini X-X-Sender: sstabellini@sstabellini-ThinkPad-X260 To: Ankur Arora cc: Stefano Stabellini , Joao Martins , Juergen Gross , Artem_Mygaiev@epam.com, xen-devel@lists.xenproject.org, kvm@vger.kernel.org, =?UTF-8?Q?Radim_Kr=C4=8Dm=C3=A1=C5=99?= , x86@kernel.org, linux-kernel@vger.kernel.org, Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , Paolo Bonzini , Boris Ostrovsky , Thomas Gleixner Subject: Re: [Xen-devel] [PATCH RFC 00/39] x86/KVM: Xen HVM guest support In-Reply-To: <8300d893-40a3-2b5b-e510-cd5955c72670@oracle.com> Message-ID: References: <20190220201609.28290-1-joao.m.martins@oracle.com> <35051310-c497-8ad5-4434-1b8426a317d2@redhat.com> <8b1f4912-4f92-69ae-ae01-d899d5640572@oracle.com> <3ee91f33-2973-c2db-386f-afbf138081b4@redhat.com> <59676804-786d-3df8-7752-8e45dec6d65b@oracle.com> <94738323-ebdf-d58e-55b6-313e27c923b0@oracle.com> <585163c2-8dea-728d-7556-9cb3559f0eca@suse.com> <97808492-58ee-337f-c894-900b34b7b1a5@oracle.com> <8300d893-40a3-2b5b-e510-cd5955c72670@oracle.com> User-Agent: Alpine 2.10 (DEB 1266 2009-07-14) MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 9 Apr 2019, Ankur Arora wrote: > On 2019-04-08 5:35 p.m., Stefano Stabellini wrote: > > On Mon, 8 Apr 2019, Joao Martins wrote: > > > On 4/8/19 11:42 AM, Juergen Gross wrote: > > > > On 08/04/2019 12:36, Joao Martins wrote: > > > > > On 4/8/19 7:44 AM, Juergen Gross wrote: > > > > > > On 12/03/2019 18:14, Joao Martins wrote: > > > > > > > On 2/22/19 4:59 PM, Paolo Bonzini wrote: > > > > > > > > On 21/02/19 12:45, Joao Martins wrote: > > > > > > > > > On 2/20/19 9:09 PM, Paolo Bonzini wrote: > > > > > > > > > > On 20/02/19 21:15, Joao Martins wrote: > > > > > > > > > > > 2. PV Driver support (patches 17 - 39) > > > > > > > > > > > > > > > > > > > > > > We start by redirecting hypercalls from the backend to > > > > > > > > > > > routines > > > > > > > > > > > which emulate the behaviour that PV backends expect i.e. > > > > > > > > > > > grant > > > > > > > > > > > table and interdomain events. Next, we add support for > > > > > > > > > > > late > > > > > > > > > > > initialization of xenbus, followed by implementing > > > > > > > > > > > frontend/backend communication mechanisms (i.e. grant > > > > > > > > > > > tables and > > > > > > > > > > > interdomain event channels). Finally, introduce > > > > > > > > > > > xen-shim.ko, > > > > > > > > > > > which will setup a limited Xen environment. This uses > > > > > > > > > > > the added > > > > > > > > > > > functionality of Xen specific shared memory (grant > > > > > > > > > > > tables) and > > > > > > > > > > > notifications (event channels). > > > > > > > > > > > > > > > > > > > > I am a bit worried by the last patches, they seem really > > > > > > > > > > brittle and > > > > > > > > > > prone to breakage. I don't know Xen well enough to > > > > > > > > > > understand if the > > > > > > > > > > lack of support for GNTMAP_host_map is fixable, but if not, > > > > > > > > > > you have to > > > > > > > > > > define a completely different hypercall. > > > > > > > > > > > > > > > > > > > I guess Ankur already answered this; so just to stack this on > > > > > > > > > top of his comment. > > > > > > > > > > > > > > > > > > The xen_shim_domain() is only meant to handle the case where > > > > > > > > > the backend > > > > > > > > > has/can-have full access to guest memory [i.e. netback and > > > > > > > > > blkback would work > > > > > > > > > with similar assumptions as vhost?]. For the normal case, > > > > > > > > > where a backend *in a > > > > > > > > > guest* maps and unmaps other guest memory, this is not > > > > > > > > > applicable and these > > > > > > > > > changes don't affect that case. > > > > > > > > > > > > > > > > > > IOW, the PV backend here sits on the hypervisor, and the > > > > > > > > > hypercalls aren't > > > > > > > > > actual hypercalls but rather invoking shim_hypercall(). The > > > > > > > > > call chain would go > > > > > > > > > more or less like: > > > > > > > > > > > > > > > > > > > > > > > > > > > gnttab_map_refs(map_ops, pages) > > > > > > > > > HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,...) > > > > > > > > > shim_hypercall() > > > > > > > > > shim_hcall_gntmap() > > > > > > > > > > > > > > > > > > Our reasoning was that given we are already in KVM, why > > > > > > > > > mapping a page if the > > > > > > > > > user (i.e. the kernel PV backend) is himself? The lack of > > > > > > > > > GNTMAP_host_map is how > > > > > > > > > the shim determines its user doesn't want to map the page. > > > > > > > > > Also, there's another > > > > > > > > > issue where PV backends always need a struct page to reference > > > > > > > > > the device > > > > > > > > > inflight data as Ankur pointed out. > > > > > > > > > > > > > > > > Ultimately it's up to the Xen people. It does make their API > > > > > > > > uglier, > > > > > > > > especially the in/out change for the parameter. If you can at > > > > > > > > least > > > > > > > > avoid that, it would alleviate my concerns quite a bit. > > > > > > > > > > > > > > In my view, we have two options overall: > > > > > > > > > > > > > > 1) Make it explicit, the changes the PV drivers we have to make in > > > > > > > order to support xen_shim_domain(). This could mean e.g. a) add a > > > > > > > callback > > > > > > > argument to gnttab_map_refs() that is invoked for every page that > > > > > > > gets looked up > > > > > > > successfully, and inside this callback the PV driver may update > > > > > > > it's tracking > > > > > > > page. Here we no longer have this in/out parameter in > > > > > > > gnttab_map_refs, and all > > > > > > > shim_domain specific bits would be a little more abstracted from > > > > > > > Xen PV > > > > > > > backends. See netback example below the scissors mark. Or b) have > > > > > > > sort of a > > > > > > > translate_gref() and put_gref() API that Xen PV drivers use which > > > > > > > make it even > > > > > > > more explicit that there's no grant ops involved. The latter is > > > > > > > more invasive. > > > > > > > > > > > > > > 2) The second option is to support guest grant mapping/unmapping > > > > > > > [*] to allow > > > > > > > hosting PV backends inside the guest. This would remove the Xen > > > > > > > changes in this > > > > > > > series completely. But it would require another guest being used > > > > > > > as netback/blkback/xenstored, and less performance than 1) > > > > > > > (though, in theory, > > > > > > > it would be equivalent to what does Xen with grants/events). The > > > > > > > only changes in > > > > > > > Linux Xen code is adding xenstored domain support, but that is > > > > > > > useful on its own > > > > > > > outside the scope of this work. > > > > > > > > > > > > > > I think there's value on both; 1) is probably more familiar for > > > > > > > KVM users > > > > > > > perhaps (as it is similar to what vhost does?) while 2) equates > > > > > > > to implementing > > > > > > > Xen disagregation capabilities in KVM. > > > > > > > > > > > > > > Thoughts? Xen maintainers what's your take on this? > > > > > > > > > > > > What I'd like best would be a new handle (e.g. xenhost_t *) used as > > > > > > an > > > > > > abstraction layer for this kind of stuff. It should be passed to the > > > > > > backends and those would pass it on to low-level Xen drivers > > > > > > (xenbus, > > > > > > event channels, grant table, ...). > > > > > > > > > > > So if IIRC backends would use the xenhost layer to access grants or > > > > > frames > > > > > referenced by grants, and that would grok into some of this. IOW, you > > > > > would have > > > > > two implementors of xenhost: one for nested remote/local events+grants > > > > > and > > > > > another for this "shim domain" ? > > > > > > > > As I'd need that for nested Xen I guess that would make it 3 variants. > > > > Probably the xen-shim variant would need more hooks, but that should be > > > > no problem. > > > > > > > I probably messed up in the short description but "nested remote/local > > > events+grants" was referring to nested Xen (FWIW remote meant L0 and local > > > L1). > > > So maybe only 2 variants are needed? > > > > > > > > > I was planning to do that (the xenhost_t * stuff) soon in order to > > > > > > add > > > > > > support for nested Xen using PV devices (you need two Xenstores for > > > > > > that > > > > > > as the nested dom0 is acting as Xen backend server, while using PV > > > > > > frontends for accessing the "real" world outside). > > > > > > > > > > > > The xenhost_t should be used for: > > > > > > > > > > > > - accessing Xenstore > > > > > > - issuing and receiving events > > > > > > - doing hypercalls > > > > > > - grant table operations > > > > > > > > > > > > > > > > In the text above, I sort of suggested a slice of this on 1.b) with a > > > > > translate_gref() and put_gref() API -- to get the page from a gref. > > > > > This was > > > > > because of the flags|host_addr hurdle we depicted above wrt to using > > > > > using grant > > > > > maps/unmaps. You think some of the xenhost layer would be ammenable to > > > > > support > > > > > this case? > > > > > > > > I think so, yes. > > > > > > > > > > > > > > > So exactly the kind of stuff you want to do, too. > > > > > > > > > > > Cool idea! > > > > > > > > In the end you might make my life easier for nested Xen. :-) > > > > > > > Hehe :) > > > > > > > Do you want to have a try with that idea or should I do that? I might be > > > > able to start working on that in about a month. > > > > > > > Ankur (CC'ed) will give a shot at it, and should start a new thread on > > > this > > > xenhost abstraction layer. > > > > If you are up for it, it would be great to write some documentation too. > > We are starting to have decent docs for some PV protocols, describing a > > specific PV interface, but we are lacking docs about the basic building > > blocks to bring up PV drivers in general. They would be extremely > Agreed. These would be useful. > > > useful. Given that you have just done the work, you are in a great > > position to write those docs. Even bad English would be fine, I am sure > > somebody else could volunteer to clean-up the language. Anything would > > help :-) > Can't make any promises on this yet but I will see if I can convert > notes I made into something useful for the community. Thank you! 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=-0.8 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 4A994C10F11 for ; Wed, 10 Apr 2019 20:46:40 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (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 0B39A20830 for ; Wed, 10 Apr 2019 20:46:39 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="AmQN83vm" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0B39A20830 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hEK6h-0005lm-GE; Wed, 10 Apr 2019 20:46:07 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1hEK6f-0005lF-WA for xen-devel@lists.xenproject.org; Wed, 10 Apr 2019 20:46:06 +0000 X-Inumbo-ID: a8420b65-5bd1-11e9-92d7-bc764e045a96 Received: from mail.kernel.org (unknown [198.145.29.99]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id a8420b65-5bd1-11e9-92d7-bc764e045a96; Wed, 10 Apr 2019 20:46:04 +0000 (UTC) Received: from localhost (c-67-164-102-47.hsd1.ca.comcast.net [67.164.102.47]) (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9E88020830; Wed, 10 Apr 2019 20:45:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554929133; bh=px7U9x0mLoBLBqMhq8XW+g+Q3qd7cPBMdlw/mG7xJKo=; h=Date:From:To:cc:Subject:In-Reply-To:References:From; b=AmQN83vmKb1z/AX2SC1Wfy8efQU+dEKiqszeBTCQhF/PTU+zM3JFdRt3kkL3I5jJv CPYuo/rIMKwWTI3rqqvem5uvqkDy4OEhqSFMD7l3zIer1UW74Xlbjsmg16bdq8Yfut DP5pAz/3mSCRsMvI4+gP/e0tBx14WYZ655lvWp2s= Date: Wed, 10 Apr 2019 13:45:29 -0700 (PDT) From: Stefano Stabellini X-X-Sender: sstabellini@sstabellini-ThinkPad-X260 To: Ankur Arora In-Reply-To: <8300d893-40a3-2b5b-e510-cd5955c72670@oracle.com> Message-ID: References: <20190220201609.28290-1-joao.m.martins@oracle.com> <35051310-c497-8ad5-4434-1b8426a317d2@redhat.com> <8b1f4912-4f92-69ae-ae01-d899d5640572@oracle.com> <3ee91f33-2973-c2db-386f-afbf138081b4@redhat.com> <59676804-786d-3df8-7752-8e45dec6d65b@oracle.com> <94738323-ebdf-d58e-55b6-313e27c923b0@oracle.com> <585163c2-8dea-728d-7556-9cb3559f0eca@suse.com> <97808492-58ee-337f-c894-900b34b7b1a5@oracle.com> <8300d893-40a3-2b5b-e510-cd5955c72670@oracle.com> User-Agent: Alpine 2.10 (DEB 1266 2009-07-14) MIME-Version: 1.0 Subject: Re: [Xen-devel] [PATCH RFC 00/39] x86/KVM: Xen HVM guest support X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: Juergen Gross , Artem_Mygaiev@epam.com, Stefano Stabellini , Thomas Gleixner , kvm@vger.kernel.org, =?UTF-8?Q?Radim_Kr=C4=8Dm=C3=A1=C5=99?= , x86@kernel.org, linux-kernel@vger.kernel.org, Paolo Bonzini , Ingo Molnar , Borislav Petkov , "H. Peter Anvin" , xen-devel@lists.xenproject.org, Joao Martins , Boris Ostrovsky Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" T24gVHVlLCA5IEFwciAyMDE5LCBBbmt1ciBBcm9yYSB3cm90ZToKPiBPbiAyMDE5LTA0LTA4IDU6 MzUgcC5tLiwgU3RlZmFubyBTdGFiZWxsaW5pIHdyb3RlOgo+ID4gT24gTW9uLCA4IEFwciAyMDE5 LCBKb2FvIE1hcnRpbnMgd3JvdGU6Cj4gPiA+IE9uIDQvOC8xOSAxMTo0MiBBTSwgSnVlcmdlbiBH cm9zcyB3cm90ZToKPiA+ID4gPiBPbiAwOC8wNC8yMDE5IDEyOjM2LCBKb2FvIE1hcnRpbnMgd3Jv dGU6Cj4gPiA+ID4gPiBPbiA0LzgvMTkgNzo0NCBBTSwgSnVlcmdlbiBHcm9zcyB3cm90ZToKPiA+ ID4gPiA+ID4gT24gMTIvMDMvMjAxOSAxODoxNCwgSm9hbyBNYXJ0aW5zIHdyb3RlOgo+ID4gPiA+ ID4gPiA+IE9uIDIvMjIvMTkgNDo1OSBQTSwgUGFvbG8gQm9uemluaSB3cm90ZToKPiA+ID4gPiA+ ID4gPiA+IE9uIDIxLzAyLzE5IDEyOjQ1LCBKb2FvIE1hcnRpbnMgd3JvdGU6Cj4gPiA+ID4gPiA+ ID4gPiA+IE9uIDIvMjAvMTkgOTowOSBQTSwgUGFvbG8gQm9uemluaSB3cm90ZToKPiA+ID4gPiA+ ID4gPiA+ID4gPiBPbiAyMC8wMi8xOSAyMToxNSwgSm9hbyBNYXJ0aW5zIHdyb3RlOgo+ID4gPiA+ ID4gPiA+ID4gPiA+ID4gICAyLiBQViBEcml2ZXIgc3VwcG9ydCAocGF0Y2hlcyAxNyAtIDM5KQo+ ID4gPiA+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgIFdlIHN0YXJ0IGJ5 IHJlZGlyZWN0aW5nIGh5cGVyY2FsbHMgZnJvbSB0aGUgYmFja2VuZCB0bwo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gcm91dGluZXMKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgd2hpY2ggZW11bGF0ZSB0 aGUgYmVoYXZpb3VyIHRoYXQgUFYgYmFja2VuZHMgZXhwZWN0IGkuZS4KPiA+ID4gPiA+ID4gPiA+ ID4gPiA+IGdyYW50Cj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgIHRhYmxlIGFuZCBpbnRlcmRvbWFp biBldmVudHMuIE5leHQsIHdlIGFkZCBzdXBwb3J0IGZvcgo+ID4gPiA+ID4gPiA+ID4gPiA+ID4g bGF0ZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICBpbml0aWFsaXphdGlvbiBvZiB4ZW5idXMsIGZv bGxvd2VkIGJ5IGltcGxlbWVudGluZwo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICBmcm9udGVuZC9i YWNrZW5kIGNvbW11bmljYXRpb24gbWVjaGFuaXNtcyAoaS5lLiBncmFudAo+ID4gPiA+ID4gPiA+ ID4gPiA+ID4gdGFibGVzIGFuZAo+ID4gPiA+ID4gPiA+ID4gPiA+ID4gICBpbnRlcmRvbWFpbiBl dmVudCBjaGFubmVscykuIEZpbmFsbHksIGludHJvZHVjZQo+ID4gPiA+ID4gPiA+ID4gPiA+ID4g eGVuLXNoaW0ua28sCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgIHdoaWNoIHdpbGwgc2V0dXAgYSBs aW1pdGVkIFhlbiBlbnZpcm9ubWVudC4gVGhpcyB1c2VzCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiB0 aGUgYWRkZWQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+ICAgZnVuY3Rpb25hbGl0eSBvZiBYZW4gc3Bl Y2lmaWMgc2hhcmVkIG1lbW9yeSAoZ3JhbnQKPiA+ID4gPiA+ID4gPiA+ID4gPiA+IHRhYmxlcykg YW5kCj4gPiA+ID4gPiA+ID4gPiA+ID4gPiAgIG5vdGlmaWNhdGlvbnMgKGV2ZW50IGNoYW5uZWxz KS4KPiA+ID4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPiBJIGFtIGEgYml0IHdv cnJpZWQgYnkgdGhlIGxhc3QgcGF0Y2hlcywgdGhleSBzZWVtIHJlYWxseQo+ID4gPiA+ID4gPiA+ ID4gPiA+IGJyaXR0bGUgYW5kCj4gPiA+ID4gPiA+ID4gPiA+ID4gcHJvbmUgdG8gYnJlYWthZ2Uu ICBJIGRvbid0IGtub3cgWGVuIHdlbGwgZW5vdWdoIHRvCj4gPiA+ID4gPiA+ID4gPiA+ID4gdW5k ZXJzdGFuZCBpZiB0aGUKPiA+ID4gPiA+ID4gPiA+ID4gPiBsYWNrIG9mIHN1cHBvcnQgZm9yIEdO VE1BUF9ob3N0X21hcCBpcyBmaXhhYmxlLCBidXQgaWYgbm90LAo+ID4gPiA+ID4gPiA+ID4gPiA+ IHlvdSBoYXZlIHRvCj4gPiA+ID4gPiA+ID4gPiA+ID4gZGVmaW5lIGEgY29tcGxldGVseSBkaWZm ZXJlbnQgaHlwZXJjYWxsLgo+ID4gPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBJ IGd1ZXNzIEFua3VyIGFscmVhZHkgYW5zd2VyZWQgdGhpczsgc28ganVzdCB0byBzdGFjayB0aGlz IG9uCj4gPiA+ID4gPiA+ID4gPiA+IHRvcCBvZiBoaXMgY29tbWVudC4KPiA+ID4gPiA+ID4gPiA+ ID4gCj4gPiA+ID4gPiA+ID4gPiA+IFRoZSB4ZW5fc2hpbV9kb21haW4oKSBpcyBvbmx5IG1lYW50 IHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZQo+ID4gPiA+ID4gPiA+ID4gPiB0aGUgYmFja2VuZAo+ ID4gPiA+ID4gPiA+ID4gPiBoYXMvY2FuLWhhdmUgZnVsbCBhY2Nlc3MgdG8gZ3Vlc3QgbWVtb3J5 IFtpLmUuIG5ldGJhY2sgYW5kCj4gPiA+ID4gPiA+ID4gPiA+IGJsa2JhY2sgd291bGQgd29yawo+ ID4gPiA+ID4gPiA+ID4gPiB3aXRoIHNpbWlsYXIgYXNzdW1wdGlvbnMgYXMgdmhvc3Q/XS4gRm9y IHRoZSBub3JtYWwgY2FzZSwKPiA+ID4gPiA+ID4gPiA+ID4gd2hlcmUgYSBiYWNrZW5kICppbiBh Cj4gPiA+ID4gPiA+ID4gPiA+IGd1ZXN0KiBtYXBzIGFuZCB1bm1hcHMgb3RoZXIgZ3Vlc3QgbWVt b3J5LCB0aGlzIGlzIG5vdAo+ID4gPiA+ID4gPiA+ID4gPiBhcHBsaWNhYmxlIGFuZCB0aGVzZQo+ ID4gPiA+ID4gPiA+ID4gPiBjaGFuZ2VzIGRvbid0IGFmZmVjdCB0aGF0IGNhc2UuCj4gPiA+ID4g PiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gPiBJT1csIHRoZSBQViBiYWNrZW5kIGhlcmUgc2l0 cyBvbiB0aGUgaHlwZXJ2aXNvciwgYW5kIHRoZQo+ID4gPiA+ID4gPiA+ID4gPiBoeXBlcmNhbGxz IGFyZW4ndAo+ID4gPiA+ID4gPiA+ID4gPiBhY3R1YWwgaHlwZXJjYWxscyBidXQgcmF0aGVyIGlu dm9raW5nIHNoaW1faHlwZXJjYWxsKCkuIFRoZQo+ID4gPiA+ID4gPiA+ID4gPiBjYWxsIGNoYWlu IHdvdWxkIGdvCj4gPiA+ID4gPiA+ID4gPiA+IG1vcmUgb3IgbGVzcyBsaWtlOgo+ID4gPiA+ID4g PiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ID4gPG5ldGJhY2t8YmxrYmFja3xzY3NpYmFjaz4KPiA+ ID4gPiA+ID4gPiA+ID4gICBnbnR0YWJfbWFwX3JlZnMobWFwX29wcywgcGFnZXMpCj4gPiA+ID4g PiA+ID4gPiA+ICAgICBIWVBFUlZJU09SX2dyYW50X3RhYmxlX29wKEdOVFRBQk9QX21hcF9ncmFu dF9yZWYsLi4uKQo+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBzaGltX2h5cGVyY2FsbCgpCj4gPiA+ ID4gPiA+ID4gPiA+ICAgICAgICAgc2hpbV9oY2FsbF9nbnRtYXAoKQo+ID4gPiA+ID4gPiA+ID4g PiAKPiA+ID4gPiA+ID4gPiA+ID4gT3VyIHJlYXNvbmluZyB3YXMgdGhhdCBnaXZlbiB3ZSBhcmUg YWxyZWFkeSBpbiBLVk0sIHdoeQo+ID4gPiA+ID4gPiA+ID4gPiBtYXBwaW5nIGEgcGFnZSBpZiB0 aGUKPiA+ID4gPiA+ID4gPiA+ID4gdXNlciAoaS5lLiB0aGUga2VybmVsIFBWIGJhY2tlbmQpIGlz IGhpbXNlbGY/IFRoZSBsYWNrIG9mCj4gPiA+ID4gPiA+ID4gPiA+IEdOVE1BUF9ob3N0X21hcCBp cyBob3cKPiA+ID4gPiA+ID4gPiA+ID4gdGhlIHNoaW0gZGV0ZXJtaW5lcyBpdHMgdXNlciBkb2Vz bid0IHdhbnQgdG8gbWFwIHRoZSBwYWdlLgo+ID4gPiA+ID4gPiA+ID4gPiBBbHNvLCB0aGVyZSdz IGFub3RoZXIKPiA+ID4gPiA+ID4gPiA+ID4gaXNzdWUgd2hlcmUgUFYgYmFja2VuZHMgYWx3YXlz IG5lZWQgYSBzdHJ1Y3QgcGFnZSB0byByZWZlcmVuY2UKPiA+ID4gPiA+ID4gPiA+ID4gdGhlIGRl dmljZQo+ID4gPiA+ID4gPiA+ID4gPiBpbmZsaWdodCBkYXRhIGFzIEFua3VyIHBvaW50ZWQgb3V0 Lgo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gPiBVbHRpbWF0ZWx5IGl0J3MgdXAgdG8g dGhlIFhlbiBwZW9wbGUuICBJdCBkb2VzIG1ha2UgdGhlaXIgQVBJCj4gPiA+ID4gPiA+ID4gPiB1 Z2xpZXIsCj4gPiA+ID4gPiA+ID4gPiBlc3BlY2lhbGx5IHRoZSBpbi9vdXQgY2hhbmdlIGZvciB0 aGUgcGFyYW1ldGVyLiAgSWYgeW91IGNhbiBhdAo+ID4gPiA+ID4gPiA+ID4gbGVhc3QKPiA+ID4g PiA+ID4gPiA+IGF2b2lkIHRoYXQsIGl0IHdvdWxkIGFsbGV2aWF0ZSBteSBjb25jZXJucyBxdWl0 ZSBhIGJpdC4KPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiBJbiBteSB2aWV3LCB3ZSBoYXZl IHR3byBvcHRpb25zIG92ZXJhbGw6Cj4gPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+ID4gMSkgTWFr ZSBpdCBleHBsaWNpdCwgdGhlIGNoYW5nZXMgdGhlIFBWIGRyaXZlcnMgd2UgaGF2ZSB0byBtYWtl IGluCj4gPiA+ID4gPiA+ID4gb3JkZXIgdG8gc3VwcG9ydCB4ZW5fc2hpbV9kb21haW4oKS4gVGhp cyBjb3VsZCBtZWFuIGUuZy4gYSkgYWRkIGEKPiA+ID4gPiA+ID4gPiBjYWxsYmFjawo+ID4gPiA+ ID4gPiA+IGFyZ3VtZW50IHRvIGdudHRhYl9tYXBfcmVmcygpIHRoYXQgaXMgaW52b2tlZCBmb3Ig ZXZlcnkgcGFnZSB0aGF0Cj4gPiA+ID4gPiA+ID4gZ2V0cyBsb29rZWQgdXAKPiA+ID4gPiA+ID4g PiBzdWNjZXNzZnVsbHksIGFuZCBpbnNpZGUgdGhpcyBjYWxsYmFjayB0aGUgUFYgZHJpdmVyIG1h eSB1cGRhdGUKPiA+ID4gPiA+ID4gPiBpdCdzIHRyYWNraW5nCj4gPiA+ID4gPiA+ID4gcGFnZS4g SGVyZSB3ZSBubyBsb25nZXIgaGF2ZSB0aGlzIGluL291dCBwYXJhbWV0ZXIgaW4KPiA+ID4gPiA+ ID4gPiBnbnR0YWJfbWFwX3JlZnMsIGFuZCBhbGwKPiA+ID4gPiA+ID4gPiBzaGltX2RvbWFpbiBz cGVjaWZpYyBiaXRzIHdvdWxkIGJlIGEgbGl0dGxlIG1vcmUgYWJzdHJhY3RlZCBmcm9tCj4gPiA+ ID4gPiA+ID4gWGVuIFBWCj4gPiA+ID4gPiA+ID4gYmFja2VuZHMuIFNlZSBuZXRiYWNrIGV4YW1w bGUgYmVsb3cgdGhlIHNjaXNzb3JzIG1hcmsuIE9yIGIpIGhhdmUKPiA+ID4gPiA+ID4gPiBzb3J0 IG9mIGEKPiA+ID4gPiA+ID4gPiB0cmFuc2xhdGVfZ3JlZigpIGFuZCBwdXRfZ3JlZigpIEFQSSB0 aGF0IFhlbiBQViBkcml2ZXJzIHVzZSB3aGljaAo+ID4gPiA+ID4gPiA+IG1ha2UgaXQgZXZlbgo+ ID4gPiA+ID4gPiA+IG1vcmUgZXhwbGljaXQgdGhhdCB0aGVyZSdzIG5vIGdyYW50IG9wcyBpbnZv bHZlZC4gVGhlIGxhdHRlciBpcwo+ID4gPiA+ID4gPiA+IG1vcmUgaW52YXNpdmUuCj4gPiA+ID4g PiA+ID4gCj4gPiA+ID4gPiA+ID4gMikgVGhlIHNlY29uZCBvcHRpb24gaXMgdG8gc3VwcG9ydCBn dWVzdCBncmFudCBtYXBwaW5nL3VubWFwcGluZwo+ID4gPiA+ID4gPiA+IFsqXSB0byBhbGxvdwo+ ID4gPiA+ID4gPiA+IGhvc3RpbmcgUFYgYmFja2VuZHMgaW5zaWRlIHRoZSBndWVzdC4gVGhpcyB3 b3VsZCByZW1vdmUgdGhlIFhlbgo+ID4gPiA+ID4gPiA+IGNoYW5nZXMgaW4gdGhpcwo+ID4gPiA+ ID4gPiA+IHNlcmllcyBjb21wbGV0ZWx5LiBCdXQgaXQgd291bGQgcmVxdWlyZSBhbm90aGVyIGd1 ZXN0IGJlaW5nIHVzZWQKPiA+ID4gPiA+ID4gPiBhcyBuZXRiYWNrL2Jsa2JhY2sveGVuc3RvcmVk LCBhbmQgbGVzcyBwZXJmb3JtYW5jZSB0aGFuIDEpCj4gPiA+ID4gPiA+ID4gKHRob3VnaCwgaW4g dGhlb3J5LAo+ID4gPiA+ID4gPiA+IGl0IHdvdWxkIGJlIGVxdWl2YWxlbnQgdG8gd2hhdCBkb2Vz IFhlbiB3aXRoIGdyYW50cy9ldmVudHMpLiBUaGUKPiA+ID4gPiA+ID4gPiBvbmx5IGNoYW5nZXMg aW4KPiA+ID4gPiA+ID4gPiBMaW51eCBYZW4gY29kZSBpcyBhZGRpbmcgeGVuc3RvcmVkIGRvbWFp biBzdXBwb3J0LCBidXQgdGhhdCBpcwo+ID4gPiA+ID4gPiA+IHVzZWZ1bCBvbiBpdHMgb3duCj4g PiA+ID4gPiA+ID4gb3V0c2lkZSB0aGUgc2NvcGUgb2YgdGhpcyB3b3JrLgo+ID4gPiA+ID4gPiA+ IAo+ID4gPiA+ID4gPiA+IEkgdGhpbmsgdGhlcmUncyB2YWx1ZSBvbiBib3RoOyAxKSBpcyBwcm9i YWJseSBtb3JlIGZhbWlsaWFyIGZvcgo+ID4gPiA+ID4gPiA+IEtWTSB1c2Vycwo+ID4gPiA+ID4g PiA+IHBlcmhhcHMgKGFzIGl0IGlzIHNpbWlsYXIgdG8gd2hhdCB2aG9zdCBkb2VzPykgd2hpbGUg IDIpIGVxdWF0ZXMKPiA+ID4gPiA+ID4gPiB0byBpbXBsZW1lbnRpbmcKPiA+ID4gPiA+ID4gPiBY ZW4gZGlzYWdyZWdhdGlvbiBjYXBhYmlsaXRpZXMgaW4gS1ZNLgo+ID4gPiA+ID4gPiA+IAo+ID4g PiA+ID4gPiA+IFRob3VnaHRzPyBYZW4gbWFpbnRhaW5lcnMgd2hhdCdzIHlvdXIgdGFrZSBvbiB0 aGlzPwo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gV2hhdCBJJ2QgbGlrZSBiZXN0IHdvdWxkIGJl IGEgbmV3IGhhbmRsZSAoZS5nLiB4ZW5ob3N0X3QgKikgdXNlZCBhcwo+ID4gPiA+ID4gPiBhbgo+ ID4gPiA+ID4gPiBhYnN0cmFjdGlvbiBsYXllciBmb3IgdGhpcyBraW5kIG9mIHN0dWZmLiBJdCBz aG91bGQgYmUgcGFzc2VkIHRvIHRoZQo+ID4gPiA+ID4gPiBiYWNrZW5kcyBhbmQgdGhvc2Ugd291 bGQgcGFzcyBpdCBvbiB0byBsb3ctbGV2ZWwgWGVuIGRyaXZlcnMKPiA+ID4gPiA+ID4gKHhlbmJ1 cywKPiA+ID4gPiA+ID4gZXZlbnQgY2hhbm5lbHMsIGdyYW50IHRhYmxlLCAuLi4pLgo+ID4gPiA+ ID4gPiAKPiA+ID4gPiA+IFNvIGlmIElJUkMgYmFja2VuZHMgd291bGQgdXNlIHRoZSB4ZW5ob3N0 IGxheWVyIHRvIGFjY2VzcyBncmFudHMgb3IKPiA+ID4gPiA+IGZyYW1lcwo+ID4gPiA+ID4gcmVm ZXJlbmNlZCBieSBncmFudHMsIGFuZCB0aGF0IHdvdWxkIGdyb2sgaW50byBzb21lIG9mIHRoaXMu IElPVywgeW91Cj4gPiA+ID4gPiB3b3VsZCBoYXZlCj4gPiA+ID4gPiB0d28gaW1wbGVtZW50b3Jz IG9mIHhlbmhvc3Q6IG9uZSBmb3IgbmVzdGVkIHJlbW90ZS9sb2NhbCBldmVudHMrZ3JhbnRzCj4g PiA+ID4gPiBhbmQKPiA+ID4gPiA+IGFub3RoZXIgZm9yIHRoaXMgInNoaW0gZG9tYWluIiA/Cj4g PiA+ID4gCj4gPiA+ID4gQXMgSSdkIG5lZWQgdGhhdCBmb3IgbmVzdGVkIFhlbiBJIGd1ZXNzIHRo YXQgd291bGQgbWFrZSBpdCAzIHZhcmlhbnRzLgo+ID4gPiA+IFByb2JhYmx5IHRoZSB4ZW4tc2hp bSB2YXJpYW50IHdvdWxkIG5lZWQgbW9yZSBob29rcywgYnV0IHRoYXQgc2hvdWxkIGJlCj4gPiA+ ID4gbm8gcHJvYmxlbS4KPiA+ID4gPiAKPiA+ID4gSSBwcm9iYWJseSBtZXNzZWQgdXAgaW4gdGhl IHNob3J0IGRlc2NyaXB0aW9uIGJ1dCAibmVzdGVkIHJlbW90ZS9sb2NhbAo+ID4gPiBldmVudHMr Z3JhbnRzIiB3YXMgcmVmZXJyaW5nIHRvIG5lc3RlZCBYZW4gKEZXSVcgcmVtb3RlIG1lYW50IEww IGFuZCBsb2NhbAo+ID4gPiBMMSkuCj4gPiA+IFNvIG1heWJlIG9ubHkgMiB2YXJpYW50cyBhcmUg bmVlZGVkPwo+ID4gPiAKPiA+ID4gPiA+ID4gSSB3YXMgcGxhbm5pbmcgdG8gZG8gdGhhdCAodGhl IHhlbmhvc3RfdCAqIHN0dWZmKSBzb29uIGluIG9yZGVyIHRvCj4gPiA+ID4gPiA+IGFkZAo+ID4g PiA+ID4gPiBzdXBwb3J0IGZvciBuZXN0ZWQgWGVuIHVzaW5nIFBWIGRldmljZXMgKHlvdSBuZWVk IHR3byBYZW5zdG9yZXMgZm9yCj4gPiA+ID4gPiA+IHRoYXQKPiA+ID4gPiA+ID4gYXMgdGhlIG5l c3RlZCBkb20wIGlzIGFjdGluZyBhcyBYZW4gYmFja2VuZCBzZXJ2ZXIsIHdoaWxlIHVzaW5nIFBW Cj4gPiA+ID4gPiA+IGZyb250ZW5kcyBmb3IgYWNjZXNzaW5nIHRoZSAicmVhbCIgd29ybGQgb3V0 c2lkZSkuCj4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiBUaGUgeGVuaG9zdF90IHNob3VsZCBiZSB1 c2VkIGZvcjoKPiA+ID4gPiA+ID4gCj4gPiA+ID4gPiA+IC0gYWNjZXNzaW5nIFhlbnN0b3JlCj4g PiA+ID4gPiA+IC0gaXNzdWluZyBhbmQgcmVjZWl2aW5nIGV2ZW50cwo+ID4gPiA+ID4gPiAtIGRv aW5nIGh5cGVyY2FsbHMKPiA+ID4gPiA+ID4gLSBncmFudCB0YWJsZSBvcGVyYXRpb25zCj4gPiA+ ID4gPiA+IAo+ID4gPiA+ID4gCj4gPiA+ID4gPiBJbiB0aGUgdGV4dCBhYm92ZSwgSSBzb3J0IG9m IHN1Z2dlc3RlZCBhIHNsaWNlIG9mIHRoaXMgb24gMS5iKSB3aXRoIGEKPiA+ID4gPiA+IHRyYW5z bGF0ZV9ncmVmKCkgYW5kIHB1dF9ncmVmKCkgQVBJIC0tIHRvIGdldCB0aGUgcGFnZSBmcm9tIGEg Z3JlZi4KPiA+ID4gPiA+IFRoaXMgd2FzCj4gPiA+ID4gPiBiZWNhdXNlIG9mIHRoZSBmbGFnc3xo b3N0X2FkZHIgaHVyZGxlIHdlIGRlcGljdGVkIGFib3ZlIHdydCB0byB1c2luZwo+ID4gPiA+ID4g dXNpbmcgZ3JhbnQKPiA+ID4gPiA+IG1hcHMvdW5tYXBzLiBZb3UgdGhpbmsgc29tZSBvZiB0aGUg eGVuaG9zdCBsYXllciB3b3VsZCBiZSBhbW1lbmFibGUgdG8KPiA+ID4gPiA+IHN1cHBvcnQKPiA+ ID4gPiA+IHRoaXMgY2FzZT8KPiA+ID4gPiAKPiA+ID4gPiBJIHRoaW5rIHNvLCB5ZXMuCj4gPiA+ ID4gCj4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gU28gZXhhY3RseSB0aGUga2luZCBvZiBzdHVmZiB5 b3Ugd2FudCB0byBkbywgdG9vLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+IENvb2wgaWRlYSEKPiA+ ID4gPiAKPiA+ID4gPiBJbiB0aGUgZW5kIHlvdSBtaWdodCBtYWtlIG15IGxpZmUgZWFzaWVyIGZv ciBuZXN0ZWQgWGVuLiA6LSkKPiA+ID4gPiAKPiA+ID4gSGVoZSA6KQo+ID4gPiAKPiA+ID4gPiBE byB5b3Ugd2FudCB0byBoYXZlIGEgdHJ5IHdpdGggdGhhdCBpZGVhIG9yIHNob3VsZCBJIGRvIHRo YXQ/IEkgbWlnaHQgYmUKPiA+ID4gPiBhYmxlIHRvIHN0YXJ0IHdvcmtpbmcgb24gdGhhdCBpbiBh Ym91dCBhIG1vbnRoLgo+ID4gPiA+IAo+ID4gPiBBbmt1ciAoQ0MnZWQpIHdpbGwgZ2l2ZSBhIHNo b3QgYXQgaXQsIGFuZCBzaG91bGQgc3RhcnQgYSBuZXcgdGhyZWFkIG9uCj4gPiA+IHRoaXMKPiA+ ID4geGVuaG9zdCBhYnN0cmFjdGlvbiBsYXllci4KPiA+IAo+ID4gSWYgeW91IGFyZSB1cCBmb3Ig aXQsIGl0IHdvdWxkIGJlIGdyZWF0IHRvIHdyaXRlIHNvbWUgZG9jdW1lbnRhdGlvbiB0b28uCj4g PiBXZSBhcmUgc3RhcnRpbmcgdG8gaGF2ZSBkZWNlbnQgZG9jcyBmb3Igc29tZSBQViBwcm90b2Nv bHMsIGRlc2NyaWJpbmcgYQo+ID4gc3BlY2lmaWMgUFYgaW50ZXJmYWNlLCBidXQgd2UgYXJlIGxh Y2tpbmcgZG9jcyBhYm91dCB0aGUgYmFzaWMgYnVpbGRpbmcKPiA+IGJsb2NrcyB0byBicmluZyB1 cCBQViBkcml2ZXJzIGluIGdlbmVyYWwuIFRoZXkgd291bGQgYmUgZXh0cmVtZWx5Cj4gQWdyZWVk LiBUaGVzZSB3b3VsZCBiZSB1c2VmdWwuCj4gCj4gPiB1c2VmdWwuIEdpdmVuIHRoYXQgeW91IGhh dmUganVzdCBkb25lIHRoZSB3b3JrLCB5b3UgYXJlIGluIGEgZ3JlYXQKPiA+IHBvc2l0aW9uIHRv IHdyaXRlIHRob3NlIGRvY3MuIEV2ZW4gYmFkIEVuZ2xpc2ggd291bGQgYmUgZmluZSwgSSBhbSBz dXJlCj4gPiBzb21lYm9keSBlbHNlIGNvdWxkIHZvbHVudGVlciB0byBjbGVhbi11cCB0aGUgbGFu Z3VhZ2UuIEFueXRoaW5nIHdvdWxkCj4gPiBoZWxwIDotKQo+IENhbid0IG1ha2UgYW55IHByb21p c2VzIG9uIHRoaXMgeWV0IGJ1dCBJIHdpbGwgc2VlIGlmIEkgY2FuIGNvbnZlcnQKPiBub3RlcyBJ IG1hZGUgaW50byBzb21ldGhpbmcgdXNlZnVsIGZvciB0aGUgY29tbXVuaXR5LgoKVGhhbmsgeW91 IQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRl dmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9s aXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==