Received: by 2002:ab2:6a05:0:b0:1f8:1780:a4ed with SMTP id w5csp2471479lqo; Mon, 13 May 2024 22:24:54 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVBsyqF57MPsEzr+PHyHvjyKiNOX7b+RCr/gHRMLW/Xe7V4Kf5oJ5zEyIi4Rgq9ewLln0Pv9N5tQ8OLiDBxf10BbfqtS4uo10/8+Eakag== X-Google-Smtp-Source: AGHT+IHFAPkiQiEe/sJNSeyRCrrNB3P3ifO91/Y+bZQccTNGHVdM/xrXcb/pAaLfqQ9BZUi59T7f X-Received: by 2002:a9d:3e02:0:b0:6f0:e8a9:9143 with SMTP id 46e09a7af769-6f0e910b9f2mr11535443a34.4.1715664294174; Mon, 13 May 2024 22:24:54 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1715664294; cv=pass; d=google.com; s=arc-20160816; b=PgVjVm8PPmBMpB/S3bDnsLVRRud3YRay1hT1PNQ44zX6b8/PrPlGJzj4r59ofOJSpT v6tSX7ln9Cqb5I+jPCvt4k5N0kP1mvESuLmsMMt2ZY0TpAXqB4U7N/S8gxom64Dec+Vb teBvxKCwYYnOTP6y04siS+D0B7OnNJqOUQ1YiDDmBWd+bkuue0gjWZ8petFta1Vpr7av iegu/84aIs/AxiyOkOiYkQrFzfQIgjh5mXDoC+kRE3/hJ5/udQ+HpAjXCivxjvKhYwaZ isAYVL42OmPE4Zdvqtx/g72LyqRN7BgAGqWOhhxCGqh4S2lCNu82n0d2TgPlT3vS4IGM tN5g== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :user-agent:content-transfer-encoding:references:in-reply-to:date:cc :to:from:subject:message-id:dkim-signature; bh=+ar8KBa1N/4SSDZRDxyO8zG8u/CHdkEsBMPPzslDm3Q=; fh=cS4qKKnnmacfYYg1sU8OSPIiXB9GJoGfbBWRoAzGM60=; b=zLyXBdkSHc+gFsQ5B7LFmSug6gZ40ITtj6ncYSuYqLUr8NlD+iknSsgvOrTh5ElJMo hgaZqw+s5y+0Js5tXSQJgmUvXJOn/P9vwZg8Wif3ZE3wXPDsGOKy1hqOYhDqo09NyKeR g4v1tUGz8MgDhw+QT7a56XaMHvxoo5CSI0QL46yu5hQsAchIrFzUzSDqdCaNYTPd/G+n R6q8y7Kxhk7vrsh/ZjtqbUZywQ32Cvc0fHbs89W5tISNZLQCDOo1GWXWnt1ng2sK6AXG 3RM6Ap/uM+eJ+LX3UseIVkZ8xLQCFne8YUE4lYwhUjmIB2HmEFoBJ7CZW5SoPix1WvRZ kzFg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@codeconstruct.com.au header.s=2022a header.b=faD3i3L7; arc=pass (i=1 spf=pass spfdomain=codeconstruct.com.au dkim=pass dkdomain=codeconstruct.com.au dmarc=pass fromdomain=codeconstruct.com.au); spf=pass (google.com: domain of linux-kernel+bounces-178326-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-178326-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=codeconstruct.com.au Return-Path: Received: from sy.mirrors.kernel.org (sy.mirrors.kernel.org. [147.75.48.161]) by mx.google.com with ESMTPS id 41be03b00d2f7-63412e1efc7si10682665a12.769.2024.05.13.22.24.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 May 2024 22:24:54 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-178326-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) client-ip=147.75.48.161; Authentication-Results: mx.google.com; dkim=pass header.i=@codeconstruct.com.au header.s=2022a header.b=faD3i3L7; arc=pass (i=1 spf=pass spfdomain=codeconstruct.com.au dkim=pass dkdomain=codeconstruct.com.au dmarc=pass fromdomain=codeconstruct.com.au); spf=pass (google.com: domain of linux-kernel+bounces-178326-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.48.161 as permitted sender) smtp.mailfrom="linux-kernel+bounces-178326-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=codeconstruct.com.au Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sy.mirrors.kernel.org (Postfix) with ESMTPS id 4CAADB227F8 for ; Tue, 14 May 2024 05:24:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7431B18AEA; Tue, 14 May 2024 05:24:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b="faD3i3L7" Received: from codeconstruct.com.au (pi.codeconstruct.com.au [203.29.241.158]) (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 4CA001755C; Tue, 14 May 2024 05:24:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=203.29.241.158 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715664278; cv=none; b=HDL7ThZv14PZq2efUID9pahX1/5aWzmzdKMvSCyjYrAarY4HuITTS/mNPu3ljHu/dB2khJHtRLMnR4j7oDKV3TeJ4YvhYUKLxK/oM9Q0K7/3vQVMIV0b+tLnEYicXPYsF4R6yD492Th38IA5OnwBSS3QVLP7LnOnvXX7QbTNFk4= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715664278; c=relaxed/simple; bh=+ar8KBa1N/4SSDZRDxyO8zG8u/CHdkEsBMPPzslDm3Q=; h=Message-ID:Subject:From:To:Cc:Date:In-Reply-To:References: Content-Type:MIME-Version; b=F51V8rBakweqa2YNXLnPnEWAqCdOcYNnCGADMSECmELwutt8uy0Pu9ZU2buqoxMrGJV7vKwQnsHkCdrxDHB7UHQx4iO8wiDuHRimDWinTFQ6H4xTZeo/e/0I9oECVDlBFxmWYDBvZTZWxUzg4RBs9o0883ECmdNd8HuytUfXg1Q= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au; spf=pass smtp.mailfrom=codeconstruct.com.au; dkim=pass (2048-bit key) header.d=codeconstruct.com.au header.i=@codeconstruct.com.au header.b=faD3i3L7; arc=none smtp.client-ip=203.29.241.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=codeconstruct.com.au Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=codeconstruct.com.au Received: from pecola.lan (unknown [159.196.93.152]) by mail.codeconstruct.com.au (Postfix) with ESMTPSA id CD95C2012B; Tue, 14 May 2024 13:24:26 +0800 (AWST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=codeconstruct.com.au; s=2022a; t=1715664267; bh=+ar8KBa1N/4SSDZRDxyO8zG8u/CHdkEsBMPPzslDm3Q=; h=Subject:From:To:Cc:Date:In-Reply-To:References; b=faD3i3L79gswLwntLW1J2pUJqy8xc396cERISvss+wxYmjFRpkclcelRx5TUZFiqM B7pO8Y56BHs0qZap6w/gCABD6PMhUOpogB/fAd0kD6J/1cS+W+j/YqwXm/MOZltqAn XMVp8CsvSM3w2U9mMGB2GwzQKnRWBsjmH/NcFD0phzLdk5w+7kmMRkcizJ6GZ1IbdA CZZRRlUdH9CwgzRlrCv9KSqD0biQptt5ZFZ0YrnbaY3KIl1YdSO4kaXmk1BUEgBVqF xi/IYC5FHMsMH5oqqdX6o/oTLfFvn7I/BOgVRrJhwEDSf695C8yNxrxTieX7HYBvxO QR+UggKh4PDkA== Message-ID: <59262ef3dd094777175dedae9f864f747947f50d.camel@codeconstruct.com.au> Subject: Re: [PATCH 1/3] mctp pcc: Implement MCTP over PCC Transport From: Jeremy Kerr To: admiyo@os.amperecomputing.com, Matt Johnston , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org Date: Tue, 14 May 2024 13:24:26 +0800 In-Reply-To: <20240513173546.679061-2-admiyo@os.amperecomputing.com> References: <20240513173546.679061-1-admiyo@os.amperecomputing.com> <20240513173546.679061-2-admiyo@os.amperecomputing.com> Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.4-2 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 SGkgQWRhbSwKCk5pY2Ugd29yayBvbiBzZW5kaW5nIHRoaXMgb3V0LgoKSSBoYXZlIHNvbWUgY29t bWVudHMgaW5saW5lLCBidXQgaW4gZ2VuZXJhbCwgKzEgZm9yIG90aGVycycgZmVlZGJhY2sgb24K Zm9ybWF0dGluZyBhbmQgd2FybmluZyBjaGVja3MgdGhlcmUuIFRoZSBjaGVja3BhdGNoLCBOSVBB IGFuZCBXPTEgY2hlY2tzCnNob3VsZCBoZWxwIG91dCB3aXRoIGFkZHJlc3NpbmcgdGhvc2UsIHNv IEknbGwgZm9jdXMgbW9yZSBvbiB0aGUgTUNUUCAvCm5ldCBzaWRlLgoKU29tZSBvZiB0aGVzZSBh cmUganVzdCBteSB1bmZhbWlsaWFyaXR5IHdpdGggdGhlIGhhcmR3YXJlIG1lY2hhbmlzbSwKc29t ZSBhcmUgbW9yZSBmaXhlcy4KCj4gSW1wbGVtZW50YXRpb24gb2YgRE1URiBEU1A6MDI5Mgo+IE1h bmFnZW1lbnQgQ29udHJvbCBUcmFuc3BvcnQgUHJvdG9jb2woTUNUUCnCoCBvdmVyCj4gUGxhdGZv cm0gQ29tbXVuaWNhdGlvbiBDaGFubmVsKFBDQykKCkNvdWxkIHlvdSBhZGQgYSBiaXQgb24gdGhl IHBsYXRmb3JtIHN1cHBvcnQgLyByZXF1aXJlbWVudHMgaGVyZSAob3IKbWF5YmUgaW4gdGhlIEtj b25maWcgaGVscCk/IEkgZmlndXJlIHRoaXMgaXMgZW50aXJlbHkgQUNQSS1iYXNlZCwgaXMKdGhh dCBjb3JyZWN0PwoKPiAtLS0gYS9kcml2ZXJzL25ldC9tY3RwL0tjb25maWcKPiArKysgYi9kcml2 ZXJzL25ldC9tY3RwL0tjb25maWcKPiBAQCAtNDIsNiArNDIsMTggQEAgY29uZmlnIE1DVFBfVFJB TlNQT1JUX0kzQwo+IMKgwqDCoMKgwqDCoMKgwqDCoCBBIE1DVFAgcHJvdG9jb2wgbmV0d29yayBk ZXZpY2UgaXMgY3JlYXRlZCBmb3IgZWFjaCBJM0MgYnVzCj4gwqDCoMKgwqDCoMKgwqDCoMKgIGhh dmluZyBhICJtY3RwLWNvbnRyb2xsZXIiIGRldmljZXRyZWUgcHJvcGVydHkuCj4gwqAKPiArY29u ZmlnIE1DVFBfVFJBTlNQT1JUX1BDQwo+ICvCoMKgwqDCoMKgwqDCoHRyaXN0YXRlICJNQ1RQwqAg UENDIHRyYW5zcG9ydCIKPiArwqDCoMKgwqDCoMKgwqBzZWxlY3QgTUNUUF9GTE9XUwoKRG8geW91 IG5lZWQgTUNUUF9GTE9XUyBoZXJlPyBJIGNhbid0IHNlZSBhbnkgcmVmZXJlbmNlIHRvIHVzaW5n IHRoZSBmbG93CmRhdGEuCgpBbHNvLCB5b3UgcHJvYmFibHkgbmVlZCBhIGRlcGVuZGVuY3kgb24g QUNQSS4KCj4gK8KgwqDCoMKgwqDCoMKgaGVscAo+ICvCoMKgwqDCoMKgwqDCoMKgIFByb3ZpZGVz IGEgZHJpdmVyIHRvIGFjY2VzcyBNQ1RQIGRldmljZXMgb3ZlciBQQ0MgdHJhbnNwb3J0LAo+ICvC oMKgwqDCoMKgwqDCoMKgIEEgTUNUUCBwcm90b2NvbCBuZXR3b3JrIGRldmljZSBpcyBjcmVhdGVk IGZvciBlYWNoIGVudHJ5IGludCB0aGUgRFNUL1NEU1QKCnMvaW50L2luLwoKPiArwqDCoMKgwqDC oMKgwqDCoCB0aGF0IG1hdGNoZXMgdGhlIGlkZW50aWZpZXIuwqAgVGhlIFBDQyBjaGFubmVscyBh cmUgc2VsZWN0ZWQgZnJvbSB0aGUKPiArwqDCoMKgwqDCoMKgwqDCoCBjb3JyZXNwb25kaW5nIGVu dHJpZXMgaW4gdGhlIFBDQ1QuCj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgIFNheSB5IGhlcmUgaWYg eW91IG5lZWQgdG8gY29ubmVjdCB0byBNQ1RQIGVuZHBvaW50cyBvdmVyIFBDQy4gVG8KPiArwqDC oMKgwqDCoMKgwqDCoCBjb21waWxlIGFzIGEgbW9kdWxlLCB1c2UgbTsgdGhlIG1vZHVsZSB3aWxs IGJlIGNhbGxlZCBtY3RwLXBjYy4KPiArCj4gwqBlbmRtZW51Cj4gwqAKPiDCoGVuZGlmCgpbLi4u XQoKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWN0cC9tY3RwLXBjYy5jIGIvZHJpdmVycy9u ZXQvbWN0cC9tY3RwLXBjYy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAw MDAwMDAuLjcyNDJlZWRkMjc1OQo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL25ldC9t Y3RwL21jdHAtcGNjLmMKPiBAQCAtMCwwICsxLDM2OCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMAo+ICsvKgo+ICsgKiBtY3RwX3BjYy5jIC0gRHJpdmVyIGZvciBNQ1RQ IG92ZXIgUENDLgoKTWlub3I6IG1jdHAtcGNjLmMgaXMgdGhlIGZpbGVuYW1lLgoKPiArc3RydWN0 IG1jdHBfcGNjX2hkciB7Cj4gK8KgwqDCoMKgwqDCoMKgdTMyIHNpZ25hdHVyZTsKPiArwqDCoMKg wqDCoMKgwqB1MzLCoCBmbGFnczsKPiArwqDCoMKgwqDCoMKgwqB1MzIgbGVuZ3RoOwo+ICvCoMKg wqDCoMKgwqDCoGNoYXIgbWN0cF9zaWduYXR1cmVbNF07Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgbWN0 cF9wY2NfcGFja2V0IHsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbWN0cF9wY2NfaGRyIHBjY19o ZWFkZXI7Cj4gK8KgwqDCoMKgwqDCoMKgdW5pb24gewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzdHJ1Y3QgbWN0cF9oZHLCoMKgwqDCoCBtY3RwX2hlYWRlcjsKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQgY2hhciBoZWFkZXJfZGF0YVtzaXplb2Yoc3Ry dWN0IG1jdHBfaGRyKV07CgpJcyB0aGlzIHdvcnRoIHRoZSB1bmlvbj8gWW91J3JlIHJlYWxseSBy ZWZlcmVuY2luZyB0aGUgaGVhZGVyICsgYm9keQpmcm9tIHlvdXIgbWVtY3B5X3RvaW8oeC0+aGVh ZGVyX2RhdGEpLCBpbiB3aGljaCBjYXNlIHlvdSdkIHdhbnQgdGhlCnBheWxvYWQgY292ZXJlZCBi eSB0aGF0IHBvaW50ZXIgdG9vLgoKTWlnaHQgYmUgZWFzaWVyIHRvIGp1c3QgdGFrZSB0aGUgYWRk cmVzc2VzIGFzIHJlcXVpcmVkLCBvciB5b3UgY291bGQKZHJvcCB0aGlzIHN0cnVjdCBhbHRvZ2V0 aGVyIChzZWUgYmVsb3cuLi4pCgo+ICvCoMKgwqDCoMKgwqDCoH07Cj4gK8KgwqDCoMKgwqDCoMKg dW5zaWduZWQgY2hhciBwYXlsb2FkW01DVFBfUEFZTE9BRF9MRU5HVEhdOwo+ICt9Owo+ICsKPiAr c3RydWN0IG1jdHBfcGNjX2h3X2FkZHIgewo+ICvCoMKgwqDCoMKgwqDCoGludCBpbmJveF9pbmRl eDsKPiArwqDCoMKgwqDCoMKgwqBpbnQgb3V0Ym94X2luZGV4Owo+ICt9Owo+ICsKPiArLyogVGhl IG5ldGRldiBzdHJ1Y3R1cmUuIE9uZSBvZiB0aGVzZSBwZXIgUENDIGFkYXB0ZXIuICovCj4gK3N0 cnVjdCBtY3RwX3BjY19uZGV2IHsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbGlzdF9oZWFkIGhl YWQ7CgpTdXBlciBtaW5vciwgYnV0IHRoaXMgaXNuJ3QgdGhlIGhlYWQgb2YgdGhlIGxpc3Q7IGJl dHRlciB0byBqdXN0IGNhbGwKdGhpcyBzb21ldGhpbmcgbGlrZSAnbGlzdCcgb3IgJ2VudHJ5JyBv ciAnbm9kZScuCgo+ICvCoMKgwqDCoMKgwqDCoC8qIHNwaW5sb2NrIHRvIHNlcmlhbGl6ZSBhY2Nl c3MgZnJvbSBuZXRkZXYgdG8gcGNjIGJ1ZmZlciovCj4gK8KgwqDCoMKgwqDCoMKgc3BpbmxvY2tf dCBsb2NrOwoKSSdkIHN1Z2dlc3QgbGlzdGluZyB3aGljaCBtZW1iZXJzIHNob3VsZCBiZSBwcm90 ZWN0ZWQgYnkgdGhhdCBsb2NrLgo+Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IG1jdHBfZGV2IG1k ZXY7Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldmljZTsKPiAr wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgcGNjX21ib3hfY2hhbiAqaW5fY2hhbjsKPiArwqDCoMKgwqDC oMKgwqBzdHJ1Y3QgcGNjX21ib3hfY2hhbiAqb3V0X2NoYW47Cj4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IG1ib3hfY2xpZW50IG91dGJveF9jbGllbnQ7Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IG1i b3hfY2xpZW50IGluYm94X2NsaWVudDsKPiArwqDCoMKgwqDCoMKgwqB2b2lkIF9faW9tZW0gKnBj Y19jb21tX2luYm94X2FkZHI7Cj4gK8KgwqDCoMKgwqDCoMKgdm9pZCBfX2lvbWVtICpwY2NfY29t bV9vdXRib3hfYWRkcjsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbWN0cF9wY2NfaHdfYWRkciBo d19hZGRyOwo+ICvCoMKgwqDCoMKgwqDCoHZvaWQgKCpjbGVhbnVwX2NoYW5uZWwpKHN0cnVjdCBw Y2NfbWJveF9jaGFuICppbl9jaGFuKTsKPiArfTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgbGlzdF9o ZWFkIG1jdHBfcGNjX25kZXZzOwo+ICsKPiArc3RhdGljIHN0cnVjdCBtY3RwX3BjY19wYWNrZXQg Km1jdHBfcGNjX2V4dHJhY3RfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqb2xkX3NrYiwKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHZvaWQgKmJ1ZmZlciwgaW50 IG91dGJveF9pbmRleCkKCllvdSdyZSBtaXhpbmcgYWRkcmVzcyBzcGFjZXMgYSBsaXR0bGUgaGVy ZS4gTG9va3MgbGlrZSBidWZmZXIgc2hvdWxkIGJlCnZvaWQgX19pb21lbSAqLCBnaXZlbiB5b3Un cmUgdXNpbmcgdGhlIGlvIGFjY2Vzc29ycyBpbiB0aGUgZnVuY3Rpb24/CgpbbWF5YmUgZG8gYSBz cGFyc2UgYnVpbGQgdG9vLCB0byBjYXRjaCB0aGVzZV0KClRoaXMgc2VlbXMgdG8gYmUgc2VuZGlu ZyB0aGUgcGFja2V0IHRvIGhhcmR3YXJlLCBzbyBleHRyYWN0X2RhdGEgc2VlbXMKYW4gb2RkIG5h bWUgZm9yIHRoZSBmdW5jdGlvbi4KCj4gK3sKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbWN0cF9w Y2NfcGFja2V0ICptcHA7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoG1wcCA9IGJ1ZmZlcjsKPiArwqDC oMKgwqDCoMKgwqB3cml0ZWwoUENDX01BR0lDIHwgb3V0Ym94X2luZGV4LCAmbXBwLT5wY2NfaGVh ZGVyLnNpZ25hdHVyZSk7Cj4gK8KgwqDCoMKgwqDCoMKgd3JpdGVsKDB4MSwgJm1wcC0+cGNjX2hl YWRlci5mbGFncyk7Cj4gK8KgwqDCoMKgwqDCoMKgbWVtY3B5X3RvaW8obXBwLT5wY2NfaGVhZGVy Lm1jdHBfc2lnbmF0dXJlLCBNQ1RQX1NJR05BVFVSRSwgU0lHTkFUVVJFX0xFTkdUSCk7Cj4gK8Kg wqDCoMKgwqDCoMKgd3JpdGVsKG9sZF9za2ItPmxlbiArIFNJR05BVFVSRV9MRU5HVEgswqAgJm1w cC0+cGNjX2hlYWRlci5sZW5ndGgpOwo+ICvCoMKgwqDCoMKgwqDCoG1lbWNweV90b2lvKG1wcC0+ aGVhZGVyX2RhdGEswqDCoMKgIG9sZF9za2ItPmRhdGEsIG9sZF9za2ItPmxlbik7CgpZb3UncmUg d3JpdGluZyB0aGUgcGNjX2hlYWRlciBmaWVsZHMgaW5kaXZpZHVhbGx5LCB0aGVuIHdyaXRpbmcg dGhlIHJlc3QKb2YgdGhlIG1jdHAgaGVhZGVyICsgcGF5bG9hZCBhdCBvbmNlLiBNYXliZSBpdCB3 b3VsZCBtYWtlIG1vcmUgc2Vuc2UgdG8KZHJvcCBzdHJ1Y3QgbWN0cF9wY2NfcGFja2V0LCB3cml0 ZSBhIG1jdHBfcGNjX2hkciwgdGhlbiB3cml0ZSB0aGUgcGFja2V0CmRhdGE/Cgo+ICvCoMKgwqDC oMKgwqDCoHJldHVybiBtcHA7CgpTbyB0aGlzIGlzIGp1c3QgcmV0dXJuaW5nIHRoZSBpbnB1dCBh cmd1bWVudCwgaXMgdGhhdCBuZWNlc3Nhcnk/Cgo+ICtzdGF0aWMgdm9pZCBtY3RwX3BjY19jbGll bnRfcnhfY2FsbGJhY2soc3RydWN0IG1ib3hfY2xpZW50ICpjLCB2b2lkICopCj4gK3sKPiArwqDC oMKgwqDCoMKgwqBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBt Y3RwX3BjY19wYWNrZXQgKm1wcDsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbWN0cF9za2JfY2Ig KmNiOwo+ICvCoMKgwqDCoMKgwqDCoGludCBkYXRhX2xlbjsKPiArwqDCoMKgwqDCoMKgwqB1bnNp Z25lZCBsb25nIGJ1Zl9wdHJfdmFsOwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBtY3RwX3BjY19u ZGV2ICptY3RwX3BjY19kZXYgPSBjb250YWluZXJfb2YoYywgc3RydWN0IG1jdHBfcGNjX25kZXYs IGluYm94X2NsaWVudCk7Cj4gK8KgwqDCoMKgwqDCoMKgdm9pZCAqc2tiX2J1ZjsKPiArCj4gK8Kg wqDCoMKgwqDCoMKgbXBwID0gKHN0cnVjdCBtY3RwX3BjY19wYWNrZXQgKiltY3RwX3BjY19kZXYt PnBjY19jb21tX2luYm94X2FkZHI7Cj4gK8KgwqDCoMKgwqDCoMKgYnVmX3B0cl92YWwgPSAodW5z aWduZWQgbG9uZyltcHA7Cj4gK8KgwqDCoMKgwqDCoMKgZGF0YV9sZW4gPSByZWFkbCgmbXBwLT5w Y2NfaGVhZGVyLmxlbmd0aCkgKyBNQ1RQX0hFQURFUl9MRU5HVEg7Cj4gK8KgwqDCoMKgwqDCoMKg c2tiID0gbmV0ZGV2X2FsbG9jX3NrYihtY3RwX3BjY19kZXYtPm1kZXYuZGV2LCBkYXRhX2xlbik7 Cj4gK8KgwqDCoMKgwqDCoMKgaWYgKCFza2IpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgbWN0cF9wY2NfZGV2LT5tZGV2LmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICvC oMKgwqDCoMKgwqDCoHNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9NQ1RQKTsKPiArwqDCoMKg wqDCoMKgwqBza2JfYnVmID0gc2tiX3B1dChza2IsIGRhdGFfbGVuKTsKPiArwqDCoMKgwqDCoMKg wqBtZW1jcHlfZnJvbWlvKHNrYl9idWYsIG1wcCwgZGF0YV9sZW4pOwo+ICvCoMKgwqDCoMKgwqDC oHNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Cj4gK8KgwqDCoMKgwqDCoMKgc2tiX3B1bGwoc2ti LCBzaXplb2Yoc3RydWN0IG1jdHBfcGNjX2hkcikpOwoKQW55IHJlYXNvbiBmb3IgaW5jbHVkaW5n IHRoZSBtcHAgaGVhZGVyIGluIHRoZSBza2IgZGF0YSBpbiB0aGUgZmlyc3QKcGxhY2U/IE5vdCBu ZWNlc3NhcmlseSBhbiBpc3N1ZSwgYnV0IHlvdSBtYXkgd2FudCB0byBjb25zaWRlciBob3cgdGhh dApjYW4gYmUgc3ltbWV0cmljYWwgd2l0aCBvdXRnb2luZyBwYWNrZXRzLCBhbmQgd2hldGhlciBp dCdzIHJlcHJlc2VudGVkCmluIGRldi0+aGFyZF9oZWFkZXJfbGVuLgoKTXkgZ3Vlc3MgaXMgdGhh dCB0aGUgbXBwIGhlYWRlciBkb2Vzbid0IG5lZWQgdG8gYmUgaW4gdGhlIHNrYiBhdCBhbGwsIGFz Cml0IHNlZW1zIG1vcmUgbGlrZSBoYXJkd2FyZSBidWZmZXIgbGF5b3V0LiBCdXQgeW91IG1heSBo YXZlIGJldHRlcgpkZXNpZ25zIQoKPiArwqDCoMKgwqDCoMKgwqBza2JfcmVzZXRfbmV0d29ya19o ZWFkZXIoc2tiKTsKPiArwqDCoMKgwqDCoMKgwqBjYiA9IF9fbWN0cF9jYihza2IpOwo+ICvCoMKg wqDCoMKgwqDCoGNiLT5oYWxlbiA9IDA7Cj4gK8KgwqDCoMKgwqDCoMKgc2tiLT5kZXYgPcKgIG1j dHBfcGNjX2Rldi0+bWRldi5kZXY7Cj4gK8KgwqDCoMKgwqDCoMKgbmV0aWZfcngoc2tiKTsKPiAr fQo+ICsKPiArc3RhdGljIG5ldGRldl90eF90IG1jdHBfcGNjX3R4KHN0cnVjdCBza19idWZmICpz a2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgdW5zaWdu ZWQgY2hhciAqYnVmZmVyOwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBtY3RwX3BjY19uZGV2ICpt cG5kOwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBtY3RwX3BjY19wYWNrZXTCoCAqbXBwOwo+ICvC oMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gK8KgwqDCoMKgwqDCoMKgaW50IHJj Owo+ICsKPiArwqDCoMKgwqDCoMKgwqBuZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOwo+ICvCoMKgwqDC oMKgwqDCoG5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwoKc3RhdHMudHhfcGFja2V0 cyB0b28/CgphbmQgd2hhdCBhYm91dCB0aGUgZmFpbHVyZSBjYXNlPwoKPiArwqDCoMKgwqDCoMKg wqBtcG5kID0gKHN0cnVjdCBtY3RwX3BjY19uZGV2ICopbmV0ZGV2X3ByaXYobmRldik7Cj4gK8Kg wqDCoMKgwqDCoMKgc3Bpbl9sb2NrX2lycXNhdmUoJm1wbmQtPmxvY2ssIGZsYWdzKTsKPiArwqDC oMKgwqDCoMKgwqBidWZmZXIgPcKgIG1wbmQtPnBjY19jb21tX291dGJveF9hZGRyOwo+ICvCoMKg wqDCoMKgwqDCoG1wcCA9IG1jdHBfcGNjX2V4dHJhY3RfZGF0YShza2IsIG1wbmQtPnBjY19jb21t X291dGJveF9hZGRyLCBtcG5kLT5od19hZGRyLm91dGJveF9pbmRleCk7Cj4gK8KgwqDCoMKgwqDC oMKgcmMgPSBtcG5kLT5vdXRfY2hhbi0+bWNoYW4tPm1ib3gtPm9wcy0+c2VuZF9kYXRhKG1wbmQt Pm91dF9jaGFuLT5tY2hhbiwgbXBwKTsKPiArwqDCoMKgwqDCoMKgwqBzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZtcG5kLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGRldl9jb25z dW1lX3NrYl9hbnkoc2tiKTsKPiArwqDCoMKgwqDCoMKgwqBuZXRpZl9zdGFydF9xdWV1ZShuZGV2 KTsKClRoaXMgYWxsIGxvb2tzIGZhaXJseSBhdG9taWMsIGRvIHdlIG5lZWQgdG8gc3RvcCAvIHN0 YXJ0IHRoZSBxdWV1ZXMgaGVyZT8KCk9yOiBkbyB3ZSBrbm93IHRoYXQgdGhlIElPIHJlZ2lvbiBp cyBzYWZlIHRvIHJlLXVzZSBpbW1lZGlhdGVseSBhZnRlcgpzZW5kX2RhdGEgaGFzIHJldHVybmVk PyBJJ20gdW5mYW1pbGlhciB3aXRoIHRoZSBtYWlsYm94IGludGVyZmFjZS4KCj4gK8KgwqDCoMKg wqDCoMKgaWYgKCFyYykKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIE5F VERFVl9UWF9PSzsKPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gTkVUREVWX1RYX0JVU1k7Cj4gK30K PiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgbWN0cF9wY2NfbmV0ZGV2 X29wcyA9IHsKPiArwqDCoMKgwqDCoMKgwqAubmRvX3N0YXJ0X3htaXQgPSBtY3RwX3BjY190eCwK PiArwqDCoMKgwqDCoMKgwqAubmRvX3VuaW5pdCA9IE5VTEwKPiArfTsKPiArCj4gK3N0YXRpYyB2 b2lkwqAgbWN0cF9wY2Nfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCj4gK3sKPiArwqDC oMKgwqDCoMKgwqBuZGV2LT50eXBlID0gQVJQSFJEX01DVFA7Cj4gK8KgwqDCoMKgwqDCoMKgbmRl di0+aGFyZF9oZWFkZXJfbGVuID0gMDsKPiArwqDCoMKgwqDCoMKgwqBuZGV2LT5hZGRyX2xlbiA9 IHNpemVvZihzdHJ1Y3QgbWN0cF9wY2NfaHdfYWRkcik7CgpEbyB5b3UgaGF2ZSBhbnkgcGh5c2lj YWwgYWRkcmVzc2luZyBvbiB0aGUgUENDIGNoYW5uZWxzPyBPciBpcyBpdApwb2ludC10by1wb2lu dD8KCklmIGl0J3MgcG9pbnQgdG8gcG9pbnQsIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRoZSBk ZXZpY2UgaGFyZHdhcmUKYWRkcmVzc2VzIGF0IGFsbC4gVGhvc2Ugc2VlbSB0byBiZSBzeW50aGV0 aWMgaW4gdGhpcyBkcml2ZXIsIHJhdGhlciB0aGFuCmJhc2VkIG9uIGEgc3BlY2lmaWVkIGFkZHJl c3Npbmcgc2NoZW1lLiBJbiB3aGljaCBjYXNlLCBpdCBtYXkgYmUgYmV0dGVyCnRvICpub3QqIGlu Y2x1ZGUgdGhlIGh3IGFkZHIgb24gdGhlIGRldmljZS4KCj4gK8KgwqDCoMKgwqDCoMKgbmRldi0+ dHhfcXVldWVfbGVuID0gREVGQVVMVF9UWF9RVUVVRV9MRU47Cj4gK8KgwqDCoMKgwqDCoMKgbmRl di0+ZmxhZ3MgPSBJRkZfTk9BUlA7Cj4gK8KgwqDCoMKgwqDCoMKgbmRldi0+bmV0ZGV2X29wcyA9 ICZtY3RwX3BjY19uZXRkZXZfb3BzOwo+ICvCoMKgwqDCoMKgwqDCoG5kZXYtPm5lZWRzX2ZyZWVf bmV0ZGV2ID0gdHJ1ZTsKPiArfQo+ICsKPiArc3RhdGljIGludCBjcmVhdGVfbWN0cF9wY2NfbmV0 ZGV2KHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRldmlj ZSAqZGV2LCBpbnQgaW5ib3hfaW5kZXgsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50IG91dGJveF9pbmRleCkKPiAr ewo+ICvCoMKgwqDCoMKgwqDCoGludCByYzsKPiArwqDCoMKgwqDCoMKgwqBpbnQgbWN0cF9wY2Nf bXR1Owo+ICvCoMKgwqDCoMKgwqDCoGNoYXIgbmFtZVszMl07Cj4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IG5ldF9kZXZpY2UgKm5kZXY7Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IG1jdHBfcGNjX25k ZXYgKm1jdHBfcGNjX2RldjsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbWN0cF9wY2NfaHdfYWRk ciBwaHlzaWNhbF9saW5rX2FkZHI7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHNucHJpbnRmKG5hbWUs IHNpemVvZihuYW1lKSwgIm1jdHBpcGNjJXgiLCBpbmJveF9pbmRleCk7CgpXaGF0IGRvZXMgdGhl ICdpJyBzdGFuZCBmb3I/ICgnaXBjYyc/KQoKR3JhbnRlZCwgdGhpcyBpcyBwcm9iYWJseSBtb3Jl IHJlYWRhYmxlIHRoYW4gbWN0cHBjYyA6RAoKLi4gYW5kIGl0J3MgY29udmVudGlvbiB0byB1c2Ug JWQgdGhlcmUgcmF0aGVyIHRoYW4gJXgsIGxlc3QgeW91IGdldAphbm90aGVyICdjJyBmcm9tIHRo ZSB0d2VsZnRoIGluZGV4LgoKPiArwqDCoMKgwqDCoMKgwqBuZGV2ID0gYWxsb2NfbmV0ZGV2KHNp emVvZihzdHJ1Y3QgbWN0cF9wY2NfbmRldiksIG5hbWUsIE5FVF9OQU1FX0VOVU0sIG1jdHBfcGNj X3NldHVwKTsKPiArwqDCoMKgwqDCoMKgwqBpZiAoIW5kZXYpCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiAtRU5PTUVNOwo+ICvCoMKgwqDCoMKgwqDCoG1jdHBfcGNjX2Rl diA9IChzdHJ1Y3QgbWN0cF9wY2NfbmRldiAqKW5ldGRldl9wcml2KG5kZXYpOwo+ICvCoMKgwqDC oMKgwqDCoElOSVRfTElTVF9IRUFEKCZtY3RwX3BjY19kZXYtPmhlYWQpOwo+ICvCoMKgwqDCoMKg wqDCoHNwaW5fbG9ja19pbml0KCZtY3RwX3BjY19kZXYtPmxvY2spOwo+ICsKPiArwqDCoMKgwqDC oMKgwqBtY3RwX3BjY19kZXYtPm91dGJveF9jbGllbnQudHhfcHJlcGFyZSA9IE5VTEw7Cj4gK8Kg wqDCoMKgwqDCoMKgbWN0cF9wY2NfZGV2LT5vdXRib3hfY2xpZW50LnR4X2RvbmUgPSBOVUxMOwoK VGhlc2Ugd2lsbCBhbHJlYWR5IGJlIHplcm9lZC4KCj4gK8KgwqDCoMKgwqDCoMKgbWN0cF9wY2Nf ZGV2LT5od19hZGRyLmluYm94X2luZGV4ID0gaW5ib3hfaW5kZXg7Cj4gK8KgwqDCoMKgwqDCoMKg bWN0cF9wY2NfZGV2LT5od19hZGRyLm91dGJveF9pbmRleCA9IG91dGJveF9pbmRleDsKPiArwqDC oMKgwqDCoMKgwqBtY3RwX3BjY19kZXYtPmluYm94X2NsaWVudC5yeF9jYWxsYmFjayA9IG1jdHBf cGNjX2NsaWVudF9yeF9jYWxsYmFjazsKPiArwqDCoMKgwqDCoMKgwqBtY3RwX3BjY19kZXYtPmNs ZWFudXBfY2hhbm5lbCA9IHBjY19tYm94X2ZyZWVfY2hhbm5lbDsKPiArwqDCoMKgwqDCoMKgwqBt Y3RwX3BjY19kZXYtPm91dF9jaGFuID0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cGNjX21ib3hfcmVxdWVzdF9jaGFubmVsKCZtY3RwX3BjY19kZXYtPm91dGJveF9jbGllbnQsCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvdXRib3hfaW5kZXgpOwo+ICvCoMKgwqDCoMKgwqDCoGlm IChJU19FUlIobWN0cF9wY2NfZGV2LT5vdXRfY2hhbikpIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgcmMgPSBQVFJfRVJSKG1jdHBfcGNjX2Rldi0+b3V0X2NoYW4pOwo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnb3RvIGZyZWVfbmV0ZGV2Owo+ICvCoMKgwqDCoMKg wqDCoH0KPiArwqDCoMKgwqDCoMKgwqBtY3RwX3BjY19kZXYtPmluX2NoYW4gPQo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwY2NfbWJveF9yZXF1ZXN0X2NoYW5uZWwoJm1jdHBfcGNj X2Rldi0+aW5ib3hfY2xpZW50LAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5ib3hfaW5kZXgp Owo+ICvCoMKgwqDCoMKgwqDCoGlmIChJU19FUlIobWN0cF9wY2NfZGV2LT5pbl9jaGFuKSkgewo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByYyA9IFBUUl9FUlIobWN0cF9wY2NfZGV2 LT5pbl9jaGFuKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBjbGVhbnVw X291dF9jaGFubmVsOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDCoMKgwqBtY3RwX3Bj Y19kZXYtPnBjY19jb21tX2luYm94X2FkZHIgPQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBkZXZtX2lvcmVtYXAoZGV2LCBtY3RwX3BjY19kZXYtPmluX2NoYW4tPnNobWVtX2Jhc2Vf YWRkciwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIG1jdHBfcGNjX2Rldi0+aW5fY2hhbi0+c2htZW1fc2l6ZSk7Cj4gK8KgwqDCoMKgwqDC oMKgaWYgKCFtY3RwX3BjY19kZXYtPnBjY19jb21tX2luYm94X2FkZHIpIHsKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgcmMgPSAtRUlOVkFMOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBnb3RvIGNsZWFudXBfaW5fY2hhbm5lbDsKPiArwqDCoMKgwqDCoMKgwqB9Cj4g K8KgwqDCoMKgwqDCoMKgbWN0cF9wY2NfZGV2LT5wY2NfY29tbV9vdXRib3hfYWRkciA9Cj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRldm1faW9yZW1hcChkZXYsIG1jdHBfcGNjX2Rl di0+b3V0X2NoYW4tPnNobWVtX2Jhc2VfYWRkciwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIG1jdHBfcGNjX2Rldi0+b3V0X2NoYW4tPnNo bWVtX3NpemUpOwo+ICvCoMKgwqDCoMKgwqDCoGlmICghbWN0cF9wY2NfZGV2LT5wY2NfY29tbV9v dXRib3hfYWRkcikgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByYyA9IC1FSU5W QUw7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gY2xlYW51cF9pbl9jaGFu bmVsOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDCoMKgwqBtY3RwX3BjY19kZXYtPmFj cGlfZGV2aWNlID0gYWNwaV9kZXY7Cj4gK8KgwqDCoMKgwqDCoMKgbWN0cF9wY2NfZGV2LT5pbmJv eF9jbGllbnQuZGV2ID0gZGV2Owo+ICvCoMKgwqDCoMKgwqDCoG1jdHBfcGNjX2Rldi0+b3V0Ym94 X2NsaWVudC5kZXYgPSBkZXY7Cj4gK8KgwqDCoMKgwqDCoMKgbWN0cF9wY2NfZGV2LT5tZGV2LmRl diA9IG5kZXY7Cj4gKwo+ICsvKiBUaGVyZSBpcyBubyBjbGVhbiB3YXkgdG8gcGFzcyB0aGUgTVRV IHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbgo+ICsgKiB1c2VkIGZvciByZWdpc3RyYXRpb24sIHNv IHNldCB0aGUgdmFsdWVzIGFoZWFkIG9mIHRpbWUuCj4gKyAqLwo+ICvCoMKgwqDCoMKgwqDCoG1j dHBfcGNjX210dSA9IG1jdHBfcGNjX2Rldi0+b3V0X2NoYW4tPnNobWVtX3NpemUgLQo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzaXplb2Yoc3RydWN0IG1jdHBfcGNjX2hkcik7Cj4g K8KgwqDCoMKgwqDCoMKgbmRldi0+bXR1ID0gbWN0cF9wY2NfbXR1OwoKU28gdGhlcmUncyBhIGJp dCBvZiBjb21wYXRpYmlsaXR5IGNvbnNpZGVyYXRpb24gaGVyZS4gSXMgaXQgZ3VhcmFudGVlZAp0 aGF0IHRoZSBvdGhlciBlbmQgb2YgdGhpcyBsaW5rIHN1cHBvcnRzIHRoZSBNVFUgeW91J3JlIGlu aXRpYWxseQpzZXR0aW5nIGhlcmU/IElmIHNvLCBkZWZhdWx0aW5nIHRvIHRoYXQgc2l6ZSBzaG91 bGQgYmUgZmluZS4KCkhvd2V2ZXIsIGlmICpub3QqOiBJJ2Qgc3VnZ2VzdCBkZWZhdWx0aW5nIHRv IHRoZSBNQ1RQIGJhc2VsaW5lIE1UVSAoNjgpLAphbmQgYWxsb3dpbmcgdXBwZXIgbGF5ZXJzIHRv IGluY3JlYXNlIG9uY2Ugd2UgaGF2ZSBlc3RhYmxpc2hlZCB0aGUKY2FwYWJpbGl0aWVzIG9mIHRo ZSByZW1vdGUgZW5kcG9pbnQuCgo+ICvCoMKgwqDCoMKgwqDCoG5kZXYtPm1heF9tdHUgPSBtY3Rw X3BjY19tdHU7Cj4gK8KgwqDCoMKgwqDCoMKgbmRldi0+bWluX210dSA9IE1DVFBfTUlOX01UVTsK PiArCj4gK8KgwqDCoMKgwqDCoMKgcGh5c2ljYWxfbGlua19hZGRyLmluYm94X2luZGV4ID0KPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaHRvbmwobWN0cF9wY2NfZGV2LT5od19hZGRy LmluYm94X2luZGV4KTsKPiArwqDCoMKgwqDCoMKgwqBwaHlzaWNhbF9saW5rX2FkZHIub3V0Ym94 X2luZGV4ID0KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaHRvbmwobWN0cF9wY2Nf ZGV2LT5od19hZGRyLm91dGJveF9pbmRleCk7Cj4gK8KgwqDCoMKgwqDCoMKgZGV2X2FkZHJfc2V0 KG5kZXYsIChjb25zdCB1OCAqKSZwaHlzaWNhbF9saW5rX2FkZHIpOwoKUmVsYXRlZCB0byB0aGUg cGh5c2ljYWwgYWRkcmVzc2luZyBxdWVyeSBhYm92ZTsgaXQgbWlnaHQgYmUgdGhhdCB5b3UKZG9u J3QgbmVlZCBhbnkgYWRkcmVzc2VzIGhlcmUuCgo+ICvCoMKgwqDCoMKgwqDCoHJjID0gcmVnaXN0 ZXJfbmV0ZGV2KG5kZXYpOwo+ICvCoMKgwqDCoMKgwqDCoGlmIChyYykKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgZ290byBjbGVhbnVwX2luX2NoYW5uZWw7Cj4gK8KgwqDCoMKgwqDC oMKgbGlzdF9hZGRfdGFpbCgmbWN0cF9wY2NfZGV2LT5oZWFkLCAmbWN0cF9wY2NfbmRldnMpOwo+ ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ICtjbGVhbnVwX2luX2NoYW5uZWw6Cj4gK8KgwqDC oMKgwqDCoMKgbWN0cF9wY2NfZGV2LT5jbGVhbnVwX2NoYW5uZWwobWN0cF9wY2NfZGV2LT5pbl9j aGFuKTsKPiArY2xlYW51cF9vdXRfY2hhbm5lbDoKPiArwqDCoMKgwqDCoMKgwqBtY3RwX3BjY19k ZXYtPmNsZWFudXBfY2hhbm5lbChtY3RwX3BjY19kZXYtPm91dF9jaGFuKTsKPiArZnJlZV9uZXRk ZXY6Cj4gK8KgwqDCoMKgwqDCoMKgdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7Cj4gK8KgwqDCoMKg wqDCoMKgZnJlZV9uZXRkZXYobmRldik7Cj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIHJjOwo+ICt9 Cj4gKwo+ICtzdHJ1Y3QgbG9va3VwX2NvbnRleHQgewo+ICvCoMKgwqDCoMKgwqDCoGludCBpbmRl eDsKPiArwqDCoMKgwqDCoMKgwqBpbnQgaW5ib3hfaW5kZXg7Cj4gK8KgwqDCoMKgwqDCoMKgaW50 IG91dGJveF9pbmRleDsKPiArfTsKPiArCj4gK3N0YXRpYyBhY3BpX3N0YXR1cyBsb29rdXBfcGNj dF9pbmRpY2VzKHN0cnVjdCBhY3BpX3Jlc291cmNlICphcmVzLCB2b2lkICpjb250ZXh0KQo+ICt7 Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGFjcGlfcmVzb3VyY2VfYWRkcmVzczMyICphZGRyOwo+ ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBsb29rdXBfY29udGV4dCAqbHVjID0gY29udGV4dDsKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgc3dpdGNoIChhcmVzLT50eXBlKSB7Cj4gK8KgwqDCoMKgwqDCoMKg Y2FzZSAweDBjOgo+ICvCoMKgwqDCoMKgwqDCoGNhc2UgMHgwYToKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgZGVmYXVsdDoKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIEFFX09LOwo+ICvCoMKgwqDCoMKgwqDCoH0K PiArCj4gK8KgwqDCoMKgwqDCoMKgYWRkciA9IEFDUElfQ0FTVF9QVFIoc3RydWN0IGFjcGlfcmVz b3VyY2VfYWRkcmVzczMyLCAmYXJlcy0+ZGF0YSk7Cj4gK8KgwqDCoMKgwqDCoMKgc3dpdGNoIChs dWMtPmluZGV4KSB7Cj4gK8KgwqDCoMKgwqDCoMKgY2FzZSAwOgo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBsdWMtPm91dGJveF9pbmRleCA9IGFkZHJbMF0uYWRkcmVzcy5taW5pbXVt Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiArwqDCoMKgwqDCoMKg wqBjYXNlIDE6Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGx1Yy0+aW5ib3hfaW5k ZXggPSBhZGRyWzBdLmFkZHJlc3MubWluaW11bTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDCoMKgwqDCoGx1Yy0+aW5k ZXgrKzsKPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gQUVfT0s7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgbWN0cF9wY2NfZHJpdmVyX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCj4gK3sKPiAr wqDCoMKgwqDCoMKgwqBpbnQgaW5ib3hfaW5kZXg7Cj4gK8KgwqDCoMKgwqDCoMKgaW50IG91dGJv eF9pbmRleDsKPiArwqDCoMKgwqDCoMKgwqBhY3BpX2hhbmRsZSBkZXZfaGFuZGxlOwo+ICvCoMKg wqDCoMKgwqDCoGFjcGlfc3RhdHVzIHN0YXR1czsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbG9v a3VwX2NvbnRleHQgY29udGV4dCA9IHswLCAwLCAwfTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgZGV2 X2luZm8oJmFkZXYtPmRldiwgIkFkZGluZyBtY3RwX3BjYyBkZXZpY2UgZm9yIEhJRMKgICVzXG4i LCBhY3BpX2RldmljZV9oaWQoYWRldikpOwo+ICvCoMKgwqDCoMKgwqDCoGRldl9oYW5kbGUgPSBh Y3BpX2RldmljZV9oYW5kbGUoYWRldik7Cj4gK8KgwqDCoMKgwqDCoMKgc3RhdHVzID0gYWNwaV93 YWxrX3Jlc291cmNlcyhkZXZfaGFuZGxlLCAiX0NSUyIsIGxvb2t1cF9wY2N0X2luZGljZXMsICZj b250ZXh0KTsKPiArwqDCoMKgwqDCoMKgwqBpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaW5ib3hfaW5kZXggPSBjb250ZXh0LmluYm94 X2luZGV4Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvdXRib3hfaW5kZXggPSBj b250ZXh0Lm91dGJveF9pbmRleDsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 dXJuIGNyZWF0ZV9tY3RwX3BjY19uZXRkZXYoYWRldiwgJmFkZXYtPmRldiwgaW5ib3hfaW5kZXgs IG91dGJveF9pbmRleCk7Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDCoMKgwqDCoGRldl9l cnIoJmFkZXYtPmRldiwgIkZBSUxVUkUgdG8gbG9va3VwIFBDQyBpbmRleGVzIGZyb20gQ1JTIik7 Cj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIC1FSU5WQUw7Cj4gK307CgpJJ2Qgc3VnZ2VzdCBmbGlw cGluZyB0aGUgY29uZGl0aW9uYWwgdGhlcmUsIG1ha2luZyBpdCB0aGUgZXJyb3IgcGF0aDoKCiAg IMKgwqDCoMKgwqDCoMKgaWYgKCFBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewogICAgICAgICAgIMKg wqDCoMKgwqDCoMKgZGV2X2VycigmYWRldi0+ZGV2LCAiRkFJTFVSRSB0byBsb29rdXAgUENDIGlu ZGV4ZXMgZnJvbSBDUlMiKTsKICAgICAgICAgICDCoMKgwqDCoMKgwqDCoHJldHVybiAtRUlOVkFM OwogICDCoMKgwqDCoMKgwqDCoH0KCsKgwqDCoMKgwqDCoMKgwqDCoMKgaW5ib3hfaW5kZXggPSBj b250ZXh0LmluYm94X2luZGV4OwrCoMKgwqDCoMKgwqDCoMKgwqDCoG91dGJveF9pbmRleCA9IGNv bnRleHQub3V0Ym94X2luZGV4OwrCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBjcmVhdGVfbWN0 cF9wY2NfbmV0ZGV2KGFkZXYsICZhZGV2LT5kZXYsIGluYm94X2luZGV4LCBvdXRib3hfaW5kZXgp OwoKPiArCj4gKy8qIHBhc3MgaW4gYWRldj1OVUxMIHRvIHJlbW92ZSBhbGwgZGV2aWNlcwo+ICsg Ki8KCldpbGwgdGhhdCBldmVyIGJlIG5lZWRlZD8gWW91IHNob3VsZCBoYXZlIGFsbCBvZiB0aGUg ZGV2aWNlcyB1bmJvdW5kCmJlZm9yZSBtb2R1bGUgZXhpdCwgbm8/Cgpbbm90IHRoYXQgSSBoYXZl IG11Y2ggZXhwZXJpZW5jZSB3aXRoIEFDUEkgYXQgYWxsLi4uXQoKPiArc3RhdGljIHZvaWQgbWN0 cF9wY2NfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYpCj4gK3sKPiArwqDC oMKgwqDCoMKgwqBzdHJ1Y3QgbWN0cF9wY2NfbmRldiAqbWN0cF9wY2NfZGV2ID0gTlVMTDsKPiAr wqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbGlzdF9oZWFkICpwdHI7Cj4gK8KgwqDCoMKgwqDCoMKgc3Ry dWN0IGxpc3RfaGVhZCAqdG1wOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBsaXN0X2Zvcl9lYWNoX3Nh ZmUocHRyLCB0bXAsICZtY3RwX3BjY19uZGV2cykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBtY3RwX3BjY19kZXYgPSBsaXN0X2VudHJ5KHB0ciwgc3RydWN0IG1jdHBfcGNjX25k ZXYsIGhlYWQpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIWFkZXYgfHwg bWN0cF9wY2NfZGV2LT5hY3BpX2RldmljZSA9PSBhZGV2KSB7CgoKUG9zc2libHkgdGlkaWVyIHRv IGZsaXAgdGhlIGNvbmRpdGlvbiBoZXJlIHRvbywgbGVhdmluZyBmZXdlciBpbmRlbnRzOgoKICAg ICAgICAgICAgICAgICAgaWYgKCFhZGV2IHx8IG1jdHBfcHh4X2Rldi0+YWNwaV9kZXZpY2UgIT0g YWRldikKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbmV0X2RldmljZSAqbmRl djsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBt Y3RwX3BjY19kZXYtPmNsZWFudXBfY2hhbm5lbChtY3RwX3BjY19kZXYtPm91dF9jaGFuKTsKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1jdHBfcGNjX2Rl di0+Y2xlYW51cF9jaGFubmVsKG1jdHBfcGNjX2Rldi0+aW5fY2hhbik7Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBuZGV2ID0gbWN0cF9wY2NfZGV2LT5t ZGV2LmRldjsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmIChuZGV2KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoG1jdHBfdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0X2RlbChwdHIpOwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKGFkZXYp Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiArwqDC oMKgwqDCoMKgwqB9Cj4gK307Cj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNl X2lkIG1jdHBfcGNjX2RldmljZV9pZHNbXSA9IHsKPiArwqDCoMKgwqDCoMKgwqB7ICJETVQwMDAx IiwgMH0sCj4gK8KgwqDCoMKgwqDCoMKgeyAiIiwgMH0sCj4gK307Cj4gKwo+ICtzdGF0aWMgc3Ry dWN0IGFjcGlfZHJpdmVyIG1jdHBfcGNjX2RyaXZlciA9IHsKPiArwqDCoMKgwqDCoMKgwqAubmFt ZSA9ICJtY3RwX3BjYyIsCj4gK8KgwqDCoMKgwqDCoMKgLmNsYXNzID0gIlVua25vd24iLAo+ICvC oMKgwqDCoMKgwqDCoC5pZHMgPSBtY3RwX3BjY19kZXZpY2VfaWRzLAo+ICvCoMKgwqDCoMKgwqDC oC5vcHMgPSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC5hZGQgPSBtY3RwX3Bj Y19kcml2ZXJfYWRkLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAucmVtb3ZlID0g bWN0cF9wY2NfZHJpdmVyX3JlbW92ZSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg Lm5vdGlmeSA9IE5VTEwsCj4gK8KgwqDCoMKgwqDCoMKgfSwKPiArwqDCoMKgwqDCoMKgwqAub3du ZXIgPSBUSElTX01PRFVMRSwKPiArCj4gK307Cj4gKwo+ICtzdGF0aWMgaW50IF9faW5pdCBtY3Rw X3BjY19tb2RfaW5pdCh2b2lkKQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgaW50IHJjOwo+ICsKPiAr wqDCoMKgwqDCoMKgwqBwcl9pbmZvKCJpbml0aWFsaXppbmcgTUNUUCBvdmVyIFBDQ1xuIik7Cj4g K8KgwqDCoMKgwqDCoMKgSU5JVF9MSVNUX0hFQUQoJm1jdHBfcGNjX25kZXZzKTsKPiArwqDCoMKg wqDCoMKgwqByYyA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmbWN0cF9wY2NfZHJpdmVyKTsK PiArwqDCoMKgwqDCoMKgwqBpZiAocmMgPCAwKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0VSUk9SLCAiRXJyb3IgcmVnaXN0ZXJpbmcg ZHJpdmVyXG4iKSk7Cj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIHJjOwo+ICt9Cj4gKwo+ICtzdGF0 aWMgX19leGl0IHZvaWQgbWN0cF9wY2NfbW9kX2V4aXQodm9pZCkKPiArewo+ICvCoMKgwqDCoMKg wqDCoHByX2luZm8oIlJlbW92aW5nIE1DVFAgb3ZlciBQQ0MgdHJhbnNwb3J0IGRyaXZlclxuIik7 Cj4gK8KgwqDCoMKgwqDCoMKgbWN0cF9wY2NfZHJpdmVyX3JlbW92ZShOVUxMKTsKPiArwqDCoMKg wqDCoMKgwqBhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmbWN0cF9wY2NfZHJpdmVyKTsKPiAr fQo+ICsKPiArbW9kdWxlX2luaXQobWN0cF9wY2NfbW9kX2luaXQpOwo+ICttb2R1bGVfZXhpdCht Y3RwX3BjY19tb2RfZXhpdCk7CgpUaGlzIGFsbCBsb29rcyBmYWlybHkgYm9pbGVycGxhdGUsIGNh biB5b3UgdXNlIG1vZHVsZV9hY3BpX2RyaXZlcigpPwoocGx1cyBhIHN0YXRpYyBpbml0aWFsaXNl ciBmb3IgbWN0cF9wY2NfbmRldnMpCgpPdmVyYWxsLCB0aGFua3MgZm9yIHRoZSBjb250cmlidXRp b25zLCB3aXRoIGEgZmV3IGNoYW5nZXMgSSB0aGluayB0aGUKdHJhbnNwb3J0IHNob3VsZCBiZSBn b29kIHRvIGdvLgoKQ2hlZXJzLAoKCkplcmVteQo=