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=-15.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_2 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 02495C07E96 for ; Tue, 6 Jul 2021 16:13:17 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D41B061A33 for ; Tue, 6 Jul 2021 16:13:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229992AbhGFQPy convert rfc822-to-8bit (ORCPT ); Tue, 6 Jul 2021 12:15:54 -0400 Received: from relay2-d.mail.gandi.net ([217.70.183.194]:62375 "EHLO relay2-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229773AbhGFQPw (ORCPT ); Tue, 6 Jul 2021 12:15:52 -0400 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 705A840009; Tue, 6 Jul 2021 16:13:09 +0000 (UTC) Date: Tue, 6 Jul 2021 18:13:08 +0200 From: Miquel Raynal To: Stefan Riedmueller Cc: Vignesh Raghavendra , linux-mtd@lists.infradead.org, Richard Weinberger , Mauro Carvalho Chehab , Kieran Bingham , Fabio Estevam , Pengutronix Kernel Team , Sascha Hauer , Boris Brezillon , Dan Brown , David Woodhouse , linux-kernel@vger.kernel.org Subject: Re: [PATCH] mtd: rawnand: nand_bbt: Skip bad blocks when searching for the BBT in NAND Message-ID: <20210706181308.1aa21d00@xps13> In-Reply-To: <20210625123821.207458-1-s.riedmueller@phytec.de> References: <20210625123821.207458-1-s.riedmueller@phytec.de> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Stefan, Stefan Riedmueller wrote on Fri, 25 Jun 2021 14:38:21 +0200: > The blocks containing the bad block table can become bad as well. So > make sure to skip any blocks that are marked bad when searching for the > bad block table. > > Otherwise in very rare cases where two BBT blocks wear out it might > happen that an obsolete BBT is used instead of a newer available > version. > > This only applies to drivers which make use of a bad block marker in flash. > Other drivers won't be able to identify bad BBT blocks and thus can't skip > these. > > Signed-off-by: Stefan Riedmueller Besides the alignment of the helper parameters (nitpick) the patch looks good to me. If we can get someone to test it before the merge window closes it's perfect. Otherwise I'll apply it and we'll let robots do the job. > --- > > Hi, > > this is the second approach of this patch. The first one [1] unfortunately lead > to boot failures on i.MX 27 boards [2] since the i.MX 27 driver uses the bad > block marker position for the bad block table marker which lead to falsely > identifying all BBT blocks as bad. > > This new patch now skips the check for bad BBT blocks if the BBT marker > position in OOB overlaps with the bad block marker position or if a driver > can't use bad block markers in flash at all (NAND_BBT_NO_OOB_BBM or > NAND_NO_BBM_QUIRK are set). This hopefully makes sure we don't break drivers > which cannot check for bad BBT blocks due to the limitations mentioned before. > > I was only able to test this patch on a phyCORE-i.MX 6 and a phyCARD-i.MX 27. > Therfore would really appreciate more people testing this to make sure I have > not missed another use case where the bad block marker position in OOB is used > in a different way than for the BBM. > > Regards, > Stefan > > [1] https://lore.kernel.org/linux-mtd/20210325102337.481172-1-s.riedmueller@phytec.de/ > [2] https://lore.kernel.org/linux-mtd/CAOMZO5DufVR=+EzCa1-MPUc+ZefZVTXb5Kgu3Wxms7cxw9GmGg@mail.gmail.com/ > > drivers/mtd/nand/raw/nand_bbt.c | 34 +++++++++++++++++++++++++++++++++ > 1 file changed, 34 insertions(+) > > diff --git a/drivers/mtd/nand/raw/nand_bbt.c b/drivers/mtd/nand/raw/nand_bbt.c > index dced32a126d9..2a30714350ee 100644 > --- a/drivers/mtd/nand/raw/nand_bbt.c > +++ b/drivers/mtd/nand/raw/nand_bbt.c > @@ -447,6 +447,36 @@ static int scan_block_fast(struct nand_chip *this, struct nand_bbt_descr *bd, > return 0; > } > > +/* Check if a potential BBT block is marked as bad */ > +static int bbt_block_checkbad(struct nand_chip *this, > + struct nand_bbt_descr *td, > + loff_t offs, uint8_t *buf) > +{ > + struct nand_bbt_descr *bd = this->badblock_pattern; > + > + /* > + * No need to check for a bad BBT block if the BBM area overlaps with > + * the bad block table marker area in OOB since writing a BBM here > + * invalidates the bad block table marker anyway. > + */ > + if (!(td->options & NAND_BBT_NO_OOB) && > + td->offs >= bd->offs && td->offs < bd->offs + bd->len) > + return 0; > + > + /* > + * There is no point in checking for a bad block marker if writing > + * such marker is not supported > + */ > + if (this->bbt_options & NAND_BBT_NO_OOB_BBM || > + this->options & NAND_NO_BBM_QUIRK) > + return 0; > + > + if (scan_block_fast(this, bd, offs, buf) > 0) > + return 1; > + > + return 0; > +} > + > /** > * create_bbt - [GENERIC] Create a bad block table by scanning the device > * @this: NAND chip object > @@ -560,6 +590,10 @@ static int search_bbt(struct nand_chip *this, uint8_t *buf, > int actblock = startblock + dir * block; > loff_t offs = (loff_t)actblock << this->bbt_erase_shift; > > + /* Check if block is marked bad */ > + if (bbt_block_checkbad(this, td, offs, buf)) > + continue; > + > /* Read first page */ > scan_read(this, buf, offs, mtd->writesize, td); > if (!check_pattern(buf, scanlen, mtd->writesize, td)) { Thanks, 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=-16.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_2 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 D8802C07E96 for ; Tue, 6 Jul 2021 16:14:04 +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 9603A619D2 for ; Tue, 6 Jul 2021 16:14:04 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9603A619D2 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-mtd-bounces+linux-mtd=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.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:Subject:Cc: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=kfjfiR+tgMkqXyaX6r1r8LytSLQuONJe412t0KY6WTM=; b=3bk/FCi446EpWK jsidKl0GqDEnrldYtRVztJtCuDzxWZtagVa9m9L5n/3SD7KDUz8p8m96tU3+hEMU51ihejOFwvPz+ vvLQmg1pmH4MWtylodZ/fabDCtWavZKIxv9XTBx66ldvqKncZ5Ia6IhKizrQ9/G4vuJO3hb2OUUVZ 88j1cfb5IGMLjoA/kA+7v+4e3hWXRSDl/d8vn9Gf0mxR6sQoTTvyTwsalel65Dm+PuyOiXuujOIKW qIaIV0kumsOm5F035m/FqARanlce7h/YNDEbmqRTc7I2rw9evsiD/RdGfi1k2xFCJuHqQ3Gy5VmdB jMSN0WH9v9D4kny4uBBA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m0nhK-00CEaW-RF; Tue, 06 Jul 2021 16:13:22 +0000 Received: from relay2-d.mail.gandi.net ([217.70.183.194]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m0nhF-00CEXG-PX for linux-mtd@lists.infradead.org; Tue, 06 Jul 2021 16:13:21 +0000 Received: (Authenticated sender: miquel.raynal@bootlin.com) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id 705A840009; Tue, 6 Jul 2021 16:13:09 +0000 (UTC) Date: Tue, 6 Jul 2021 18:13:08 +0200 From: Miquel Raynal To: Stefan Riedmueller Cc: Vignesh Raghavendra , linux-mtd@lists.infradead.org, Richard Weinberger , Mauro Carvalho Chehab , Kieran Bingham , Fabio Estevam , Pengutronix Kernel Team , Sascha Hauer , Boris Brezillon , Dan Brown , David Woodhouse , linux-kernel@vger.kernel.org Subject: Re: [PATCH] mtd: rawnand: nand_bbt: Skip bad blocks when searching for the BBT in NAND Message-ID: <20210706181308.1aa21d00@xps13> In-Reply-To: <20210625123821.207458-1-s.riedmueller@phytec.de> References: <20210625123821.207458-1-s.riedmueller@phytec.de> Organization: Bootlin X-Mailer: Claws Mail 3.17.7 (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-20210706_091318_129333_9728CB76 X-CRM114-Status: GOOD ( 38.18 ) X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org SGkgU3RlZmFuLAoKU3RlZmFuIFJpZWRtdWVsbGVyIDxzLnJpZWRtdWVsbGVyQHBoeXRlYy5kZT4g d3JvdGUgb24gRnJpLCAyNSBKdW4gMjAyMQoxNDozODoyMSArMDIwMDoKCj4gVGhlIGJsb2NrcyBj b250YWluaW5nIHRoZSBiYWQgYmxvY2sgdGFibGUgY2FuIGJlY29tZSBiYWQgYXMgd2VsbC4gU28K PiBtYWtlIHN1cmUgdG8gc2tpcCBhbnkgYmxvY2tzIHRoYXQgYXJlIG1hcmtlZCBiYWQgd2hlbiBz ZWFyY2hpbmcgZm9yIHRoZQo+IGJhZCBibG9jayB0YWJsZS4KPiAKPiBPdGhlcndpc2UgaW4gdmVy eSByYXJlIGNhc2VzIHdoZXJlIHR3byBCQlQgYmxvY2tzIHdlYXIgb3V0IGl0IG1pZ2h0Cj4gaGFw cGVuIHRoYXQgYW4gb2Jzb2xldGUgQkJUIGlzIHVzZWQgaW5zdGVhZCBvZiBhIG5ld2VyIGF2YWls YWJsZQo+IHZlcnNpb24uCj4gCj4gVGhpcyBvbmx5IGFwcGxpZXMgdG8gZHJpdmVycyB3aGljaCBt YWtlIHVzZSBvZiBhIGJhZCBibG9jayBtYXJrZXIgaW4gZmxhc2guCj4gT3RoZXIgZHJpdmVycyB3 b24ndCBiZSBhYmxlIHRvIGlkZW50aWZ5IGJhZCBCQlQgYmxvY2tzIGFuZCB0aHVzIGNhbid0IHNr aXAKPiB0aGVzZS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBTdGVmYW4gUmllZG11ZWxsZXIgPHMucmll ZG11ZWxsZXJAcGh5dGVjLmRlPgoKQmVzaWRlcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBoZWxwZXIg cGFyYW1ldGVycyAobml0cGljaykgdGhlIHBhdGNoCmxvb2tzIGdvb2QgdG8gbWUuIElmIHdlIGNh biBnZXQgc29tZW9uZSB0byB0ZXN0IGl0IGJlZm9yZSB0aGUgbWVyZ2UKd2luZG93IGNsb3NlcyBp dCdzIHBlcmZlY3QuIE90aGVyd2lzZSBJJ2xsIGFwcGx5IGl0IGFuZCB3ZSdsbCBsZXQgcm9ib3Rz CmRvIHRoZSBqb2IuCgo+IC0tLQo+IAo+IEhpLAo+IAo+IHRoaXMgaXMgdGhlIHNlY29uZCBhcHBy b2FjaCBvZiB0aGlzIHBhdGNoLiBUaGUgZmlyc3Qgb25lIFsxXSB1bmZvcnR1bmF0ZWx5IGxlYWQK PiB0byBib290IGZhaWx1cmVzIG9uIGkuTVggMjcgYm9hcmRzIFsyXSBzaW5jZSB0aGUgaS5NWCAy NyBkcml2ZXIgdXNlcyB0aGUgYmFkCj4gYmxvY2sgbWFya2VyIHBvc2l0aW9uIGZvciB0aGUgYmFk IGJsb2NrIHRhYmxlIG1hcmtlciB3aGljaCBsZWFkIHRvIGZhbHNlbHkKPiBpZGVudGlmeWluZyBh bGwgQkJUIGJsb2NrcyBhcyBiYWQuCj4gCj4gVGhpcyBuZXcgcGF0Y2ggbm93IHNraXBzIHRoZSBj aGVjayBmb3IgYmFkIEJCVCBibG9ja3MgaWYgdGhlIEJCVCBtYXJrZXIKPiBwb3NpdGlvbiBpbiBP T0Igb3ZlcmxhcHMgd2l0aCB0aGUgYmFkIGJsb2NrIG1hcmtlciBwb3NpdGlvbiBvciBpZiBhIGRy aXZlcgo+IGNhbid0IHVzZSBiYWQgYmxvY2sgbWFya2VycyBpbiBmbGFzaCBhdCBhbGwgKE5BTkRf QkJUX05PX09PQl9CQk0gb3IKPiBOQU5EX05PX0JCTV9RVUlSSyBhcmUgc2V0KS4gVGhpcyBob3Bl ZnVsbHkgbWFrZXMgc3VyZSB3ZSBkb24ndCBicmVhayBkcml2ZXJzCj4gd2hpY2ggY2Fubm90IGNo ZWNrIGZvciBiYWQgQkJUIGJsb2NrcyBkdWUgdG8gdGhlIGxpbWl0YXRpb25zIG1lbnRpb25lZCBi ZWZvcmUuCj4gCj4gSSB3YXMgb25seSBhYmxlIHRvIHRlc3QgdGhpcyBwYXRjaCBvbiBhIHBoeUNP UkUtaS5NWCA2IGFuZCBhIHBoeUNBUkQtaS5NWCAyNy4KPiBUaGVyZm9yZSB3b3VsZCByZWFsbHkg YXBwcmVjaWF0ZSBtb3JlIHBlb3BsZSB0ZXN0aW5nIHRoaXMgdG8gbWFrZSBzdXJlIEkgaGF2ZQo+ IG5vdCBtaXNzZWQgYW5vdGhlciB1c2UgY2FzZSB3aGVyZSB0aGUgYmFkIGJsb2NrIG1hcmtlciBw b3NpdGlvbiBpbiBPT0IgaXMgdXNlZAo+IGluIGEgZGlmZmVyZW50IHdheSB0aGFuIGZvciB0aGUg QkJNLgo+IAo+IFJlZ2FyZHMsCj4gU3RlZmFuCj4gCj4gWzFdIGh0dHBzOi8vbG9yZS5rZXJuZWwu b3JnL2xpbnV4LW10ZC8yMDIxMDMyNTEwMjMzNy40ODExNzItMS1zLnJpZWRtdWVsbGVyQHBoeXRl Yy5kZS8KPiBbMl0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvbGludXgtbXRkL0NBT01aTzVEdWZW Uj0rRXpDYTEtTVBVYytaZWZaVlRYYjVLZ3UzV3htczdjeHc5R21HZ0BtYWlsLmdtYWlsLmNvbS8K PiAKPiAgZHJpdmVycy9tdGQvbmFuZC9yYXcvbmFuZF9iYnQuYyB8IDM0ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKwo+ICAxIGZpbGUgY2hhbmdlZCwgMzQgaW5zZXJ0aW9ucygrKQo+ IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5kX2JidC5jIGIvZHJpdmVy cy9tdGQvbmFuZC9yYXcvbmFuZF9iYnQuYwo+IGluZGV4IGRjZWQzMmExMjZkOS4uMmEzMDcxNDM1 MGVlIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvbXRkL25hbmQvcmF3L25hbmRfYmJ0LmMKPiArKysg Yi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9uYW5kX2JidC5jCj4gQEAgLTQ0Nyw2ICs0NDcsMzYgQEAg c3RhdGljIGludCBzY2FuX2Jsb2NrX2Zhc3Qoc3RydWN0IG5hbmRfY2hpcCAqdGhpcywgc3RydWN0 IG5hbmRfYmJ0X2Rlc2NyICpiZCwKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICsvKiBDaGVjayBp ZiBhIHBvdGVudGlhbCBCQlQgYmxvY2sgaXMgbWFya2VkIGFzIGJhZCAqLwo+ICtzdGF0aWMgaW50 IGJidF9ibG9ja19jaGVja2JhZChzdHJ1Y3QgbmFuZF9jaGlwICp0aGlzLAo+ICsJCQkJICAgICAg c3RydWN0IG5hbmRfYmJ0X2Rlc2NyICp0ZCwKPiArCQkJCSAgICAgIGxvZmZfdCBvZmZzLCB1aW50 OF90ICpidWYpCj4gK3sKPiArCXN0cnVjdCBuYW5kX2JidF9kZXNjciAqYmQgPSB0aGlzLT5iYWRi bG9ja19wYXR0ZXJuOwo+ICsKPiArCS8qCj4gKwkgKiBObyBuZWVkIHRvIGNoZWNrIGZvciBhIGJh ZCBCQlQgYmxvY2sgaWYgdGhlIEJCTSBhcmVhIG92ZXJsYXBzIHdpdGgKPiArCSAqIHRoZSBiYWQg YmxvY2sgdGFibGUgbWFya2VyIGFyZWEgaW4gT09CIHNpbmNlIHdyaXRpbmcgYSBCQk0gaGVyZQo+ ICsJICogaW52YWxpZGF0ZXMgdGhlIGJhZCBibG9jayB0YWJsZSBtYXJrZXIgYW55d2F5Lgo+ICsJ ICovCj4gKwlpZiAoISh0ZC0+b3B0aW9ucyAmIE5BTkRfQkJUX05PX09PQikgJiYKPiArCSAgICB0 ZC0+b2ZmcyA+PSBiZC0+b2ZmcyAmJiB0ZC0+b2ZmcyA8IGJkLT5vZmZzICsgYmQtPmxlbikKPiAr CQlyZXR1cm4gMDsKPiArCj4gKwkvKgo+ICsJICogVGhlcmUgaXMgbm8gcG9pbnQgaW4gY2hlY2tp bmcgZm9yIGEgYmFkIGJsb2NrIG1hcmtlciBpZiB3cml0aW5nCj4gKwkgKiBzdWNoIG1hcmtlciBp cyBub3Qgc3VwcG9ydGVkCj4gKwkgKi8KPiArCWlmICh0aGlzLT5iYnRfb3B0aW9ucyAmIE5BTkRf QkJUX05PX09PQl9CQk0gfHwKPiArCSAgICB0aGlzLT5vcHRpb25zICYgTkFORF9OT19CQk1fUVVJ UkspCj4gKwkJcmV0dXJuIDA7Cj4gKwo+ICsJaWYgKHNjYW5fYmxvY2tfZmFzdCh0aGlzLCBiZCwg b2ZmcywgYnVmKSA+IDApCj4gKwkJcmV0dXJuIDE7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gIC8qKgo+ICAgKiBjcmVhdGVfYmJ0IC0gW0dFTkVSSUNdIENyZWF0ZSBhIGJhZCBibG9jayB0 YWJsZSBieSBzY2FubmluZyB0aGUgZGV2aWNlCj4gICAqIEB0aGlzOiBOQU5EIGNoaXAgb2JqZWN0 Cj4gQEAgLTU2MCw2ICs1OTAsMTAgQEAgc3RhdGljIGludCBzZWFyY2hfYmJ0KHN0cnVjdCBuYW5k X2NoaXAgKnRoaXMsIHVpbnQ4X3QgKmJ1ZiwKPiAgCQkJaW50IGFjdGJsb2NrID0gc3RhcnRibG9j ayArIGRpciAqIGJsb2NrOwo+ICAJCQlsb2ZmX3Qgb2ZmcyA9IChsb2ZmX3QpYWN0YmxvY2sgPDwg dGhpcy0+YmJ0X2VyYXNlX3NoaWZ0Owo+ICAKPiArCQkJLyogQ2hlY2sgaWYgYmxvY2sgaXMgbWFy a2VkIGJhZCAqLwo+ICsJCQlpZiAoYmJ0X2Jsb2NrX2NoZWNrYmFkKHRoaXMsIHRkLCBvZmZzLCBi dWYpKQo+ICsJCQkJY29udGludWU7Cj4gKwo+ICAJCQkvKiBSZWFkIGZpcnN0IHBhZ2UgKi8KPiAg CQkJc2Nhbl9yZWFkKHRoaXMsIGJ1Ziwgb2ZmcywgbXRkLT53cml0ZXNpemUsIHRkKTsKPiAgCQkJ aWYgKCFjaGVja19wYXR0ZXJuKGJ1Ziwgc2NhbmxlbiwgbXRkLT53cml0ZXNpemUsIHRkKSkgewoK VGhhbmtzLApNaXF1w6hsCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KTGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo=