From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7C87C04AAF for ; Tue, 21 May 2019 09:46:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 73B4F21479 for ; Tue, 21 May 2019 09:46:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726448AbfEUJqw convert rfc822-to-8bit (ORCPT ); Tue, 21 May 2019 05:46:52 -0400 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:35805 "EHLO relay7-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726391AbfEUJqv (ORCPT ); Tue, 21 May 2019 05:46:51 -0400 X-Originating-IP: 90.88.22.185 Received: from xps13 (aaubervilliers-681-1-80-185.w90-88.abo.wanadoo.fr [90.88.22.185]) (Authenticated sender: miquel.raynal@bootlin.com) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id B16F920005; Tue, 21 May 2019 09:46:44 +0000 (UTC) Date: Tue, 21 May 2019 11:46:44 +0200 From: Miquel Raynal To: Stephen Boyd Cc: Michael Turquette , Russell King , linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , Antoine Tenart , Maxime Chevallier , Gregory Clement , Nadav Haklai Subject: Re: [PATCH v4 0/4] Add device links to clocks Message-ID: <20190521114644.7000a751@xps13> In-Reply-To: <155502565678.20095.10517989462650657961@swboyd.mtv.corp.google.com> References: <20190108161940.4814-1-miquel.raynal@bootlin.com> <155502565678.20095.10517989462650657961@swboyd.mtv.corp.google.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Sender: linux-clk-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-clk@vger.kernel.org Hi Stephen, Stephen Boyd wrote on Thu, 11 Apr 2019 16:34:16 -0700: > Quoting Miquel Raynal (2019-01-08 08:19:36) > > Hello, > > > > While working on suspend to RAM feature, I ran into troubles multiple > > times when clocks where not suspending/resuming at the desired time. I > > had a look at the core and I think the same logic as in the > > regulator's core may be applied here to (very easily) fix this issue: > > using device links. > > > > The only additional change I had to do was to always (when available) > > populate the device entry of the core clock structure so that it could > > be used later. This is the purpose of patch 1. Patch 2 actually adds > > support for device links. > > > > Here is a step-by-step explanation of how links are managed, following > > Maxime Ripard's suggestion. > > > > > > The order of probe has no importance because the framework already > > handles orphaned clocks so let's be simple and say there are two root > > clocks, not depending on anything, that are probed first: xtal0 and > > xtal1. None of these clocks have a parent, there is no device link in > > the game, yet. > > > > +----------------+ +----------------+ > > | | | | > > | | | | > > | xtal0 core | | xtal1 core | > > | | | | > > | | | | > > +-------^^-------+ +-------^^-------+ > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | xtal0 clk | | xtal1 clk | > > | | | | > > +----------------+ +----------------+ > > > > Then, a peripheral clock periph0 is probed. His parent is xtal1. The > > clock_register_*() call will run __clk_init_parent() and a link between > > periph0's core and xtal1's core will be created and stored in > > periph0's core->parent_clk_link entry. > > > > +----------------+ +----------------+ > > | | | | > > | | | | > > | xtal0 core | | xtal1 core | > > | | | | > > | | | | > > +-------^^-------+ +-------^^-------+ > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | xtal0 clk | | xtal1 clk | > > | | | | > > +----------------+ +-------^--------+ > > | > > | > > +--------------+ > > | ->parent_clk_link > > | > > +----------------+ > > | | > > | | > > | periph0 core | > > | | > > | | > > +-------^^-------+ > > || > > || > > +----------------+ > > | | > > | periph0 clk 0 | > > | | > > +----------------+ > > > > Then, device0 is probed and "get" the periph0 clock. clk_get() will be > > called and a struct clk will be instantiated for device0 (called in > > the figure clk 1). A link between device0 and the new clk 1 instance of > > periph0 will be created and stored in the clk->consumer_link entry. > > > > +----------------+ +----------------+ > > | | | | > > | | | | > > | xtal0 core | | xtal1 core | > > | | | | > > | | | | > > +-------^^-------+ +-------^^-------+ > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | xtal0 clk | | xtal1 clk | > > | | | | > > +----------------+ +-------^--------+ > > | > > | > > +--------------+ > > | ->parent_clk_link > > | > > +----------------+ > > | | > > | | > > | periph0 core | > > | <-------------+ > > | <-------------| > > +-------^^-------+ || > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | periph0 clk 0 | | periph0 clk 1 | > > | | | | > > +----------------+ +----------------+ > > | > > | ->consumer_link > > | > > | > > | > > +-------v--------+ > > | device0 | > > +----------------+ > > > > Right now, device0 is linked to periph0, itself linked to xtal1 so > > everything is fine. > > > > Now let's get some fun: the new parent of periph0 is xtal1. The process > > will call clk_reparent(), periph0's core->parent_clk_link will be > > destroyed and a new link to xtal1 will be setup and stored. The > > situation is now that device0 is linked to periph0 and periph0 is > > linked to xtal1, so the dependency between device0 and xtal1 is still > > clear. > > > > +----------------+ +----------------+ > > | | | | > > | | | | > > | xtal0 core | | xtal1 core | > > | | | | > > | | | | > > +-------^^-------+ +-------^^-------+ > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | xtal0 clk | | xtal1 clk | > > | | | | > > +-------^--------+ +----------------+ > > | > > | \ / > > +----------------------------x > > ->parent_clk_link | / \ > > | > > +----------------+ > > | | > > | | > > | periph0 core | > > | <-------------+ > > | <-------------| > > +-------^^-------+ || > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | periph0 clk 0 | | periph0 clk 1 | > > | | | | > > +----------------+ +----------------+ > > | > > | ->consumer_link > > | > > | > > | > > +-------v--------+ > > | device0 | > > +----------------+ > > > > I assume periph0 cannot be removed while there are devices using it, > > same for xtal0. > > > > What can happen is that device0 'put' the clock periph0. The relevant > > link is deleted and the clk instance dropped. > > > > +----------------+ +----------------+ > > | | | | > > | | | | > > | xtal0 core | | xtal1 core | > > | | | | > > | | | | > > +-------^^-------+ +-------^^-------+ > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | xtal0 clk | | xtal1 clk | > > | | | | > > +-------^--------+ +----------------+ > > | > > | \ / > > +----------------------------x > > ->parent_clk_link | / \ > > | > > +----------------+ > > | | > > | | > > | periph0 core | > > | | > > | | > > +-------^^-------+ > > || > > || > > +----------------+ > > | | > > | periph0 clk 0 | > > | | > > +----------------+ > > > > Now we can unregister periph0: link with the parent will be destroyed > > and the clock may be safely removed. > > > > +----------------+ +----------------+ > > | | | | > > | | | | > > | xtal0 core | | xtal1 core | > > | | | | > > | | | | > > +-------^^-------+ +-------^^-------+ > > || || > > || || > > +----------------+ +----------------+ > > | | | | > > | xtal0 clk | | xtal1 clk | > > | | | | > > +----------------+ +----------------+ > > > > > > This is my understanding of the common clock framework and how links > > can be added to it. > > > > As a result, here are the links created during the boot of an > > ESPRESSObin: > > > > Sorry this patch series is taking way too long to get merged. It's > already mid-April! > > So I still have some of the original questions I had from before, mostly > around circular parent chains between clk providers. For example, there > are clk providers that both provide clks to other providers and consume > clks from those providers. Does device links work gracefully here? > > Just speaking from my own qcom experience, I can point to the PCIe PHY > that's a provider of a clk to GCC and a consumer of a clk in GCC. In > block diagram form this is: > > > PCIE PHY GCC > +--------------+ +-------------------------+ > | | | | > | PHY clk ->----------+---- gcc_pipe_clk ---+ | > | | | | | > | | | | | > | pci_pipe_clk <----------|---------------------+ | > | | | | > +--------------+ +-------------------------+ > > The end result is that the PCIe PHY is a clk controller that provides > the PHY clk to GCC's gcc_pipe_clk and then it gets the same clk signal > back from GCC and uses it on the PCIe PHY's pci_pipe_clk input. > > So is this is a problem? > It's now my turn to get back on this topic. I just put my noise back into this and for what I understand of the clk subsystem, I think the situation you describe could be pictured like this: +---------------+ | | | | | PCIe PHY | | | | | +-----^^--------+ || || +---------------+ | | | pcie_pipe_clk | | | +------^--------+ | | ->parent_clk_link | | +---------------+ | | | | | GCC | | | | | +------^^-------+ || || +---------------+ | | | gcc_pipe_clk | | | +------^--------+ | | ->parent_clk_link | | +---------------+ | | | | | PCIe PHY | | | | | +------^^-------+ || || +---------------+ | | | phy_clk | | | +---------------+ IMHO the fact that the first and third blocks are the same does not interfere with device links. Honestly, I cannot be 100% sure it won't break on qcom designs, maybe the best would be to have someone to test. I don't have the relevant hardware. Do you? It would be really helpful! There is an entire PCIe series blocked, waiting for these device links to be merged so it would help a lot if someone could test. Thank you very much, Miquèl From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-1.0 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A7D33C04AAF for ; Tue, 21 May 2019 09:47:03 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7C3ED21479 for ; Tue, 21 May 2019 09:47:03 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="hB4PNyMX" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7C3ED21479 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=bootlin.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=VaaXbmGtGZoqGwjFhHra+xnLuFfTn1m3YGo+XRPL2y8=; b=hB4PNyMXo92V7m pe5qO9Ni9wDVykFOOiMx2TDd55XIEENvhgW+XBMn8k2yj7iqfDzufdNNwRq+h+rGIyVOxvndrMtbv 9cBWkwI8491aZOmM0E6YjbZYzekAmULttd8eolvJu9dIDQpHvWxSfQV6XwBFpH7uEDODzUaczKJrJ NNhaD3MfijRKV1M7lt+qlsx+102gIaATHXqKuqmxHF6XDk5Rw3cXKB91/fEejR7j/rfhsoLG2bl+t UaIwURuFzQ3FFP3j3RG6OcgHZN0hmbsey56R+kgK3uiEbUFHUVYMa+ihR8YAqON7ThBc99r5E/hQG RxWbnao4lUvWfK/zR+xA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hT1MJ-0004CL-Cf; Tue, 21 May 2019 09:46:59 +0000 Received: from relay7-d.mail.gandi.net ([217.70.183.200]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hT1MF-00048e-LI for linux-arm-kernel@lists.infradead.org; Tue, 21 May 2019 09:46:58 +0000 X-Originating-IP: 90.88.22.185 Received: from xps13 (aaubervilliers-681-1-80-185.w90-88.abo.wanadoo.fr [90.88.22.185]) (Authenticated sender: miquel.raynal@bootlin.com) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id B16F920005; Tue, 21 May 2019 09:46:44 +0000 (UTC) Date: Tue, 21 May 2019 11:46:44 +0200 From: Miquel Raynal To: Stephen Boyd Subject: Re: [PATCH v4 0/4] Add device links to clocks Message-ID: <20190521114644.7000a751@xps13> In-Reply-To: <155502565678.20095.10517989462650657961@swboyd.mtv.corp.google.com> References: <20190108161940.4814-1-miquel.raynal@bootlin.com> <155502565678.20095.10517989462650657961@swboyd.mtv.corp.google.com> Organization: Bootlin X-Mailer: Claws Mail 3.17.1 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190521_024656_612419_74333874 X-CRM114-Status: GOOD ( 30.34 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gregory Clement , Antoine Tenart , Michael Turquette , linux-kernel@vger.kernel.org, Russell King , Nadav Haklai , Thomas Petazzoni , Maxime Chevallier , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgU3RlcGhlbiwKClN0ZXBoZW4gQm95ZCA8c2JveWRAa2VybmVsLm9yZz4gd3JvdGUgb24gVGh1 LCAxMSBBcHIgMjAxOSAxNjozNDoxNgotMDcwMDoKCj4gUXVvdGluZyBNaXF1ZWwgUmF5bmFsICgy MDE5LTAxLTA4IDA4OjE5OjM2KQo+ID4gSGVsbG8sCj4gPiAKPiA+IFdoaWxlIHdvcmtpbmcgb24g c3VzcGVuZCB0byBSQU0gZmVhdHVyZSwgSSByYW4gaW50byB0cm91YmxlcyBtdWx0aXBsZQo+ID4g dGltZXMgd2hlbiBjbG9ja3Mgd2hlcmUgbm90IHN1c3BlbmRpbmcvcmVzdW1pbmcgYXQgdGhlIGRl c2lyZWQgdGltZS4gSQo+ID4gaGFkIGEgbG9vayBhdCB0aGUgY29yZSBhbmQgSSB0aGluayB0aGUg c2FtZSBsb2dpYyBhcyBpbiB0aGUKPiA+IHJlZ3VsYXRvcidzIGNvcmUgbWF5IGJlIGFwcGxpZWQg aGVyZSB0byAodmVyeSBlYXNpbHkpIGZpeCB0aGlzIGlzc3VlOgo+ID4gdXNpbmcgZGV2aWNlIGxp bmtzLgo+ID4gCj4gPiBUaGUgb25seSBhZGRpdGlvbmFsIGNoYW5nZSBJIGhhZCB0byBkbyB3YXMg dG8gYWx3YXlzICh3aGVuIGF2YWlsYWJsZSkKPiA+IHBvcHVsYXRlIHRoZSBkZXZpY2UgZW50cnkg b2YgdGhlIGNvcmUgY2xvY2sgc3RydWN0dXJlIHNvIHRoYXQgaXQgY291bGQKPiA+IGJlIHVzZWQg bGF0ZXIuIFRoaXMgaXMgdGhlIHB1cnBvc2Ugb2YgcGF0Y2ggMS4gUGF0Y2ggMiBhY3R1YWxseSBh ZGRzCj4gPiBzdXBwb3J0IGZvciBkZXZpY2UgbGlua3MuCj4gPiAKPiA+IEhlcmUgaXMgYSBzdGVw LWJ5LXN0ZXAgZXhwbGFuYXRpb24gb2YgaG93IGxpbmtzIGFyZSBtYW5hZ2VkLCBmb2xsb3dpbmcK PiA+IE1heGltZSBSaXBhcmQncyBzdWdnZXN0aW9uLgo+ID4gCj4gPiAKPiA+IFRoZSBvcmRlciBv ZiBwcm9iZSBoYXMgbm8gaW1wb3J0YW5jZSBiZWNhdXNlIHRoZSBmcmFtZXdvcmsgYWxyZWFkeQo+ ID4gaGFuZGxlcyBvcnBoYW5lZCBjbG9ja3Mgc28gbGV0J3MgYmUgc2ltcGxlIGFuZCBzYXkgdGhl cmUgYXJlIHR3byByb290Cj4gPiBjbG9ja3MsIG5vdCBkZXBlbmRpbmcgb24gYW55dGhpbmcsIHRo YXQgYXJlIHByb2JlZCBmaXJzdDogeHRhbDAgYW5kCj4gPiB4dGFsMS4gTm9uZSBvZiB0aGVzZSBj bG9ja3MgaGF2ZSBhIHBhcmVudCwgdGhlcmUgaXMgbm8gZGV2aWNlIGxpbmsgaW4KPiA+IHRoZSBn YW1lLCB5ZXQuCj4gPiAKPiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0t LS0tLS0tLS0tLS0tKwo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAg ICAgICAgICAgICB8Cj4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgIHwKPiA+ICAgIHwgICB4dGFsMCBjb3JlICAgfCAgICAgICAgICAgIHwgICB4dGFs MSBjb3JlICAgfAo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICB8Cj4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAg ICAgICAgIHwKPiA+ICAgICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tXl4t LS0tLS0tKwo+ID4gICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAo+ ID4gICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAo+ID4gICAgKy0t LS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICB8ICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgIHwgICB4 dGFsMCBjbGsgICAgfCAgICAgICAgICAgIHwgICB4dGFsMSBjbGsgICAgfAo+ID4gICAgfCAgICAg ICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICArLS0tLS0t LS0tLS0tLS0tLSsgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+IAo+ID4gVGhlbiwg YSBwZXJpcGhlcmFsIGNsb2NrIHBlcmlwaDAgaXMgcHJvYmVkLiBIaXMgcGFyZW50IGlzIHh0YWwx LiBUaGUKPiA+IGNsb2NrX3JlZ2lzdGVyXyooKSBjYWxsIHdpbGwgcnVuIF9fY2xrX2luaXRfcGFy ZW50KCkgYW5kIGEgbGluayBiZXR3ZWVuCj4gPiBwZXJpcGgwJ3MgY29yZSBhbmQgeHRhbDEncyBj b3JlIHdpbGwgYmUgY3JlYXRlZCBhbmQgc3RvcmVkIGluCj4gPiBwZXJpcGgwJ3MgY29yZS0+cGFy ZW50X2Nsa19saW5rIGVudHJ5Lgo+ID4gCj4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAg ICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAg ICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAg ICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICB8ICAgeHRhbDAgY29yZSAgIHwgICAgICAgICAg ICB8ICAgeHRhbDEgY29yZSAgIHwKPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAg IHwgICAgICAgICAgICAgICAgfAo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiAgICArLS0tLS0tLV5eLS0tLS0tLSsgICAgICAgICAgICAr LS0tLS0tLV5eLS0tLS0tLSsKPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAg ICAgICAgfHwKPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwK PiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4g PiAgICB8ICAgeHRhbDAgY2xrICAgIHwgICAgICAgICAgICB8ICAgeHRhbDEgY2xrICAgIHwKPiA+ ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4g ICAgKy0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS1eLS0tLS0tLS0rCj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICArLS0tLS0tLS0tLS0tLS0rCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAt PnBhcmVudF9jbGtfbGluawo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiAgICAg ICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ICAgICAgICAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8 Cj4gPiAgICAgICAgICAgICAgICAgICB8ICBwZXJpcGgwIGNvcmUgIHwKPiA+ICAgICAgICAgICAg ICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsKPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgICAgfHwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg fHwKPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ID4gICAgICAgICAg ICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICB8ICBwZXJp cGgwIGNsayAwIHwKPiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4g ICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAKPiA+IFRoZW4sIGRldmlj ZTAgaXMgcHJvYmVkIGFuZCAiZ2V0IiB0aGUgcGVyaXBoMCBjbG9jay4gY2xrX2dldCgpIHdpbGwg YmUKPiA+IGNhbGxlZCBhbmQgYSBzdHJ1Y3QgY2xrIHdpbGwgYmUgaW5zdGFudGlhdGVkIGZvciBk ZXZpY2UwIChjYWxsZWQgaW4KPiA+IHRoZSBmaWd1cmUgY2xrIDEpLiBBIGxpbmsgYmV0d2VlbiBk ZXZpY2UwIGFuZCB0aGUgbmV3IGNsayAxIGluc3RhbmNlIG9mCj4gPiBwZXJpcGgwIHdpbGwgYmUg Y3JlYXRlZCBhbmQgc3RvcmVkIGluIHRoZSBjbGstPmNvbnN1bWVyX2xpbmsgZW50cnkuCj4gPiAK PiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4g PiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ ICAgIHwgICB4dGFsMCBjb3JlICAgfCAgICAgICAgICAgIHwgICB4dGFsMSBjb3JlICAgfAo+ID4g ICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAg ICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAg ICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKwo+ID4gICAg ICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAo+ID4gICAgICAgICAgICB8 fCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAo+ID4gICAgKy0tLS0tLS0tLS0tLS0tLS0r ICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICB8ICAgICAgICAgICAgICAgIHwg ICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgIHwgICB4dGFsMCBjbGsgICAgfCAg ICAgICAgICAgIHwgICB4dGFsMSBjbGsgICAgfAo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAg ICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAg ICAgICAgICArLS0tLS0tLV4tLS0tLS0tLSsKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLSsKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIC0+cGFyZW50X2Nsa19saW5rCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0t LS0tLS0tKwo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICAg ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICAgIHwg IHBlcmlwaDAgY29yZSAgfAo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICA8 LS0tLS0tLS0tLS0tLSsKPiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgPC0t LS0tLS0tLS0tLS18Cj4gPiAgICAgICAgICAgICAgICAgICArLS0tLS0tLV5eLS0tLS0tLSsgICAg ICAgICAgICB8fAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAg ICAgICAgfHwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAg ICAgIHx8Cj4gPiAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgKy0tLS0t LS0tLS0tLS0tLS0rCj4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICB8ICBwZXJpcGgwIGNsayAw IHwgICAgfCAgcGVyaXBoMCBjbGsgMSB8Cj4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAg ICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICArLS0t LS0tLS0tLS0tLS0tLSsgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0+Y29uc3VtZXJfbGluawo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tdi0tLS0tLS0tKwo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgZGV2aWNlMCAgICAgfAo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ ID4gCj4gPiBSaWdodCBub3csIGRldmljZTAgaXMgbGlua2VkIHRvIHBlcmlwaDAsIGl0c2VsZiBs aW5rZWQgdG8geHRhbDEgc28KPiA+IGV2ZXJ5dGhpbmcgaXMgZmluZS4KPiA+IAo+ID4gTm93IGxl dCdzIGdldCBzb21lIGZ1bjogdGhlIG5ldyBwYXJlbnQgb2YgcGVyaXBoMCBpcyB4dGFsMS4gVGhl IHByb2Nlc3MKPiA+IHdpbGwgY2FsbCBjbGtfcmVwYXJlbnQoKSwgcGVyaXBoMCdzIGNvcmUtPnBh cmVudF9jbGtfbGluayB3aWxsIGJlCj4gPiBkZXN0cm95ZWQgYW5kIGEgbmV3IGxpbmsgdG8geHRh bDEgd2lsbCBiZSBzZXR1cCBhbmQgc3RvcmVkLiBUaGUKPiA+IHNpdHVhdGlvbiBpcyBub3cgdGhh dCBkZXZpY2UwIGlzIGxpbmtlZCB0byBwZXJpcGgwIGFuZCBwZXJpcGgwIGlzCj4gPiBsaW5rZWQg dG8geHRhbDEsIHNvIHRoZSBkZXBlbmRlbmN5IGJldHdlZW4gZGV2aWNlMCBhbmQgeHRhbDEgaXMg c3RpbGwKPiA+IGNsZWFyLgo+ID4gCj4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAg ICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAg IHwgICAgICAgICAgICAgICAgfAo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiAgICB8ICAgeHRhbDAgY29yZSAgIHwgICAgICAgICAgICB8 ICAgeHRhbDEgY29yZSAgIHwKPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwg ICAgICAgICAgICAgICAgfAo+ID4gICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAg ICAgICAgICAgICAgICB8Cj4gPiAgICArLS0tLS0tLV5eLS0tLS0tLSsgICAgICAgICAgICArLS0t LS0tLV5eLS0tLS0tLSsKPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAg ICAgfHwKPiA+ICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKPiA+ ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ID4g ICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAg ICB8ICAgeHRhbDAgY2xrICAgIHwgICAgICAgICAgICB8ICAgeHRhbDEgY2xrICAgIHwKPiA+ICAg IHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAg Ky0tLS0tLS1eLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICAg ICAgICAgIHwKPiA+ICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwgLwo+ ID4gICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXggIAo+ID4gICAgICAg LT5wYXJlbnRfY2xrX2xpbmsgICB8ICAgICAgICAgICAgLyBcICAKPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4g PiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAg ICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgICAgICAgICAgICAgICAgfCAgcGVyaXBoMCBj b3JlICB8Cj4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIDwtLS0tLS0tLS0t LS0tKwo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICA8LS0tLS0tLS0tLS0t LXwKPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKyAgICAgICAgICAgIHx8 Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAgICAgICB8fAo+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgfHwKPiA+ ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICArLS0tLS0tLS0tLS0tLS0t LSsKPiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgICAg ICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICAgIHwgIHBlcmlwaDAgY2xrIDAgfCAgICB8ICBw ZXJpcGgwIGNsayAxIHwKPiA+ICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAg ICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0t LS0tKyAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgLT5jb25zdW1lcl9saW5rCj4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKy0tLS0tLS12LS0tLS0tLS0rCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgfCAgICBkZXZpY2UwICAgICB8Cj4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAKPiA+IEkg YXNzdW1lIHBlcmlwaDAgY2Fubm90IGJlIHJlbW92ZWQgd2hpbGUgdGhlcmUgYXJlIGRldmljZXMg dXNpbmcgaXQsCj4gPiBzYW1lIGZvciB4dGFsMC4KPiA+IAo+ID4gV2hhdCBjYW4gaGFwcGVuIGlz IHRoYXQgZGV2aWNlMCAncHV0JyB0aGUgY2xvY2sgcGVyaXBoMC4gVGhlIHJlbGV2YW50Cj4gPiBs aW5rIGlzIGRlbGV0ZWQgYW5kIHRoZSBjbGsgaW5zdGFuY2UgZHJvcHBlZC4KPiA+IAo+ID4gICAg Ky0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICB8 ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgIHwg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgfCAg IHh0YWwwIGNvcmUgICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNvcmUgICB8Cj4gPiAgICB8ICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgIHwgICAg ICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgKy0tLS0t LS1eXi0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS1eXi0tLS0tLS0rCj4gPiAgICAgICAgICAg IHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Cj4gPiAgICAgICAgICAgIHx8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHx8Cj4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAg ICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAg ICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAg ICAgfCAgIHh0YWwxIGNsayAgICB8Cj4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAg ICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgICstLS0tLS0tXi0tLS0tLS0tKyAgICAgICAgICAg ICstLS0tLS0tLS0tLS0tLS0tKwo+ID4gICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgICAgICAgICAgICBcIC8KPiA+ICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS14ICAKPiA+ICAgICAgIC0+cGFyZW50X2Nsa19saW5rICAgfCAgICAgICAg ICAgIC8gXCAgCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAg ICAgICAgICstLS0tLS0tLS0tLS0tLS0tKwo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAg ICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAg ICAgICAgICAgICAgICAgIHwgIHBlcmlwaDAgY29yZSAgfAo+ID4gICAgICAgICAgICAgICAgICAg fCAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAg IHwKPiA+ICAgICAgICAgICAgICAgICAgICstLS0tLS0tXl4tLS0tLS0tKwo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgICB8fAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICB8fAo+ID4g ICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICAgICAgICAgICAgICAg ICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgICAgICAgICAgICAgICAgIHwgIHBlcmlwaDAgY2xr IDAgfAo+ID4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8Cj4gPiAgICAgICAg ICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLSsKPiA+IAo+ID4gTm93IHdlIGNhbiB1bnJlZ2lz dGVyIHBlcmlwaDA6IGxpbmsgd2l0aCB0aGUgcGFyZW50IHdpbGwgYmUgZGVzdHJveWVkCj4gPiBh bmQgdGhlIGNsb2NrIG1heSBiZSBzYWZlbHkgcmVtb3ZlZC4KPiA+IAo+ID4gICAgKy0tLS0tLS0t LS0tLS0tLS0rICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCj4gPiAgICB8ICAgICAgICAg ICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgIHwgICAgICAgICAg ICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgfCAgIHh0YWwwIGNv cmUgICB8ICAgICAgICAgICAgfCAgIHh0YWwxIGNvcmUgICB8Cj4gPiAgICB8ICAgICAgICAgICAg ICAgIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwKPiA+ICAgIHwgICAgICAgICAgICAg ICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfAo+ID4gICAgKy0tLS0tLS1eXi0tLS0t LS0rICAgICAgICAgICAgKy0tLS0tLS1eXi0tLS0tLS0rCj4gPiAgICAgICAgICAgIHx8ICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHx8Cj4gPiAgICAgICAgICAgIHx8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHx8Cj4gPiAgICArLS0tLS0tLS0tLS0tLS0tLSsgICAgICAgICAgICArLS0t LS0tLS0tLS0tLS0tLSsKPiA+ICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAg ICAgICAgICAgICAgfAo+ID4gICAgfCAgIHh0YWwwIGNsayAgICB8ICAgICAgICAgICAgfCAgIHh0 YWwxIGNsayAgICB8Cj4gPiAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAg ICAgICAgICAgIHwKPiA+ICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICAgICAgICstLS0tLS0t LS0tLS0tLS0tKwo+ID4gCj4gPiAKPiA+IFRoaXMgaXMgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUg Y29tbW9uIGNsb2NrIGZyYW1ld29yayBhbmQgaG93IGxpbmtzCj4gPiBjYW4gYmUgYWRkZWQgdG8g aXQuCj4gPiAKPiA+IEFzIGEgcmVzdWx0LCBoZXJlIGFyZSB0aGUgbGlua3MgY3JlYXRlZCBkdXJp bmcgdGhlIGJvb3Qgb2YgYW4KPiA+IEVTUFJFU1NPYmluOgo+ID4gICAKPiAKPiBTb3JyeSB0aGlz IHBhdGNoIHNlcmllcyBpcyB0YWtpbmcgd2F5IHRvbyBsb25nIHRvIGdldCBtZXJnZWQuIEl0J3MK PiBhbHJlYWR5IG1pZC1BcHJpbCEKPiAKPiBTbyBJIHN0aWxsIGhhdmUgc29tZSBvZiB0aGUgb3Jp Z2luYWwgcXVlc3Rpb25zIEkgaGFkIGZyb20gYmVmb3JlLCBtb3N0bHkKPiBhcm91bmQgY2lyY3Vs YXIgcGFyZW50IGNoYWlucyBiZXR3ZWVuIGNsayBwcm92aWRlcnMuIEZvciBleGFtcGxlLCB0aGVy ZQo+IGFyZSBjbGsgcHJvdmlkZXJzIHRoYXQgYm90aCBwcm92aWRlIGNsa3MgdG8gb3RoZXIgcHJv dmlkZXJzIGFuZCBjb25zdW1lCj4gY2xrcyBmcm9tIHRob3NlIHByb3ZpZGVycy4gRG9lcyBkZXZp Y2UgbGlua3Mgd29yayBncmFjZWZ1bGx5IGhlcmU/Cj4gCj4gSnVzdCBzcGVha2luZyBmcm9tIG15 IG93biBxY29tIGV4cGVyaWVuY2UsIEkgY2FuIHBvaW50IHRvIHRoZSBQQ0llIFBIWQo+IHRoYXQn cyBhIHByb3ZpZGVyIG9mIGEgY2xrIHRvIEdDQyBhbmQgYSBjb25zdW1lciBvZiBhIGNsayBpbiBH Q0MuIEluCj4gYmxvY2sgZGlhZ3JhbSBmb3JtIHRoaXMgaXM6Cj4gCj4gCj4gICAgICAgUENJRSBQ SFkgICAgICAgICAgICAgICAgICAgICAgICBHQ0MKPiAgICArLS0tLS0tLS0tLS0tLS0rICAgICAg ICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwo+ICAgIHwgICAgICAgICAgICAgIHwgICAg ICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8Cj4gICAgfCAgICAgUEhZIGNsayAtPi0t LS0tLS0tLS0rLS0tLSBnY2NfcGlwZV9jbGsgLS0tKyAgIHwKPiAgICB8ICAgICAgICAgICAgICB8 ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgfAo+ICAgIHwgICAgICAgICAgICAg IHwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICB8Cj4gICAgfCBwY2lfcGlwZV9j bGsgPC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgIHwKPiAgICB8ICAgICAgICAg ICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfAo+ICAgICstLS0tLS0t LS0tLS0tLSsgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCj4gCj4gVGhlIGVu ZCByZXN1bHQgaXMgdGhhdCB0aGUgUENJZSBQSFkgaXMgYSBjbGsgY29udHJvbGxlciB0aGF0IHBy b3ZpZGVzCj4gdGhlIFBIWSBjbGsgdG8gR0NDJ3MgZ2NjX3BpcGVfY2xrIGFuZCB0aGVuIGl0IGdl dHMgdGhlIHNhbWUgY2xrIHNpZ25hbAo+IGJhY2sgZnJvbSBHQ0MgYW5kIHVzZXMgaXQgb24gdGhl IFBDSWUgUEhZJ3MgcGNpX3BpcGVfY2xrIGlucHV0Lgo+IAo+IFNvIGlzIHRoaXMgaXMgYSBwcm9i bGVtPwo+IAoKSXQncyBub3cgbXkgdHVybiB0byBnZXQgYmFjayBvbiB0aGlzIHRvcGljLgoKSSBq dXN0IHB1dCBteSBub2lzZSBiYWNrIGludG8gdGhpcyBhbmQgZm9yIHdoYXQgSSB1bmRlcnN0YW5k IG9mIHRoZQpjbGsgc3Vic3lzdGVtLCBJIHRoaW5rIHRoZSBzaXR1YXRpb24geW91IGRlc2NyaWJl IGNvdWxkIGJlIHBpY3R1cmVkCmxpa2UgdGhpczoKCgogICAgICAgICArLS0tLS0tLS0tLS0tLS0t KwogICAgICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAgICB8ICAgICAgICAgICAgICAgfAog ICAgICAgICB8IFBDSWUgUEhZICAgICAgfAogICAgICAgICB8ICAgICAgICAgICAgICAgfAogICAg ICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAgICArLS0tLS1eXi0tLS0tLS0tKwogICAgICAg ICAgICAgICB8fAogICAgICAgICAgICAgICB8fAogICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwog ICAgICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAgICB8IHBjaWVfcGlwZV9jbGsgfAogICAg ICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAgICArLS0tLS0tXi0tLS0tLS0tKwogICAgICAg ICAgICAgICAgfAogICAgICAgICAgICAgICAgfCAtPnBhcmVudF9jbGtfbGluawogICAgICAgICAg ICAgICAgfAogICAgICAgICAgICAgICAgfAogICAgICAgICArLS0tLS0tLS0tLS0tLS0tKwogICAg ICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAg ICB8IEdDQyAgICAgICAgICAgfAogICAgICAgICB8ICAgICAgICAgICAgICAgfAogICAgICAgICB8 ICAgICAgICAgICAgICAgfAogICAgICAgICArLS0tLS0tXl4tLS0tLS0tKwogICAgICAgICAgICAg ICAgfHwKICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCiAgICAg ICAgIHwgICAgICAgICAgICAgICB8CiAgICAgICAgIHwgZ2NjX3BpcGVfY2xrICB8CiAgICAgICAg IHwgICAgICAgICAgICAgICB8CiAgICAgICAgICstLS0tLS1eLS0tLS0tLS0rCiAgICAgICAgICAg ICAgICB8CiAgICAgICAgICAgICAgICB8IC0+cGFyZW50X2Nsa19saW5rCiAgICAgICAgICAgICAg ICB8CiAgICAgICAgICAgICAgICB8CiAgICAgICAgICstLS0tLS0tLS0tLS0tLS0rCiAgICAgICAg IHwgICAgICAgICAgICAgICB8CiAgICAgICAgIHwgICAgICAgICAgICAgICB8CiAgICAgICAgIHwg UENJZSBQSFkgICAgICB8CiAgICAgICAgIHwgICAgICAgICAgICAgICB8CiAgICAgICAgIHwgICAg ICAgICAgICAgICB8CiAgICAgICAgICstLS0tLS1eXi0tLS0tLS0rCiAgICAgICAgICAgICAgICB8 fAogICAgICAgICAgICAgICAgfHwKICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAg fCAgICAgICAgICAgICAgIHwKICAgICAgICAgfCBwaHlfY2xrICAgICAgIHwKICAgICAgICAgfCAg ICAgICAgICAgICAgIHwKICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKCgpJTUhPIHRoZSBmYWN0 IHRoYXQgdGhlIGZpcnN0IGFuZCB0aGlyZCBibG9ja3MgYXJlIHRoZSBzYW1lIGRvZXMgbm90Cmlu dGVyZmVyZSB3aXRoIGRldmljZSBsaW5rcy4KCkhvbmVzdGx5LCBJIGNhbm5vdCBiZSAxMDAlIHN1 cmUgaXQgd29uJ3QgYnJlYWsgb24gcWNvbSBkZXNpZ25zLCBtYXliZQp0aGUgYmVzdCB3b3VsZCBi ZSB0byBoYXZlIHNvbWVvbmUgdG8gdGVzdC4gSSBkb24ndCBoYXZlIHRoZSByZWxldmFudApoYXJk d2FyZS4gRG8geW91PyBJdCB3b3VsZCBiZSByZWFsbHkgaGVscGZ1bCEKClRoZXJlIGlzIGFuIGVu dGlyZSBQQ0llIHNlcmllcyBibG9ja2VkLCB3YWl0aW5nIGZvciB0aGVzZSBkZXZpY2UgbGlua3MK dG8gYmUgbWVyZ2VkIHNvIGl0IHdvdWxkIGhlbHAgYSBsb3QgaWYgc29tZW9uZSBjb3VsZCB0ZXN0 LgoKVGhhbmsgeW91IHZlcnkgbXVjaCwKTWlxdcOobAoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGlu dXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=