From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ej1-f53.google.com (mail-ej1-f53.google.com [209.85.218.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3FC4BECB; Mon, 18 Jul 2022 20:34:41 +0000 (UTC) Received: by mail-ej1-f53.google.com with SMTP id bp15so23480139ejb.6; Mon, 18 Jul 2022 13:34:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SgQ3vg69XrKG4SLCrmfnrR9gARtMXL/8P6uqVwUjR3c=; b=VxWwXRXdCUcsrKmUjNBAHYCWburQdbxY7b81p9Yht9MSbBsge4pGwUZNohHpUSWRFi SUdz+Hcs+7ifQSWy/OBNqjMDwmgV3Uqj2u4MlNqGrCjZdmFzXkzI5/3hvG5F8LZrCmmC zVSAv9N++OTVah8O5gecqRvRO1WuigyMu+j8AcfENxfYCpbbSx54E/71kKir1jWuv8UP 8ddcGUmWt4psg0OckI1yLQCePjydWmUNCnJPsDhi05V9zgTN3dMzWdbXWlEMXzhBJSVg Bb4/I5mwxTFy1n5mwtURwCG/I7Iydua3PeQDgYE+znOjrxAEjkeAUcJ+I3Uz4NeI4RM+ Wi6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SgQ3vg69XrKG4SLCrmfnrR9gARtMXL/8P6uqVwUjR3c=; b=QWLpFtpoQU7+9SNx8N0EyC27Rihwt+G3C+J6aTuGLRHuTj5UrgFUJLqiYbqHFnXyP3 DpNvCQDR5RxFiu5HfDwQ7ybMSX1H0AtZydw5aNe8kk+Ow6GoS5iO95ytkbF5ehKuMd9C pQzs0XiQtxWUYZx8dDLa+pV+rsvthc09Xf5VM1CHO/tmVik20PvZ99C12Ez6eKUtVvHg nQj9aYR1UPas1yiCOBlPLwUe3DIJ2Ehg4n6lMGgS1KZk2cw9s/RvU1OM/l9WIod0GSIH schzTG/WJW9vOs/gDjWl7w4R81dwzJh7gdzZI0BpdjQG8AVZSGeDOcSJ38CKRS1pXWqm z5/w== X-Gm-Message-State: AJIora9ejp8pK6SS1Yf18ne63YCUISvsOsahkPrbw/cevp5eHCDvK/Xf DaFKdpQHHKA473Y3xeUpN6o= X-Google-Smtp-Source: AGRyM1tGC2mf5OL95/Xi8XsQYmNIKA2K5q/KcUfriX7AvcRKc6Sa4cckzxTSNZj7ebXoHk11R9xhPg== X-Received: by 2002:a17:907:761c:b0:6d6:e553:7bd1 with SMTP id jx28-20020a170907761c00b006d6e5537bd1mr27853505ejc.5.1658176479423; Mon, 18 Jul 2022 13:34:39 -0700 (PDT) Received: from jernej-laptop.localnet (213-161-3-76.dynamic.telemach.net. [213.161.3.76]) by smtp.gmail.com with ESMTPSA id b17-20020a1709063cb100b00722fadc4279sm5856158ejh.124.2022.07.18.13.34.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Jul 2022 13:34:38 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: mripard@kernel.org, paul.kocialkowski@bootlin.com, Nicolas Dufresne Cc: mchehab@kernel.org, gregkh@linuxfoundation.org, wens@csie.org, samuel@sholland.org, hverkuil-cisco@xs4all.nl, ezequiel@vanguardiasur.com.ar, linux-media@vger.kernel.org, linux-staging@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH] media: cedrus: hevc: Add check for invalid timestamp Date: Mon, 18 Jul 2022 22:34:37 +0200 Message-ID: <1795344.atdPhlSkOF@jernej-laptop> In-Reply-To: References: <20220718165649.16407-1-jernej.skrabec@gmail.com> <4725382.GXAFRqVoOG@kista> Precedence: bulk X-Mailing-List: linux-sunxi@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="UTF-8" Dne ponedeljek, 18. julij 2022 ob 21:37:31 CEST je Nicolas Dufresne=20 napisal(a): > Le lundi 18 juillet 2022 =C3=A0 19:57 +0200, Jernej =C5=A0krabec a =C3=A9= crit : > > Dne ponedeljek, 18. julij 2022 ob 19:41:48 CEST je Nicolas Dufresne > >=20 > > napisal(a): > > > Le lundi 18 juillet 2022 =C3=A0 18:56 +0200, Jernej Skrabec a =C3=A9c= rit : > > > > Not all DPB entries will be used most of the time. Unused entries w= ill > > > > thus have invalid timestamps. They will produce negative buffer ind= ex > > > > which is not specifically handled. This works just by chance in > > > > current > > > > code. It will even produce bogus pointer, but since it's not used, = it > > > > won't do any harm. > > > >=20 > > > > Let's fix that brittle design by skipping writing DPB entry altoget= her > > > > if timestamp is invalid. > > > >=20 > > > > Fixes: 86caab29da78 ("media: cedrus: Add HEVC/H.265 decoding suppor= t") > > > > Signed-off-by: Jernej Skrabec > > > > --- > > > >=20 > > > > drivers/staging/media/sunxi/cedrus/cedrus_h265.c | 3 +++ > > > > 1 file changed, 3 insertions(+) > > > >=20 > > > > diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c > > > > b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c index > > > > 1afc6797d806..687f87598f78 100644 > > > > --- a/drivers/staging/media/sunxi/cedrus/cedrus_h265.c > > > > +++ b/drivers/staging/media/sunxi/cedrus/cedrus_h265.c > > > > @@ -147,6 +147,9 @@ static void > > > > cedrus_h265_frame_info_write_dpb(struct > > > > cedrus_ctx *ctx,> > > > >=20 > > > > dpb[i].pic_order_cnt_val > > > > =09 > > > > }; > > > >=20 > > > > + if (buffer_index < 0) > > > > + continue; > > >=20 > > > When I compare to other codecs, when the buffer_index does not exist, > > > the > > > addr 0 is being programmed into the HW. With this implementation is is > > > left > > > to whatever it was set for the previous decode operation. I think its= is > > > nicer done the other way. > >=20 > > It's done the same way as it's done in vendor lib. As I stated in commit > > message, actual values don't matter for unused entries. If it is used by > > accident, HW reaction on all zero pointers can only be worse than using > > old, but valid entry. > >=20 > > Due to no real documentation and Allwinner unwillingness to share detai= ls, > > we'll probably never know what's best response for each error. Some thi= ngs > > can be deduced from vendor code, but not all. > >=20 > > I would rather not complicate this fix, especially since it's candidate > > for > > backporting. >=20 > I am simply trying to highlight that this is not consistant with how the > H264 part is done. Why do we reset the register for one codec and not the > other ? While H264 and HEVC are similar in many ways, Cedrus uses two different cor= es=20 or in Cedrus slang, engines, for them. They have their own quirks. One of t= he=20 most apparent is handling of DPB array. H264 requires that same entry is=20 always at the same position in HW DPB. That's not required by HEVC. Additional reasons for differences come from the fact that it's from two=20 different authors (Maxime and Paul). Those differences were created at the= =20 beginning and it is what it is. >=20 > Perhaps you should sync to your preference the driver as a whole. It also > seems that before your patch, some bits would be 0 and some other would be > very large values. Between this and leaving random value, I don't really > see any gain or reason for a backport. It neither break or fix anything as > far as I understand. Maybe there is no need to backport, but the change is nevertheless useful. = As=20 I explained, current code works only by chance, as we noticed with Ezequiel= 's=20 rework. It's certainly worthwhile to make code less brittle. As far as I'm= =20 concerned, fixes tag can be dropped or even Ezequiel can squash this change= =20 into his commit, with appropriate adjustments, of course. I'm not completely sure what do you mean by syncing driver preference. Code= =20 changes always need a good reason to be accepted. Moving code around and=20 renaming things just to be similar with something else is not. Best regards, Jernej >=20 > My general opinion, is that we fixe the unused address (like to 0) then w= hen > something goes wrong, as least it will go wrong consistently. >=20 > > Best regards, > > Jernej > >=20 > > > > + > > > >=20 > > > > cedrus_h265_frame_info_write_single(ctx, i, > >=20 > > dpb[i].field_pic, > >=20 > >=20 > > pic_order_cnt, > >=20 > > buffer_index); 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 C7F70C433EF for ; Mon, 18 Jul 2022 20:35:45 +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:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=FLi5HoPE9FKa44tLjljH8zic/D7+4/l47ELnH9edfI4=; b=TzZ0OSYmyb88PR FENgJkJWIJjdEYjeTr2PUIll/kWtsMjX1WkSSz2jsjZMc5orVwdP1iJ5/k58lTYw5nfj3D3ph//84 oQZ061J6vOImEf/mJdu0ni7J9j2ROnwgf2gYvv3hPBLvROJWcWLsfE0IWdgufySql3s+tmt2qlIMq rLOFLY0g3BTX7NdGiE+rVyVnD0VnCoZZjBhiPCAtBbKJtH2+BzI1floMkOl8uLZDFA7u6ySGHsPrt 0m8xPOhmwfcfXkm3bRXhnyJBpZVT92bdajUqHiy3WVRqrSnPzrp/MXRs6ytaObQ+YUbiornm2dSaz tlX21+DduK0vtTvI961g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oDXS2-000qVG-CR; Mon, 18 Jul 2022 20:34:46 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1oDXRz-000qQD-53 for linux-arm-kernel@lists.infradead.org; Mon, 18 Jul 2022 20:34:44 +0000 Received: by mail-ej1-x62d.google.com with SMTP id b11so23422983eju.10 for ; Mon, 18 Jul 2022 13:34:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SgQ3vg69XrKG4SLCrmfnrR9gARtMXL/8P6uqVwUjR3c=; b=VxWwXRXdCUcsrKmUjNBAHYCWburQdbxY7b81p9Yht9MSbBsge4pGwUZNohHpUSWRFi SUdz+Hcs+7ifQSWy/OBNqjMDwmgV3Uqj2u4MlNqGrCjZdmFzXkzI5/3hvG5F8LZrCmmC zVSAv9N++OTVah8O5gecqRvRO1WuigyMu+j8AcfENxfYCpbbSx54E/71kKir1jWuv8UP 8ddcGUmWt4psg0OckI1yLQCePjydWmUNCnJPsDhi05V9zgTN3dMzWdbXWlEMXzhBJSVg Bb4/I5mwxTFy1n5mwtURwCG/I7Iydua3PeQDgYE+znOjrxAEjkeAUcJ+I3Uz4NeI4RM+ Wi6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SgQ3vg69XrKG4SLCrmfnrR9gARtMXL/8P6uqVwUjR3c=; b=jaSXgvZqymMZV90Q4JDoPOs4dvUfRMVEFRRCeJiK2inNF7N6r91phGjPcu6vtmpzgd U4bScqwwAjg1AAI/8DxMZqjDfmz99c0vbA1i+fBtA+hk8dUzm7+wer9oaydqOk1LROJ+ vRe0blyuDhTxm+IkuExbnWrVicNUeeZ821F2JZy4f6CKevmhiyi6cEKu+KNlhhOG8csW uWSa3fJPw+Sf+JiAQrq2KmJFC48ZO0e9uT277YZFo+Ow288lAqv+V1OM0jyhrWGvuhDE yYsSFnrwscw4wGnvcNisNT2yslCW+M/5qocCME4xHtnIUNMiF7QAe/948jY7/VZlwlkV W2sw== X-Gm-Message-State: AJIora8TyFscSa2n4mPnB/FLXG2nLkUx6RCkY3m2nWk9Ma0SOYOKOvtN Qn0ZyFa9A5k2lSJdO4RPEEk= X-Google-Smtp-Source: AGRyM1tGC2mf5OL95/Xi8XsQYmNIKA2K5q/KcUfriX7AvcRKc6Sa4cckzxTSNZj7ebXoHk11R9xhPg== X-Received: by 2002:a17:907:761c:b0:6d6:e553:7bd1 with SMTP id jx28-20020a170907761c00b006d6e5537bd1mr27853505ejc.5.1658176479423; Mon, 18 Jul 2022 13:34:39 -0700 (PDT) Received: from jernej-laptop.localnet (213-161-3-76.dynamic.telemach.net. [213.161.3.76]) by smtp.gmail.com with ESMTPSA id b17-20020a1709063cb100b00722fadc4279sm5856158ejh.124.2022.07.18.13.34.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 18 Jul 2022 13:34:38 -0700 (PDT) From: Jernej =?utf-8?B?xaBrcmFiZWM=?= To: mripard@kernel.org, paul.kocialkowski@bootlin.com, Nicolas Dufresne Cc: mchehab@kernel.org, gregkh@linuxfoundation.org, wens@csie.org, samuel@sholland.org, hverkuil-cisco@xs4all.nl, ezequiel@vanguardiasur.com.ar, linux-media@vger.kernel.org, linux-staging@lists.linux.dev, linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH] media: cedrus: hevc: Add check for invalid timestamp Date: Mon, 18 Jul 2022 22:34:37 +0200 Message-ID: <1795344.atdPhlSkOF@jernej-laptop> In-Reply-To: References: <20220718165649.16407-1-jernej.skrabec@gmail.com> <4725382.GXAFRqVoOG@kista> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220718_133443_221356_7EAD1EF0 X-CRM114-Status: GOOD ( 39.59 ) 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 RG5lIHBvbmVkZWxqZWssIDE4LiBqdWxpaiAyMDIyIG9iIDIxOjM3OjMxIENFU1QgamUgTmljb2xh cyBEdWZyZXNuZSAKbmFwaXNhbChhKToKPiBMZSBsdW5kaSAxOCBqdWlsbGV0IDIwMjIgw6AgMTk6 NTcgKzAyMDAsIEplcm5laiDFoGtyYWJlYyBhIMOpY3JpdCA6Cj4gPiBEbmUgcG9uZWRlbGplaywg MTguIGp1bGlqIDIwMjIgb2IgMTk6NDE6NDggQ0VTVCBqZSBOaWNvbGFzIER1ZnJlc25lCj4gPiAK PiA+IG5hcGlzYWwoYSk6Cj4gPiA+IExlIGx1bmRpIDE4IGp1aWxsZXQgMjAyMiDDoCAxODo1NiAr MDIwMCwgSmVybmVqIFNrcmFiZWMgYSDDqWNyaXQgOgo+ID4gPiA+IE5vdCBhbGwgRFBCIGVudHJp ZXMgd2lsbCBiZSB1c2VkIG1vc3Qgb2YgdGhlIHRpbWUuIFVudXNlZCBlbnRyaWVzIHdpbGwKPiA+ ID4gPiB0aHVzIGhhdmUgaW52YWxpZCB0aW1lc3RhbXBzLiBUaGV5IHdpbGwgcHJvZHVjZSBuZWdh dGl2ZSBidWZmZXIgaW5kZXgKPiA+ID4gPiB3aGljaCBpcyBub3Qgc3BlY2lmaWNhbGx5IGhhbmRs ZWQuIFRoaXMgd29ya3MganVzdCBieSBjaGFuY2UgaW4KPiA+ID4gPiBjdXJyZW50Cj4gPiA+ID4g Y29kZS4gSXQgd2lsbCBldmVuIHByb2R1Y2UgYm9ndXMgcG9pbnRlciwgYnV0IHNpbmNlIGl0J3Mg bm90IHVzZWQsIGl0Cj4gPiA+ID4gd29uJ3QgZG8gYW55IGhhcm0uCj4gPiA+ID4gCj4gPiA+ID4g TGV0J3MgZml4IHRoYXQgYnJpdHRsZSBkZXNpZ24gYnkgc2tpcHBpbmcgd3JpdGluZyBEUEIgZW50 cnkgYWx0b2dldGhlcgo+ID4gPiA+IGlmIHRpbWVzdGFtcCBpcyBpbnZhbGlkLgo+ID4gPiA+IAo+ ID4gPiA+IEZpeGVzOiA4NmNhYWIyOWRhNzggKCJtZWRpYTogY2VkcnVzOiBBZGQgSEVWQy9ILjI2 NSBkZWNvZGluZyBzdXBwb3J0IikKPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBKZXJuZWogU2tyYWJl YyA8amVybmVqLnNrcmFiZWNAZ21haWwuY29tPgo+ID4gPiA+IC0tLQo+ID4gPiA+IAo+ID4gPiA+ ICBkcml2ZXJzL3N0YWdpbmcvbWVkaWEvc3VueGkvY2VkcnVzL2NlZHJ1c19oMjY1LmMgfCAzICsr Kwo+ID4gPiA+ICAxIGZpbGUgY2hhbmdlZCwgMyBpbnNlcnRpb25zKCspCj4gPiA+ID4gCj4gPiA+ ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9zdW54aS9jZWRydXMvY2VkcnVz X2gyNjUuYwo+ID4gPiA+IGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRy dXNfaDI2NS5jIGluZGV4Cj4gPiA+ID4gMWFmYzY3OTdkODA2Li42ODdmODc1OThmNzggMTAwNjQ0 Cj4gPiA+ID4gLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL3N1bnhpL2NlZHJ1cy9jZWRydXNf aDI2NS5jCj4gPiA+ID4gKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL3N1bnhpL2NlZHJ1cy9j ZWRydXNfaDI2NS5jCj4gPiA+ID4gQEAgLTE0Nyw2ICsxNDcsOSBAQCBzdGF0aWMgdm9pZAo+ID4g PiA+IGNlZHJ1c19oMjY1X2ZyYW1lX2luZm9fd3JpdGVfZHBiKHN0cnVjdAo+ID4gPiA+IGNlZHJ1 c19jdHggKmN0eCw+Cj4gPiA+ID4gCj4gPiA+ID4gIAkJCWRwYltpXS5waWNfb3JkZXJfY250X3Zh bAo+ID4gPiA+ICAJCQo+ID4gPiA+ICAJCX07Cj4gPiA+ID4gCj4gPiA+ID4gKwkJaWYgKGJ1ZmZl cl9pbmRleCA8IDApCj4gPiA+ID4gKwkJCWNvbnRpbnVlOwo+ID4gPiAKPiA+ID4gV2hlbiBJIGNv bXBhcmUgdG8gb3RoZXIgY29kZWNzLCB3aGVuIHRoZSBidWZmZXJfaW5kZXggZG9lcyBub3QgZXhp c3QsCj4gPiA+IHRoZQo+ID4gPiBhZGRyIDAgaXMgYmVpbmcgcHJvZ3JhbW1lZCBpbnRvIHRoZSBI Vy4gV2l0aCB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGlzCj4gPiA+IGxlZnQKPiA+ID4gdG8gd2hh dGV2ZXIgaXQgd2FzIHNldCBmb3IgdGhlIHByZXZpb3VzIGRlY29kZSBvcGVyYXRpb24uIEkgdGhp bmsgaXRzIGlzCj4gPiA+IG5pY2VyIGRvbmUgdGhlIG90aGVyIHdheS4KPiA+IAo+ID4gSXQncyBk b25lIHRoZSBzYW1lIHdheSBhcyBpdCdzIGRvbmUgaW4gdmVuZG9yIGxpYi4gQXMgSSBzdGF0ZWQg aW4gY29tbWl0Cj4gPiBtZXNzYWdlLCBhY3R1YWwgdmFsdWVzIGRvbid0IG1hdHRlciBmb3IgdW51 c2VkIGVudHJpZXMuIElmIGl0IGlzIHVzZWQgYnkKPiA+IGFjY2lkZW50LCBIVyByZWFjdGlvbiBv biBhbGwgemVybyBwb2ludGVycyBjYW4gb25seSBiZSB3b3JzZSB0aGFuIHVzaW5nCj4gPiBvbGQs IGJ1dCB2YWxpZCBlbnRyeS4KPiA+IAo+ID4gRHVlIHRvIG5vIHJlYWwgZG9jdW1lbnRhdGlvbiBh bmQgQWxsd2lubmVyIHVud2lsbGluZ25lc3MgdG8gc2hhcmUgZGV0YWlscywKPiA+IHdlJ2xsIHBy b2JhYmx5IG5ldmVyIGtub3cgd2hhdCdzIGJlc3QgcmVzcG9uc2UgZm9yIGVhY2ggZXJyb3IuIFNv bWUgdGhpbmdzCj4gPiBjYW4gYmUgZGVkdWNlZCBmcm9tIHZlbmRvciBjb2RlLCBidXQgbm90IGFs bC4KPiA+IAo+ID4gSSB3b3VsZCByYXRoZXIgbm90IGNvbXBsaWNhdGUgdGhpcyBmaXgsIGVzcGVj aWFsbHkgc2luY2UgaXQncyBjYW5kaWRhdGUKPiA+IGZvcgo+ID4gYmFja3BvcnRpbmcuCj4gCj4g SSBhbSBzaW1wbHkgdHJ5aW5nIHRvIGhpZ2hsaWdodCB0aGF0IHRoaXMgaXMgbm90IGNvbnNpc3Rh bnQgd2l0aCBob3cgdGhlCj4gSDI2NCBwYXJ0IGlzIGRvbmUuIFdoeSBkbyB3ZSByZXNldCB0aGUg cmVnaXN0ZXIgZm9yIG9uZSBjb2RlYyBhbmQgbm90IHRoZQo+IG90aGVyID8KCldoaWxlIEgyNjQg YW5kIEhFVkMgYXJlIHNpbWlsYXIgaW4gbWFueSB3YXlzLCBDZWRydXMgdXNlcyB0d28gZGlmZmVy ZW50IGNvcmVzIApvciBpbiBDZWRydXMgc2xhbmcsIGVuZ2luZXMsIGZvciB0aGVtLiBUaGV5IGhh dmUgdGhlaXIgb3duIHF1aXJrcy4gT25lIG9mIHRoZSAKbW9zdCBhcHBhcmVudCBpcyBoYW5kbGlu ZyBvZiBEUEIgYXJyYXkuIEgyNjQgcmVxdWlyZXMgdGhhdCBzYW1lIGVudHJ5IGlzIAphbHdheXMg YXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gSFcgRFBCLiBUaGF0J3Mgbm90IHJlcXVpcmVkIGJ5IEhF VkMuCgpBZGRpdGlvbmFsIHJlYXNvbnMgZm9yIGRpZmZlcmVuY2VzIGNvbWUgZnJvbSB0aGUgZmFj dCB0aGF0IGl0J3MgZnJvbSB0d28gCmRpZmZlcmVudCBhdXRob3JzIChNYXhpbWUgYW5kIFBhdWwp LiBUaG9zZSBkaWZmZXJlbmNlcyB3ZXJlIGNyZWF0ZWQgYXQgdGhlIApiZWdpbm5pbmcgYW5kIGl0 IGlzIHdoYXQgaXQgaXMuCgo+IAo+IFBlcmhhcHMgeW91IHNob3VsZCBzeW5jIHRvIHlvdXIgcHJl ZmVyZW5jZSB0aGUgZHJpdmVyIGFzIGEgd2hvbGUuIEl0IGFsc28KPiBzZWVtcyB0aGF0IGJlZm9y ZSB5b3VyIHBhdGNoLCBzb21lIGJpdHMgd291bGQgYmUgMCBhbmQgc29tZSBvdGhlciB3b3VsZCBi ZQo+IHZlcnkgbGFyZ2UgdmFsdWVzLiBCZXR3ZWVuIHRoaXMgYW5kIGxlYXZpbmcgcmFuZG9tIHZh bHVlLCBJIGRvbid0IHJlYWxseQo+IHNlZSBhbnkgZ2FpbiBvciByZWFzb24gZm9yIGEgYmFja3Bv cnQuIEl0IG5laXRoZXIgYnJlYWsgb3IgZml4IGFueXRoaW5nIGFzCj4gZmFyIGFzIEkgdW5kZXJz dGFuZC4KCk1heWJlIHRoZXJlIGlzIG5vIG5lZWQgdG8gYmFja3BvcnQsIGJ1dCB0aGUgY2hhbmdl IGlzIG5ldmVydGhlbGVzcyB1c2VmdWwuIEFzIApJIGV4cGxhaW5lZCwgY3VycmVudCBjb2RlIHdv cmtzIG9ubHkgYnkgY2hhbmNlLCBhcyB3ZSBub3RpY2VkIHdpdGggRXplcXVpZWwncyAKcmV3b3Jr LiBJdCdzIGNlcnRhaW5seSB3b3J0aHdoaWxlIHRvIG1ha2UgY29kZSBsZXNzIGJyaXR0bGUuIEFz IGZhciBhcyBJJ20gCmNvbmNlcm5lZCwgZml4ZXMgdGFnIGNhbiBiZSBkcm9wcGVkIG9yIGV2ZW4g RXplcXVpZWwgY2FuIHNxdWFzaCB0aGlzIGNoYW5nZSAKaW50byBoaXMgY29tbWl0LCB3aXRoIGFw cHJvcHJpYXRlIGFkanVzdG1lbnRzLCBvZiBjb3Vyc2UuCgpJJ20gbm90IGNvbXBsZXRlbHkgc3Vy ZSB3aGF0IGRvIHlvdSBtZWFuIGJ5IHN5bmNpbmcgZHJpdmVyIHByZWZlcmVuY2UuIENvZGUgCmNo YW5nZXMgYWx3YXlzIG5lZWQgYSBnb29kIHJlYXNvbiB0byBiZSBhY2NlcHRlZC4gTW92aW5nIGNv ZGUgYXJvdW5kIGFuZCAKcmVuYW1pbmcgdGhpbmdzIGp1c3QgdG8gYmUgc2ltaWxhciB3aXRoIHNv bWV0aGluZyBlbHNlIGlzIG5vdC4KCkJlc3QgcmVnYXJkcywKSmVybmVqCgo+IAo+IE15IGdlbmVy YWwgb3BpbmlvbiwgaXMgdGhhdCB3ZSBmaXhlIHRoZSB1bnVzZWQgYWRkcmVzcyAobGlrZSB0byAw KSB0aGVuIHdoZW4KPiBzb21ldGhpbmcgZ29lcyB3cm9uZywgYXMgbGVhc3QgaXQgd2lsbCBnbyB3 cm9uZyBjb25zaXN0ZW50bHkuCj4gCj4gPiBCZXN0IHJlZ2FyZHMsCj4gPiBKZXJuZWoKPiA+IAo+ ID4gPiA+ICsKPiA+ID4gPiAKPiA+ID4gPiAgCQljZWRydXNfaDI2NV9mcmFtZV9pbmZvX3dyaXRl X3NpbmdsZShjdHgsIGksCj4gPiAKPiA+IGRwYltpXS5maWVsZF9waWMsCj4gPiAKPiA+IAo+ID4g cGljX29yZGVyX2NudCwKPiA+IAo+ID4gYnVmZmVyX2luZGV4KTsKCgoKCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxp bmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3Rz LmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==