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.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE, SPF_PASS,T_DKIMWL_WL_HIGH,USER_AGENT_MUTT 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 4C666C04AB5 for ; Mon, 3 Jun 2019 18:10:31 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 008B2239C8 for ; Mon, 3 Jun 2019 18:10:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559585431; bh=8PZxrvRuljog68jeLWkBdzwKyB+Mp40kmJneyi+Sdu4=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=vIIeu55YdzIFRnDA/a9dxtYbPyrYBu8DAJbbV8uZc8HvmAH49GNq8fbBpW+7Ufw4C krrntqfTNJZ4xMqWWd02evUDX3BFjd0a7NTaVcoMCxVDb/kXQdK5jQAfpri76P5Ias rxd6C9hVEKq9bXr8zwq8DGgGXnnXMqVrgw3dAUug= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726427AbfFCSKa (ORCPT ); Mon, 3 Jun 2019 14:10:30 -0400 Received: from mail.kernel.org ([198.145.29.99]:58784 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726410AbfFCSKa (ORCPT ); Mon, 3 Jun 2019 14:10:30 -0400 Received: from localhost (unknown [69.71.4.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 70B0F22ADF; Mon, 3 Jun 2019 18:10:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1559585428; bh=8PZxrvRuljog68jeLWkBdzwKyB+Mp40kmJneyi+Sdu4=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=oj1IBADJ7ExF6qEUOYWHpGVGgO5EfipQDI/K4Gy5UoMh/YEfZGcVLsLlJ6sTzFkFA mmEgJef0+6D6MaBvpyH9AlIg39ATNEjcjPUD4kkMwlBE815UdLC2hyyKbBbjKqYjSb hKTG439S1f9xtB2ieJrtJ11gfwuK77HP6N4MXjes= Date: Mon, 3 Jun 2019 13:10:25 -0500 From: Bjorn Helgaas To: Karol Herbst Cc: nouveau , Lyude Paul , Linux PCI Subject: Re: [PATCH v2 4/4] pci: save the boot pcie link speed and restore it on fini Message-ID: <20190603181025.GD189360@google.com> References: <20190507201245.9295-5-kherbst@redhat.com> <20190520211933.GA57618@google.com> <20190521131033.GC57618@google.com> <20190521141317.GD57618@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Mon, Jun 03, 2019 at 03:18:56PM +0200, Karol Herbst wrote: > @bjorn: any further ideas? Otherwise I'd like to just go ahead and fix > this issue inside Nouveau and leave it there until we have a better > understanding or non Nouveau cases of this issue. Nope, I have no more ideas. > On Tue, May 21, 2019 at 7:48 PM Karol Herbst wrote: > > > > doing the same on the bridge controller with my workarounds applied: > > > > please note some differences: > > LnkSta: Speed 8GT/s (ok) vs Speed 2.5GT/s (downgraded) > > SltSta: PresDet+ vs PresDet- > > LnkSta2: Equalization stuff > > Virtual channel: NegoPending- vs NegoPending+ > > > > both times I executed lspci while the GPU was still suspended. > > > > 00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th > > Gen Core Processor PCIe Controller (x16) (rev 05) (prog-if 00 [Normal > > decode]) > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > > ParErr- Stepping- SERR- FastB2B- DisINTx- > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > SERR- > Latency: 0 > > Interrupt: pin A routed to IRQ 16 > > Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 > > I/O behind bridge: 0000e000-0000efff [size=4K] > > Memory behind bridge: ec000000-ed0fffff [size=17M] > > Prefetchable memory behind bridge: > > 00000000c0000000-00000000d1ffffff [size=288M] > > Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > BridgeCtl: Parity- SERR- NoISA- VGA- VGA16+ MAbort- >Reset- FastB2B- > > PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- > > Capabilities: [88] Subsystem: Dell Device 07be > > Capabilities: [80] Power Management version 3 > > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA > > PME(D0+,D1-,D2-,D3hot+,D3cold+) > > Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME- > > Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit- > > Address: 00000000 Data: 0000 > > Capabilities: [a0] Express (v2) Root Port (Slot+), MSI 00 > > DevCap: MaxPayload 256 bytes, PhantFunc 0 > > ExtTag- RBE+ > > DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq- > > RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- > > MaxPayload 256 bytes, MaxReadReq 128 bytes > > DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- > > AuxPwr- TransPend- > > LnkCap: Port #2, Speed 8GT/s, Width x16, ASPM L0s L1, > > Exit Latency L0s <256ns, L1 <8us > > ClockPM- Surprise- LLActRep- BwNot+ ASPMOptComp+ > > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+ > > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > > LnkSta: Speed 8GT/s (ok), Width x16 (ok) > > TrErr- Train- SlotClk+ DLActive- BWMgmt+ ABWMgmt+ > > SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- > > HotPlug- Surprise- > > Slot #1, PowerLimit 75.000W; Interlock- NoCompl+ > > SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- > > CmdCplt- HPIrq- LinkChg- > > Control: AttnInd Unknown, PwrInd Unknown, > > Power- Interlock- > > SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- > > PresDet+ Interlock- > > Changed: MRL- PresDet+ LinkState- > > RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- > > PMEIntEna- CRSVisible- > > RootCap: CRSVisible- > > RootSta: PME ReqID 0000, PMEStatus- PMEPending- > > DevCap2: Completion Timeout: Not Supported, > > TimeoutDis-, LTR+, OBFF Via WAKE# ARIFwd- > > AtomicOpsCap: Routing- 32bit+ 64bit+ 128bitCAS+ > > DevCtl2: Completion Timeout: 50us to 50ms, > > TimeoutDis-, LTR+, OBFF Via WAKE# ARIFwd- > > AtomicOpsCtl: ReqEn- EgressBlck- > > LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis- > > Transmit Margin: Normal Operating Range, > > EnterModifiedCompliance- ComplianceSOS- > > Compliance De-emphasis: -6dB > > LnkSta2: Current De-emphasis Level: -6dB, > > EqualizationComplete+, EqualizationPhase1+ > > EqualizationPhase2+, EqualizationPhase3+, > > LinkEqualizationRequest- > > Capabilities: [100 v1] Virtual Channel > > Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 > > Arb: Fixed- WRR32- WRR64- WRR128- > > Ctrl: ArbSelect=Fixed > > Status: InProgress- > > VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- > > Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- > > Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=ff > > Status: NegoPending- InProgress- > > Capabilities: [140 v1] Root Complex Link > > Desc: PortNumber=02 ComponentID=01 EltType=Config > > Link0: Desc: TargetPort=00 TargetComponent=01 > > AssocRCRB- LinkType=MemMapped LinkValid+ > > Addr: 00000000fed19000 > > Capabilities: [d94 v1] Secondary PCI Express > > Kernel driver in use: pcieport > > 00: 86 80 01 19 07 00 10 00 05 00 04 06 00 00 81 00 > > 10: 00 00 00 00 00 00 00 00 00 01 01 00 e0 e0 00 20 > > 20: 00 ec 00 ed 01 c0 f1 d1 00 00 00 00 00 00 00 00 > > 30: 00 00 00 00 88 00 00 00 00 00 00 00 ff 01 10 00 > > 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > 70: 00 00 00 00 00 00 00 00 00 62 17 00 00 00 00 0a > > 80: 01 90 03 c8 08 00 00 00 0d 80 00 00 28 10 be 07 > > 90: 05 a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > a0: 10 00 42 01 01 80 00 00 20 00 00 00 03 ad 61 02 > > b0: 40 00 03 d1 80 25 0c 00 00 00 48 00 00 00 00 00 > > c0: 00 00 00 00 80 0b 08 00 00 64 00 00 0e 00 00 00 > > d0: 43 00 1e 00 00 00 00 00 00 00 00 00 00 00 00 00 > > e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > f0: 00 00 00 84 4e 01 01 20 00 00 00 00 e0 00 10 00 > > > > On Tue, May 21, 2019 at 7:35 PM Karol Herbst wrote: > > > > > > was able to get the lspci prints via ssh. Machine rebooted > > > automatically each time though. > > > > > > relevant dmesg: > > > kernel: nouveau 0000:01:00.0: Refused to change power state, currently in D3 > > > kernel: nouveau 0000:01:00.0: Refused to change power state, currently in D3 > > > kernel: nouveau 0000:01:00.0: Refused to change power state, currently in D3 > > > kernel: nouveau 0000:01:00.0: tmr: stalled at ffffffffffffffff > > > > > > (last one is a 64 bit mmio read to get the on GPU timer value) > > > > > > # lspci -vvxxx -s 0:01.00 > > > 00:01.0 PCI bridge: Intel Corporation Xeon E3-1200 v5/E3-1500 v5/6th > > > Gen Core Processor PCIe Controller (x16) (rev 05) (prog-if 00 [Normal > > > decode]) > > > Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- > > > ParErr- Stepping- SERR- FastB2B- DisINTx- > > > Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > SERR- > > Latency: 0 > > > Interrupt: pin A routed to IRQ 16 > > > Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 > > > I/O behind bridge: 0000e000-0000efff [size=4K] > > > Memory behind bridge: ec000000-ed0fffff [size=17M] > > > Prefetchable memory behind bridge: > > > 00000000c0000000-00000000d1ffffff [size=288M] > > > Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- > > > > > BridgeCtl: Parity- SERR- NoISA- VGA- VGA16+ MAbort- >Reset- FastB2B- > > > PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- > > > Capabilities: [88] Subsystem: Dell Device 07be > > > Capabilities: [80] Power Management version 3 > > > Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA > > > PME(D0+,D1-,D2-,D3hot+,D3cold+) > > > Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME- > > > Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit- > > > Address: 00000000 Data: 0000 > > > Capabilities: [a0] Express (v2) Root Port (Slot+), MSI 00 > > > DevCap: MaxPayload 256 bytes, PhantFunc 0 > > > ExtTag- RBE+ > > > DevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq- > > > RlxdOrd- ExtTag- PhantFunc- AuxPwr- NoSnoop- > > > MaxPayload 256 bytes, MaxReadReq 128 bytes > > > DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- > > > AuxPwr- TransPend- > > > LnkCap: Port #2, Speed 8GT/s, Width x16, ASPM L0s L1, > > > Exit Latency L0s <256ns, L1 <8us > > > ClockPM- Surprise- LLActRep- BwNot+ ASPMOptComp+ > > > LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk+ > > > ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt- > > > LnkSta: Speed 2.5GT/s (downgraded), Width x16 (ok) > > > TrErr- Train- SlotClk+ DLActive- BWMgmt+ ABWMgmt+ > > > SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- > > > HotPlug- Surprise- > > > Slot #1, PowerLimit 75.000W; Interlock- NoCompl+ > > > SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- > > > HPIrq- LinkChg- > > > Control: AttnInd Unknown, PwrInd Unknown, > > > Power- Interlock- > > > SltSta: Status: AttnBtn- PowerFlt- MRL- CmdCplt- > > > PresDet- Interlock- > > > Changed: MRL- PresDet+ LinkState- > > > RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- > > > PMEIntEna- CRSVisible- > > > RootCap: CRSVisible- > > > RootSta: PME ReqID 0000, PMEStatus- PMEPending- > > > DevCap2: Completion Timeout: Not Supported, > > > TimeoutDis-, LTR+, OBFF Via WAKE# ARIFwd- > > > AtomicOpsCap: Routing- 32bit+ 64bit+ 128bitCAS+ > > > DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, > > > LTR+, OBFF Via WAKE# ARIFwd- > > > AtomicOpsCtl: ReqEn- EgressBlck- > > > LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis- > > > Transmit Margin: Normal Operating Range, > > > EnterModifiedCompliance- ComplianceSOS- > > > Compliance De-emphasis: -6dB > > > LnkSta2: Current De-emphasis Level: -6dB, > > > EqualizationComplete-, EqualizationPhase1- > > > EqualizationPhase2-, EqualizationPhase3-, > > > LinkEqualizationRequest- > > > Capabilities: [100 v1] Virtual Channel > > > Caps: LPEVC=0 RefClk=100ns PATEntryBits=1 > > > Arb: Fixed- WRR32- WRR64- WRR128- > > > Ctrl: ArbSelect=Fixed > > > Status: InProgress- > > > VC0: Caps: PATOffset=00 MaxTimeSlots=1 RejSnoopTrans- > > > Arb: Fixed+ WRR32- WRR64- WRR128- TWRR128- WRR256- > > > Ctrl: Enable+ ID=0 ArbSelect=Fixed TC/VC=ff > > > Status: NegoPending+ InProgress- > > > Capabilities: [140 v1] Root Complex Link > > > Desc: PortNumber=02 ComponentID=01 EltType=Config > > > Link0: Desc: TargetPort=00 TargetComponent=01 > > > AssocRCRB- LinkType=MemMapped LinkValid+ > > > Addr: 00000000fed19000 > > > Capabilities: [d94 v1] Secondary PCI Express > > > Kernel driver in use: pcieport > > > 00: 86 80 01 19 07 00 10 00 05 00 04 06 00 00 81 00 > > > 10: 00 00 00 00 00 00 00 00 00 01 01 00 e0 e0 00 20 > > > 20: 00 ec 00 ed 01 c0 f1 d1 00 00 00 00 00 00 00 00 > > > 30: 00 00 00 00 88 00 00 00 00 00 00 00 ff 01 10 00 > > > 40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > > 50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > > 60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > > 70: 00 00 00 00 00 00 00 00 00 62 17 00 00 00 00 0a > > > 80: 01 90 03 c8 08 00 00 00 0d 80 00 00 28 10 be 07 > > > 90: 05 a0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > > a0: 10 00 42 01 01 80 00 00 20 00 00 00 03 ad 61 02 > > > b0: 40 00 01 d1 80 25 0c 00 00 00 08 00 00 00 00 00 > > > c0: 00 00 00 00 80 0b 08 00 00 64 00 00 0e 00 00 00 > > > d0: 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > > e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 > > > f0: 00 40 01 00 4e 01 01 22 00 00 00 00 e0 00 10 00 > > > > > > lspci -vvxxx -s 1:00.00 > > > 01:00.0 3D controller: NVIDIA Corporation GP107M [GeForce GTX 1050 > > > Mobile] (rev ff) (prog-if ff) > > > !!! Unknown header type 7f > > > Kernel driver in use: nouveau > > > Kernel modules: nouveau > > > 00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > 90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff > > > > > > On Tue, May 21, 2019 at 4:30 PM Karol Herbst wrote: > > > > > > > > On Tue, May 21, 2019 at 4:13 PM Bjorn Helgaas wrote: > > > > > > > > > > On Tue, May 21, 2019 at 03:28:48PM +0200, Karol Herbst wrote: > > > > > > On Tue, May 21, 2019 at 3:11 PM Bjorn Helgaas wrote: > > > > > > > On Tue, May 21, 2019 at 12:30:38AM +0200, Karol Herbst wrote: > > > > > > > > On Mon, May 20, 2019 at 11:20 PM Bjorn Helgaas wrote: > > > > > > > > > On Tue, May 07, 2019 at 10:12:45PM +0200, Karol Herbst wrote: > > > > > > > > > > Apperantly things go south if we suspend the device with a different PCIE > > > > > > > > > > link speed set than it got booted with. Fixes runtime suspend on my gp107. > > > > > > > > > > > > > > > > > > > > This all looks like some bug inside the pci subsystem and I would prefer a > > > > > > > > > > fix there instead of nouveau, but maybe there is no real nice way of doing > > > > > > > > > > that outside of drivers? > > > > > > > > > > > > > > > > > > I agree it would be nice to fix this in the PCI core if that's > > > > > > > > > feasible. > > > > > > > > > > > > > > > > > > It looks like this driver changes the PCIe link speed using some > > > > > > > > > device-specific mechanism. When we suspend, we put the device in > > > > > > > > > D3cold, so it loses all its state. When we resume, the link probably > > > > > > > > > comes up at the boot speed because nothing did that device-specific > > > > > > > > > magic to change it, so you probably end up with the link being slow > > > > > > > > > but the driver thinking it's configured to be fast, and maybe that > > > > > > > > > combination doesn't work. > > > > > > > > > > > > > > > > > > If it requires something device-specific to change that link speed, I > > > > > > > > > don't know how to put that in the PCI core. But maybe I'm missing > > > > > > > > > something? > > > > > > > > > > > > > > > > > > Per the PCIe spec (r4.0, sec 1.2): > > > > > > > > > > > > > > > > > > Initialization – During hardware initialization, each PCI Express > > > > > > > > > Link is set up following a negotiation of Lane widths and frequency > > > > > > > > > of operation by the two agents at each end of the Link. No firmware > > > > > > > > > or operating system software is involved. > > > > > > > > > > > > > > > > > > I have been assuming that this means device-specific link speed > > > > > > > > > management is out of spec, but it seems pretty common that devices > > > > > > > > > don't come up by themselves at the fastest possible link speed. So > > > > > > > > > maybe the spec just intends that devices can operate at *some* valid > > > > > > > > > speed. > > > > > > > > > > > > > > > > I would expect that devices kind of have to figure out what they can > > > > > > > > operate on and the operating system kind of just checks what the > > > > > > > > current state is and doesn't try to "restore" the old state or > > > > > > > > something? > > > > > > > > > > > > > > The devices at each end of the link negotiate the width and speed of > > > > > > > the link. This is done directly by the hardware without any help from > > > > > > > the OS. > > > > > > > > > > > > > > The OS can read the current link state (Current Link Speed and > > > > > > > Negotiated Link Width, both in the Link Status register). The OS has > > > > > > > very little control over that state. It can't directly restore the > > > > > > > state because the hardware has to negotiate a width & speed that > > > > > > > result in reliable operation. > > > > > > > > > > > > > > > We don't do anything in the driver after the device was suspended. And > > > > > > > > the 0x88000 is a mirror of the PCI config space, but we also got some > > > > > > > > PCIe stuff at 0x8c000 which is used by newer GPUs for gen3 stuff > > > > > > > > essentially. I have no idea how much of this is part of the actual pci > > > > > > > > standard and how much is driver specific. But the driver also wants to > > > > > > > > have some control over the link speed as it's tight to performance > > > > > > > > states on GPU. > > > > > > > > > > > > > > As far as I'm aware, there is no generic PCIe way for the OS to > > > > > > > influence the link width or speed. If the GPU driver needs to do > > > > > > > that, it would be via some device-specific mechanism. > > > > > > > > > > > > > > > The big issue here is just, that the GPU boots with 8.0, some on-gpu > > > > > > > > init mechanism decreases it to 2.5. If we suspend, the GPU or at least > > > > > > > > the communication with the controller is broken. But if we set it to > > > > > > > > the boot speed, resuming the GPU just works. So my assumption was, > > > > > > > > that _something_ (might it be the controller or the pci subsystem) > > > > > > > > tries to force to operate on an invalid link speed and because the > > > > > > > > bridge controller is actually powered down as well (as all children > > > > > > > > are in D3cold) I could imagine that something in the pci subsystem > > > > > > > > actually restores the state which lets the controller fail to > > > > > > > > establish communication again? > > > > > > > > > > > > > > 1) At boot-time, the Port and the GPU hardware negotiate 8.0 GT/s > > > > > > > without OS/driver intervention. > > > > > > > > > > > > > > 2) Some mechanism reduces link speed to 2.5 GT/s. This probably > > > > > > > requires driver intervention or at least some ACPI method. > > > > > > > > > > > > there is no driver intervention and Nouveau doesn't care at all. It's > > > > > > all done on the GPU. We just upload a script and some firmware on to > > > > > > the GPU. The script runs then on the PMU inside the GPU and this > > > > > > script also causes changing the PCIe link settings. But from a Nouveau > > > > > > point of view we don't care about the link before or after that script > > > > > > was invoked. Also there is no ACPI method involved. > > > > > > > > > > > > But if there is something we should notify pci core about, maybe > > > > > > that's something we have to do then? > > > > > > > > > > I don't think there's anything the PCI core could do with that > > > > > information anyway. The PCI core doesn't care at all about the link > > > > > speed, and it really can't influence it directly. > > > > > > > > > > > > 3) Suspend puts GPU into D3cold (powered off). > > > > > > > > > > > > > > 4) Resume restores GPU to D0, and the Port and GPU hardware again > > > > > > > negotiate 8.0 GT/s without OS/driver intervention, just like at > > > > > > > initial boot. > > > > > > > > > > > > No, that negotiation fails apparently as any attempt to read anything > > > > > > from the device just fails inside pci core. Or something goes wrong > > > > > > when resuming the bridge controller. > > > > > > > > > > I'm surprised the negotiation would fail even after a power cycle of > > > > > the device. But if you can avoid the issue by running another script > > > > > on the PMU before suspend, that's probably what you'll have to do. > > > > > > > > > > > > > there is none as far as we know. Or at least nothing inside the vbios. > > > > We still have to get signed PMU firmware images from Nvidia for full > > > > support, but this still would be a hacky issue as we would depend on > > > > those then (and without having those in redistributable form, there > > > > isn't much we can do about except fixing it on the kernel side). > > > > > > > > > > > 5) Now the driver thinks the GPU is at 2.5 GT/s but it's actually at > > > > > > > 8.0 GT/s. > > > > > > > > > > > > what is actually meant by "driver" here? The pci subsystem or Nouveau? > > > > > > > > > > I was thinking Nouveau because the PCI core doesn't care about the > > > > > link speed. > > > > > > > > > > > > Without knowing more about the transition to 2.5 GT/s, I can't guess > > > > > > > why the GPU wouldn't work after resume. From a PCIe point of view, > > > > > > > the link is supposed to work and the device should be reachable > > > > > > > independent of the link speed. But maybe there's some weird > > > > > > > dependency between the GPU and the driver here. > > > > > > > > > > > > but the device isn't reachable at all, not even from the pci > > > > > > subsystem. All reads fail/return a default error value (0xffffffff). > > > > > > > > > > Are these PCI config reads that return 0xffffffff? Or MMIO reads? > > > > > "lspci -vvxxxx" of the bridge and the GPU might have a clue about > > > > > whether a PCI error occurred. > > > > > > > > > > > > > that's kind of problematic as it might just lock up my machine... but > > > > let me try that. > > > > > > > > > > > It sounds like things work if you return to 8.0 GT/s before suspend, > > > > > > > things work. That would make sense to me because then the driver's > > > > > > > idea of the link state after resume would match the actual state. > > > > > > > > > > > > depends on what is meant by the driver here. Inside Nouveau we don't > > > > > > care one bit about the current link speed, so I assume you mean > > > > > > something inside the pci core code? > > > > > > > > > > > > > But I don't see a way to deal with this in the PCI core. The PCI core > > > > > > > does save and restore most of the architected config space around > > > > > > > suspend/resume, but since this appears to be a device-specific thing, > > > > > > > the PCI core would have no idea how to save/restore it. > > > > > > > > > > > > if we assume that the negotiation on a device level works as intended, > > > > > > then I would expect this to be a pci core issue, which might actually > > > > > > be not fixable there. But if it's not, then we would have to put > > > > > > something like that inside the runpm documentation to tell drivers > > > > > > they have to do something about it. > > > > > >lspci -vvxxxx > > > > > > But again, for me it just sounds like the negotiation on the device > > > > > > level fails or something inside pci core messes it up. > > > > > > > > > > To me it sounds like the PMU script messed something up, and the PCI > > > > > core has no way to know what that was or how to fix it. > > > > > > > > > > > > > sure, I am mainly wondering why it doesn't work after we power cycled > > > > the GPU and the host bridge controller, because no matter what the > > > > state was before, we have to reprobe instead of relying on a known > > > > state, no? > > > > > > > > > > > > > > Signed-off-by: Karol Herbst > > > > > > > > > > Reviewed-by: Lyude Paul > > > > > > > > > > --- > > > > > > > > > > drm/nouveau/include/nvkm/subdev/pci.h | 5 +++-- > > > > > > > > > > drm/nouveau/nvkm/subdev/pci/base.c | 9 +++++++-- > > > > > > > > > > drm/nouveau/nvkm/subdev/pci/pcie.c | 24 ++++++++++++++++++++---- > > > > > > > > > > drm/nouveau/nvkm/subdev/pci/priv.h | 2 ++ > > > > > > > > > > 4 files changed, 32 insertions(+), 8 deletions(-) > > > > > > > > > > > > > > > > > > > > diff --git a/drm/nouveau/include/nvkm/subdev/pci.h b/drm/nouveau/include/nvkm/subdev/pci.h > > > > > > > > > > index 1fdf3098..b23793a2 100644 > > > > > > > > > > --- a/drm/nouveau/include/nvkm/subdev/pci.h > > > > > > > > > > +++ b/drm/nouveau/include/nvkm/subdev/pci.h > > > > > > > > > > @@ -26,8 +26,9 @@ struct nvkm_pci { > > > > > > > > > > } agp; > > > > > > > > > > > > > > > > > > > > struct { > > > > > > > > > > - enum nvkm_pcie_speed speed; > > > > > > > > > > - u8 width; > > > > > > > > > > + enum nvkm_pcie_speed cur_speed; > > > > > > > > > > + enum nvkm_pcie_speed def_speed; > > > > > > > > > > + u8 cur_width; > > > > > > > > > > } pcie; > > > > > > > > > > > > > > > > > > > > bool msi; > > > > > > > > > > diff --git a/drm/nouveau/nvkm/subdev/pci/base.c b/drm/nouveau/nvkm/subdev/pci/base.c > > > > > > > > > > index ee2431a7..d9fb5a83 100644 > > > > > > > > > > --- a/drm/nouveau/nvkm/subdev/pci/base.c > > > > > > > > > > +++ b/drm/nouveau/nvkm/subdev/pci/base.c > > > > > > > > > > @@ -90,6 +90,8 @@ nvkm_pci_fini(struct nvkm_subdev *subdev, bool suspend) > > > > > > > > > > > > > > > > > > > > if (pci->agp.bridge) > > > > > > > > > > nvkm_agp_fini(pci); > > > > > > > > > > + else if (pci_is_pcie(pci->pdev)) > > > > > > > > > > + nvkm_pcie_fini(pci); > > > > > > > > > > > > > > > > > > > > return 0; > > > > > > > > > > } > > > > > > > > > > @@ -100,6 +102,8 @@ nvkm_pci_preinit(struct nvkm_subdev *subdev) > > > > > > > > > > struct nvkm_pci *pci = nvkm_pci(subdev); > > > > > > > > > > if (pci->agp.bridge) > > > > > > > > > > nvkm_agp_preinit(pci); > > > > > > > > > > + else if (pci_is_pcie(pci->pdev)) > > > > > > > > > > + nvkm_pcie_preinit(pci); > > > > > > > > > > return 0; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > @@ -193,8 +197,9 @@ nvkm_pci_new_(const struct nvkm_pci_func *func, struct nvkm_device *device, > > > > > > > > > > pci->func = func; > > > > > > > > > > pci->pdev = device->func->pci(device)->pdev; > > > > > > > > > > pci->irq = -1; > > > > > > > > > > - pci->pcie.speed = -1; > > > > > > > > > > - pci->pcie.width = -1; > > > > > > > > > > + pci->pcie.cur_speed = -1; > > > > > > > > > > + pci->pcie.def_speed = -1; > > > > > > > > > > + pci->pcie.cur_width = -1; > > > > > > > > > > > > > > > > > > > > if (device->type == NVKM_DEVICE_AGP) > > > > > > > > > > nvkm_agp_ctor(pci); > > > > > > > > > > diff --git a/drm/nouveau/nvkm/subdev/pci/pcie.c b/drm/nouveau/nvkm/subdev/pci/pcie.c > > > > > > > > > > index 70ccbe0d..731dd30e 100644 > > > > > > > > > > --- a/drm/nouveau/nvkm/subdev/pci/pcie.c > > > > > > > > > > +++ b/drm/nouveau/nvkm/subdev/pci/pcie.c > > > > > > > > > > @@ -85,6 +85,13 @@ nvkm_pcie_oneinit(struct nvkm_pci *pci) > > > > > > > > > > return 0; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > +int > > > > > > > > > > +nvkm_pcie_preinit(struct nvkm_pci *pci) > > > > > > > > > > +{ > > > > > > > > > > + pci->pcie.def_speed = nvkm_pcie_get_speed(pci); > > > > > > > > > > + return 0; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > int > > > > > > > > > > nvkm_pcie_init(struct nvkm_pci *pci) > > > > > > > > > > { > > > > > > > > > > @@ -105,12 +112,21 @@ nvkm_pcie_init(struct nvkm_pci *pci) > > > > > > > > > > if (pci->func->pcie.init) > > > > > > > > > > pci->func->pcie.init(pci); > > > > > > > > > > > > > > > > > > > > - if (pci->pcie.speed != -1) > > > > > > > > > > - nvkm_pcie_set_link(pci, pci->pcie.speed, pci->pcie.width); > > > > > > > > > > + if (pci->pcie.cur_speed != -1) > > > > > > > > > > + nvkm_pcie_set_link(pci, pci->pcie.cur_speed, > > > > > > > > > > + pci->pcie.cur_width); > > > > > > > > > > > > > > > > > > > > return 0; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > +int > > > > > > > > > > +nvkm_pcie_fini(struct nvkm_pci *pci) > > > > > > > > > > +{ > > > > > > > > > > + if (!IS_ERR_VALUE(pci->pcie.def_speed)) > > > > > > > > > > + return nvkm_pcie_set_link(pci, pci->pcie.def_speed, 16); > > > > > > > > > > + return 0; > > > > > > > > > > +} > > > > > > > > > > + > > > > > > > > > > int > > > > > > > > > > nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width) > > > > > > > > > > { > > > > > > > > > > @@ -146,8 +162,8 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width) > > > > > > > > > > speed = max_speed; > > > > > > > > > > } > > > > > > > > > > > > > > > > > > > > - pci->pcie.speed = speed; > > > > > > > > > > - pci->pcie.width = width; > > > > > > > > > > + pci->pcie.cur_speed = speed; > > > > > > > > > > + pci->pcie.cur_width = width; > > > > > > > > > > > > > > > > > > > > if (speed == cur_speed) { > > > > > > > > > > nvkm_debug(subdev, "requested matches current speed\n"); > > > > > > > > > > diff --git a/drm/nouveau/nvkm/subdev/pci/priv.h b/drm/nouveau/nvkm/subdev/pci/priv.h > > > > > > > > > > index a0d4c007..e7744671 100644 > > > > > > > > > > --- a/drm/nouveau/nvkm/subdev/pci/priv.h > > > > > > > > > > +++ b/drm/nouveau/nvkm/subdev/pci/priv.h > > > > > > > > > > @@ -60,5 +60,7 @@ enum nvkm_pcie_speed gk104_pcie_max_speed(struct nvkm_pci *); > > > > > > > > > > int gk104_pcie_version_supported(struct nvkm_pci *); > > > > > > > > > > > > > > > > > > > > int nvkm_pcie_oneinit(struct nvkm_pci *); > > > > > > > > > > +int nvkm_pcie_preinit(struct nvkm_pci *); > > > > > > > > > > int nvkm_pcie_init(struct nvkm_pci *); > > > > > > > > > > +int nvkm_pcie_fini(struct nvkm_pci *); > > > > > > > > > > #endif > > > > > > > > > > -- > > > > > > > > > > 2.21.0 > > > > > > > > > > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bjorn Helgaas Subject: Re: [PATCH v2 4/4] pci: save the boot pcie link speed and restore it on fini Date: Mon, 3 Jun 2019 13:10:25 -0500 Message-ID: <20190603181025.GD189360@google.com> References: <20190507201245.9295-5-kherbst@redhat.com> <20190520211933.GA57618@google.com> <20190521131033.GC57618@google.com> <20190521141317.GD57618@google.com> 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: Karol Herbst Cc: nouveau , Linux PCI List-Id: nouveau.vger.kernel.org T24gTW9uLCBKdW4gMDMsIDIwMTkgYXQgMDM6MTg6NTZQTSArMDIwMCwgS2Fyb2wgSGVyYnN0IHdy b3RlOgo+IEBiam9ybjogYW55IGZ1cnRoZXIgaWRlYXM/IE90aGVyd2lzZSBJJ2QgbGlrZSB0byBq dXN0IGdvIGFoZWFkIGFuZCBmaXgKPiB0aGlzIGlzc3VlIGluc2lkZSBOb3V2ZWF1IGFuZCBsZWF2 ZSBpdCB0aGVyZSB1bnRpbCB3ZSBoYXZlIGEgYmV0dGVyCj4gdW5kZXJzdGFuZGluZyBvciBub24g Tm91dmVhdSBjYXNlcyBvZiB0aGlzIGlzc3VlLgoKTm9wZSwgSSBoYXZlIG5vIG1vcmUgaWRlYXMu Cgo+IE9uIFR1ZSwgTWF5IDIxLCAyMDE5IGF0IDc6NDggUE0gS2Fyb2wgSGVyYnN0IDxraGVyYnN0 QHJlZGhhdC5jb20+IHdyb3RlOgo+ID4KPiA+IGRvaW5nIHRoZSBzYW1lIG9uIHRoZSBicmlkZ2Ug Y29udHJvbGxlciB3aXRoIG15IHdvcmthcm91bmRzIGFwcGxpZWQ6Cj4gPgo+ID4gcGxlYXNlIG5v dGUgc29tZSBkaWZmZXJlbmNlczoKPiA+IExua1N0YTogU3BlZWQgOEdUL3MgKG9rKSB2cyBTcGVl ZCAyLjVHVC9zIChkb3duZ3JhZGVkKQo+ID4gU2x0U3RhOiBQcmVzRGV0KyB2cyBQcmVzRGV0LQo+ ID4gTG5rU3RhMjogRXF1YWxpemF0aW9uIHN0dWZmCj4gPiBWaXJ0dWFsIGNoYW5uZWw6IE5lZ29Q ZW5kaW5nLSB2cyBOZWdvUGVuZGluZysKPiA+Cj4gPiBib3RoIHRpbWVzIEkgZXhlY3V0ZWQgbHNw Y2kgd2hpbGUgdGhlIEdQVSB3YXMgc3RpbGwgc3VzcGVuZGVkLgo+ID4KPiA+IDAwOjAxLjAgUENJ IGJyaWRnZTogSW50ZWwgQ29ycG9yYXRpb24gWGVvbiBFMy0xMjAwIHY1L0UzLTE1MDAgdjUvNnRo Cj4gPiBHZW4gQ29yZSBQcm9jZXNzb3IgUENJZSBDb250cm9sbGVyICh4MTYpIChyZXYgMDUpIChw cm9nLWlmIDAwIFtOb3JtYWwKPiA+IGRlY29kZV0pCj4gPiAgICAgICAgIENvbnRyb2w6IEkvTysg TWVtKyBCdXNNYXN0ZXIrIFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtCj4gPiBQYXJFcnIt IFN0ZXBwaW5nLSBTRVJSLSBGYXN0QjJCLSBEaXNJTlR4LQo+ID4gICAgICAgICBTdGF0dXM6IENh cCsgNjZNSHotIFVERi0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LQo+ID4g PFRBYm9ydC0gPE1BYm9ydC0gPlNFUlItIDxQRVJSLSBJTlR4LQo+ID4gICAgICAgICBMYXRlbmN5 OiAwCj4gPiAgICAgICAgIEludGVycnVwdDogcGluIEEgcm91dGVkIHRvIElSUSAxNgo+ID4gICAg ICAgICBCdXM6IHByaW1hcnk9MDAsIHNlY29uZGFyeT0wMSwgc3Vib3JkaW5hdGU9MDEsIHNlYy1s YXRlbmN5PTAKPiA+ICAgICAgICAgSS9PIGJlaGluZCBicmlkZ2U6IDAwMDBlMDAwLTAwMDBlZmZm IFtzaXplPTRLXQo+ID4gICAgICAgICBNZW1vcnkgYmVoaW5kIGJyaWRnZTogZWMwMDAwMDAtZWQw ZmZmZmYgW3NpemU9MTdNXQo+ID4gICAgICAgICBQcmVmZXRjaGFibGUgbWVtb3J5IGJlaGluZCBi cmlkZ2U6Cj4gPiAwMDAwMDAwMGMwMDAwMDAwLTAwMDAwMDAwZDFmZmZmZmYgW3NpemU9Mjg4TV0K PiA+ICAgICAgICAgU2Vjb25kYXJ5IHN0YXR1czogNjZNSHotIEZhc3RCMkItIFBhckVyci0gREVW U0VMPWZhc3QgPlRBYm9ydC0KPiA+IDxUQWJvcnQtIDxNQWJvcnQrIDxTRVJSLSA8UEVSUi0KPiA+ ICAgICAgICAgQnJpZGdlQ3RsOiBQYXJpdHktIFNFUlItIE5vSVNBLSBWR0EtIFZHQTE2KyBNQWJv cnQtID5SZXNldC0gRmFzdEIyQi0KPiA+ICAgICAgICAgICAgICAgICBQcmlEaXNjVG1yLSBTZWNE aXNjVG1yLSBEaXNjVG1yU3RhdC0gRGlzY1RtclNFUlJFbi0KPiA+ICAgICAgICAgQ2FwYWJpbGl0 aWVzOiBbODhdIFN1YnN5c3RlbTogRGVsbCBEZXZpY2UgMDdiZQo+ID4gICAgICAgICBDYXBhYmls aXRpZXM6IFs4MF0gUG93ZXIgTWFuYWdlbWVudCB2ZXJzaW9uIDMKPiA+ICAgICAgICAgICAgICAg ICBGbGFnczogUE1FQ2xrLSBEU0ktIEQxLSBEMi0gQXV4Q3VycmVudD0wbUEKPiA+IFBNRShEMCss RDEtLEQyLSxEM2hvdCssRDNjb2xkKykKPiA+ICAgICAgICAgICAgICAgICBTdGF0dXM6IEQwIE5v U29mdFJzdCsgUE1FLUVuYWJsZS0gRFNlbD0wIERTY2FsZT0wIFBNRS0KPiA+ICAgICAgICAgQ2Fw YWJpbGl0aWVzOiBbOTBdIE1TSTogRW5hYmxlLSBDb3VudD0xLzEgTWFza2FibGUtIDY0Yml0LQo+ ID4gICAgICAgICAgICAgICAgIEFkZHJlc3M6IDAwMDAwMDAwICBEYXRhOiAwMDAwCj4gPiAgICAg ICAgIENhcGFiaWxpdGllczogW2EwXSBFeHByZXNzICh2MikgUm9vdCBQb3J0IChTbG90KyksIE1T SSAwMAo+ID4gICAgICAgICAgICAgICAgIERldkNhcDogTWF4UGF5bG9hZCAyNTYgYnl0ZXMsIFBo YW50RnVuYyAwCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBFeHRUYWctIFJCRSsKPiA+ICAg ICAgICAgICAgICAgICBEZXZDdGw6IENvcnJFcnItIE5vbkZhdGFsRXJyLSBGYXRhbEVyci0gVW5z dXBSZXEtCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBSbHhkT3JkLSBFeHRUYWctIFBoYW50 RnVuYy0gQXV4UHdyLSBOb1Nub29wLQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgTWF4UGF5 bG9hZCAyNTYgYnl0ZXMsIE1heFJlYWRSZXEgMTI4IGJ5dGVzCj4gPiAgICAgICAgICAgICAgICAg RGV2U3RhOiBDb3JyRXJyLSBOb25GYXRhbEVyci0gRmF0YWxFcnItIFVuc3VwUmVxLQo+ID4gQXV4 UHdyLSBUcmFuc1BlbmQtCj4gPiAgICAgICAgICAgICAgICAgTG5rQ2FwOiBQb3J0ICMyLCBTcGVl ZCA4R1QvcywgV2lkdGggeDE2LCBBU1BNIEwwcyBMMSwKPiA+IEV4aXQgTGF0ZW5jeSBMMHMgPDI1 Nm5zLCBMMSA8OHVzCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBDbG9ja1BNLSBTdXJwcmlz ZS0gTExBY3RSZXAtIEJ3Tm90KyBBU1BNT3B0Q29tcCsKPiA+ICAgICAgICAgICAgICAgICBMbmtD dGw6IEFTUE0gRGlzYWJsZWQ7IFJDQiA2NCBieXRlcyBEaXNhYmxlZC0gQ29tbUNsaysKPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgIEV4dFN5bmNoLSBDbG9ja1BNLSBBdXRXaWREaXMtIEJXSW50 LSBBdXRCV0ludC0KPiA+ICAgICAgICAgICAgICAgICBMbmtTdGE6IFNwZWVkIDhHVC9zIChvayks IFdpZHRoIHgxNiAob2spCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBUckVyci0gVHJhaW4t IFNsb3RDbGsrIERMQWN0aXZlLSBCV01nbXQrIEFCV01nbXQrCj4gPiAgICAgICAgICAgICAgICAg U2x0Q2FwOiBBdHRuQnRuLSBQd3JDdHJsLSBNUkwtIEF0dG5JbmQtIFB3ckluZC0KPiA+IEhvdFBs dWctIFN1cnByaXNlLQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgU2xvdCAjMSwgUG93ZXJM aW1pdCA3NS4wMDBXOyBJbnRlcmxvY2stIE5vQ29tcGwrCj4gPiAgICAgICAgICAgICAgICAgU2x0 Q3RsOiBFbmFibGU6IEF0dG5CdG4tIFB3ckZsdC0gTVJMLSBQcmVzRGV0LQo+ID4gQ21kQ3BsdC0g SFBJcnEtIExpbmtDaGctCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sOiBBdHRu SW5kIFVua25vd24sIFB3ckluZCBVbmtub3duLAo+ID4gUG93ZXItIEludGVybG9jay0KPiA+ICAg ICAgICAgICAgICAgICBTbHRTdGE6IFN0YXR1czogQXR0bkJ0bi0gUG93ZXJGbHQtIE1STC0gQ21k Q3BsdC0KPiA+IFByZXNEZXQrIEludGVybG9jay0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAg IENoYW5nZWQ6IE1STC0gUHJlc0RldCsgTGlua1N0YXRlLQo+ID4gICAgICAgICAgICAgICAgIFJv b3RDdGw6IEVyckNvcnJlY3RhYmxlLSBFcnJOb24tRmF0YWwtIEVyckZhdGFsLQo+ID4gUE1FSW50 RW5hLSBDUlNWaXNpYmxlLQo+ID4gICAgICAgICAgICAgICAgIFJvb3RDYXA6IENSU1Zpc2libGUt Cj4gPiAgICAgICAgICAgICAgICAgUm9vdFN0YTogUE1FIFJlcUlEIDAwMDAsIFBNRVN0YXR1cy0g UE1FUGVuZGluZy0KPiA+ICAgICAgICAgICAgICAgICBEZXZDYXAyOiBDb21wbGV0aW9uIFRpbWVv dXQ6IE5vdCBTdXBwb3J0ZWQsCj4gPiBUaW1lb3V0RGlzLSwgTFRSKywgT0JGRiBWaWEgV0FLRSMg QVJJRndkLQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09wc0NhcDogUm91dGlu Zy0gMzJiaXQrIDY0Yml0KyAxMjhiaXRDQVMrCj4gPiAgICAgICAgICAgICAgICAgRGV2Q3RsMjog Q29tcGxldGlvbiBUaW1lb3V0OiA1MHVzIHRvIDUwbXMsCj4gPiBUaW1lb3V0RGlzLSwgTFRSKywg T0JGRiBWaWEgV0FLRSMgQVJJRndkLQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21p Y09wc0N0bDogUmVxRW4tIEVncmVzc0JsY2stCj4gPiAgICAgICAgICAgICAgICAgTG5rQ3RsMjog VGFyZ2V0IExpbmsgU3BlZWQ6IDhHVC9zLCBFbnRlckNvbXBsaWFuY2UtIFNwZWVkRGlzLQo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbWl0IE1hcmdpbjogTm9ybWFsIE9wZXJhdGlu ZyBSYW5nZSwKPiA+IEVudGVyTW9kaWZpZWRDb21wbGlhbmNlLSBDb21wbGlhbmNlU09TLQo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsaWFuY2UgRGUtZW1waGFzaXM6IC02ZEIKPiA+ ICAgICAgICAgICAgICAgICBMbmtTdGEyOiBDdXJyZW50IERlLWVtcGhhc2lzIExldmVsOiAtNmRC LAo+ID4gRXF1YWxpemF0aW9uQ29tcGxldGUrLCBFcXVhbGl6YXRpb25QaGFzZTErCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgRXF1YWxpemF0aW9uUGhhc2UyKywgRXF1YWxpemF0aW9uUGhh c2UzKywKPiA+IExpbmtFcXVhbGl6YXRpb25SZXF1ZXN0LQo+ID4gICAgICAgICBDYXBhYmlsaXRp ZXM6IFsxMDAgdjFdIFZpcnR1YWwgQ2hhbm5lbAo+ID4gICAgICAgICAgICAgICAgIENhcHM6ICAg TFBFVkM9MCBSZWZDbGs9MTAwbnMgUEFURW50cnlCaXRzPTEKPiA+ICAgICAgICAgICAgICAgICBB cmI6ICAgIEZpeGVkLSBXUlIzMi0gV1JSNjQtIFdSUjEyOC0KPiA+ICAgICAgICAgICAgICAgICBD dHJsOiAgIEFyYlNlbGVjdD1GaXhlZAo+ID4gICAgICAgICAgICAgICAgIFN0YXR1czogSW5Qcm9n cmVzcy0KPiA+ICAgICAgICAgICAgICAgICBWQzA6ICAgIENhcHM6ICAgUEFUT2Zmc2V0PTAwIE1h eFRpbWVTbG90cz0xIFJlalNub29wVHJhbnMtCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBB cmI6ICAgIEZpeGVkKyBXUlIzMi0gV1JSNjQtIFdSUjEyOC0gVFdSUjEyOC0gV1JSMjU2LQo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgQ3RybDogICBFbmFibGUrIElEPTAgQXJiU2VsZWN0PUZp eGVkIFRDL1ZDPWZmCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXM6IE5lZ29QZW5k aW5nLSBJblByb2dyZXNzLQo+ID4gICAgICAgICBDYXBhYmlsaXRpZXM6IFsxNDAgdjFdIFJvb3Qg Q29tcGxleCBMaW5rCj4gPiAgICAgICAgICAgICAgICAgRGVzYzogICBQb3J0TnVtYmVyPTAyIENv bXBvbmVudElEPTAxIEVsdFR5cGU9Q29uZmlnCj4gPiAgICAgICAgICAgICAgICAgTGluazA6ICBE ZXNjOiAgIFRhcmdldFBvcnQ9MDAgVGFyZ2V0Q29tcG9uZW50PTAxCj4gPiBBc3NvY1JDUkItIExp bmtUeXBlPU1lbU1hcHBlZCBMaW5rVmFsaWQrCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBB ZGRyOiAgIDAwMDAwMDAwZmVkMTkwMDAKPiA+ICAgICAgICAgQ2FwYWJpbGl0aWVzOiBbZDk0IHYx XSBTZWNvbmRhcnkgUENJIEV4cHJlc3MgPD8+Cj4gPiAgICAgICAgIEtlcm5lbCBkcml2ZXIgaW4g dXNlOiBwY2llcG9ydAo+ID4gMDA6IDg2IDgwIDAxIDE5IDA3IDAwIDEwIDAwIDA1IDAwIDA0IDA2 IDAwIDAwIDgxIDAwCj4gPiAxMDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDEgMDEgMDAg ZTAgZTAgMDAgMjAKPiA+IDIwOiAwMCBlYyAwMCBlZCAwMSBjMCBmMSBkMSAwMCAwMCAwMCAwMCAw MCAwMCAwMCAwMAo+ID4gMzA6IDAwIDAwIDAwIDAwIDg4IDAwIDAwIDAwIDAwIDAwIDAwIDAwIGZm IDAxIDEwIDAwCj4gPiA0MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAgMDAgMDAKPiA+IDUwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMAo+ID4gNjA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwCj4gPiA3MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgNjIgMTcgMDAgMDAgMDAg MDAgMGEKPiA+IDgwOiAwMSA5MCAwMyBjOCAwOCAwMCAwMCAwMCAwZCA4MCAwMCAwMCAyOCAxMCBi ZSAwNwo+ID4gOTA6IDA1IGEwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwCj4gPiBhMDogMTAgMDAgNDIgMDEgMDEgODAgMDAgMDAgMjAgMDAgMDAgMDAgMDMgYWQgNjEg MDIKPiA+IGIwOiA0MCAwMCAwMyBkMSA4MCAyNSAwYyAwMCAwMCAwMCA0OCAwMCAwMCAwMCAwMCAw MAo+ID4gYzA6IDAwIDAwIDAwIDAwIDgwIDBiIDA4IDAwIDAwIDY0IDAwIDAwIDBlIDAwIDAwIDAw Cj4gPiBkMDogNDMgMDAgMWUgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAK PiA+IGUwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ ID4gZjA6IDAwIDAwIDAwIDg0IDRlIDAxIDAxIDIwIDAwIDAwIDAwIDAwIGUwIDAwIDEwIDAwCj4g Pgo+ID4gT24gVHVlLCBNYXkgMjEsIDIwMTkgYXQgNzozNSBQTSBLYXJvbCBIZXJic3QgPGtoZXJi c3RAcmVkaGF0LmNvbT4gd3JvdGU6Cj4gPiA+Cj4gPiA+IHdhcyBhYmxlIHRvIGdldCB0aGUgbHNw Y2kgcHJpbnRzIHZpYSBzc2guIE1hY2hpbmUgcmVib290ZWQKPiA+ID4gYXV0b21hdGljYWxseSBl YWNoIHRpbWUgdGhvdWdoLgo+ID4gPgo+ID4gPiByZWxldmFudCBkbWVzZzoKPiA+ID4ga2VybmVs OiBub3V2ZWF1IDAwMDA6MDE6MDAuMDogUmVmdXNlZCB0byBjaGFuZ2UgcG93ZXIgc3RhdGUsIGN1 cnJlbnRseSBpbiBEMwo+ID4gPiBrZXJuZWw6IG5vdXZlYXUgMDAwMDowMTowMC4wOiBSZWZ1c2Vk IHRvIGNoYW5nZSBwb3dlciBzdGF0ZSwgY3VycmVudGx5IGluIEQzCj4gPiA+IGtlcm5lbDogbm91 dmVhdSAwMDAwOjAxOjAwLjA6IFJlZnVzZWQgdG8gY2hhbmdlIHBvd2VyIHN0YXRlLCBjdXJyZW50 bHkgaW4gRDMKPiA+ID4ga2VybmVsOiBub3V2ZWF1IDAwMDA6MDE6MDAuMDogdG1yOiBzdGFsbGVk IGF0IGZmZmZmZmZmZmZmZmZmZmYKPiA+ID4KPiA+ID4gKGxhc3Qgb25lIGlzIGEgNjQgYml0IG1t aW8gcmVhZCB0byBnZXQgdGhlIG9uIEdQVSB0aW1lciB2YWx1ZSkKPiA+ID4KPiA+ID4gIyBsc3Bj aSAtdnZ4eHggLXMgMDowMS4wMAo+ID4gPiAwMDowMS4wIFBDSSBicmlkZ2U6IEludGVsIENvcnBv cmF0aW9uIFhlb24gRTMtMTIwMCB2NS9FMy0xNTAwIHY1LzZ0aAo+ID4gPiBHZW4gQ29yZSBQcm9j ZXNzb3IgUENJZSBDb250cm9sbGVyICh4MTYpIChyZXYgMDUpIChwcm9nLWlmIDAwIFtOb3JtYWwK PiA+ID4gZGVjb2RlXSkKPiA+ID4gICAgICAgIENvbnRyb2w6IEkvTysgTWVtKyBCdXNNYXN0ZXIr IFNwZWNDeWNsZS0gTWVtV0lOVi0gVkdBU25vb3AtCj4gPiA+IFBhckVyci0gU3RlcHBpbmctIFNF UlItIEZhc3RCMkItIERpc0lOVHgtCj4gPiA+ICAgICAgICBTdGF0dXM6IENhcCsgNjZNSHotIFVE Ri0gRmFzdEIyQi0gUGFyRXJyLSBERVZTRUw9ZmFzdCA+VEFib3J0LQo+ID4gPiA8VEFib3J0LSA8 TUFib3J0LSA+U0VSUi0gPFBFUlItIElOVHgtCj4gPiA+ICAgICAgICBMYXRlbmN5OiAwCj4gPiA+ ICAgICAgICBJbnRlcnJ1cHQ6IHBpbiBBIHJvdXRlZCB0byBJUlEgMTYKPiA+ID4gICAgICAgIEJ1 czogcHJpbWFyeT0wMCwgc2Vjb25kYXJ5PTAxLCBzdWJvcmRpbmF0ZT0wMSwgc2VjLWxhdGVuY3k9 MAo+ID4gPiAgICAgICAgSS9PIGJlaGluZCBicmlkZ2U6IDAwMDBlMDAwLTAwMDBlZmZmIFtzaXpl PTRLXQo+ID4gPiAgICAgICAgTWVtb3J5IGJlaGluZCBicmlkZ2U6IGVjMDAwMDAwLWVkMGZmZmZm IFtzaXplPTE3TV0KPiA+ID4gICAgICAgIFByZWZldGNoYWJsZSBtZW1vcnkgYmVoaW5kIGJyaWRn ZToKPiA+ID4gMDAwMDAwMDBjMDAwMDAwMC0wMDAwMDAwMGQxZmZmZmZmIFtzaXplPTI4OE1dCj4g PiA+ICAgICAgICBTZWNvbmRhcnkgc3RhdHVzOiA2Nk1Iei0gRmFzdEIyQi0gUGFyRXJyLSBERVZT RUw9ZmFzdCA+VEFib3J0LQo+ID4gPiA8VEFib3J0LSA8TUFib3J0KyA8U0VSUi0gPFBFUlItCj4g PiA+ICAgICAgICBCcmlkZ2VDdGw6IFBhcml0eS0gU0VSUi0gTm9JU0EtIFZHQS0gVkdBMTYrIE1B Ym9ydC0gPlJlc2V0LSBGYXN0QjJCLQo+ID4gPiAgICAgICAgICAgICAgICBQcmlEaXNjVG1yLSBT ZWNEaXNjVG1yLSBEaXNjVG1yU3RhdC0gRGlzY1RtclNFUlJFbi0KPiA+ID4gICAgICAgIENhcGFi aWxpdGllczogWzg4XSBTdWJzeXN0ZW06IERlbGwgRGV2aWNlIDA3YmUKPiA+ID4gICAgICAgIENh cGFiaWxpdGllczogWzgwXSBQb3dlciBNYW5hZ2VtZW50IHZlcnNpb24gMwo+ID4gPiAgICAgICAg ICAgICAgICBGbGFnczogUE1FQ2xrLSBEU0ktIEQxLSBEMi0gQXV4Q3VycmVudD0wbUEKPiA+ID4g UE1FKEQwKyxEMS0sRDItLEQzaG90KyxEM2NvbGQrKQo+ID4gPiAgICAgICAgICAgICAgICBTdGF0 dXM6IEQwIE5vU29mdFJzdCsgUE1FLUVuYWJsZS0gRFNlbD0wIERTY2FsZT0wIFBNRS0KPiA+ID4g ICAgICAgIENhcGFiaWxpdGllczogWzkwXSBNU0k6IEVuYWJsZS0gQ291bnQ9MS8xIE1hc2thYmxl LSA2NGJpdC0KPiA+ID4gICAgICAgICAgICAgICAgQWRkcmVzczogMDAwMDAwMDAgIERhdGE6IDAw MDAKPiA+ID4gICAgICAgIENhcGFiaWxpdGllczogW2EwXSBFeHByZXNzICh2MikgUm9vdCBQb3J0 IChTbG90KyksIE1TSSAwMAo+ID4gPiAgICAgICAgICAgICAgICBEZXZDYXA6IE1heFBheWxvYWQg MjU2IGJ5dGVzLCBQaGFudEZ1bmMgMAo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgIEV4dFRh Zy0gUkJFKwo+ID4gPiAgICAgICAgICAgICAgICBEZXZDdGw6IENvcnJFcnItIE5vbkZhdGFsRXJy LSBGYXRhbEVyci0gVW5zdXBSZXEtCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgUmx4ZE9y ZC0gRXh0VGFnLSBQaGFudEZ1bmMtIEF1eFB3ci0gTm9Tbm9vcC0KPiA+ID4gICAgICAgICAgICAg ICAgICAgICAgICBNYXhQYXlsb2FkIDI1NiBieXRlcywgTWF4UmVhZFJlcSAxMjggYnl0ZXMKPiA+ ID4gICAgICAgICAgICAgICAgRGV2U3RhOiBDb3JyRXJyLSBOb25GYXRhbEVyci0gRmF0YWxFcnIt IFVuc3VwUmVxLQo+ID4gPiBBdXhQd3ItIFRyYW5zUGVuZC0KPiA+ID4gICAgICAgICAgICAgICAg TG5rQ2FwOiBQb3J0ICMyLCBTcGVlZCA4R1QvcywgV2lkdGggeDE2LCBBU1BNIEwwcyBMMSwKPiA+ ID4gRXhpdCBMYXRlbmN5IEwwcyA8MjU2bnMsIEwxIDw4dXMKPiA+ID4gICAgICAgICAgICAgICAg ICAgICAgICBDbG9ja1BNLSBTdXJwcmlzZS0gTExBY3RSZXAtIEJ3Tm90KyBBU1BNT3B0Q29tcCsK PiA+ID4gICAgICAgICAgICAgICAgTG5rQ3RsOiBBU1BNIERpc2FibGVkOyBSQ0IgNjQgYnl0ZXMg RGlzYWJsZWQtIENvbW1DbGsrCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgRXh0U3luY2gt IENsb2NrUE0tIEF1dFdpZERpcy0gQldJbnQtIEF1dEJXSW50LQo+ID4gPiAgICAgICAgICAgICAg ICBMbmtTdGE6IFNwZWVkIDIuNUdUL3MgKGRvd25ncmFkZWQpLCBXaWR0aCB4MTYgKG9rKQo+ID4g PiAgICAgICAgICAgICAgICAgICAgICAgIFRyRXJyLSBUcmFpbi0gU2xvdENsaysgRExBY3RpdmUt IEJXTWdtdCsgQUJXTWdtdCsKPiA+ID4gICAgICAgICAgICAgICAgU2x0Q2FwOiBBdHRuQnRuLSBQ d3JDdHJsLSBNUkwtIEF0dG5JbmQtIFB3ckluZC0KPiA+ID4gSG90UGx1Zy0gU3VycHJpc2UtCj4g PiA+ICAgICAgICAgICAgICAgICAgICAgICAgU2xvdCAjMSwgUG93ZXJMaW1pdCA3NS4wMDBXOyBJ bnRlcmxvY2stIE5vQ29tcGwrCj4gPiA+ICAgICAgICAgICAgICAgIFNsdEN0bDogRW5hYmxlOiBB dHRuQnRuLSBQd3JGbHQtIE1STC0gUHJlc0RldC0gQ21kQ3BsdC0KPiA+ID4gSFBJcnEtIExpbmtD aGctCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbDogQXR0bkluZCBVbmtub3du LCBQd3JJbmQgVW5rbm93biwKPiA+ID4gUG93ZXItIEludGVybG9jay0KPiA+ID4gICAgICAgICAg ICAgICAgU2x0U3RhOiBTdGF0dXM6IEF0dG5CdG4tIFBvd2VyRmx0LSBNUkwtIENtZENwbHQtCj4g PiA+IFByZXNEZXQtIEludGVybG9jay0KPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICBDaGFu Z2VkOiBNUkwtIFByZXNEZXQrIExpbmtTdGF0ZS0KPiA+ID4gICAgICAgICAgICAgICAgUm9vdEN0 bDogRXJyQ29ycmVjdGFibGUtIEVyck5vbi1GYXRhbC0gRXJyRmF0YWwtCj4gPiA+IFBNRUludEVu YS0gQ1JTVmlzaWJsZS0KPiA+ID4gICAgICAgICAgICAgICAgUm9vdENhcDogQ1JTVmlzaWJsZS0K PiA+ID4gICAgICAgICAgICAgICAgUm9vdFN0YTogUE1FIFJlcUlEIDAwMDAsIFBNRVN0YXR1cy0g UE1FUGVuZGluZy0KPiA+ID4gICAgICAgICAgICAgICAgRGV2Q2FwMjogQ29tcGxldGlvbiBUaW1l b3V0OiBOb3QgU3VwcG9ydGVkLAo+ID4gPiBUaW1lb3V0RGlzLSwgTFRSKywgT0JGRiBWaWEgV0FL RSMgQVJJRndkLQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNPcHNDYXA6IFJv dXRpbmctIDMyYml0KyA2NGJpdCsgMTI4Yml0Q0FTKwo+ID4gPiAgICAgICAgICAgICAgICBEZXZD dGwyOiBDb21wbGV0aW9uIFRpbWVvdXQ6IDUwdXMgdG8gNTBtcywgVGltZW91dERpcy0sCj4gPiA+ IExUUissIE9CRkYgVmlhIFdBS0UjIEFSSUZ3ZC0KPiA+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgQXRvbWljT3BzQ3RsOiBSZXFFbi0gRWdyZXNzQmxjay0KPiA+ID4gICAgICAgICAgICAgICAg TG5rQ3RsMjogVGFyZ2V0IExpbmsgU3BlZWQ6IDhHVC9zLCBFbnRlckNvbXBsaWFuY2UtIFNwZWVk RGlzLQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc21pdCBNYXJnaW46IE5vcm1h bCBPcGVyYXRpbmcgUmFuZ2UsCj4gPiA+IEVudGVyTW9kaWZpZWRDb21wbGlhbmNlLSBDb21wbGlh bmNlU09TLQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGlhbmNlIERlLWVtcGhh c2lzOiAtNmRCCj4gPiA+ICAgICAgICAgICAgICAgIExua1N0YTI6IEN1cnJlbnQgRGUtZW1waGFz aXMgTGV2ZWw6IC02ZEIsCj4gPiA+IEVxdWFsaXphdGlvbkNvbXBsZXRlLSwgRXF1YWxpemF0aW9u UGhhc2UxLQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICBFcXVhbGl6YXRpb25QaGFzZTIt LCBFcXVhbGl6YXRpb25QaGFzZTMtLAo+ID4gPiBMaW5rRXF1YWxpemF0aW9uUmVxdWVzdC0KPiA+ ID4gICAgICAgIENhcGFiaWxpdGllczogWzEwMCB2MV0gVmlydHVhbCBDaGFubmVsCj4gPiA+ICAg ICAgICAgICAgICAgIENhcHM6ICAgTFBFVkM9MCBSZWZDbGs9MTAwbnMgUEFURW50cnlCaXRzPTEK PiA+ID4gICAgICAgICAgICAgICAgQXJiOiAgICBGaXhlZC0gV1JSMzItIFdSUjY0LSBXUlIxMjgt Cj4gPiA+ICAgICAgICAgICAgICAgIEN0cmw6ICAgQXJiU2VsZWN0PUZpeGVkCj4gPiA+ICAgICAg ICAgICAgICAgIFN0YXR1czogSW5Qcm9ncmVzcy0KPiA+ID4gICAgICAgICAgICAgICAgVkMwOiAg ICBDYXBzOiAgIFBBVE9mZnNldD0wMCBNYXhUaW1lU2xvdHM9MSBSZWpTbm9vcFRyYW5zLQo+ID4g PiAgICAgICAgICAgICAgICAgICAgICAgIEFyYjogICAgRml4ZWQrIFdSUjMyLSBXUlI2NC0gV1JS MTI4LSBUV1JSMTI4LSBXUlIyNTYtCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgQ3RybDog ICBFbmFibGUrIElEPTAgQXJiU2VsZWN0PUZpeGVkIFRDL1ZDPWZmCj4gPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgU3RhdHVzOiBOZWdvUGVuZGluZysgSW5Qcm9ncmVzcy0KPiA+ID4gICAgICAg IENhcGFiaWxpdGllczogWzE0MCB2MV0gUm9vdCBDb21wbGV4IExpbmsKPiA+ID4gICAgICAgICAg ICAgICAgRGVzYzogICBQb3J0TnVtYmVyPTAyIENvbXBvbmVudElEPTAxIEVsdFR5cGU9Q29uZmln Cj4gPiA+ICAgICAgICAgICAgICAgIExpbmswOiAgRGVzYzogICBUYXJnZXRQb3J0PTAwIFRhcmdl dENvbXBvbmVudD0wMQo+ID4gPiBBc3NvY1JDUkItIExpbmtUeXBlPU1lbU1hcHBlZCBMaW5rVmFs aWQrCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgQWRkcjogICAwMDAwMDAwMGZlZDE5MDAw Cj4gPiA+ICAgICAgICBDYXBhYmlsaXRpZXM6IFtkOTQgdjFdIFNlY29uZGFyeSBQQ0kgRXhwcmVz cyA8Pz4KPiA+ID4gICAgICAgIEtlcm5lbCBkcml2ZXIgaW4gdXNlOiBwY2llcG9ydAo+ID4gPiAw MDogODYgODAgMDEgMTkgMDcgMDAgMTAgMDAgMDUgMDAgMDQgMDYgMDAgMDAgODEgMDAKPiA+ID4g MTA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAxIDAxIDAwIGUwIGUwIDAwIDIwCj4gPiA+ IDIwOiAwMCBlYyAwMCBlZCAwMSBjMCBmMSBkMSAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ID4g PiAzMDogMDAgMDAgMDAgMDAgODggMDAgMDAgMDAgMDAgMDAgMDAgMDAgZmYgMDEgMTAgMDAKPiA+ ID4gNDA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCj4g PiA+IDUwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMAo+ ID4gPiA2MDogMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAK PiA+ID4gNzA6IDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDYyIDE3IDAwIDAwIDAwIDAwIDBh Cj4gPiA+IDgwOiAwMSA5MCAwMyBjOCAwOCAwMCAwMCAwMCAwZCA4MCAwMCAwMCAyOCAxMCBiZSAw Nwo+ID4gPiA5MDogMDUgYTAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAg MDAKPiA+ID4gYTA6IDEwIDAwIDQyIDAxIDAxIDgwIDAwIDAwIDIwIDAwIDAwIDAwIDAzIGFkIDYx IDAyCj4gPiA+IGIwOiA0MCAwMCAwMSBkMSA4MCAyNSAwYyAwMCAwMCAwMCAwOCAwMCAwMCAwMCAw MCAwMAo+ID4gPiBjMDogMDAgMDAgMDAgMDAgODAgMGIgMDggMDAgMDAgNjQgMDAgMDAgMGUgMDAg MDAgMDAKPiA+ID4gZDA6IDQzIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAw IDAwIDAwCj4gPiA+IGUwOiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAw MCAwMCAwMAo+ID4gPiBmMDogMDAgNDAgMDEgMDAgNGUgMDEgMDEgMjIgMDAgMDAgMDAgMDAgZTAg MDAgMTAgMDAKPiA+ID4KPiA+ID4gbHNwY2kgLXZ2eHh4IC1zIDE6MDAuMDAKPiA+ID4gMDE6MDAu MCAzRCBjb250cm9sbGVyOiBOVklESUEgQ29ycG9yYXRpb24gR1AxMDdNIFtHZUZvcmNlIEdUWCAx MDUwCj4gPiA+IE1vYmlsZV0gKHJldiBmZikgKHByb2ctaWYgZmYpCj4gPiA+ICAgICAgICAhISEg VW5rbm93biBoZWFkZXIgdHlwZSA3Zgo+ID4gPiAgICAgICAgS2VybmVsIGRyaXZlciBpbiB1c2U6 IG5vdXZlYXUKPiA+ID4gICAgICAgIEtlcm5lbCBtb2R1bGVzOiBub3V2ZWF1Cj4gPiA+IDAwOiBm ZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZgo+ID4gPiAxMDog ZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYKPiA+ID4gMjA6 IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmCj4gPiA+IDMw OiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZgo+ID4gPiA0 MDogZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYKPiA+ID4g NTA6IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmCj4gPiA+ IDYwOiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZgo+ID4g PiA3MDogZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYKPiA+ ID4gODA6IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmCj4g PiA+IDkwOiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZgo+ ID4gPiBhMDogZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYK PiA+ID4gYjA6IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZm Cj4gPiA+IGMwOiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBm Zgo+ID4gPiBkMDogZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYg ZmYKPiA+ID4gZTA6IGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZm IGZmCj4gPiA+IGYwOiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiBm ZiBmZgo+ID4gPgo+ID4gPiBPbiBUdWUsIE1heSAyMSwgMjAxOSBhdCA0OjMwIFBNIEthcm9sIEhl cmJzdCA8a2hlcmJzdEByZWRoYXQuY29tPiB3cm90ZToKPiA+ID4gPgo+ID4gPiA+IE9uIFR1ZSwg TWF5IDIxLCAyMDE5IGF0IDQ6MTMgUE0gQmpvcm4gSGVsZ2FhcyA8aGVsZ2Fhc0BrZXJuZWwub3Jn PiB3cm90ZToKPiA+ID4gPiA+Cj4gPiA+ID4gPiBPbiBUdWUsIE1heSAyMSwgMjAxOSBhdCAwMzoy ODo0OFBNICswMjAwLCBLYXJvbCBIZXJic3Qgd3JvdGU6Cj4gPiA+ID4gPiA+IE9uIFR1ZSwgTWF5 IDIxLCAyMDE5IGF0IDM6MTEgUE0gQmpvcm4gSGVsZ2FhcyA8aGVsZ2Fhc0BrZXJuZWwub3JnPiB3 cm90ZToKPiA+ID4gPiA+ID4gPiBPbiBUdWUsIE1heSAyMSwgMjAxOSBhdCAxMjozMDozOEFNICsw MjAwLCBLYXJvbCBIZXJic3Qgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiBPbiBNb24sIE1heSAyMCwg MjAxOSBhdCAxMToyMCBQTSBCam9ybiBIZWxnYWFzIDxoZWxnYWFzQGtlcm5lbC5vcmc+IHdyb3Rl Ogo+ID4gPiA+ID4gPiA+ID4gPiBPbiBUdWUsIE1heSAwNywgMjAxOSBhdCAxMDoxMjo0NVBNICsw MjAwLCBLYXJvbCBIZXJic3Qgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gPiA+ID4gQXBwZXJhbnRseSB0 aGluZ3MgZ28gc291dGggaWYgd2Ugc3VzcGVuZCB0aGUgZGV2aWNlIHdpdGggYSBkaWZmZXJlbnQg UENJRQo+ID4gPiA+ID4gPiA+ID4gPiA+IGxpbmsgc3BlZWQgc2V0IHRoYW4gaXQgZ290IGJvb3Rl ZCB3aXRoLiBGaXhlcyBydW50aW1lIHN1c3BlbmQgb24gbXkgZ3AxMDcuCj4gPiA+ID4gPiA+ID4g PiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiBUaGlzIGFsbCBsb29rcyBsaWtlIHNvbWUgYnVnIGlu c2lkZSB0aGUgcGNpIHN1YnN5c3RlbSBhbmQgSSB3b3VsZCBwcmVmZXIgYQo+ID4gPiA+ID4gPiA+ ID4gPiA+IGZpeCB0aGVyZSBpbnN0ZWFkIG9mIG5vdXZlYXUsIGJ1dCBtYXliZSB0aGVyZSBpcyBu byByZWFsIG5pY2Ugd2F5IG9mIGRvaW5nCj4gPiA+ID4gPiA+ID4gPiA+ID4gdGhhdCBvdXRzaWRl IG9mIGRyaXZlcnM/Cj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+IEkgYWdyZWUg aXQgd291bGQgYmUgbmljZSB0byBmaXggdGhpcyBpbiB0aGUgUENJIGNvcmUgaWYgdGhhdCdzCj4g PiA+ID4gPiA+ID4gPiA+IGZlYXNpYmxlLgo+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ ID4gPiBJdCBsb29rcyBsaWtlIHRoaXMgZHJpdmVyIGNoYW5nZXMgdGhlIFBDSWUgbGluayBzcGVl ZCB1c2luZyBzb21lCj4gPiA+ID4gPiA+ID4gPiA+IGRldmljZS1zcGVjaWZpYyBtZWNoYW5pc20u ICBXaGVuIHdlIHN1c3BlbmQsIHdlIHB1dCB0aGUgZGV2aWNlIGluCj4gPiA+ID4gPiA+ID4gPiA+ IEQzY29sZCwgc28gaXQgbG9zZXMgYWxsIGl0cyBzdGF0ZS4gIFdoZW4gd2UgcmVzdW1lLCB0aGUg bGluayBwcm9iYWJseQo+ID4gPiA+ID4gPiA+ID4gPiBjb21lcyB1cCBhdCB0aGUgYm9vdCBzcGVl ZCBiZWNhdXNlIG5vdGhpbmcgZGlkIHRoYXQgZGV2aWNlLXNwZWNpZmljCj4gPiA+ID4gPiA+ID4g PiA+IG1hZ2ljIHRvIGNoYW5nZSBpdCwgc28geW91IHByb2JhYmx5IGVuZCB1cCB3aXRoIHRoZSBs aW5rIGJlaW5nIHNsb3cKPiA+ID4gPiA+ID4gPiA+ID4gYnV0IHRoZSBkcml2ZXIgdGhpbmtpbmcg aXQncyBjb25maWd1cmVkIHRvIGJlIGZhc3QsIGFuZCBtYXliZSB0aGF0Cj4gPiA+ID4gPiA+ID4g PiA+IGNvbWJpbmF0aW9uIGRvZXNuJ3Qgd29yay4KPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gPiA+ID4gSWYgaXQgcmVxdWlyZXMgc29tZXRoaW5nIGRldmljZS1zcGVjaWZpYyB0byBjaGFu Z2UgdGhhdCBsaW5rIHNwZWVkLCBJCj4gPiA+ID4gPiA+ID4gPiA+IGRvbid0IGtub3cgaG93IHRv IHB1dCB0aGF0IGluIHRoZSBQQ0kgY29yZS4gIEJ1dCBtYXliZSBJJ20gbWlzc2luZwo+ID4gPiA+ ID4gPiA+ID4gPiBzb21ldGhpbmc/Cj4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiA+ IFBlciB0aGUgUENJZSBzcGVjIChyNC4wLCBzZWMgMS4yKToKPiA+ID4gPiA+ID4gPiA+ID4KPiA+ ID4gPiA+ID4gPiA+ID4gICBJbml0aWFsaXphdGlvbiDigJMgRHVyaW5nIGhhcmR3YXJlIGluaXRp YWxpemF0aW9uLCBlYWNoIFBDSSBFeHByZXNzCj4gPiA+ID4gPiA+ID4gPiA+ICAgTGluayBpcyBz ZXQgdXAgZm9sbG93aW5nIGEgbmVnb3RpYXRpb24gb2YgTGFuZSB3aWR0aHMgYW5kIGZyZXF1ZW5j eQo+ID4gPiA+ID4gPiA+ID4gPiAgIG9mIG9wZXJhdGlvbiBieSB0aGUgdHdvIGFnZW50cyBhdCBl YWNoIGVuZCBvZiB0aGUgTGluay4gTm8gZmlybXdhcmUKPiA+ID4gPiA+ID4gPiA+ID4gICBvciBv cGVyYXRpbmcgc3lzdGVtIHNvZnR3YXJlIGlzIGludm9sdmVkLgo+ID4gPiA+ID4gPiA+ID4gPgo+ ID4gPiA+ID4gPiA+ID4gPiBJIGhhdmUgYmVlbiBhc3N1bWluZyB0aGF0IHRoaXMgbWVhbnMgZGV2 aWNlLXNwZWNpZmljIGxpbmsgc3BlZWQKPiA+ID4gPiA+ID4gPiA+ID4gbWFuYWdlbWVudCBpcyBv dXQgb2Ygc3BlYywgYnV0IGl0IHNlZW1zIHByZXR0eSBjb21tb24gdGhhdCBkZXZpY2VzCj4gPiA+ ID4gPiA+ID4gPiA+IGRvbid0IGNvbWUgdXAgYnkgdGhlbXNlbHZlcyBhdCB0aGUgZmFzdGVzdCBw b3NzaWJsZSBsaW5rIHNwZWVkLiAgU28KPiA+ID4gPiA+ID4gPiA+ID4gbWF5YmUgdGhlIHNwZWMg anVzdCBpbnRlbmRzIHRoYXQgZGV2aWNlcyBjYW4gb3BlcmF0ZSBhdCAqc29tZSogdmFsaWQKPiA+ ID4gPiA+ID4gPiA+ID4gc3BlZWQuCj4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gSSB3 b3VsZCBleHBlY3QgdGhhdCBkZXZpY2VzIGtpbmQgb2YgaGF2ZSB0byBmaWd1cmUgb3V0IHdoYXQg dGhleSBjYW4KPiA+ID4gPiA+ID4gPiA+IG9wZXJhdGUgb24gYW5kIHRoZSBvcGVyYXRpbmcgc3lz dGVtIGtpbmQgb2YganVzdCBjaGVja3Mgd2hhdCB0aGUKPiA+ID4gPiA+ID4gPiA+IGN1cnJlbnQg c3RhdGUgaXMgYW5kIGRvZXNuJ3QgdHJ5IHRvICJyZXN0b3JlIiB0aGUgb2xkIHN0YXRlIG9yCj4g PiA+ID4gPiA+ID4gPiBzb21ldGhpbmc/Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBUaGUg ZGV2aWNlcyBhdCBlYWNoIGVuZCBvZiB0aGUgbGluayBuZWdvdGlhdGUgdGhlIHdpZHRoIGFuZCBz cGVlZCBvZgo+ID4gPiA+ID4gPiA+IHRoZSBsaW5rLiAgVGhpcyBpcyBkb25lIGRpcmVjdGx5IGJ5 IHRoZSBoYXJkd2FyZSB3aXRob3V0IGFueSBoZWxwIGZyb20KPiA+ID4gPiA+ID4gPiB0aGUgT1Mu Cj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBUaGUgT1MgY2FuIHJlYWQgdGhlIGN1cnJlbnQg bGluayBzdGF0ZSAoQ3VycmVudCBMaW5rIFNwZWVkIGFuZAo+ID4gPiA+ID4gPiA+IE5lZ290aWF0 ZWQgTGluayBXaWR0aCwgYm90aCBpbiB0aGUgTGluayBTdGF0dXMgcmVnaXN0ZXIpLiAgVGhlIE9T IGhhcwo+ID4gPiA+ID4gPiA+IHZlcnkgbGl0dGxlIGNvbnRyb2wgb3ZlciB0aGF0IHN0YXRlLiAg SXQgY2FuJ3QgZGlyZWN0bHkgcmVzdG9yZSB0aGUKPiA+ID4gPiA+ID4gPiBzdGF0ZSBiZWNhdXNl IHRoZSBoYXJkd2FyZSBoYXMgdG8gbmVnb3RpYXRlIGEgd2lkdGggJiBzcGVlZCB0aGF0Cj4gPiA+ ID4gPiA+ID4gcmVzdWx0IGluIHJlbGlhYmxlIG9wZXJhdGlvbi4KPiA+ID4gPiA+ID4gPgo+ID4g PiA+ID4gPiA+ID4gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhlIGRyaXZlciBhZnRlciB0aGUg ZGV2aWNlIHdhcyBzdXNwZW5kZWQuIEFuZAo+ID4gPiA+ID4gPiA+ID4gdGhlIDB4ODgwMDAgaXMg YSBtaXJyb3Igb2YgdGhlIFBDSSBjb25maWcgc3BhY2UsIGJ1dCB3ZSBhbHNvIGdvdCBzb21lCj4g PiA+ID4gPiA+ID4gPiBQQ0llIHN0dWZmIGF0IDB4OGMwMDAgd2hpY2ggaXMgdXNlZCBieSBuZXdl ciBHUFVzIGZvciBnZW4zIHN0dWZmCj4gPiA+ID4gPiA+ID4gPiBlc3NlbnRpYWxseS4gSSBoYXZl IG5vIGlkZWEgaG93IG11Y2ggb2YgdGhpcyBpcyBwYXJ0IG9mIHRoZSBhY3R1YWwgcGNpCj4gPiA+ ID4gPiA+ID4gPiBzdGFuZGFyZCBhbmQgaG93IG11Y2ggaXMgZHJpdmVyIHNwZWNpZmljLiBCdXQg dGhlIGRyaXZlciBhbHNvIHdhbnRzIHRvCj4gPiA+ID4gPiA+ID4gPiBoYXZlIHNvbWUgY29udHJv bCBvdmVyIHRoZSBsaW5rIHNwZWVkIGFzIGl0J3MgdGlnaHQgdG8gcGVyZm9ybWFuY2UKPiA+ID4g PiA+ID4gPiA+IHN0YXRlcyBvbiBHUFUuCj4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBBcyBm YXIgYXMgSSdtIGF3YXJlLCB0aGVyZSBpcyBubyBnZW5lcmljIFBDSWUgd2F5IGZvciB0aGUgT1Mg dG8KPiA+ID4gPiA+ID4gPiBpbmZsdWVuY2UgdGhlIGxpbmsgd2lkdGggb3Igc3BlZWQuICBJZiB0 aGUgR1BVIGRyaXZlciBuZWVkcyB0byBkbwo+ID4gPiA+ID4gPiA+IHRoYXQsIGl0IHdvdWxkIGJl IHZpYSBzb21lIGRldmljZS1zcGVjaWZpYyBtZWNoYW5pc20uCj4gPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gPiA+IFRoZSBiaWcgaXNzdWUgaGVyZSBpcyBqdXN0LCB0aGF0IHRoZSBHUFUgYm9vdHMg d2l0aCA4LjAsIHNvbWUgb24tZ3B1Cj4gPiA+ID4gPiA+ID4gPiBpbml0IG1lY2hhbmlzbSBkZWNy ZWFzZXMgaXQgdG8gMi41LiBJZiB3ZSBzdXNwZW5kLCB0aGUgR1BVIG9yIGF0IGxlYXN0Cj4gPiA+ ID4gPiA+ID4gPiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBjb250cm9sbGVyIGlzIGJyb2tl bi4gQnV0IGlmIHdlIHNldCBpdCB0bwo+ID4gPiA+ID4gPiA+ID4gdGhlIGJvb3Qgc3BlZWQsIHJl c3VtaW5nIHRoZSBHUFUganVzdCB3b3Jrcy4gU28gbXkgYXNzdW1wdGlvbiB3YXMsCj4gPiA+ID4g PiA+ID4gPiB0aGF0IF9zb21ldGhpbmdfIChtaWdodCBpdCBiZSB0aGUgY29udHJvbGxlciBvciB0 aGUgcGNpIHN1YnN5c3RlbSkKPiA+ID4gPiA+ID4gPiA+IHRyaWVzIHRvIGZvcmNlIHRvIG9wZXJh dGUgb24gYW4gaW52YWxpZCBsaW5rIHNwZWVkIGFuZCBiZWNhdXNlIHRoZQo+ID4gPiA+ID4gPiA+ ID4gYnJpZGdlIGNvbnRyb2xsZXIgaXMgYWN0dWFsbHkgcG93ZXJlZCBkb3duIGFzIHdlbGwgKGFz IGFsbCBjaGlsZHJlbgo+ID4gPiA+ID4gPiA+ID4gYXJlIGluIEQzY29sZCkgSSBjb3VsZCBpbWFn aW5lIHRoYXQgc29tZXRoaW5nIGluIHRoZSBwY2kgc3Vic3lzdGVtCj4gPiA+ID4gPiA+ID4gPiBh Y3R1YWxseSByZXN0b3JlcyB0aGUgc3RhdGUgd2hpY2ggbGV0cyB0aGUgY29udHJvbGxlciBmYWls IHRvCj4gPiA+ID4gPiA+ID4gPiBlc3RhYmxpc2ggY29tbXVuaWNhdGlvbiBhZ2Fpbj8KPiA+ID4g PiA+ID4gPgo+ID4gPiA+ID4gPiA+ICAgMSkgQXQgYm9vdC10aW1lLCB0aGUgUG9ydCBhbmQgdGhl IEdQVSBoYXJkd2FyZSBuZWdvdGlhdGUgOC4wIEdUL3MKPiA+ID4gPiA+ID4gPiAgICAgIHdpdGhv dXQgT1MvZHJpdmVyIGludGVydmVudGlvbi4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ICAg MikgU29tZSBtZWNoYW5pc20gcmVkdWNlcyBsaW5rIHNwZWVkIHRvIDIuNSBHVC9zLiAgVGhpcyBw cm9iYWJseQo+ID4gPiA+ID4gPiA+ICAgICAgcmVxdWlyZXMgZHJpdmVyIGludGVydmVudGlvbiBv ciBhdCBsZWFzdCBzb21lIEFDUEkgbWV0aG9kLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiB0aGVy ZSBpcyBubyBkcml2ZXIgaW50ZXJ2ZW50aW9uIGFuZCBOb3V2ZWF1IGRvZXNuJ3QgY2FyZSBhdCBh bGwuIEl0J3MKPiA+ID4gPiA+ID4gYWxsIGRvbmUgb24gdGhlIEdQVS4gV2UganVzdCB1cGxvYWQg YSBzY3JpcHQgYW5kIHNvbWUgZmlybXdhcmUgb24gdG8KPiA+ID4gPiA+ID4gdGhlIEdQVS4gVGhl IHNjcmlwdCBydW5zIHRoZW4gb24gdGhlIFBNVSBpbnNpZGUgdGhlIEdQVSBhbmQgdGhpcwo+ID4g PiA+ID4gPiBzY3JpcHQgYWxzbyBjYXVzZXMgY2hhbmdpbmcgdGhlIFBDSWUgbGluayBzZXR0aW5n cy4gQnV0IGZyb20gYSBOb3V2ZWF1Cj4gPiA+ID4gPiA+IHBvaW50IG9mIHZpZXcgd2UgZG9uJ3Qg Y2FyZSBhYm91dCB0aGUgbGluayBiZWZvcmUgb3IgYWZ0ZXIgdGhhdCBzY3JpcHQKPiA+ID4gPiA+ ID4gd2FzIGludm9rZWQuIEFsc28gdGhlcmUgaXMgbm8gQUNQSSBtZXRob2QgaW52b2x2ZWQuCj4g PiA+ID4gPiA+Cj4gPiA+ID4gPiA+IEJ1dCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgd2Ugc2hvdWxk IG5vdGlmeSBwY2kgY29yZSBhYm91dCwgbWF5YmUKPiA+ID4gPiA+ID4gdGhhdCdzIHNvbWV0aGlu ZyB3ZSBoYXZlIHRvIGRvIHRoZW4/Cj4gPiA+ID4gPgo+ID4gPiA+ID4gSSBkb24ndCB0aGluayB0 aGVyZSdzIGFueXRoaW5nIHRoZSBQQ0kgY29yZSBjb3VsZCBkbyB3aXRoIHRoYXQKPiA+ID4gPiA+ IGluZm9ybWF0aW9uIGFueXdheS4gIFRoZSBQQ0kgY29yZSBkb2Vzbid0IGNhcmUgYXQgYWxsIGFi b3V0IHRoZSBsaW5rCj4gPiA+ID4gPiBzcGVlZCwgYW5kIGl0IHJlYWxseSBjYW4ndCBpbmZsdWVu Y2UgaXQgZGlyZWN0bHkuCj4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ICAgMykgU3VzcGVuZCBwdXRz IEdQVSBpbnRvIEQzY29sZCAocG93ZXJlZCBvZmYpLgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gICA0KSBSZXN1bWUgcmVzdG9yZXMgR1BVIHRvIEQwLCBhbmQgdGhlIFBvcnQgYW5kIEdQVSBo YXJkd2FyZSBhZ2Fpbgo+ID4gPiA+ID4gPiA+ICAgICAgbmVnb3RpYXRlIDguMCBHVC9zIHdpdGhv dXQgT1MvZHJpdmVyIGludGVydmVudGlvbiwganVzdCBsaWtlIGF0Cj4gPiA+ID4gPiA+ID4gICAg ICBpbml0aWFsIGJvb3QuCj4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+IE5vLCB0aGF0IG5lZ290aWF0 aW9uIGZhaWxzIGFwcGFyZW50bHkgYXMgYW55IGF0dGVtcHQgdG8gcmVhZCBhbnl0aGluZwo+ID4g PiA+ID4gPiBmcm9tIHRoZSBkZXZpY2UganVzdCBmYWlscyBpbnNpZGUgcGNpIGNvcmUuIE9yIHNv bWV0aGluZyBnb2VzIHdyb25nCj4gPiA+ID4gPiA+IHdoZW4gcmVzdW1pbmcgdGhlIGJyaWRnZSBj b250cm9sbGVyLgo+ID4gPiA+ID4KPiA+ID4gPiA+IEknbSBzdXJwcmlzZWQgdGhlIG5lZ290aWF0 aW9uIHdvdWxkIGZhaWwgZXZlbiBhZnRlciBhIHBvd2VyIGN5Y2xlIG9mCj4gPiA+ID4gPiB0aGUg ZGV2aWNlLiAgQnV0IGlmIHlvdSBjYW4gYXZvaWQgdGhlIGlzc3VlIGJ5IHJ1bm5pbmcgYW5vdGhl ciBzY3JpcHQKPiA+ID4gPiA+IG9uIHRoZSBQTVUgYmVmb3JlIHN1c3BlbmQsIHRoYXQncyBwcm9i YWJseSB3aGF0IHlvdSdsbCBoYXZlIHRvIGRvLgo+ID4gPiA+ID4KPiA+ID4gPgo+ID4gPiA+IHRo ZXJlIGlzIG5vbmUgYXMgZmFyIGFzIHdlIGtub3cuIE9yIGF0IGxlYXN0IG5vdGhpbmcgaW5zaWRl IHRoZSB2Ymlvcy4KPiA+ID4gPiBXZSBzdGlsbCBoYXZlIHRvIGdldCBzaWduZWQgUE1VIGZpcm13 YXJlIGltYWdlcyBmcm9tIE52aWRpYSBmb3IgZnVsbAo+ID4gPiA+IHN1cHBvcnQsIGJ1dCB0aGlz IHN0aWxsIHdvdWxkIGJlIGEgaGFja3kgaXNzdWUgYXMgd2Ugd291bGQgZGVwZW5kIG9uCj4gPiA+ ID4gdGhvc2UgdGhlbiAoYW5kIHdpdGhvdXQgaGF2aW5nIHRob3NlIGluICByZWRpc3RyaWJ1dGFi bGUgZm9ybSwgdGhlcmUKPiA+ID4gPiBpc24ndCBtdWNoIHdlIGNhbiBkbyBhYm91dCBleGNlcHQg Zml4aW5nIGl0IG9uIHRoZSBrZXJuZWwgc2lkZSkuCj4gPiA+ID4KPiA+ID4gPiA+ID4gPiAgIDUp IE5vdyB0aGUgZHJpdmVyIHRoaW5rcyB0aGUgR1BVIGlzIGF0IDIuNSBHVC9zIGJ1dCBpdCdzIGFj dHVhbGx5IGF0Cj4gPiA+ID4gPiA+ID4gICAgICA4LjAgR1Qvcy4KPiA+ID4gPiA+ID4KPiA+ID4g PiA+ID4gd2hhdCBpcyBhY3R1YWxseSBtZWFudCBieSAiZHJpdmVyIiBoZXJlPyBUaGUgcGNpIHN1 YnN5c3RlbSBvciBOb3V2ZWF1Pwo+ID4gPiA+ID4KPiA+ID4gPiA+IEkgd2FzIHRoaW5raW5nIE5v dXZlYXUgYmVjYXVzZSB0aGUgUENJIGNvcmUgZG9lc24ndCBjYXJlIGFib3V0IHRoZQo+ID4gPiA+ ID4gbGluayBzcGVlZC4KPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gV2l0aG91dCBrbm93aW5nIG1v cmUgYWJvdXQgdGhlIHRyYW5zaXRpb24gdG8gMi41IEdUL3MsIEkgY2FuJ3QgZ3Vlc3MKPiA+ID4g PiA+ID4gPiB3aHkgdGhlIEdQVSB3b3VsZG4ndCB3b3JrIGFmdGVyIHJlc3VtZS4gIEZyb20gYSBQ Q0llIHBvaW50IG9mIHZpZXcsCj4gPiA+ID4gPiA+ID4gdGhlIGxpbmsgaXMgc3VwcG9zZWQgdG8g d29yayBhbmQgdGhlIGRldmljZSBzaG91bGQgYmUgcmVhY2hhYmxlCj4gPiA+ID4gPiA+ID4gaW5k ZXBlbmRlbnQgb2YgdGhlIGxpbmsgc3BlZWQuICBCdXQgbWF5YmUgdGhlcmUncyBzb21lIHdlaXJk Cj4gPiA+ID4gPiA+ID4gZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBHUFUgYW5kIHRoZSBkcml2ZXIg aGVyZS4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gYnV0IHRoZSBkZXZpY2UgaXNuJ3QgcmVhY2hh YmxlIGF0IGFsbCwgbm90IGV2ZW4gZnJvbSB0aGUgcGNpCj4gPiA+ID4gPiA+IHN1YnN5c3RlbS4g QWxsIHJlYWRzIGZhaWwvcmV0dXJuIGEgZGVmYXVsdCBlcnJvciB2YWx1ZSAoMHhmZmZmZmZmZiku Cj4gPiA+ID4gPgo+ID4gPiA+ID4gQXJlIHRoZXNlIFBDSSBjb25maWcgcmVhZHMgdGhhdCByZXR1 cm4gMHhmZmZmZmZmZj8gIE9yIE1NSU8gcmVhZHM/Cj4gPiA+ID4gPiAibHNwY2kgLXZ2eHh4eCIg b2YgdGhlIGJyaWRnZSBhbmQgdGhlIEdQVSBtaWdodCBoYXZlIGEgY2x1ZSBhYm91dAo+ID4gPiA+ ID4gd2hldGhlciBhIFBDSSBlcnJvciBvY2N1cnJlZC4KPiA+ID4gPiA+Cj4gPiA+ID4KPiA+ID4g PiB0aGF0J3Mga2luZCBvZiBwcm9ibGVtYXRpYyBhcyBpdCBtaWdodCBqdXN0IGxvY2sgdXAgbXkg bWFjaGluZS4uLiBidXQKPiA+ID4gPiBsZXQgbWUgdHJ5IHRoYXQuCj4gPiA+ID4KPiA+ID4gPiA+ ID4gPiBJdCBzb3VuZHMgbGlrZSB0aGluZ3Mgd29yayBpZiB5b3UgcmV0dXJuIHRvIDguMCBHVC9z IGJlZm9yZSBzdXNwZW5kLAo+ID4gPiA+ID4gPiA+IHRoaW5ncyB3b3JrLiAgVGhhdCB3b3VsZCBt YWtlIHNlbnNlIHRvIG1lIGJlY2F1c2UgdGhlbiB0aGUgZHJpdmVyJ3MKPiA+ID4gPiA+ID4gPiBp ZGVhIG9mIHRoZSBsaW5rIHN0YXRlIGFmdGVyIHJlc3VtZSB3b3VsZCBtYXRjaCB0aGUgYWN0dWFs IHN0YXRlLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBkZXBlbmRzIG9uIHdoYXQgaXMgbWVhbnQg YnkgdGhlIGRyaXZlciBoZXJlLiBJbnNpZGUgTm91dmVhdSB3ZSBkb24ndAo+ID4gPiA+ID4gPiBj YXJlIG9uZSBiaXQgYWJvdXQgdGhlIGN1cnJlbnQgbGluayBzcGVlZCwgc28gSSBhc3N1bWUgeW91 IG1lYW4KPiA+ID4gPiA+ID4gc29tZXRoaW5nIGluc2lkZSB0aGUgcGNpIGNvcmUgY29kZT8KPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiBCdXQgSSBkb24ndCBzZWUgYSB3YXkgdG8gZGVhbCB3aXRo IHRoaXMgaW4gdGhlIFBDSSBjb3JlLiAgVGhlIFBDSSBjb3JlCj4gPiA+ID4gPiA+ID4gZG9lcyBz YXZlIGFuZCByZXN0b3JlIG1vc3Qgb2YgdGhlIGFyY2hpdGVjdGVkIGNvbmZpZyBzcGFjZSBhcm91 bmQKPiA+ID4gPiA+ID4gPiBzdXNwZW5kL3Jlc3VtZSwgYnV0IHNpbmNlIHRoaXMgYXBwZWFycyB0 byBiZSBhIGRldmljZS1zcGVjaWZpYyB0aGluZywKPiA+ID4gPiA+ID4gPiB0aGUgUENJIGNvcmUg d291bGQgaGF2ZSBubyBpZGVhIGhvdyB0byBzYXZlL3Jlc3RvcmUgaXQuCj4gPiA+ID4gPiA+Cj4g PiA+ID4gPiA+IGlmIHdlIGFzc3VtZSB0aGF0IHRoZSBuZWdvdGlhdGlvbiBvbiBhIGRldmljZSBs ZXZlbCB3b3JrcyBhcyBpbnRlbmRlZCwKPiA+ID4gPiA+ID4gdGhlbiBJIHdvdWxkIGV4cGVjdCB0 aGlzIHRvIGJlIGEgcGNpIGNvcmUgaXNzdWUsIHdoaWNoIG1pZ2h0IGFjdHVhbGx5Cj4gPiA+ID4g PiA+IGJlIG5vdCBmaXhhYmxlIHRoZXJlLiBCdXQgaWYgaXQncyBub3QsIHRoZW4gd2Ugd291bGQg aGF2ZSB0byBwdXQKPiA+ID4gPiA+ID4gc29tZXRoaW5nIGxpa2UgdGhhdCBpbnNpZGUgdGhlIHJ1 bnBtIGRvY3VtZW50YXRpb24gdG8gdGVsbCBkcml2ZXJzCj4gPiA+ID4gPiA+IHRoZXkgaGF2ZSB0 byBkbyBzb21ldGhpbmcgYWJvdXQgaXQuCj4gPiA+ID4gPiA+bHNwY2kgLXZ2eHh4eAo+ID4gPiA+ ID4gPiBCdXQgYWdhaW4sIGZvciBtZSBpdCBqdXN0IHNvdW5kcyBsaWtlIHRoZSBuZWdvdGlhdGlv biBvbiB0aGUgZGV2aWNlCj4gPiA+ID4gPiA+IGxldmVsIGZhaWxzIG9yIHNvbWV0aGluZyBpbnNp ZGUgcGNpIGNvcmUgbWVzc2VzIGl0IHVwLgo+ID4gPiA+ID4KPiA+ID4gPiA+IFRvIG1lIGl0IHNv dW5kcyBsaWtlIHRoZSBQTVUgc2NyaXB0IG1lc3NlZCBzb21ldGhpbmcgdXAsIGFuZCB0aGUgUENJ Cj4gPiA+ID4gPiBjb3JlIGhhcyBubyB3YXkgdG8ga25vdyB3aGF0IHRoYXQgd2FzIG9yIGhvdyB0 byBmaXggaXQuCj4gPiA+ID4gPgo+ID4gPiA+Cj4gPiA+ID4gc3VyZSwgSSBhbSBtYWlubHkgd29u ZGVyaW5nIHdoeSBpdCBkb2Vzbid0IHdvcmsgYWZ0ZXIgd2UgcG93ZXIgY3ljbGVkCj4gPiA+ID4g dGhlIEdQVSBhbmQgdGhlIGhvc3QgYnJpZGdlIGNvbnRyb2xsZXIsIGJlY2F1c2Ugbm8gbWF0dGVy IHdoYXQgdGhlCj4gPiA+ID4gc3RhdGUgd2FzIGJlZm9yZSwgd2UgaGF2ZSB0byByZXByb2JlIGlu c3RlYWQgb2YgcmVseWluZyBvbiBhIGtub3duCj4gPiA+ID4gc3RhdGUsIG5vPwo+ID4gPiA+Cj4g PiA+ID4gPiA+ID4gPiA+ID4gU2lnbmVkLW9mZi1ieTogS2Fyb2wgSGVyYnN0IDxraGVyYnN0QHJl ZGhhdC5jb20+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gUmV2aWV3ZWQtYnk6IEx5dWRlIFBhdWwgPGx5 dWRlQHJlZGhhdC5jb20+Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tCj4gPiA+ID4gPiA+ID4gPiA+ ID4gIGRybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9zdWJkZXYvcGNpLmggfCAgNSArKystLQo+ID4g PiA+ID4gPiA+ID4gPiA+ICBkcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvYmFzZS5jICAgIHwg IDkgKysrKysrKy0tCj4gPiA+ID4gPiA+ID4gPiA+ID4gIGRybS9ub3V2ZWF1L252a20vc3ViZGV2 L3BjaS9wY2llLmMgICAgfCAyNCArKysrKysrKysrKysrKysrKysrKy0tLS0KPiA+ID4gPiA+ID4g PiA+ID4gPiAgZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3ByaXYuaCAgICB8ICAyICsrCj4g PiA+ID4gPiA+ID4gPiA+ID4gIDQgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0aW9ucygrKSwgOCBk ZWxldGlvbnMoLSkKPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IGRpZmYg LS1naXQgYS9kcm0vbm91dmVhdS9pbmNsdWRlL252a20vc3ViZGV2L3BjaS5oIGIvZHJtL25vdXZl YXUvaW5jbHVkZS9udmttL3N1YmRldi9wY2kuaAo+ID4gPiA+ID4gPiA+ID4gPiA+IGluZGV4IDFm ZGYzMDk4Li5iMjM3OTNhMiAxMDA2NDQKPiA+ID4gPiA+ID4gPiA+ID4gPiAtLS0gYS9kcm0vbm91 dmVhdS9pbmNsdWRlL252a20vc3ViZGV2L3BjaS5oCj4gPiA+ID4gPiA+ID4gPiA+ID4gKysrIGIv ZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL3N1YmRldi9wY2kuaAo+ID4gPiA+ID4gPiA+ID4gPiA+ IEBAIC0yNiw4ICsyNiw5IEBAIHN0cnVjdCBudmttX3BjaSB7Cj4gPiA+ID4gPiA+ID4gPiA+ID4g ICAgICAgfSBhZ3A7Cj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICBzdHJ1Y3Qgewo+ID4gPiA+ID4gPiA+ID4gPiA+IC0gICAgICAgICAgICAgZW51bSBudmttX3Bj aWVfc3BlZWQgc3BlZWQ7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLSAgICAgICAgICAgICB1OCB3aWR0 aDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIGVudW0gbnZrbV9wY2llX3NwZWVk IGN1cl9zcGVlZDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIGVudW0gbnZrbV9w Y2llX3NwZWVkIGRlZl9zcGVlZDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIHU4 IGN1cl93aWR0aDsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICB9IHBjaWU7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBib29sIG1zaTsKPiA+ID4gPiA+ID4g PiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYyBi L2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9iYXNlLmMKPiA+ID4gPiA+ID4gPiA+ID4gPiBp bmRleCBlZTI0MzFhNy4uZDlmYjVhODMgMTAwNjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tIGEv ZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsr KyBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9iYXNlLmMKPiA+ID4gPiA+ID4gPiA+ID4g PiBAQCAtOTAsNiArOTAsOCBAQCBudmttX3BjaV9maW5pKHN0cnVjdCBudmttX3N1YmRldiAqc3Vi ZGV2LCBib29sIHN1c3BlbmQpCj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4g PiAgICAgICBpZiAocGNpLT5hZ3AuYnJpZGdlKQo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgICAg ICAgICAgbnZrbV9hZ3BfZmluaShwY2kpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIGVsc2Ug aWYgKHBjaV9pc19wY2llKHBjaS0+cGRldikpCj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgICAg ICAgICBudmttX3BjaWVfZmluaShwY2kpOwo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgICAgcmV0dXJuIDA7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIH0KPiA+ID4gPiA+ ID4gPiA+ID4gPiBAQCAtMTAwLDYgKzEwMiw4IEBAIG52a21fcGNpX3ByZWluaXQoc3RydWN0IG52 a21fc3ViZGV2ICpzdWJkZXYpCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgc3RydWN0IG52a21f cGNpICpwY2kgPSBudmttX3BjaShzdWJkZXYpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICAgICAgIGlm IChwY2ktPmFncC5icmlkZ2UpCj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICBudmtt X2FncF9wcmVpbml0KHBjaSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgZWxzZSBpZiAocGNp X2lzX3BjaWUocGNpLT5wZGV2KSkKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIG52 a21fcGNpZV9wcmVpbml0KHBjaSk7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gICAgICAgcmV0dXJuIDA7 Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIH0KPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ ID4gPiA+IEBAIC0xOTMsOCArMTk3LDkgQEAgbnZrbV9wY2lfbmV3Xyhjb25zdCBzdHJ1Y3QgbnZr bV9wY2lfZnVuYyAqZnVuYywgc3RydWN0IG52a21fZGV2aWNlICpkZXZpY2UsCj4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgICAgcGNpLT5mdW5jID0gZnVuYzsKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAg ICBwY2ktPnBkZXYgPSBkZXZpY2UtPmZ1bmMtPnBjaShkZXZpY2UpLT5wZGV2Owo+ID4gPiA+ID4g PiA+ID4gPiA+ICAgICAgIHBjaS0+aXJxID0gLTE7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLSAgICAg cGNpLT5wY2llLnNwZWVkID0gLTE7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLSAgICAgcGNpLT5wY2ll LndpZHRoID0gLTE7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgcGNpLT5wY2llLmN1cl9zcGVl ZCA9IC0xOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIHBjaS0+cGNpZS5kZWZfc3BlZWQgPSAt MTsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICBwY2ktPnBjaWUuY3VyX3dpZHRoID0gLTE7Cj4g PiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICBpZiAoZGV2aWNlLT50 eXBlID09IE5WS01fREVWSUNFX0FHUCkKPiA+ID4gPiA+ID4gPiA+ID4gPiAgICAgICAgICAgICAg IG52a21fYWdwX2N0b3IocGNpKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJt L25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUuYyBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2 L3BjaS9wY2llLmMKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmRleCA3MGNjYmUwZC4uNzMxZGQzMGUg MTAwNjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tIGEvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYv cGNpL3BjaWUuYwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RybS9ub3V2ZWF1L252a20vc3Vi ZGV2L3BjaS9wY2llLmMKPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtODUsNiArODUsMTMgQEAgbnZr bV9wY2llX29uZWluaXQoc3RydWN0IG52a21fcGNpICpwY2kpCj4gPiA+ID4gPiA+ID4gPiA+ID4g ICAgICAgcmV0dXJuIDA7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIH0KPiA+ID4gPiA+ID4gPiA+ID4g Pgo+ID4gPiA+ID4gPiA+ID4gPiA+ICtpbnQKPiA+ID4gPiA+ID4gPiA+ID4gPiArbnZrbV9wY2ll X3ByZWluaXQoc3RydWN0IG52a21fcGNpICpwY2kpCj4gPiA+ID4gPiA+ID4gPiA+ID4gK3sKPiA+ ID4gPiA+ID4gPiA+ID4gPiArICAgICBwY2ktPnBjaWUuZGVmX3NwZWVkID0gbnZrbV9wY2llX2dl dF9zcGVlZChwY2kpOwo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgIHJldHVybiAwOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICt9Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKwo+ID4gPiA+ID4gPiA+ID4gPiA+ ICBpbnQKPiA+ID4gPiA+ID4gPiA+ID4gPiAgbnZrbV9wY2llX2luaXQoc3RydWN0IG52a21fcGNp ICpwY2kpCj4gPiA+ID4gPiA+ID4gPiA+ID4gIHsKPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtMTA1 LDEyICsxMTIsMjEgQEAgbnZrbV9wY2llX2luaXQoc3RydWN0IG52a21fcGNpICpwY2kpCj4gPiA+ ID4gPiA+ID4gPiA+ID4gICAgICAgaWYgKHBjaS0+ZnVuYy0+cGNpZS5pbml0KQo+ID4gPiA+ID4g PiA+ID4gPiA+ICAgICAgICAgICAgICAgcGNpLT5mdW5jLT5wY2llLmluaXQocGNpKTsKPiA+ID4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+IC0gICAgIGlmIChwY2ktPnBjaWUuc3Bl ZWQgIT0gLTEpCj4gPiA+ID4gPiA+ID4gPiA+ID4gLSAgICAgICAgICAgICBudmttX3BjaWVfc2V0 X2xpbmsocGNpLCBwY2ktPnBjaWUuc3BlZWQsIHBjaS0+cGNpZS53aWR0aCk7Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgaWYgKHBjaS0+cGNpZS5jdXJfc3BlZWQgIT0gLTEpCj4gPiA+ID4gPiA+ ID4gPiA+ID4gKyAgICAgICAgICAgICBudmttX3BjaWVfc2V0X2xpbmsocGNpLCBwY2ktPnBjaWUu Y3VyX3NwZWVkLAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHBjaS0+cGNpZS5jdXJfd2lkdGgpOwo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4g PiA+ID4gPiA+ID4gICAgICAgcmV0dXJuIDA7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gIH0KPiA+ID4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+ICtpbnQKPiA+ID4gPiA+ID4gPiA+ID4g PiArbnZrbV9wY2llX2Zpbmkoc3RydWN0IG52a21fcGNpICpwY2kpCj4gPiA+ID4gPiA+ID4gPiA+ ID4gK3sKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICBpZiAoIUlTX0VSUl9WQUxVRShwY2ktPnBj aWUuZGVmX3NwZWVkKSkKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiBu dmttX3BjaWVfc2V0X2xpbmsocGNpLCBwY2ktPnBjaWUuZGVmX3NwZWVkLCAxNik7Cj4gPiA+ID4g PiA+ID4gPiA+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gK30KPiA+ID4g PiA+ID4gPiA+ID4gPiArCj4gPiA+ID4gPiA+ID4gPiA+ID4gIGludAo+ID4gPiA+ID4gPiA+ID4g PiA+ICBudmttX3BjaWVfc2V0X2xpbmsoc3RydWN0IG52a21fcGNpICpwY2ksIGVudW0gbnZrbV9w Y2llX3NwZWVkIHNwZWVkLCB1OCB3aWR0aCkKPiA+ID4gPiA+ID4gPiA+ID4gPiAgewo+ID4gPiA+ ID4gPiA+ID4gPiA+IEBAIC0xNDYsOCArMTYyLDggQEAgbnZrbV9wY2llX3NldF9saW5rKHN0cnVj dCBudmttX3BjaSAqcGNpLCBlbnVtIG52a21fcGNpZV9zcGVlZCBzcGVlZCwgdTggd2lkdGgpCj4g PiA+ID4gPiA+ID4gPiA+ID4gICAgICAgICAgICAgICBzcGVlZCA9IG1heF9zcGVlZDsKPiA+ID4g PiA+ID4gPiA+ID4gPiAgICAgICB9Cj4gPiA+ID4gPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gPiA+ ID4gPiAtICAgICBwY2ktPnBjaWUuc3BlZWQgPSBzcGVlZDsKPiA+ID4gPiA+ID4gPiA+ID4gPiAt ICAgICBwY2ktPnBjaWUud2lkdGggPSB3aWR0aDsKPiA+ID4gPiA+ID4gPiA+ID4gPiArICAgICBw Y2ktPnBjaWUuY3VyX3NwZWVkID0gc3BlZWQ7Cj4gPiA+ID4gPiA+ID4gPiA+ID4gKyAgICAgcGNp LT5wY2llLmN1cl93aWR0aCA9IHdpZHRoOwo+ID4gPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ ID4gPiA+ID4gICAgICAgaWYgKHNwZWVkID09IGN1cl9zcGVlZCkgewo+ID4gPiA+ID4gPiA+ID4g PiA+ICAgICAgICAgICAgICAgbnZrbV9kZWJ1ZyhzdWJkZXYsICJyZXF1ZXN0ZWQgbWF0Y2hlcyBj dXJyZW50IHNwZWVkXG4iKTsKPiA+ID4gPiA+ID4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJtL25v dXZlYXUvbnZrbS9zdWJkZXYvcGNpL3ByaXYuaCBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3Bj aS9wcml2LmgKPiA+ID4gPiA+ID4gPiA+ID4gPiBpbmRleCBhMGQ0YzAwNy4uZTc3NDQ2NzEgMTAw NjQ0Cj4gPiA+ID4gPiA+ID4gPiA+ID4gLS0tIGEvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNp L3ByaXYuaAo+ID4gPiA+ID4gPiA+ID4gPiA+ICsrKyBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2 L3BjaS9wcml2LmgKPiA+ID4gPiA+ID4gPiA+ID4gPiBAQCAtNjAsNSArNjAsNyBAQCBlbnVtIG52 a21fcGNpZV9zcGVlZCBnazEwNF9wY2llX21heF9zcGVlZChzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4g PiA+ID4gPiA+ID4gPiA+ID4gIGludCBnazEwNF9wY2llX3ZlcnNpb25fc3VwcG9ydGVkKHN0cnVj dCBudmttX3BjaSAqKTsKPiA+ID4gPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gPiA+ICBp bnQgbnZrbV9wY2llX29uZWluaXQoc3RydWN0IG52a21fcGNpICopOwo+ID4gPiA+ID4gPiA+ID4g PiA+ICtpbnQgbnZrbV9wY2llX3ByZWluaXQoc3RydWN0IG52a21fcGNpICopOwo+ID4gPiA+ID4g PiA+ID4gPiA+ICBpbnQgbnZrbV9wY2llX2luaXQoc3RydWN0IG52a21fcGNpICopOwo+ID4gPiA+ ID4gPiA+ID4gPiA+ICtpbnQgbnZrbV9wY2llX2Zpbmkoc3RydWN0IG52a21fcGNpICopOwo+ID4g PiA+ID4gPiA+ID4gPiA+ICAjZW5kaWYKPiA+ID4gPiA+ID4gPiA+ID4gPiAtLQo+ID4gPiA+ID4g PiA+ID4gPiA+IDIuMjEuMAo+ID4gPiA+ID4gPiA+ID4gPiA+Cl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCk5vdXZlYXUgbWFpbGluZyBsaXN0Ck5vdXZlYXVA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vbm91dmVhdQ==