From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from bmailout2.hostsharing.net ([83.223.90.240]:52123 "EHLO bmailout2.hostsharing.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750735AbeCJGJy (ORCPT ); Sat, 10 Mar 2018 01:09:54 -0500 Date: Sat, 10 Mar 2018 07:09:51 +0100 From: Lukas Wunner To: Peter Wu Cc: dri-devel@lists.freedesktop.org, Alex Deucher , nouveau@lists.freedesktop.org, Imre Deak , Maik Freudenberg , Raphael Doursenaud , Martin Lopatar , Daniel Drake , Denis Lisov , zigarrre@gmail.com, "Rafael J. Wysocki" , Bjorn Helgaas , linux-pci@vger.kernel.org Subject: Re: [PATCH v2 0/7] Modernize vga_switcheroo by using device link for HDA Message-ID: <20180310060951.GA25550@wunner.de> References: <20180305205831.GA1397@al> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii In-Reply-To: <20180305205831.GA1397@al> Sender: linux-pci-owner@vger.kernel.org List-ID: Hi Peter, thanks a million for the extensive testing and reviewing. I'll go through the issues you've found below, but it appears to me that they're all either in the "works as intended" category or are caused by something unrelated to this series: On Mon, Mar 05, 2018 at 09:58:31PM +0100, Peter Wu wrote: > Issue 1 - GPU does not suspend on text console. > When present at the text console and an external monitor is connected > through HDMI or DP, the RPM counter is 1. Only when the cable is removed > (or when "echo off > /sys/class/drm/card1-HDMI-A-1/status"), the RPM > count drops to 0 and the GPU device suspends. When Xorg is started > (startx), the RPM counter also drops to 0 though. Yes, that behavior is intended: The GPU device is kept resumed as long as it has an active crtc, and it has an active crtc if it's used as text console. > Issue 2 - RPM counter for audio function drops below 0 on system sleep. > When both nouveau and snd-hda-intel are loaded and a HDMI (or DP?) cable > is connected, the RPM counter becomes one after suspend/resume. This > happens both with text console and Xorg. Which RPM counter becomes one? That of the GPU? If so, it would be caused by the GPU activating a crtc on hotplug to light up the display, hence staying resumed. I don't quite understand what you mean by "RPM counter for audio function drops below 0 on system sleep". I've gone through the HDA code and don't see an unbalanced pm_runtime_get / _put. However the PM core changes the usage count a couple of times over a system sleep cycle by acquiring/releasing a runtime PM ref or enabling/disabling runtime PM (see drivers/base/power/main.c), maybe that's what you observed. > Issue 3 - invalid PCI config reads to audio device if disconnected. > When no HDMI/DP cable is connected, the HDMI audio function will be > inaccessible after runtime/system resume. Assume nouveau loaded before > s/r, then loading snd-hda-intel will fail with: > > hdaudio hdaudioC1D0: no AFG or MFG node found > hdaudio hdaudioC1D1: no AFG or MFG node found > hdaudio hdaudioC1D2: no AFG or MFG node found > hdaudio hdaudioC1D3: no AFG or MFG node found > hdaudio hdaudioC1D4: no AFG or MFG node found > hdaudio hdaudioC1D5: no AFG or MFG node found > hdaudio hdaudioC1D6: no AFG or MFG node found > hdaudio hdaudioC1D7: no AFG or MFG node found > snd_hda_intel 0000:01:00.1: no codecs initialized Okay, that's really bad, but it appears to be caused by the BIOS hiding the audio function on resume if no cable is connected. I've attached 3 patches to this bugzilla to fix this issue: https://bugs.freedesktop.org/show_bug.cgi?id=75985 I've extensively tested system sleep in conjunction with the switcheroo_devlink patches and the above never occurred on my machine because the audio function is never hidden. I don't consider this issue a blocker for the switcheroo_devlink patches because I would expect it to occur regardless. Quite to the contrary, the switcheroo_devlink patches are a requirement to fix the issue because the audio function needs to be exposed either from the GPU driver or a PCI quirk applied to the GPU, and the audio function needs to delay resume until that has happened, which is achieved by the device link. > Issue 4 - runtime_active_kids leak with audio function. > After the above issue, the audio device never entered the suspended > state even though the runtime_usage counter reached 0. It turned out > that runtime_active_kids was 4. Every time snd-hda-intel is loaded (and > fails to initialize due to the above issue), this counter is increased. Yes, the codec devices are created as children of the HDA device and keep it awake because initialization failed. This won't occur once issue 3 is fixed. > Issue 5 - audio breaks after system sleep or stopping Xorg. > When Xorg is stopped or the system sleep/resumes while speaker-test is > active (e.g. in GNU screen), audio stops playing and speaker-test exits. That is odd, I don't have an explanation for this but suspect a bug in the sound code. > Issue 6 - wrong pin status reported / no audio > (Possibly "working as expected" since audio is tied to GPU function.) > Scenario: HDMI cable is connected but GPU is unused > ("echo off > /sys/class/drm/card1-HDMI-1-1/status" from console or > with "xrandr --output HDMI-A-1 --off"). hdajacksensetest reports no > HDMI pin presence even if connected, dmesg reports: > > nouveau 0000:01:00.0: DRM: DDC responded, but no EDID for HDMI-A-1 Interesting, and yes, that would seem to be working as expected. > Issue 7 - nouveau: warning after unloading after stopping Xorg > (Issue in nouveau, likely not related to this patch set.) > After "xrandr --output HDMI-1-1 --mode 2560x1440" in Xorg, stopping Xorg > (and possibly "echo off > /sys/class/drm/card1-HDMI-A-1/status"), > removing nouveau triggered: > > WARNING: CPU: 7 PID: 5475 at drivers/gpu/drm/drm_mode_config.c:439 drm_mode_config_cleanup+0x1fa/0x260 Okay, the driver was unloaded while the connector was still active. You should also see a "connector HDMI-1-1 leaked!" message in dmesg. I thought I had fixed this two years ago with commit 523872f6b072 ("drm/nouveau: Turn off CRTCs on driver unload"). Either that commit didn't work as it should or the issue reappeared. :-( So yes, it's a bug, but unrelated to the switcheroo_devlink patches. > Issue 8 - acpi: sleeping function in atomic context. > (Issue is likely not related to this patch set.) > At some point I also got a BUG, nouveau was already unloaded and I ran: > "echo 1 | tee /sys/bus/pci/devices/0000:01:00.{0,1}/remove" > > BUG: sleeping function called from invalid context at /home/peter/linux/mm/slab.h:419 Wow, that would seem to be a bug in ACPI code, sorry, I'm clueless about that one. :-) Once again thanks and let me know if unhiding the audio function as per the patches I attached to the above-linked bugzilla fixes issue 3. Lukas From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lukas Wunner Subject: Re: [PATCH v2 0/7] Modernize vga_switcheroo by using device link for HDA Date: Sat, 10 Mar 2018 07:09:51 +0100 Message-ID: <20180310060951.GA25550@wunner.de> References: <20180305205831.GA1397@al> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20180305205831.GA1397@al> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Peter Wu Cc: zigarrre-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Imre Deak , "Rafael J. Wysocki" , linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, Daniel Drake , dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Denis Lisov , Bjorn Helgaas , Martin Lopatar , Alex Deucher , Maik Freudenberg , Raphael Doursenaud List-Id: nouveau.vger.kernel.org SGkgUGV0ZXIsCgp0aGFua3MgYSBtaWxsaW9uIGZvciB0aGUgZXh0ZW5zaXZlIHRlc3RpbmcgYW5k IHJldmlld2luZy4KCkknbGwgZ28gdGhyb3VnaCB0aGUgaXNzdWVzIHlvdSd2ZSBmb3VuZCBiZWxv dywgYnV0IGl0IGFwcGVhcnMgdG8gbWUKdGhhdCB0aGV5J3JlIGFsbCBlaXRoZXIgaW4gdGhlICJ3 b3JrcyBhcyBpbnRlbmRlZCIgY2F0ZWdvcnkgb3IgYXJlCmNhdXNlZCBieSBzb21ldGhpbmcgdW5y ZWxhdGVkIHRvIHRoaXMgc2VyaWVzOgoKCk9uIE1vbiwgTWFyIDA1LCAyMDE4IGF0IDA5OjU4OjMx UE0gKzAxMDAsIFBldGVyIFd1IHdyb3RlOgo+IElzc3VlIDEgLSBHUFUgZG9lcyBub3Qgc3VzcGVu ZCBvbiB0ZXh0IGNvbnNvbGUuCj4gV2hlbiBwcmVzZW50IGF0IHRoZSB0ZXh0IGNvbnNvbGUgYW5k IGFuIGV4dGVybmFsIG1vbml0b3IgaXMgY29ubmVjdGVkCj4gdGhyb3VnaCBIRE1JIG9yIERQLCB0 aGUgUlBNIGNvdW50ZXIgaXMgMS4gT25seSB3aGVuIHRoZSBjYWJsZSBpcyByZW1vdmVkCj4gKG9y IHdoZW4gImVjaG8gb2ZmID4gL3N5cy9jbGFzcy9kcm0vY2FyZDEtSERNSS1BLTEvc3RhdHVzIiks IHRoZSBSUE0KPiBjb3VudCBkcm9wcyB0byAwIGFuZCB0aGUgR1BVIGRldmljZSBzdXNwZW5kcy4g V2hlbiBYb3JnIGlzIHN0YXJ0ZWQKPiAoc3RhcnR4KSwgdGhlIFJQTSBjb3VudGVyIGFsc28gZHJv cHMgdG8gMCB0aG91Z2guCgpZZXMsIHRoYXQgYmVoYXZpb3IgaXMgaW50ZW5kZWQ6ICBUaGUgR1BV IGRldmljZSBpcyBrZXB0IHJlc3VtZWQgYXMKbG9uZyBhcyBpdCBoYXMgYW4gYWN0aXZlIGNydGMs IGFuZCBpdCBoYXMgYW4gYWN0aXZlIGNydGMgaWYgaXQncwp1c2VkIGFzIHRleHQgY29uc29sZS4K Cgo+IElzc3VlIDIgLSBSUE0gY291bnRlciBmb3IgYXVkaW8gZnVuY3Rpb24gZHJvcHMgYmVsb3cg MCBvbiBzeXN0ZW0gc2xlZXAuCj4gV2hlbiBib3RoIG5vdXZlYXUgYW5kIHNuZC1oZGEtaW50ZWwg YXJlIGxvYWRlZCBhbmQgYSBIRE1JIChvciBEUD8pIGNhYmxlCj4gaXMgY29ubmVjdGVkLCB0aGUg UlBNIGNvdW50ZXIgYmVjb21lcyBvbmUgYWZ0ZXIgc3VzcGVuZC9yZXN1bWUuIFRoaXMKPiBoYXBw ZW5zIGJvdGggd2l0aCB0ZXh0IGNvbnNvbGUgYW5kIFhvcmcuCgpXaGljaCBSUE0gY291bnRlciBi ZWNvbWVzIG9uZT8gIFRoYXQgb2YgdGhlIEdQVT8gIElmIHNvLCBpdCB3b3VsZCBiZQpjYXVzZWQg YnkgdGhlIEdQVSBhY3RpdmF0aW5nIGEgY3J0YyBvbiBob3RwbHVnIHRvIGxpZ2h0IHVwIHRoZSBk aXNwbGF5LApoZW5jZSBzdGF5aW5nIHJlc3VtZWQuCgpJIGRvbid0IHF1aXRlIHVuZGVyc3RhbmQg d2hhdCB5b3UgbWVhbiBieSAiUlBNIGNvdW50ZXIgZm9yIGF1ZGlvCmZ1bmN0aW9uIGRyb3BzIGJl bG93IDAgb24gc3lzdGVtIHNsZWVwIi4gIEkndmUgZ29uZSB0aHJvdWdoIHRoZSBIREEKY29kZSBh bmQgZG9uJ3Qgc2VlIGFuIHVuYmFsYW5jZWQgcG1fcnVudGltZV9nZXQgLyBfcHV0LiAgSG93ZXZl ciB0aGUKUE0gY29yZSBjaGFuZ2VzIHRoZSB1c2FnZSBjb3VudCBhIGNvdXBsZSBvZiB0aW1lcyBv dmVyIGEgc3lzdGVtIHNsZWVwCmN5Y2xlIGJ5IGFjcXVpcmluZy9yZWxlYXNpbmcgYSBydW50aW1l IFBNIHJlZiBvciBlbmFibGluZy9kaXNhYmxpbmcKcnVudGltZSBQTSAoc2VlIGRyaXZlcnMvYmFz ZS9wb3dlci9tYWluLmMpLCBtYXliZSB0aGF0J3Mgd2hhdCB5b3UKb2JzZXJ2ZWQuCgoKPiBJc3N1 ZSAzIC0gaW52YWxpZCBQQ0kgY29uZmlnIHJlYWRzIHRvIGF1ZGlvIGRldmljZSBpZiBkaXNjb25u ZWN0ZWQuCj4gV2hlbiBubyBIRE1JL0RQIGNhYmxlIGlzIGNvbm5lY3RlZCwgdGhlIEhETUkgYXVk aW8gZnVuY3Rpb24gd2lsbCBiZQo+IGluYWNjZXNzaWJsZSBhZnRlciBydW50aW1lL3N5c3RlbSBy ZXN1bWUuIEFzc3VtZSBub3V2ZWF1IGxvYWRlZCBiZWZvcmUKPiBzL3IsIHRoZW4gbG9hZGluZyBz bmQtaGRhLWludGVsIHdpbGwgZmFpbCB3aXRoOgo+IAo+ICAgICBoZGF1ZGlvIGhkYXVkaW9DMUQw OiBubyBBRkcgb3IgTUZHIG5vZGUgZm91bmQKPiAgICAgaGRhdWRpbyBoZGF1ZGlvQzFEMTogbm8g QUZHIG9yIE1GRyBub2RlIGZvdW5kCj4gICAgIGhkYXVkaW8gaGRhdWRpb0MxRDI6IG5vIEFGRyBv ciBNRkcgbm9kZSBmb3VuZAo+ICAgICBoZGF1ZGlvIGhkYXVkaW9DMUQzOiBubyBBRkcgb3IgTUZH IG5vZGUgZm91bmQKPiAgICAgaGRhdWRpbyBoZGF1ZGlvQzFENDogbm8gQUZHIG9yIE1GRyBub2Rl IGZvdW5kCj4gICAgIGhkYXVkaW8gaGRhdWRpb0MxRDU6IG5vIEFGRyBvciBNRkcgbm9kZSBmb3Vu ZAo+ICAgICBoZGF1ZGlvIGhkYXVkaW9DMUQ2OiBubyBBRkcgb3IgTUZHIG5vZGUgZm91bmQKPiAg ICAgaGRhdWRpbyBoZGF1ZGlvQzFENzogbm8gQUZHIG9yIE1GRyBub2RlIGZvdW5kCj4gICAgIHNu ZF9oZGFfaW50ZWwgMDAwMDowMTowMC4xOiBubyBjb2RlY3MgaW5pdGlhbGl6ZWQKCk9rYXksIHRo YXQncyByZWFsbHkgYmFkLCBidXQgaXQgYXBwZWFycyB0byBiZSBjYXVzZWQgYnkgdGhlIEJJT1MK aGlkaW5nIHRoZSBhdWRpbyBmdW5jdGlvbiBvbiByZXN1bWUgaWYgbm8gY2FibGUgaXMgY29ubmVj dGVkLgpJJ3ZlIGF0dGFjaGVkIDMgcGF0Y2hlcyB0byB0aGlzIGJ1Z3ppbGxhIHRvIGZpeCB0aGlz IGlzc3VlOgpodHRwczovL2J1Z3MuZnJlZWRlc2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk4 NQoKSSd2ZSBleHRlbnNpdmVseSB0ZXN0ZWQgc3lzdGVtIHNsZWVwIGluIGNvbmp1bmN0aW9uIHdp dGggdGhlCnN3aXRjaGVyb29fZGV2bGluayBwYXRjaGVzIGFuZCB0aGUgYWJvdmUgbmV2ZXIgb2Nj dXJyZWQgb24gbXkKbWFjaGluZSBiZWNhdXNlIHRoZSBhdWRpbyBmdW5jdGlvbiBpcyBuZXZlciBo aWRkZW4uCgpJIGRvbid0IGNvbnNpZGVyIHRoaXMgaXNzdWUgYSBibG9ja2VyIGZvciB0aGUgc3dp dGNoZXJvb19kZXZsaW5rCnBhdGNoZXMgYmVjYXVzZSBJIHdvdWxkIGV4cGVjdCBpdCB0byBvY2N1 ciByZWdhcmRsZXNzLiAgUXVpdGUgdG8KdGhlIGNvbnRyYXJ5LCB0aGUgc3dpdGNoZXJvb19kZXZs aW5rIHBhdGNoZXMgYXJlIGEgcmVxdWlyZW1lbnQgdG8KZml4IHRoZSBpc3N1ZSBiZWNhdXNlIHRo ZSBhdWRpbyBmdW5jdGlvbiBuZWVkcyB0byBiZSBleHBvc2VkCmVpdGhlciBmcm9tIHRoZSBHUFUg ZHJpdmVyIG9yIGEgUENJIHF1aXJrIGFwcGxpZWQgdG8gdGhlIEdQVSwKYW5kIHRoZSBhdWRpbyBm dW5jdGlvbiBuZWVkcyB0byBkZWxheSByZXN1bWUgdW50aWwgdGhhdCBoYXMKaGFwcGVuZWQsIHdo aWNoIGlzIGFjaGlldmVkIGJ5IHRoZSBkZXZpY2UgbGluay4KCgo+IElzc3VlIDQgLSBydW50aW1l X2FjdGl2ZV9raWRzIGxlYWsgd2l0aCBhdWRpbyBmdW5jdGlvbi4KPiBBZnRlciB0aGUgYWJvdmUg aXNzdWUsIHRoZSBhdWRpbyBkZXZpY2UgbmV2ZXIgZW50ZXJlZCB0aGUgc3VzcGVuZGVkCj4gc3Rh dGUgZXZlbiB0aG91Z2ggdGhlIHJ1bnRpbWVfdXNhZ2UgY291bnRlciByZWFjaGVkIDAuIEl0IHR1 cm5lZCBvdXQKPiB0aGF0IHJ1bnRpbWVfYWN0aXZlX2tpZHMgd2FzIDQuIEV2ZXJ5IHRpbWUgc25k LWhkYS1pbnRlbCBpcyBsb2FkZWQgKGFuZAo+IGZhaWxzIHRvIGluaXRpYWxpemUgZHVlIHRvIHRo ZSBhYm92ZSBpc3N1ZSksIHRoaXMgY291bnRlciBpcyBpbmNyZWFzZWQuCgpZZXMsIHRoZSBjb2Rl YyBkZXZpY2VzIGFyZSBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoZSBIREEgZGV2aWNlCmFuZCBr ZWVwIGl0IGF3YWtlIGJlY2F1c2UgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiAgVGhpcyB3b24ndCBv Y2N1cgpvbmNlIGlzc3VlIDMgaXMgZml4ZWQuCgoKPiBJc3N1ZSA1IC0gYXVkaW8gYnJlYWtzIGFm dGVyIHN5c3RlbSBzbGVlcCBvciBzdG9wcGluZyBYb3JnLgo+IFdoZW4gWG9yZyBpcyBzdG9wcGVk IG9yIHRoZSBzeXN0ZW0gc2xlZXAvcmVzdW1lcyB3aGlsZSBzcGVha2VyLXRlc3QgaXMKPiBhY3Rp dmUgKGUuZy4gaW4gR05VIHNjcmVlbiksIGF1ZGlvIHN0b3BzIHBsYXlpbmcgYW5kIHNwZWFrZXIt dGVzdCBleGl0cy4KClRoYXQgaXMgb2RkLCBJIGRvbid0IGhhdmUgYW4gZXhwbGFuYXRpb24gZm9y IHRoaXMgYnV0IHN1c3BlY3QgYSBidWcKaW4gdGhlIHNvdW5kIGNvZGUuCgoKPiBJc3N1ZSA2IC0g d3JvbmcgcGluIHN0YXR1cyByZXBvcnRlZCAvIG5vIGF1ZGlvCj4gKFBvc3NpYmx5ICJ3b3JraW5n IGFzIGV4cGVjdGVkIiBzaW5jZSBhdWRpbyBpcyB0aWVkIHRvIEdQVSBmdW5jdGlvbi4pCj4gU2Nl bmFyaW86IEhETUkgY2FibGUgaXMgY29ubmVjdGVkIGJ1dCBHUFUgaXMgdW51c2VkCj4gKCJlY2hv IG9mZiA+IC9zeXMvY2xhc3MvZHJtL2NhcmQxLUhETUktMS0xL3N0YXR1cyIgZnJvbSBjb25zb2xl IG9yCj4gd2l0aCAieHJhbmRyIC0tb3V0cHV0IEhETUktQS0xIC0tb2ZmIikuIGhkYWphY2tzZW5z ZXRlc3QgcmVwb3J0cyBubwo+IEhETUkgcGluIHByZXNlbmNlIGV2ZW4gaWYgY29ubmVjdGVkLCBk bWVzZyByZXBvcnRzOgo+IAo+ICAgICBub3V2ZWF1IDAwMDA6MDE6MDAuMDogRFJNOiBEREMgcmVz cG9uZGVkLCBidXQgbm8gRURJRCBmb3IgSERNSS1BLTEKCkludGVyZXN0aW5nLCBhbmQgeWVzLCB0 aGF0IHdvdWxkIHNlZW0gdG8gYmUgd29ya2luZyBhcyBleHBlY3RlZC4KCgo+IElzc3VlIDcgLSBu b3V2ZWF1OiB3YXJuaW5nIGFmdGVyIHVubG9hZGluZyBhZnRlciBzdG9wcGluZyBYb3JnCj4gKElz c3VlIGluIG5vdXZlYXUsIGxpa2VseSBub3QgcmVsYXRlZCB0byB0aGlzIHBhdGNoIHNldC4pCj4g QWZ0ZXIgInhyYW5kciAtLW91dHB1dCBIRE1JLTEtMSAtLW1vZGUgMjU2MHgxNDQwIiBpbiBYb3Jn LCBzdG9wcGluZyBYb3JnCj4gKGFuZCBwb3NzaWJseSAiZWNobyBvZmYgPiAvc3lzL2NsYXNzL2Ry bS9jYXJkMS1IRE1JLUEtMS9zdGF0dXMiKSwKPiByZW1vdmluZyBub3V2ZWF1IHRyaWdnZXJlZDoK PiAKPiAgICAgV0FSTklORzogQ1BVOiA3IFBJRDogNTQ3NSBhdCBkcml2ZXJzL2dwdS9kcm0vZHJt X21vZGVfY29uZmlnLmM6NDM5IGRybV9tb2RlX2NvbmZpZ19jbGVhbnVwKzB4MWZhLzB4MjYwCgpP a2F5LCB0aGUgZHJpdmVyIHdhcyB1bmxvYWRlZCB3aGlsZSB0aGUgY29ubmVjdG9yIHdhcyBzdGls bCBhY3RpdmUuCllvdSBzaG91bGQgYWxzbyBzZWUgYSAiY29ubmVjdG9yIEhETUktMS0xIGxlYWtl ZCEiIG1lc3NhZ2UgaW4gZG1lc2cuCkkgdGhvdWdodCBJIGhhZCBmaXhlZCB0aGlzIHR3byB5ZWFy cyBhZ28gd2l0aCBjb21taXQgNTIzODcyZjZiMDcyCigiZHJtL25vdXZlYXU6IFR1cm4gb2ZmIENS VENzIG9uIGRyaXZlciB1bmxvYWQiKS4gIEVpdGhlciB0aGF0IGNvbW1pdApkaWRuJ3Qgd29yayBh cyBpdCBzaG91bGQgb3IgdGhlIGlzc3VlIHJlYXBwZWFyZWQuICA6LSgKClNvIHllcywgaXQncyBh IGJ1ZywgYnV0IHVucmVsYXRlZCB0byB0aGUgc3dpdGNoZXJvb19kZXZsaW5rIHBhdGNoZXMuCgoK PiBJc3N1ZSA4IC0gYWNwaTogc2xlZXBpbmcgZnVuY3Rpb24gaW4gYXRvbWljIGNvbnRleHQuCj4g KElzc3VlIGlzIGxpa2VseSBub3QgcmVsYXRlZCB0byB0aGlzIHBhdGNoIHNldC4pCj4gQXQgc29t ZSBwb2ludCBJIGFsc28gZ290IGEgQlVHLCBub3V2ZWF1IHdhcyBhbHJlYWR5IHVubG9hZGVkIGFu ZCBJIHJhbjoKPiAiZWNobyAxIHwgdGVlIC9zeXMvYnVzL3BjaS9kZXZpY2VzLzAwMDA6MDE6MDAu ezAsMX0vcmVtb3ZlIgo+IAo+ICAgICBCVUc6IHNsZWVwaW5nIGZ1bmN0aW9uIGNhbGxlZCBmcm9t IGludmFsaWQgY29udGV4dCBhdCAvaG9tZS9wZXRlci9saW51eC9tbS9zbGFiLmg6NDE5CgpXb3cs IHRoYXQgd291bGQgc2VlbSB0byBiZSBhIGJ1ZyBpbiBBQ1BJIGNvZGUsIHNvcnJ5LCBJJ20gY2x1 ZWxlc3MKYWJvdXQgdGhhdCBvbmUuIDotKQoKT25jZSBhZ2FpbiB0aGFua3MgYW5kIGxldCBtZSBr bm93IGlmIHVuaGlkaW5nIHRoZSBhdWRpbyBmdW5jdGlvbgphcyBwZXIgdGhlIHBhdGNoZXMgSSBh dHRhY2hlZCB0byB0aGUgYWJvdmUtbGlua2VkIGJ1Z3ppbGxhIGZpeGVzCmlzc3VlIDMuCgpMdWth cwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOb3V2ZWF1 IG1haWxpbmcgbGlzdApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3Rz LmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZlYXUK