From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mout-p-201.mailbox.org (mout-p-201.mailbox.org [80.241.56.171]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2C5A5C8FD; Sun, 11 Feb 2024 15:09:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=80.241.56.171 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707664170; cv=none; b=kF2oHzIgz+37iIkTBqDEkvh0WL7ZOOi+Lv5lo/TkMc2pcBOs3WJZz/GA/cqs+dc0g+Hhzgfvn15nmyGGx7cdjIREeyVaEtp3gdZmjtFgUqH7g8MPIyNROiJwCYbHAGF3SDKPuUfnSS3d2o2GsIzT9ceATnoUMrNqeDh9ilx3VJA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707664170; c=relaxed/simple; bh=Jql5iGou1X/RyvV8b/jJVSCrI5gfo2R/oLK0sRZrM2w=; h=References:From:To:Cc:Subject:In-reply-to:Date:Message-ID: MIME-Version:Content-Type; b=VUIMVUE0UIl8BT/Ex7VUe5UgcfWuMFFkNMeYk3bkmj6QMOhUq6Hvtdf3weA+9ILdOUdTv9DAv0+Mcix7UKwkVRkYfA9OUB2T5/ENnY06GYP9WPYJjYSgAGwbzvHliMIskzRyT5tryIYU4k8JGvAw/qiAoDynnCc0Vn7iYdsUuG4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oltmanns.dev; spf=pass smtp.mailfrom=oltmanns.dev; dkim=pass (2048-bit key) header.d=oltmanns.dev header.i=@oltmanns.dev header.b=iNacjmOH; arc=none smtp.client-ip=80.241.56.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=oltmanns.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oltmanns.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=oltmanns.dev header.i=@oltmanns.dev header.b="iNacjmOH" Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4TXrbR1fH4z9sQm; Sun, 11 Feb 2024 16:09:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1707664163; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LUVCRZm4sMe3u++O9hyPgin+lwvmga6oGxpeS7+ujsw=; b=iNacjmOHnnJ7cN7BlOWZYDwt9xoKhavIzlIDQUkisuFwI/Do5r1nA5ByoqLssXMWFgfwfm +URrBjnBznNmzPuWYko6BWSnAuqgK+kP6z4djSYiS5bSA1f9PhH4Wk9JISqbNvT1JrqWKe YFABOkhChQcjji6fkK394DaHJ4S7uQZDesUmOipXbmcilPSczQPRDhwCKeKYU75fXp6KfW gZZllox4x/AlU22kbWcC30634jdmVWfxXplgrGQGgpJrKbjWP+utG9zTWvx90Z5HSVqxah KEHVjEiDshV1NHikGOd+BEKe+G56Bt4y0QhAeckFoAHqV9dWqwk8KkEmwdv0Dg== References: <20240205-pinephone-pll-fixes-v2-0-96a46a2d8c9b@oltmanns.dev> From: Frank Oltmanns To: =?utf-8?Q?Ond=C5=99ej?= Jirman Cc: Michael Turquette , Stephen Boyd , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Guido =?utf-8?Q?G=C3=BCnther?= , Purism Kernel Team , Neil Armstrong , Jessica Zhang , Sam Ravnborg , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org Subject: Re: [PATCH v2 0/6] Pinephone video out fixes (flipping between two frames) In-reply-to: Date: Sun, 11 Feb 2024 16:09:16 +0100 Message-ID: <87wmrbxckj.fsf@oltmanns.dev> Precedence: bulk X-Mailing-List: linux-clk@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Rspamd-Queue-Id: 4TXrbR1fH4z9sQm Hi Ond=C5=99ej, On 2024-02-05 at 17:02:00 +0100, Ond=C5=99ej Jirman wrote: > On Mon, Feb 05, 2024 at 04:54:07PM +0100, Ond=C5=99ej Jirman wrote: >> On Mon, Feb 05, 2024 at 04:22:23PM +0100, Frank Oltmanns wrote: >> > On some pinephones the video output sometimes freezes (flips between t= wo >> > frames) [1]. It seems to be that the reason for this behaviour is that >> > PLL-MIPI, PLL-GPU and GPU are operating outside their limits. >> > >> > In this patch series I propose the followin changes: >> > 1. sunxi-ng: Adhere to the following constraints given in the >> > Allwinner A64 Manual regarding PLL-MIPI: >> > * M/N <=3D 3 >> > * (PLL_VIDEO0)/M >=3D 24MHz >> > * 500MHz <=3D clockrate <=3D 1400MHz >> > >> > 2. Choose a higher clock rate for the ST7703 based XDB599 panel, so >> > that the panel function well with the Allwinner A64 SOC. PLL-MIPI >> > must run between 500 MHz and 1.4 GHz. As PLL-MIPI runs at 6 times >> > the panel's clock rate, we need the panel's clock to be at least >> > 83.333 MHz. >> > >> > 3. Increase the minimum frequency in the A64 DTS OPPs from 120 MHz to >> > 192 MHz. This further reduces the issue. >> > >> > Unfortunately, with these patches the issue [1] is not completely gone, >> > but becomes less likely. >> > >> > Note, that when pinning the GPU to 432 MHz the issue completely >> > disappears for me. I've searched the BSP and could not find any >> > indication that supports the idea of having the three OPPs. The only >> > frequency I found in the BPSs for A64 is 432 MHz, that has also proven >> > stable for me. So, while increasing the minimum frequency to 192 MHz >> > reduces the issue, should we maybe instead set the GPU to a fixed 432 >> > MHz instead? >> >> Per A64 User Manual 1.1 page 81: >> >> (9). Clock output of PLL_GPU can be used for GPU;and dynamic frequency s= caling is not supported; > > You may be able to elegantly work around this by pinning PLL_GPU to a cer= tain > frequency (assing it in DT and then don't decalre gpu clock as > CLK_SET_RATE_PARENT). Say 432 MHz for PLL and then do the scaling via GPU= _CLK_REG > N divider between 432MHz and 216MHz and maybe 108MHz if that brings any g= ains. > I really like this idea. Unfortunately, it seems that the divisor of the GPU_CLK_REG must always be set to 1. I tried to convey this info in the commit message for PATCH 6. If using a different divisor than 1 the bug I'm trying to fix here occurs within minutes. Nevertheless, I gave your proposal a quick try - it seems so elegant. Unfortunately, but not unexpectedly, the bug occured almost immediately. > Then you can perhaps sidestep all these potential issues with PLL_GPU and > lack of DVFS support decalred in the manual. > > regards, > o. > >> Also sunxi-ng clk driver does apply NM factors at once to PLL_GPU clock, >> which can cause sudden frequency increase beyond intended output frequen= cy, >> because division is applied immediately while multiplication is reflected >> slowly. >> >> Eg. if you're changing divider from 7 to 1, you can get a sudden 7x outp= ut >> frequency spike, before PLL VCO manages to lower the frequency through N= clk >> divider feedback loop and lock on again. This can mess up whatever's con= nected >> to the output quite badly. >> >> You'd have to put logging on kernel writes to PLL_GPU register to see wh= at >> is written in there and if divider is lowered significantly on some GPU >> devfreq frequency transitions. By looking at the clocks in clk_summary in debugfs, the rate of PLL-GPU always matches the rate of the GPU (at least at 120, 312, and 432 MHz). This is further underlined by the fact, that none of the rates can be achieved by integer dividing one of the other rates. sunxi-ng would only favor a different rate for pll-gpu than the one that is requested for the gpu, if pll-gpu is already running at a rate such that there exists an M =E2=88=88 {1, 2, 3, 4, 5, 6, 7, 8}, where rate of pll-gpu / M =3D requested gpu rate or if the requested rate could not be reached directly by pll-gpu. Both is not the case for the rates in question (120, 192, 312, and 432 MHz). This means that the following divisor/multipliers are used by sunxi-ng's ccu_nm: N =3D 5, M =3D 1 for 120 MHz (min value without PATCH 6) N =3D 8, M =3D 1 for 192 MHz (min value after applying PATCH 6) N =3D 13, M =3D 1 for 312 MHz N =3D 18, M =3D 1 for 432 MHz So, with or without PATCH 6, the divider stays constant and it's only the multiplier that changes. This means, there should be no unexpected frequency spikes, right? >> It's also unclear what happens when FRAC_CLK_OUT or PLL_MODE_SEL changes. Those are not changed once the clock is initialized. The bug however occurs hours or days after booting. IMO, this makes it unlikely that this could be the culprit. >> Maybe not much because M is supposed to be set to 1, but you still need = to >> care when enabling fractional mode, and setting M to 1 because that's ex= actly >> the bad scenario if M was previously higher than 1. >> >> It's tricky. >> >> Having GPU module clock gated during PLL config changes may help! You can >> do that without locking yourself out, unlike with the CPU PLL. >> >> There's a gate enable bit for it at GPU_CLK_REG.SCLK_GATING. (page 122) The GPU should already be properly gated: https://elixir.bootlin.com/linux/v6.7.4/source/drivers/clk/sunxi-ng/ccu-sun= 50i-a64.c#L599 Thank you for your detailed proposal! It was insightful to read. But while those were all great ideas, they have all already been taken care of. I'm fresh out of ideas again (except for pinning the GPU rate). Again, thank you so much, Frank >> >> Kind regards, >> o. >> >> > I very much appreciate your feedback! >> > >> > [1] https://gitlab.com/postmarketOS/pmaports/-/issues/805 >> > >> > Signed-off-by: Frank Oltmanns >> > --- >> > Changes in v2: >> > - dts: Increase minimum GPU frequency to 192 MHz. >> > - nkm and a64: Add minimum and maximum rate for PLL-MIPI. >> > - nkm: Use the same approach for skipping invalid rates in >> > ccu_nkm_find_best() as in ccu_nkm_find_best_with_parent_adj(). >> > - nkm: Improve names for ratio struct members and hence get rid of >> > describing comments. >> > - nkm and a64: Correct description in the commit messages: M/N <=3D 3 >> > - Remove patches for nm as they were not needed. >> > - st7703: Rework the commit message to cover more background for the >> > change. >> > - Link to v1: https://lore.kernel.org/r/20231218-pinephone-pll-fixes-v= 1-0-e238b6ed6dc1@oltmanns.dev >> > >> > --- >> > Frank Oltmanns (6): >> > clk: sunxi-ng: nkm: Support constraints on m/n ratio and parent = rate >> > clk: sunxi-ng: a64: Add constraints on PLL-MIPI's n/m ratio and = parent rate >> > clk: sunxi-ng: nkm: Support minimum and maximum rate >> > clk: sunxi-ng: a64: Set minimum and maximum rate for PLL-MIPI >> > drm/panel: st7703: Drive XBD599 panel at higher clock rate >> > arm64: dts: allwinner: a64: Fix minimum GPU OPP rate >> > >> > arch/arm64/boot/dts/allwinner/sun50i-a64.dtsi | 4 ++-- >> > drivers/clk/sunxi-ng/ccu-sun50i-a64.c | 14 +++++++---- >> > drivers/clk/sunxi-ng/ccu_nkm.c | 34 ++++++++++++++++++= +++++++++ >> > drivers/clk/sunxi-ng/ccu_nkm.h | 4 ++++ >> > drivers/gpu/drm/panel/panel-sitronix-st7703.c | 14 +++++------ >> > 5 files changed, 56 insertions(+), 14 deletions(-) >> > --- >> > base-commit: 059c53e877ca6e723e10490c27c1487a63e66efe >> > change-id: 20231218-pinephone-pll-fixes-0ccdfde273e4 >> > >> > Best regards, >> > -- >> > Frank Oltmanns >> > 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id EEA33C4829A for ; Sun, 11 Feb 2024 15:09:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-ID:Date: In-reply-to:Subject:Cc:To:From:References:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=BdKQP1b/XNl5uK+62L4RyQa+wM60Ndb9O83DzYVoqWo=; b=V5nCEuMhgBO5jN96RMFhiJo66V MQRVRVxa5F46fa+nLI3tNw0VMjXjFpX6biFb2tfkevh5wkxMUxniQFUm4DGe30/F0BUqmnn4k5s49 ScyQ/GIAhT29erhjN7UYWK/bQSSSJMbjJd1vjy9o9eZcBjBVuv3r6lSVHqngsBXjGeWTcxrRDWHGW pC9ELoN7EHE4bdVEL8hXD/kYYqm5VuobFLg+7ITLQQq/UTnWDL7DSKX+1hWfDJYN7fBJN4b2o9Vii WsTAv1eXHS+m+Dh1z4iGO6EHDSCM9J8MxWK4QDA/uCrVXX+Zhu93CRzxluJKGZQBgssNG4T8S5J2r bFORA7tQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rZBSY-00000002tat-24F0; Sun, 11 Feb 2024 15:09:34 +0000 Received: from mout-p-201.mailbox.org ([2001:67c:2050:0:465::201]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rZBSU-00000002tYd-3rqA for linux-arm-kernel@lists.infradead.org; Sun, 11 Feb 2024 15:09:32 +0000 Received: from smtp102.mailbox.org (smtp102.mailbox.org [IPv6:2001:67c:2050:b231:465::102]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-201.mailbox.org (Postfix) with ESMTPS id 4TXrbR1fH4z9sQm; Sun, 11 Feb 2024 16:09:23 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oltmanns.dev; s=MBO0001; t=1707664163; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LUVCRZm4sMe3u++O9hyPgin+lwvmga6oGxpeS7+ujsw=; b=iNacjmOHnnJ7cN7BlOWZYDwt9xoKhavIzlIDQUkisuFwI/Do5r1nA5ByoqLssXMWFgfwfm +URrBjnBznNmzPuWYko6BWSnAuqgK+kP6z4djSYiS5bSA1f9PhH4Wk9JISqbNvT1JrqWKe YFABOkhChQcjji6fkK394DaHJ4S7uQZDesUmOipXbmcilPSczQPRDhwCKeKYU75fXp6KfW gZZllox4x/AlU22kbWcC30634jdmVWfxXplgrGQGgpJrKbjWP+utG9zTWvx90Z5HSVqxah KEHVjEiDshV1NHikGOd+BEKe+G56Bt4y0QhAeckFoAHqV9dWqwk8KkEmwdv0Dg== References: <20240205-pinephone-pll-fixes-v2-0-96a46a2d8c9b@oltmanns.dev> From: Frank Oltmanns To: =?utf-8?Q?Ond=C5=99ej?= Jirman Cc: Michael Turquette , Stephen Boyd , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Guido =?utf-8?Q?G=C3=BCnther?= , Purism Kernel Team , Neil Armstrong , Jessica Zhang , Sam Ravnborg , Maarten Lankhorst , Maxime Ripard , Thomas Zimmermann , David Airlie , Daniel Vetter , Rob Herring , Krzysztof Kozlowski , Conor Dooley , linux-clk@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, devicetree@vger.kernel.org Subject: Re: [PATCH v2 0/6] Pinephone video out fixes (flipping between two frames) In-reply-to: Date: Sun, 11 Feb 2024 16:09:16 +0100 Message-ID: <87wmrbxckj.fsf@oltmanns.dev> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4TXrbR1fH4z9sQm X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240211_070931_171798_30C722FE X-CRM114-Status: GOOD ( 48.76 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgT25kxZllaiwKCk9uIDIwMjQtMDItMDUgYXQgMTc6MDI6MDAgKzAxMDAsIE9uZMWZZWogSmly bWFuIDxtZWdpQHhmZi5jej4gd3JvdGU6Cj4gT24gTW9uLCBGZWIgMDUsIDIwMjQgYXQgMDQ6NTQ6 MDdQTSArMDEwMCwgT25kxZllaiBKaXJtYW4gd3JvdGU6Cj4+IE9uIE1vbiwgRmViIDA1LCAyMDI0 IGF0IDA0OjIyOjIzUE0gKzAxMDAsIEZyYW5rIE9sdG1hbm5zIHdyb3RlOgo+PiA+IE9uIHNvbWUg cGluZXBob25lcyB0aGUgdmlkZW8gb3V0cHV0IHNvbWV0aW1lcyBmcmVlemVzIChmbGlwcyBiZXR3 ZWVuIHR3bwo+PiA+IGZyYW1lcykgWzFdLiBJdCBzZWVtcyB0byBiZSB0aGF0IHRoZSByZWFzb24g Zm9yIHRoaXMgYmVoYXZpb3VyIGlzIHRoYXQKPj4gPiBQTEwtTUlQSSwgUExMLUdQVSBhbmQgR1BV IGFyZSBvcGVyYXRpbmcgb3V0c2lkZSB0aGVpciBsaW1pdHMuCj4+ID4KPj4gPiBJbiB0aGlzIHBh dGNoIHNlcmllcyBJIHByb3Bvc2UgdGhlIGZvbGxvd2luIGNoYW5nZXM6Cj4+ID4gICAxLiBzdW54 aS1uZzogQWRoZXJlIHRvIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgZ2l2ZW4gaW4gdGhlCj4+ ID4gICAgICBBbGx3aW5uZXIgQTY0IE1hbnVhbCByZWdhcmRpbmcgUExMLU1JUEk6Cj4+ID4gICAg ICAgKiBNL04gPD0gMwo+PiA+ICAgICAgICogKFBMTF9WSURFTzApL00gPj0gMjRNSHoKPj4gPiAg ICAgICAqIDUwME1IeiA8PSBjbG9ja3JhdGUgPD0gMTQwME1Iego+PiA+Cj4+ID4gICAyLiBDaG9v c2UgYSBoaWdoZXIgY2xvY2sgcmF0ZSBmb3IgdGhlIFNUNzcwMyBiYXNlZCBYREI1OTkgcGFuZWws IHNvCj4+ID4gICAgICB0aGF0IHRoZSBwYW5lbCBmdW5jdGlvbiB3ZWxsIHdpdGggdGhlIEFsbHdp bm5lciBBNjQgU09DLiBQTEwtTUlQSQo+PiA+ICAgICAgbXVzdCBydW4gYmV0d2VlbiA1MDAgTUh6 IGFuZCAxLjQgR0h6LiBBcyBQTEwtTUlQSSBydW5zIGF0IDYgdGltZXMKPj4gPiAgICAgIHRoZSBw YW5lbCdzIGNsb2NrIHJhdGUsIHdlIG5lZWQgdGhlIHBhbmVsJ3MgY2xvY2sgdG8gYmUgYXQgbGVh c3QKPj4gPiAgICAgIDgzLjMzMyBNSHouCj4+ID4KPj4gPiAgIDMuIEluY3JlYXNlIHRoZSBtaW5p bXVtIGZyZXF1ZW5jeSBpbiB0aGUgQTY0IERUUyBPUFBzIGZyb20gMTIwIE1IeiB0bwo+PiA+ICAg ICAgMTkyIE1Iei4gVGhpcyBmdXJ0aGVyIHJlZHVjZXMgdGhlIGlzc3VlLgo+PiA+Cj4+ID4gVW5m b3J0dW5hdGVseSwgd2l0aCB0aGVzZSBwYXRjaGVzIHRoZSBpc3N1ZSBbMV0gaXMgbm90IGNvbXBs ZXRlbHkgZ29uZSwKPj4gPiBidXQgYmVjb21lcyBsZXNzIGxpa2VseS4KPj4gPgo+PiA+IE5vdGUs IHRoYXQgd2hlbiBwaW5uaW5nIHRoZSBHUFUgdG8gNDMyIE1IeiB0aGUgaXNzdWUgY29tcGxldGVs eQo+PiA+IGRpc2FwcGVhcnMgZm9yIG1lLiBJJ3ZlIHNlYXJjaGVkIHRoZSBCU1AgYW5kIGNvdWxk IG5vdCBmaW5kIGFueQo+PiA+IGluZGljYXRpb24gdGhhdCBzdXBwb3J0cyB0aGUgaWRlYSBvZiBo YXZpbmcgdGhlIHRocmVlIE9QUHMuIFRoZSBvbmx5Cj4+ID4gZnJlcXVlbmN5IEkgZm91bmQgaW4g dGhlIEJQU3MgZm9yIEE2NCBpcyA0MzIgTUh6LCB0aGF0IGhhcyBhbHNvIHByb3Zlbgo+PiA+IHN0 YWJsZSBmb3IgbWUuIFNvLCB3aGlsZSBpbmNyZWFzaW5nIHRoZSBtaW5pbXVtIGZyZXF1ZW5jeSB0 byAxOTIgTUh6Cj4+ID4gcmVkdWNlcyB0aGUgaXNzdWUsIHNob3VsZCB3ZSBtYXliZSBpbnN0ZWFk IHNldCB0aGUgR1BVIHRvIGEgZml4ZWQgNDMyCj4+ID4gTUh6IGluc3RlYWQ/Cj4+Cj4+IFBlciBB NjQgVXNlciBNYW51YWwgMS4xIHBhZ2UgODE6Cj4+Cj4+ICg5KS4gQ2xvY2sgb3V0cHV0IG9mIFBM TF9HUFUgY2FuIGJlIHVzZWQgZm9yIEdQVTthbmQgZHluYW1pYyBmcmVxdWVuY3kgc2NhbGluZyBp cyBub3Qgc3VwcG9ydGVkOwo+Cj4gWW91IG1heSBiZSBhYmxlIHRvIGVsZWdhbnRseSB3b3JrIGFy b3VuZCB0aGlzIGJ5IHBpbm5pbmcgUExMX0dQVSB0byBhIGNlcnRhaW4KPiBmcmVxdWVuY3kgKGFz c2luZyBpdCBpbiBEVCBhbmQgdGhlbiBkb24ndCBkZWNhbHJlIGdwdSBjbG9jayBhcwo+IENMS19T RVRfUkFURV9QQVJFTlQpLiBTYXkgNDMyIE1IeiBmb3IgUExMIGFuZCB0aGVuIGRvIHRoZSBzY2Fs aW5nIHZpYSBHUFVfQ0xLX1JFRwo+IE4gZGl2aWRlciBiZXR3ZWVuIDQzMk1IeiBhbmQgMjE2TUh6 IGFuZCBtYXliZSAxMDhNSHogaWYgdGhhdCBicmluZ3MgYW55IGdhaW5zLgo+CgpJIHJlYWxseSBs aWtlIHRoaXMgaWRlYS4gVW5mb3J0dW5hdGVseSwgaXQgc2VlbXMgdGhhdCB0aGUgZGl2aXNvciBv ZiB0aGUKR1BVX0NMS19SRUcgbXVzdCBhbHdheXMgYmUgc2V0IHRvIDEuIEkgdHJpZWQgdG8gY29u dmV5IHRoaXMgaW5mbyBpbiB0aGUKY29tbWl0IG1lc3NhZ2UgZm9yIFBBVENIIDYuIElmIHVzaW5n IGEgZGlmZmVyZW50IGRpdmlzb3IgdGhhbiAxIHRoZSBidWcKSSdtIHRyeWluZyB0byBmaXggaGVy ZSBvY2N1cnMgd2l0aGluIG1pbnV0ZXMuIE5ldmVydGhlbGVzcywgSSBnYXZlIHlvdXIKcHJvcG9z YWwgYSBxdWljayB0cnkgLSBpdCBzZWVtcyBzbyBlbGVnYW50LiBVbmZvcnR1bmF0ZWx5LCBidXQg bm90CnVuZXhwZWN0ZWRseSwgdGhlIGJ1ZyBvY2N1cmVkIGFsbW9zdCBpbW1lZGlhdGVseS4KCj4g VGhlbiB5b3UgY2FuIHBlcmhhcHMgc2lkZXN0ZXAgYWxsIHRoZXNlIHBvdGVudGlhbCBpc3N1ZXMg d2l0aCBQTExfR1BVIGFuZAo+IGxhY2sgb2YgRFZGUyBzdXBwb3J0IGRlY2FscmVkIGluIHRoZSBt YW51YWwuCj4KPiByZWdhcmRzLAo+IAlvLgo+Cj4+IEFsc28gc3VueGktbmcgY2xrIGRyaXZlciBk b2VzIGFwcGx5IE5NIGZhY3RvcnMgYXQgb25jZSB0byBQTExfR1BVIGNsb2NrLAo+PiB3aGljaCBj YW4gY2F1c2Ugc3VkZGVuIGZyZXF1ZW5jeSBpbmNyZWFzZSBiZXlvbmQgaW50ZW5kZWQgb3V0cHV0 IGZyZXF1ZW5jeSwKPj4gYmVjYXVzZSBkaXZpc2lvbiBpcyBhcHBsaWVkIGltbWVkaWF0ZWx5IHdo aWxlIG11bHRpcGxpY2F0aW9uIGlzIHJlZmxlY3RlZAo+PiBzbG93bHkuCj4+Cj4+IEVnLiBpZiB5 b3UncmUgY2hhbmdpbmcgZGl2aWRlciBmcm9tIDcgdG8gMSwgeW91IGNhbiBnZXQgYSBzdWRkZW4g N3ggb3V0cHV0Cj4+IGZyZXF1ZW5jeSBzcGlrZSwgYmVmb3JlIFBMTCBWQ08gbWFuYWdlcyB0byBs b3dlciB0aGUgZnJlcXVlbmN5IHRocm91Z2ggTiBjbGsKPj4gZGl2aWRlciBmZWVkYmFjayBsb29w IGFuZCBsb2NrIG9uIGFnYWluLiBUaGlzIGNhbiBtZXNzIHVwIHdoYXRldmVyJ3MgY29ubmVjdGVk Cj4+IHRvIHRoZSBvdXRwdXQgcXVpdGUgYmFkbHkuCj4+Cj4+IFlvdSdkIGhhdmUgdG8gcHV0IGxv Z2dpbmcgb24ga2VybmVsIHdyaXRlcyB0byBQTExfR1BVIHJlZ2lzdGVyIHRvIHNlZSB3aGF0Cj4+ IGlzIHdyaXR0ZW4gaW4gdGhlcmUgYW5kIGlmIGRpdmlkZXIgaXMgbG93ZXJlZCBzaWduaWZpY2Fu dGx5IG9uIHNvbWUgR1BVCj4+IGRldmZyZXEgZnJlcXVlbmN5IHRyYW5zaXRpb25zLgoKQnkgbG9v a2luZyBhdCB0aGUgY2xvY2tzIGluIGNsa19zdW1tYXJ5IGluIGRlYnVnZnMsIHRoZSByYXRlIG9m IFBMTC1HUFUKYWx3YXlzIG1hdGNoZXMgdGhlIHJhdGUgb2YgdGhlIEdQVSAoYXQgbGVhc3QgYXQg MTIwLCAzMTIsIGFuZCA0MzIgTUh6KS4KVGhpcyBpcyBmdXJ0aGVyIHVuZGVybGluZWQgYnkgdGhl IGZhY3QsIHRoYXQgbm9uZSBvZiB0aGUgcmF0ZXMgY2FuIGJlCmFjaGlldmVkIGJ5IGludGVnZXIg ZGl2aWRpbmcgb25lIG9mIHRoZSBvdGhlciByYXRlcy4gc3VueGktbmcgd291bGQKb25seSBmYXZv ciBhIGRpZmZlcmVudCByYXRlIGZvciBwbGwtZ3B1IHRoYW4gdGhlIG9uZSB0aGF0IGlzIHJlcXVl c3RlZApmb3IgdGhlIGdwdSwgaWYgcGxsLWdwdSBpcyBhbHJlYWR5IHJ1bm5pbmcgYXQgYSByYXRl IHN1Y2ggdGhhdCB0aGVyZQpleGlzdHMgYW4gTSDiiIggezEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9 LCB3aGVyZQogIHJhdGUgb2YgcGxsLWdwdSAvIE0gPSByZXF1ZXN0ZWQgZ3B1IHJhdGUKb3IgaWYg dGhlIHJlcXVlc3RlZCByYXRlIGNvdWxkIG5vdCBiZSByZWFjaGVkIGRpcmVjdGx5IGJ5IHBsbC1n cHUuIEJvdGgKaXMgbm90IHRoZSBjYXNlIGZvciB0aGUgcmF0ZXMgaW4gcXVlc3Rpb24gKDEyMCwg MTkyLCAzMTIsIGFuZCA0MzIgTUh6KS4KClRoaXMgbWVhbnMgdGhhdCB0aGUgZm9sbG93aW5nIGRp dmlzb3IvbXVsdGlwbGllcnMgYXJlIHVzZWQgYnkgc3VueGktbmcncwpjY3Vfbm06Ck4gPSAgNSwg TSA9IDEgZm9yIDEyMCBNSHogKG1pbiB2YWx1ZSB3aXRob3V0IFBBVENIIDYpCk4gPSAgOCwgTSA9 IDEgZm9yIDE5MiBNSHogKG1pbiB2YWx1ZSBhZnRlciBhcHBseWluZyBQQVRDSCA2KQpOID0gMTMs IE0gPSAxIGZvciAzMTIgTUh6Ck4gPSAxOCwgTSA9IDEgZm9yIDQzMiBNSHoKClNvLCB3aXRoIG9y IHdpdGhvdXQgUEFUQ0ggNiwgdGhlIGRpdmlkZXIgc3RheXMgY29uc3RhbnQgYW5kIGl0J3Mgb25s eQp0aGUgbXVsdGlwbGllciB0aGF0IGNoYW5nZXMuIFRoaXMgbWVhbnMsIHRoZXJlIHNob3VsZCBi ZSBubyB1bmV4cGVjdGVkCmZyZXF1ZW5jeSBzcGlrZXMsIHJpZ2h0PwoKPj4gSXQncyBhbHNvIHVu Y2xlYXIgd2hhdCBoYXBwZW5zIHdoZW4gRlJBQ19DTEtfT1VUIG9yIFBMTF9NT0RFX1NFTCBjaGFu Z2VzLgoKVGhvc2UgYXJlIG5vdCBjaGFuZ2VkIG9uY2UgdGhlIGNsb2NrIGlzIGluaXRpYWxpemVk LiBUaGUgYnVnIGhvd2V2ZXIKb2NjdXJzIGhvdXJzIG9yIGRheXMgYWZ0ZXIgYm9vdGluZy4gSU1P LCB0aGlzIG1ha2VzIGl0IHVubGlrZWx5IHRoYXQgdGhpcwpjb3VsZCBiZSB0aGUgY3VscHJpdC4K Cj4+IE1heWJlIG5vdCBtdWNoIGJlY2F1c2UgTSBpcyBzdXBwb3NlZCB0byBiZSBzZXQgdG8gMSwg YnV0IHlvdSBzdGlsbCBuZWVkIHRvCj4+IGNhcmUgd2hlbiBlbmFibGluZyBmcmFjdGlvbmFsIG1v ZGUsIGFuZCBzZXR0aW5nIE0gdG8gMSBiZWNhdXNlIHRoYXQncyBleGFjdGx5Cj4+IHRoZSBiYWQg c2NlbmFyaW8gaWYgTSB3YXMgcHJldmlvdXNseSBoaWdoZXIgdGhhbiAxLgo+Pgo+PiBJdCdzIHRy aWNreS4KPj4KPj4gSGF2aW5nIEdQVSBtb2R1bGUgY2xvY2sgZ2F0ZWQgZHVyaW5nIFBMTCBjb25m aWcgY2hhbmdlcyBtYXkgaGVscCEgWW91IGNhbgo+PiBkbyB0aGF0IHdpdGhvdXQgbG9ja2luZyB5 b3Vyc2VsZiBvdXQsIHVubGlrZSB3aXRoIHRoZSBDUFUgUExMLgo+Pgo+PiBUaGVyZSdzIGEgZ2F0 ZSBlbmFibGUgYml0IGZvciBpdCBhdCBHUFVfQ0xLX1JFRy5TQ0xLX0dBVElORy4gKHBhZ2UgMTIy KQoKVGhlIEdQVSBzaG91bGQgYWxyZWFkeSBiZSBwcm9wZXJseSBnYXRlZDoKaHR0cHM6Ly9lbGl4 aXIuYm9vdGxpbi5jb20vbGludXgvdjYuNy40L3NvdXJjZS9kcml2ZXJzL2Nsay9zdW54aS1uZy9j Y3Utc3VuNTBpLWE2NC5jI0w1OTkKClRoYW5rIHlvdSBmb3IgeW91ciBkZXRhaWxlZCBwcm9wb3Nh bCEgSXQgd2FzIGluc2lnaHRmdWwgdG8gcmVhZC4gQnV0CndoaWxlIHRob3NlIHdlcmUgYWxsIGdy ZWF0IGlkZWFzLCB0aGV5IGhhdmUgYWxsIGFscmVhZHkgYmVlbiB0YWtlbiBjYXJlCm9mLiBJJ20g ZnJlc2ggb3V0IG9mIGlkZWFzIGFnYWluIChleGNlcHQgZm9yIHBpbm5pbmcgdGhlIEdQVSByYXRl KS4KCkFnYWluLCB0aGFuayB5b3Ugc28gbXVjaCwKICBGcmFuawoKPj4KPj4gS2luZCByZWdhcmRz LAo+PiAJby4KPj4KPj4gPiBJIHZlcnkgbXVjaCBhcHByZWNpYXRlIHlvdXIgZmVlZGJhY2shCj4+ ID4KPj4gPiBbMV0gaHR0cHM6Ly9naXRsYWIuY29tL3Bvc3RtYXJrZXRPUy9wbWFwb3J0cy8tL2lz c3Vlcy84MDUKPj4gPgo+PiA+IFNpZ25lZC1vZmYtYnk6IEZyYW5rIE9sdG1hbm5zIDxmcmFua0Bv bHRtYW5ucy5kZXY+Cj4+ID4gLS0tCj4+ID4gQ2hhbmdlcyBpbiB2MjoKPj4gPiAtIGR0czogSW5j cmVhc2UgbWluaW11bSBHUFUgZnJlcXVlbmN5IHRvIDE5MiBNSHouCj4+ID4gLSBua20gYW5kIGE2 NDogQWRkIG1pbmltdW0gYW5kIG1heGltdW0gcmF0ZSBmb3IgUExMLU1JUEkuCj4+ID4gLSBua206 IFVzZSB0aGUgc2FtZSBhcHByb2FjaCBmb3Igc2tpcHBpbmcgaW52YWxpZCByYXRlcyBpbgo+PiA+ ICAgY2N1X25rbV9maW5kX2Jlc3QoKSBhcyBpbiBjY3VfbmttX2ZpbmRfYmVzdF93aXRoX3BhcmVu dF9hZGooKS4KPj4gPiAtIG5rbTogSW1wcm92ZSBuYW1lcyBmb3IgcmF0aW8gc3RydWN0IG1lbWJl cnMgYW5kIGhlbmNlIGdldCByaWQgb2YKPj4gPiAgIGRlc2NyaWJpbmcgY29tbWVudHMuCj4+ID4g LSBua20gYW5kIGE2NDogQ29ycmVjdCBkZXNjcmlwdGlvbiBpbiB0aGUgY29tbWl0IG1lc3NhZ2Vz OiBNL04gPD0gMwo+PiA+IC0gUmVtb3ZlIHBhdGNoZXMgZm9yIG5tIGFzIHRoZXkgd2VyZSBub3Qg bmVlZGVkLgo+PiA+IC0gc3Q3NzAzOiBSZXdvcmsgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIGNvdmVy IG1vcmUgYmFja2dyb3VuZCBmb3IgdGhlCj4+ID4gICBjaGFuZ2UuCj4+ID4gLSBMaW5rIHRvIHYx OiBodHRwczovL2xvcmUua2VybmVsLm9yZy9yLzIwMjMxMjE4LXBpbmVwaG9uZS1wbGwtZml4ZXMt djEtMC1lMjM4YjZlZDZkYzFAb2x0bWFubnMuZGV2Cj4+ID4KPj4gPiAtLS0KPj4gPiBGcmFuayBP bHRtYW5ucyAoNik6Cj4+ID4gICAgICAgY2xrOiBzdW54aS1uZzogbmttOiBTdXBwb3J0IGNvbnN0 cmFpbnRzIG9uIG0vbiByYXRpbyBhbmQgcGFyZW50IHJhdGUKPj4gPiAgICAgICBjbGs6IHN1bnhp LW5nOiBhNjQ6IEFkZCBjb25zdHJhaW50cyBvbiBQTEwtTUlQSSdzIG4vbSByYXRpbyBhbmQgcGFy ZW50IHJhdGUKPj4gPiAgICAgICBjbGs6IHN1bnhpLW5nOiBua206IFN1cHBvcnQgbWluaW11bSBh bmQgbWF4aW11bSByYXRlCj4+ID4gICAgICAgY2xrOiBzdW54aS1uZzogYTY0OiBTZXQgbWluaW11 bSBhbmQgbWF4aW11bSByYXRlIGZvciBQTEwtTUlQSQo+PiA+ICAgICAgIGRybS9wYW5lbDogc3Q3 NzAzOiBEcml2ZSBYQkQ1OTkgcGFuZWwgYXQgaGlnaGVyIGNsb2NrIHJhdGUKPj4gPiAgICAgICBh cm02NDogZHRzOiBhbGx3aW5uZXI6IGE2NDogRml4IG1pbmltdW0gR1BVIE9QUCByYXRlCj4+ID4K Pj4gPiAgYXJjaC9hcm02NC9ib290L2R0cy9hbGx3aW5uZXIvc3VuNTBpLWE2NC5kdHNpIHwgIDQg KystLQo+PiA+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3Utc3VuNTBpLWE2NC5jICAgICAgICAg fCAxNCArKysrKysrLS0tLQo+PiA+ICBkcml2ZXJzL2Nsay9zdW54aS1uZy9jY3VfbmttLmMgICAg ICAgICAgICAgICAgfCAzNCArKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4gPiAgZHJpdmVy cy9jbGsvc3VueGktbmcvY2N1X25rbS5oICAgICAgICAgICAgICAgIHwgIDQgKysrKwo+PiA+ICBk cml2ZXJzL2dwdS9kcm0vcGFuZWwvcGFuZWwtc2l0cm9uaXgtc3Q3NzAzLmMgfCAxNCArKysrKy0t LS0tLQo+PiA+ICA1IGZpbGVzIGNoYW5nZWQsIDU2IGluc2VydGlvbnMoKyksIDE0IGRlbGV0aW9u cygtKQo+PiA+IC0tLQo+PiA+IGJhc2UtY29tbWl0OiAwNTljNTNlODc3Y2E2ZTcyM2UxMDQ5MGMy N2MxNDg3YTYzZTY2ZWZlCj4+ID4gY2hhbmdlLWlkOiAyMDIzMTIxOC1waW5lcGhvbmUtcGxsLWZp eGVzLTBjY2RmZGUyNzNlNAo+PiA+Cj4+ID4gQmVzdCByZWdhcmRzLAo+PiA+IC0tCj4+ID4gRnJh bmsgT2x0bWFubnMgPGZyYW5rQG9sdG1hbm5zLmRldj4KPj4gPgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxp c3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=