From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lekensteyn.nl ([178.21.112.251]:44431 "EHLO lekensteyn.nl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727094AbeH1NsV (ORCPT ); Tue, 28 Aug 2018 09:48:21 -0400 Date: Tue, 28 Aug 2018 11:57:22 +0200 From: Peter Wu To: Daniel Drake Cc: linux-pci@vger.kernel.org, nouveau@lists.freedesktop.org, Linux PM , Endless Linux Upstreaming Team Subject: Re: [Nouveau] Rewriting Intel PCI bridge prefetch base address bits solves nvidia graphics issues Message-ID: <20180828095722.GA8820@al> References: <20180824154212.GB8601@al> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: Sender: linux-pci-owner@vger.kernel.org List-ID: On Tue, Aug 28, 2018 at 10:23:24AM +0800, Daniel Drake wrote: > On Fri, Aug 24, 2018 at 11:42 PM, Peter Wu wrote: > > Are these systems also affected through runtime power management? For > > example: > > > > modprobe nouveau # should enable runtime PM > > sleep 6 # wait for runtime suspend to kick in > > lspci -s1: # runtime resume by reading PCI config space > > > > On laptops from about 2015-2016 with a GTX 9xxM this sequence results in > > hangs on various laptops > > (https://bugzilla.kernel.org/show_bug.cgi?id=156341). > > This works fine here. I'm facing a different issue. Just to be sure, after "sleep", do both devices report "suspended" in /sys/bus/pci/devices/0000:00:1c.0/power/runtime_status /sys/bus/pci/devices/0000:01:00.0/power/runtime_status and was this reproduced with a recent mainline kernel with no special cmdline options? The endlessm kernel on Github seems to have quite some patches, one of them explicitly disable runtime PM: https://github.com/endlessm/linux/commit/8b128b50cd6725eee2ae9025a1510a221d9b42f2 > >> After a lot of experimentation I found a workaround: during resume, > >> set the value of PCI_PREF_BASE_UPPER32 to 0 on the parent PCI bridge. > >> Easily done in drivers/pci/quirks.c. Now all nvidia stuff works fine. > > > > I am curious, how did you discover this? While this could work, perhaps > > there are alternative workarounds/fixes? > > Based on the observation that the following procedure works fine (note > the addition of step 3): > > 1. Boot > 2. Suspend/resume > 3. echo rescan > /sys/bus/pci/devices/0000:00:1c.0/rescan > 4. Load nouveau driver > 5. Start X > > I worked through the rescan codepath until I had isolated the specific > code which magically makes things work (in pci_bridge_check_ranges). > > Having found that, step 3 in the above test procedure can be replaced > with a simple: > setpci -s 00:1c.0 0x28.l=0 > > > When you say "parent PCI" bridge, is that actually the device you see in > > "lspci -tv"? On a Dell XPS 9560, the GPU is under a different device: > > > > -[0000:00]-+-00.0 Intel Corporation Xeon E3-1200 v6/7th Gen Core Processor Host Bridge/DRAM Registers > > +-01.0-[01]----00.0 NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] > > > > 00:01.0 PCI bridge [0604]: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th Gen Core Processor PCIe Controller (x16) [8086:1901] (rev 05) > > Yes, it's the parent bridge shown by lspci. The address of this varies > from system to system. Could you share some details: - acpidump - lspci -nnxxxxvvv - BIOS version (from /sys/class/dmi/id/) - kernel version (mainline?) Perhaps there is some magic in the ACPI suspend or resume path that causes this. > >> 1. Is the Intel PCI bridge misbehaving here? Why does writing the same > >> value of PCI_PREF_BASE_UPPER32 make any difference at all? > > > > At what point in the suspend code path did you insert this write? It is > > possible that the write somehow acted as a fence/memory barrier? > > static void quirk_pref_base_upper32(struct pci_dev *dev) > { > u32 pref_base_upper32; > pci_read_config_dword(dev, PCI_PREF_BASE_UPPER32, &pref_base_upper32); > pci_write_config_dword(dev, PCI_PREF_BASE_UPPER32, pref_base_upper32); > } > DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, 0x9d10, quirk_pref_base_upper32); > > I don't think it's acting as a barrier. I tried changing this code to > rewrite other registers such as PCI_PREF_MEMORY_BASE and that makes > the bug come back. > > >> 2. Who is responsible for saving and restoring PCI bridge > >> configuration during suspend and resume? Linux? ACPI? BIOS? > > > > Not sure about PCI bridges, but at least for the PCI Express Capability > > registers, it is in control of the OS when control is granted via the > > ACPI _OSC method. > > I guess you are referring to pci_save_pcie_state(). I can't see > anything equivalent for the bridge registers. Yes that would be the function, called via pci_save_state. > > I recently compared PCI configuration space access and ACPI method > > invocation using QEMU + VFIO with Linux 4.18, Windows 7 and Windows 10 > > (1803). There were differences like disabling MSI/interrupts before > > suspend, setting the Enable Clock Power Management bit in PCI Express > > Link Control and more, but applying these changes were so far not really > > successful. > > Interesting. Do you know any way that I could spy on Windows' accesses > to the PCI bridge registers? > Looking at at https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF > I suspect VFIO would not help me here. > It says: > Note: If they are grouped with other devices in this manner, pci > root ports and bridges should neither be bound to vfio at boot, nor be > added to the VM. Only non-bridge devices can be passed to a guest, but perhaps logging access to the emulated bridge is already sufficient. The Prefetchable Base Upper 32 Bits register is at offset 0x28. In a trace where the Nvidia device is disabled/enabled via Device Manager, I see writes on the enable path: 2571@1535108904.593107:rp_write_config (ioh3420, @0x28, 0x0, len=0x4) For Linux, I only see one write at startup, none on runtime resume. I did not test system sleep/resume. (disable/enable is arguably a bit different from system s/r, you may want to do additional testing here.) Full log for WIndows 10 and Linux: https://github.com/Lekensteyn/acpi-stuff/blob/master/d3test/XPS9560/slogs/win10-rp-enable-disable.txt#L3418 https://github.com/Lekensteyn/acpi-stuff/blob/master/d3test/XPS9560/slogs/linux-rp.txt lspci for the emulated bridge: https://github.com/Lekensteyn/acpi-stuff/blob/master/d3test/XPS9560/lspci-vm-vfio.txt#L359 The rp_*_config trace points are non-standard and require patches: https://github.com/Lekensteyn/acpi-stuff/blob/master/d3test/patches/qemu-trace.diff -- Kind regards, Peter Wu https://lekensteyn.nl From mboxrd@z Thu Jan 1 00:00:00 1970 From: Peter Wu Subject: Re: Rewriting Intel PCI bridge prefetch base address bits solves nvidia graphics issues Date: Tue, 28 Aug 2018 11:57:22 +0200 Message-ID: <20180828095722.GA8820@al> References: <20180824154212.GB8601@al> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Daniel Drake Cc: linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Linux PM , Endless Linux Upstreaming Team , nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: linux-pm@vger.kernel.org T24gVHVlLCBBdWcgMjgsIDIwMTggYXQgMTA6MjM6MjRBTSArMDgwMCwgRGFuaWVsIERyYWtlIHdy b3RlOgo+IE9uIEZyaSwgQXVnIDI0LCAyMDE4IGF0IDExOjQyIFBNLCBQZXRlciBXdSA8cGV0ZXJA bGVrZW5zdGV5bi5ubD4gd3JvdGU6Cj4gPiBBcmUgdGhlc2Ugc3lzdGVtcyBhbHNvIGFmZmVjdGVk IHRocm91Z2ggcnVudGltZSBwb3dlciBtYW5hZ2VtZW50PyBGb3IKPiA+IGV4YW1wbGU6Cj4gPgo+ ID4gICAgIG1vZHByb2JlIG5vdXZlYXUgICAgIyBzaG91bGQgZW5hYmxlIHJ1bnRpbWUgUE0KPiA+ ICAgICBzbGVlcCA2ICAgICAgICAgICAgICMgd2FpdCBmb3IgcnVudGltZSBzdXNwZW5kIHRvIGtp Y2sgaW4KPiA+ICAgICBsc3BjaSAtczE6ICAgICAgICAgICMgcnVudGltZSByZXN1bWUgYnkgcmVh ZGluZyBQQ0kgY29uZmlnIHNwYWNlCj4gPgo+ID4gT24gbGFwdG9wcyBmcm9tIGFib3V0IDIwMTUt MjAxNiB3aXRoIGEgR1RYIDl4eE0gdGhpcyBzZXF1ZW5jZSByZXN1bHRzIGluCj4gPiBoYW5ncyBv biB2YXJpb3VzIGxhcHRvcHMKPiA+IChodHRwczovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvc2hvd19i dWcuY2dpP2lkPTE1NjM0MSkuCj4gCj4gVGhpcyB3b3JrcyBmaW5lIGhlcmUuIEknbSBmYWNpbmcg YSBkaWZmZXJlbnQgaXNzdWUuCgpKdXN0IHRvIGJlIHN1cmUsIGFmdGVyICJzbGVlcCIsIGRvIGJv dGggZGV2aWNlcyByZXBvcnQgInN1c3BlbmRlZCIgaW4KL3N5cy9idXMvcGNpL2RldmljZXMvMDAw MDowMDoxYy4wL3Bvd2VyL3J1bnRpbWVfc3RhdHVzCi9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6 MDE6MDAuMC9wb3dlci9ydW50aW1lX3N0YXR1cwoKYW5kIHdhcyB0aGlzIHJlcHJvZHVjZWQgd2l0 aCBhIHJlY2VudCBtYWlubGluZSBrZXJuZWwgd2l0aCBubyBzcGVjaWFsCmNtZGxpbmUgb3B0aW9u cz8gVGhlIGVuZGxlc3NtIGtlcm5lbCBvbiBHaXRodWIgc2VlbXMgdG8gaGF2ZSBxdWl0ZSBzb21l CnBhdGNoZXMsIG9uZSBvZiB0aGVtIGV4cGxpY2l0bHkgZGlzYWJsZSBydW50aW1lIFBNOgpodHRw czovL2dpdGh1Yi5jb20vZW5kbGVzc20vbGludXgvY29tbWl0LzhiMTI4YjUwY2Q2NzI1ZWVlMmFl OTAyNWExNTEwYTIyMWQ5YjQyZjIKCj4gPj4gQWZ0ZXIgYSBsb3Qgb2YgZXhwZXJpbWVudGF0aW9u IEkgZm91bmQgYSB3b3JrYXJvdW5kOiBkdXJpbmcgcmVzdW1lLAo+ID4+IHNldCB0aGUgdmFsdWUg b2YgUENJX1BSRUZfQkFTRV9VUFBFUjMyIHRvIDAgb24gdGhlIHBhcmVudCBQQ0kgYnJpZGdlLgo+ ID4+IEVhc2lseSBkb25lIGluIGRyaXZlcnMvcGNpL3F1aXJrcy5jLiBOb3cgYWxsIG52aWRpYSBz dHVmZiB3b3JrcyBmaW5lLgo+ID4KPiA+IEkgYW0gY3VyaW91cywgaG93IGRpZCB5b3UgZGlzY292 ZXIgdGhpcz8gV2hpbGUgdGhpcyBjb3VsZCB3b3JrLCBwZXJoYXBzCj4gPiB0aGVyZSBhcmUgYWx0 ZXJuYXRpdmUgd29ya2Fyb3VuZHMvZml4ZXM/Cj4gCj4gQmFzZWQgb24gdGhlIG9ic2VydmF0aW9u IHRoYXQgdGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgd29ya3MgZmluZSAobm90ZQo+IHRoZSBhZGRp dGlvbiBvZiBzdGVwIDMpOgo+IAo+IDEuIEJvb3QKPiAyLiBTdXNwZW5kL3Jlc3VtZQo+IDMuIGVj aG8gcmVzY2FuID4gL3N5cy9idXMvcGNpL2RldmljZXMvMDAwMDowMDoxYy4wL3Jlc2Nhbgo+IDQu IExvYWQgbm91dmVhdSBkcml2ZXIKPiA1LiBTdGFydCBYCj4gCj4gSSB3b3JrZWQgdGhyb3VnaCB0 aGUgcmVzY2FuIGNvZGVwYXRoIHVudGlsIEkgaGFkIGlzb2xhdGVkIHRoZSBzcGVjaWZpYwo+IGNv ZGUgd2hpY2ggbWFnaWNhbGx5IG1ha2VzIHRoaW5ncyB3b3JrIChpbiBwY2lfYnJpZGdlX2NoZWNr X3JhbmdlcykuCj4gCj4gSGF2aW5nIGZvdW5kIHRoYXQsIHN0ZXAgMyBpbiB0aGUgYWJvdmUgdGVz dCBwcm9jZWR1cmUgY2FuIGJlIHJlcGxhY2VkCj4gd2l0aCBhIHNpbXBsZToKPiAgICBzZXRwY2kg LXMgMDA6MWMuMCAweDI4Lmw9MAo+IAo+ID4gV2hlbiB5b3Ugc2F5ICJwYXJlbnQgUENJIiBicmlk Z2UsIGlzIHRoYXQgYWN0dWFsbHkgdGhlIGRldmljZSB5b3Ugc2VlIGluCj4gPiAibHNwY2kgLXR2 Ij8gT24gYSBEZWxsIFhQUyA5NTYwLCB0aGUgR1BVIGlzIHVuZGVyIGEgZGlmZmVyZW50IGRldmlj ZToKPiA+Cj4gPiAgIC1bMDAwMDowMF0tKy0wMC4wICBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIEUz LTEyMDAgdjYvN3RoIEdlbiBDb3JlIFByb2Nlc3NvciBIb3N0IEJyaWRnZS9EUkFNIFJlZ2lzdGVy cwo+ID4gICAgICAgICAgICAgICstMDEuMC1bMDFdLS0tLTAwLjAgIE5WSURJQSBDb3Jwb3JhdGlv biBHUDEwN00gW0dlRm9yY2UgR1RYIDEwNTAgTW9iaWxlXQo+ID4KPiA+ICAwMDowMS4wIFBDSSBi cmlkZ2UgWzA2MDRdOiBJbnRlbCBDb3Jwb3JhdGlvbiBYZW9uIEUzLTEyMDAgdjUvRTMtMTUwMCB2 NS82dGggR2VuIENvcmUgUHJvY2Vzc29yIFBDSWUgQ29udHJvbGxlciAoeDE2KSBbODA4NjoxOTAx XSAocmV2IDA1KQo+IAo+IFllcywgaXQncyB0aGUgcGFyZW50IGJyaWRnZSBzaG93biBieSBsc3Bj aS4gVGhlIGFkZHJlc3Mgb2YgdGhpcyB2YXJpZXMKPiBmcm9tIHN5c3RlbSB0byBzeXN0ZW0uCgpD b3VsZCB5b3Ugc2hhcmUgc29tZSBkZXRhaWxzOgotIGFjcGlkdW1wCi0gbHNwY2kgLW5ueHh4eHZ2 dgotIEJJT1MgdmVyc2lvbiAoZnJvbSAvc3lzL2NsYXNzL2RtaS9pZC8pCi0ga2VybmVsIHZlcnNp b24gKG1haW5saW5lPykKClBlcmhhcHMgdGhlcmUgaXMgc29tZSBtYWdpYyBpbiB0aGUgQUNQSSBz dXNwZW5kIG9yIHJlc3VtZSBwYXRoIHRoYXQKY2F1c2VzIHRoaXMuCgo+ID4+IDEuIElzIHRoZSBJ bnRlbCBQQ0kgYnJpZGdlIG1pc2JlaGF2aW5nIGhlcmU/IFdoeSBkb2VzIHdyaXRpbmcgdGhlIHNh bWUKPiA+PiB2YWx1ZSBvZiBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIgbWFrZSBhbnkgZGlmZmVyZW5j ZSBhdCBhbGw/Cj4gPgo+ID4gQXQgd2hhdCBwb2ludCBpbiB0aGUgc3VzcGVuZCBjb2RlIHBhdGgg ZGlkIHlvdSBpbnNlcnQgdGhpcyB3cml0ZT8gSXQgaXMKPiA+IHBvc3NpYmxlIHRoYXQgdGhlIHdy aXRlIHNvbWVob3cgYWN0ZWQgYXMgYSBmZW5jZS9tZW1vcnkgYmFycmllcj8KPiAKPiBzdGF0aWMg dm9pZCBxdWlya19wcmVmX2Jhc2VfdXBwZXIzMihzdHJ1Y3QgcGNpX2RldiAqZGV2KQo+IHsKPiAg ICAgICAgdTMyIHByZWZfYmFzZV91cHBlcjMyOwo+ICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdv cmQoZGV2LCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIsICZwcmVmX2Jhc2VfdXBwZXIzMik7Cj4gICAg ICAgIHBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUFJFRl9CQVNFX1VQUEVSMzIsIHBy ZWZfYmFzZV91cHBlcjMyKTsKPiB9Cj4gREVDTEFSRV9QQ0lfRklYVVBfUkVTVU1FKFBDSV9WRU5E T1JfSURfSU5URUwsICAweDlkMTAsIHF1aXJrX3ByZWZfYmFzZV91cHBlcjMyKTsKPiAKPiBJIGRv bid0IHRoaW5rIGl0J3MgYWN0aW5nIGFzIGEgYmFycmllci4gSSB0cmllZCBjaGFuZ2luZyB0aGlz IGNvZGUgdG8KPiByZXdyaXRlIG90aGVyIHJlZ2lzdGVycyBzdWNoIGFzIFBDSV9QUkVGX01FTU9S WV9CQVNFIGFuZCB0aGF0IG1ha2VzCj4gdGhlIGJ1ZyBjb21lIGJhY2suCj4gCj4gPj4gMi4gV2hv IGlzIHJlc3BvbnNpYmxlIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBQQ0kgYnJpZGdlCj4gPj4g Y29uZmlndXJhdGlvbiBkdXJpbmcgc3VzcGVuZCBhbmQgcmVzdW1lPyBMaW51eD8gQUNQST8gQklP Uz8KPiA+Cj4gPiBOb3Qgc3VyZSBhYm91dCBQQ0kgYnJpZGdlcywgYnV0IGF0IGxlYXN0IGZvciB0 aGUgUENJIEV4cHJlc3MgQ2FwYWJpbGl0eQo+ID4gcmVnaXN0ZXJzLCBpdCBpcyBpbiBjb250cm9s IG9mIHRoZSBPUyB3aGVuIGNvbnRyb2wgaXMgZ3JhbnRlZCB2aWEgdGhlCj4gPiBBQ1BJIF9PU0Mg bWV0aG9kLgo+IAo+IEkgZ3Vlc3MgeW91IGFyZSByZWZlcnJpbmcgdG8gcGNpX3NhdmVfcGNpZV9z dGF0ZSgpLiBJIGNhbid0IHNlZQo+IGFueXRoaW5nIGVxdWl2YWxlbnQgZm9yIHRoZSBicmlkZ2Ug cmVnaXN0ZXJzLgoKWWVzIHRoYXQgd291bGQgYmUgdGhlIGZ1bmN0aW9uLCBjYWxsZWQgdmlhIHBj aV9zYXZlX3N0YXRlLgoKPiA+IEkgcmVjZW50bHkgY29tcGFyZWQgUENJIGNvbmZpZ3VyYXRpb24g c3BhY2UgYWNjZXNzIGFuZCBBQ1BJIG1ldGhvZAo+ID4gaW52b2NhdGlvbiB1c2luZyBRRU1VICsg VkZJTyB3aXRoIExpbnV4IDQuMTgsIFdpbmRvd3MgNyBhbmQgV2luZG93cyAxMAo+ID4gKDE4MDMp LiBUaGVyZSB3ZXJlIGRpZmZlcmVuY2VzIGxpa2UgZGlzYWJsaW5nIE1TSS9pbnRlcnJ1cHRzIGJl Zm9yZQo+ID4gc3VzcGVuZCwgc2V0dGluZyB0aGUgRW5hYmxlIENsb2NrIFBvd2VyIE1hbmFnZW1l bnQgYml0IGluIFBDSSBFeHByZXNzCj4gPiBMaW5rIENvbnRyb2wgYW5kIG1vcmUsIGJ1dCBhcHBs eWluZyB0aGVzZSBjaGFuZ2VzIHdlcmUgc28gZmFyIG5vdCByZWFsbHkKPiA+IHN1Y2Nlc3NmdWwu Cj4gCj4gSW50ZXJlc3RpbmcuIERvIHlvdSBrbm93IGFueSB3YXkgdGhhdCBJIGNvdWxkIHNweSBv biBXaW5kb3dzJyBhY2Nlc3Nlcwo+IHRvIHRoZSBQQ0kgYnJpZGdlIHJlZ2lzdGVycz8KPiBMb29r aW5nIGF0IGF0IGh0dHBzOi8vd2lraS5hcmNobGludXgub3JnL2luZGV4LnBocC9QQ0lfcGFzc3Ro cm91Z2hfdmlhX09WTUYKPiBJIHN1c3BlY3QgVkZJTyB3b3VsZCBub3QgaGVscCBtZSBoZXJlLgo+ IEl0IHNheXM6Cj4gICAgIE5vdGU6IElmIHRoZXkgYXJlIGdyb3VwZWQgd2l0aCBvdGhlciBkZXZp Y2VzIGluIHRoaXMgbWFubmVyLCBwY2kKPiByb290IHBvcnRzIGFuZCBicmlkZ2VzIHNob3VsZCBu ZWl0aGVyIGJlIGJvdW5kIHRvIHZmaW8gYXQgYm9vdCwgbm9yIGJlCj4gYWRkZWQgdG8gdGhlIFZN LgoKT25seSBub24tYnJpZGdlIGRldmljZXMgY2FuIGJlIHBhc3NlZCB0byBhIGd1ZXN0LCBidXQg cGVyaGFwcyBsb2dnaW5nCmFjY2VzcyB0byB0aGUgZW11bGF0ZWQgYnJpZGdlIGlzIGFscmVhZHkg c3VmZmljaWVudC4gVGhlIFByZWZldGNoYWJsZQpCYXNlIFVwcGVyIDMyIEJpdHMgcmVnaXN0ZXIg aXMgYXQgb2Zmc2V0IDB4MjguCgpJbiBhIHRyYWNlIHdoZXJlIHRoZSBOdmlkaWEgZGV2aWNlIGlz IGRpc2FibGVkL2VuYWJsZWQgdmlhIERldmljZQpNYW5hZ2VyLCBJIHNlZSB3cml0ZXMgb24gdGhl IGVuYWJsZSBwYXRoOgoKICAgIDI1NzFAMTUzNTEwODkwNC41OTMxMDc6cnBfd3JpdGVfY29uZmln IChpb2gzNDIwLCBAMHgyOCwgMHgwLCBsZW49MHg0KQoKRm9yIExpbnV4LCBJIG9ubHkgc2VlIG9u ZSB3cml0ZSBhdCBzdGFydHVwLCBub25lIG9uIHJ1bnRpbWUgcmVzdW1lLgpJIGRpZCBub3QgdGVz dCBzeXN0ZW0gc2xlZXAvcmVzdW1lLiAoZGlzYWJsZS9lbmFibGUgaXMgYXJndWFibHkgYSBiaXQK ZGlmZmVyZW50IGZyb20gc3lzdGVtIHMvciwgeW91IG1heSB3YW50IHRvIGRvIGFkZGl0aW9uYWwg dGVzdGluZyBoZXJlLikKCkZ1bGwgbG9nIGZvciBXSW5kb3dzIDEwIGFuZCBMaW51eDoKaHR0cHM6 Ly9naXRodWIuY29tL0xla2Vuc3RleW4vYWNwaS1zdHVmZi9ibG9iL21hc3Rlci9kM3Rlc3QvWFBT OTU2MC9zbG9ncy93aW4xMC1ycC1lbmFibGUtZGlzYWJsZS50eHQjTDM0MTgKaHR0cHM6Ly9naXRo dWIuY29tL0xla2Vuc3RleW4vYWNwaS1zdHVmZi9ibG9iL21hc3Rlci9kM3Rlc3QvWFBTOTU2MC9z bG9ncy9saW51eC1ycC50eHQKbHNwY2kgZm9yIHRoZSBlbXVsYXRlZCBicmlkZ2U6Cmh0dHBzOi8v Z2l0aHViLmNvbS9MZWtlbnN0ZXluL2FjcGktc3R1ZmYvYmxvYi9tYXN0ZXIvZDN0ZXN0L1hQUzk1 NjAvbHNwY2ktdm0tdmZpby50eHQjTDM1OQpUaGUgcnBfKl9jb25maWcgdHJhY2UgcG9pbnRzIGFy ZSBub24tc3RhbmRhcmQgYW5kIHJlcXVpcmUgcGF0Y2hlczoKaHR0cHM6Ly9naXRodWIuY29tL0xl a2Vuc3RleW4vYWNwaS1zdHVmZi9ibG9iL21hc3Rlci9kM3Rlc3QvcGF0Y2hlcy9xZW11LXRyYWNl LmRpZmYKLS0gCktpbmQgcmVnYXJkcywKUGV0ZXIgV3UKaHR0cHM6Ly9sZWtlbnN0ZXluLm5sCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCk5vdXZlYXUgbWFp bGluZyBsaXN0Ck5vdXZlYXVAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vbm91dmVhdQo=