Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp966471rdg; Fri, 13 Oct 2023 06:38:30 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH+6UadN+RIvQixAL+a5un96mV3SSWGYZV8uI7576X7FU8Rewv4Vv9bJiCC4iyfWF5KMfOM X-Received: by 2002:a17:902:d054:b0:1c9:e68a:1b58 with SMTP id l20-20020a170902d05400b001c9e68a1b58mr3176080pll.54.1697204310367; Fri, 13 Oct 2023 06:38:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697204310; cv=none; d=google.com; s=arc-20160816; b=QPpLk9UsGqU5eXEMz6Bs9yRuw0v2R22iXxhpPMcyYEkMmaTMyao2Em6Ns076YLqZvp iQyt3YAfqztE1qhy/6WbfsRsF3WZHoR7FsXp+XfxsPua7ZvzaNciPCb6w5m1TpZ3gbx7 4NJ+shmgBoGHC5GSJ1HAxaRswWOJdSclLIZBlojN4/6i4rxYlX/4U+4K6izSA3GuiG3h qEuiYMKiZODyXuy8M3dkX2zqkti7Pr2sKmZccqAREEOQMYX/I/BHFUAtlVQ+zLiJ9Ezm Zbfn52xipE0DnJox/Ye4Elgngjn0cIMPh0SMajW89pZy4T9h+L6bCNbUspd91Ccwi4tv dh1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent :content-transfer-encoding:organization:references:in-reply-to:date :cc:to:from:subject:message-id:dkim-signature; bh=ibMc2TxxsP7PCphT+oX+z+0vFdC/pPu+Ri+Z9hXuBWs=; fh=htvIroZrbKeU2x4AOko0NW3x9xa19Yggb7QfVOG/ARs=; b=S7imFQrerY1gUVH8VfhH/CxnG877N6d3qkpRXpx+nZmkLYoDTbYANDcjdx5AYNFVc0 UFz7pUwaiPnLpURGFguK1aj33/i5+6W1yqbB+zZOH1Gm0MfINBl+Abgktg/uGa2TYfuD QWGM91/wv3FDgsJkzWYF2/ebGb9Is+fmNLkMHv8Wqjvpq6ipdNpKnCwZkvVU8UDlXJFM +azpoVuljnWz9Dup/qc976BZ/r2XpOchwf/NPPZVaZJmnSXg5f1qZk/L0LNTPCP4zmcL dSGX1hqLY6jbAAX6pAGKcqT/x/S6fK59xVl7HXrbKpM3kb4bYOOhDJKYid/MFZG3kl2X LP0A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=b6OllthZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from snail.vger.email (snail.vger.email. [23.128.96.37]) by mx.google.com with ESMTPS id w10-20020a170902e88a00b001c33d339754si4853792plg.136.2023.10.13.06.38.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Oct 2023 06:38:30 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) client-ip=23.128.96.37; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=b6OllthZ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.37 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by snail.vger.email (Postfix) with ESMTP id 6DCC482B4843; Fri, 13 Oct 2023 06:38:29 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at snail.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231984AbjJMNiM (ORCPT + 99 others); Fri, 13 Oct 2023 09:38:12 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38876 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229830AbjJMNiI (ORCPT ); Fri, 13 Oct 2023 09:38:08 -0400 Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1E7BFBF for ; Fri, 13 Oct 2023 06:38:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697204282; x=1728740282; h=message-id:subject:from:to:cc:date:in-reply-to: references:content-transfer-encoding:mime-version; bh=ibMc2TxxsP7PCphT+oX+z+0vFdC/pPu+Ri+Z9hXuBWs=; b=b6OllthZPssfmAp0AC7yTZU1VcPEotRvJd4VcVUkndyPX57ZrGpQeND0 HLjfljcxcVxfgEncNgSFk5vcGG39/3fWtKgKMxehOkqPsK/fjciVXKZzU tZxMkGEvrFbFth5c/6ByW8Xh/MmM7dO5CCmW9NsXb58PukWZTwQ//Jdt/ yu3Y0jyOBOsk2HBew/BslPUWVvuaxAkiPauz3g3d1LIP/BIeZr/g5niJq 06512yTbd2oQ5N7/k36ZlbF+9lqZ1Eblx3ECb3BPUXPP54GitUK/44HxG zvcdQxZAGFy4L52VLzqKwmXcGsd6H3P9SA0BeJy8HTKmziJHEfS8m1nGd Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10862"; a="370245969" X-IronPort-AV: E=Sophos;i="6.03,222,1694761200"; d="scan'208";a="370245969" Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Oct 2023 06:38:00 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10862"; a="928435306" X-IronPort-AV: E=Sophos;i="6.03,222,1694761200"; d="scan'208";a="928435306" Received: from dstacken-mobl1.ger.corp.intel.com (HELO [10.249.254.172]) ([10.249.254.172]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Oct 2023 06:37:57 -0700 Message-ID: Subject: Re: [PATCH drm-misc-next v6 4/6] drm/gpuvm: track/lock/validate external/evicted objects From: Thomas =?ISO-8859-1?Q?Hellstr=F6m?= To: Danilo Krummrich , airlied@gmail.com, daniel@ffwll.ch, matthew.brost@intel.com, sarah.walker@imgtec.com, donald.robson@imgtec.com, boris.brezillon@collabora.com, christian.koenig@amd.com, faith@gfxstrand.net Cc: dri-devel@lists.freedesktop.org, nouveau@lists.freedesktop.org, linux-kernel@vger.kernel.org Date: Fri, 13 Oct 2023 15:37:54 +0200 In-Reply-To: <20231008233212.13815-5-dakr@redhat.com> References: <20231008233212.13815-1-dakr@redhat.com> <20231008233212.13815-5-dakr@redhat.com> Organization: Intel Sweden AB, Registration Number: 556189-6027 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 User-Agent: Evolution 3.46.4 (3.46.4-1.fc37) MIME-Version: 1.0 X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (snail.vger.email [0.0.0.0]); Fri, 13 Oct 2023 06:38:29 -0700 (PDT) SGksCgpPbiBNb24sIDIwMjMtMTAtMDkgYXQgMDE6MzIgKzAyMDAsIERhbmlsbyBLcnVtbXJpY2gg d3JvdGU6Cj4gQ3VycmVudGx5IHRoZSBEUk0gR1BVVk0gb2ZmZXJzIGNvbW1vbiBpbmZyYXN0cnVj dHVyZSB0byB0cmFjayBHUFUgVkEKPiBhbGxvY2F0aW9ucyBhbmQgbWFwcGluZ3MsIGdlbmVyaWNh bGx5IGNvbm5lY3QgR1BVIFZBIG1hcHBpbmdzIHRvCj4gdGhlaXIKPiBiYWNraW5nIGJ1ZmZlcnMg YW5kIHBlcmZvcm0gbW9yZSBjb21wbGV4IG1hcHBpbmcgb3BlcmF0aW9ucyBvbiB0aGUKPiBHUFUg VkEKPiBzcGFjZS4KPiAKPiBIb3dldmVyLCB0aGVyZSBhcmUgbW9yZSBkZXNpZ24gcGF0dGVybnMg Y29tbW9ubHkgdXNlZCBieSBkcml2ZXJzLAo+IHdoaWNoCj4gY2FuIHBvdGVudGlhbGx5IGJlIGdl bmVyYWxpemVkIGluIG9yZGVyIHRvIG1ha2UgdGhlIERSTSBHUFVWTQo+IHJlcHJlc2VudAo+IGEg YmFzaXMgZm9yIEdQVS1WTSBpbXBsZW1lbnRhdGlvbnMuIEluIHRoaXMgY29udGV4dCwgdGhpcyBw YXRjaCBhaW1zCj4gYXQgZ2VuZXJhbGl6aW5nIHRoZSBmb2xsb3dpbmcgZWxlbWVudHMuCj4gCj4g MSkgUHJvdmlkZSBhIGNvbW1vbiBkbWEtcmVzdiBmb3IgR0VNIG9iamVjdHMgbm90IGJlaW5nIHVz ZWQgb3V0c2lkZQo+IG9mCj4gwqDCoCB0aGlzIEdQVS1WTS4KPiAKPiAyKSBQcm92aWRlIHRyYWNr aW5nIG9mIGV4dGVybmFsIEdFTSBvYmplY3RzIChHRU0gb2JqZWN0cyB3aGljaCBhcmUKPiDCoMKg IHNoYXJlZCB3aXRoIG90aGVyIEdQVS1WTXMpLgo+IAo+IDMpIFByb3ZpZGUgZnVuY3Rpb25zIHRv IGVmZmljaWVudGx5IGxvY2sgYWxsIEdFTSBvYmplY3RzIGRtYS1yZXN2IHRoZQo+IMKgwqAgR1BV LVZNIGNvbnRhaW5zIG1hcHBpbmdzIG9mLgo+IAo+IDQpIFByb3ZpZGUgdHJhY2tpbmcgb2YgZXZp Y3RlZCBHRU0gb2JqZWN0cyB0aGUgR1BVLVZNIGNvbnRhaW5zCj4gbWFwcGluZ3MKPiDCoMKgIG9m LCBzdWNoIHRoYXQgdmFsaWRhdGlvbiBvZiBldmljdGVkIEdFTSBvYmplY3RzIGlzIGFjY2VsZXJh dGVkLgo+IAo+IDUpIFByb3ZpZGUgc29tZSBjb252aW5pZW5jZSBmdW5jdGlvbnMgZm9yIGNvbW1v biBwYXR0ZXJucy4KPiAKPiBCaWcgdGhhbmtzIHRvIEJvcmlzIEJyZXppbGxvbiBmb3IgaGlzIGhl bHAgdG8gZmlndXJlIG91dCBsb2NraW5nIGZvcgo+IGRyaXZlcnMgdXBkYXRpbmcgdGhlIEdQVSBW QSBzcGFjZSB3aXRoaW4gdGhlIGZlbmNlIHNpZ25hbGxpbmcgcGF0aC4KPiAKPiBTdWdnZXN0ZWQt Ynk6IE1hdHRoZXcgQnJvc3QgPG1hdHRoZXcuYnJvc3RAaW50ZWwuY29tPgo+IFNpZ25lZC1vZmYt Ynk6IERhbmlsbyBLcnVtbXJpY2ggPGRha3JAcmVkaGF0LmNvbT4KPiAtLS0KPiDCoGRyaXZlcnMv Z3B1L2RybS9kcm1fZ3B1dm0uYyB8IDY0Ngo+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKwo+IMKgaW5jbHVkZS9kcm0vZHJtX2dwdXZtLmjCoMKgwqDCoCB8IDI0NiArKysrKysr KysrKysrKwo+IMKgMiBmaWxlcyBjaGFuZ2VkLCA4OTIgaW5zZXJ0aW9ucygrKQo+IAoKVGhlcmUn cyBhIGNoZWNrcGF0Y2gucGwgd2FybmluZyBhbmQgYSBudW1iZXIgb2YgcmFuZG9tIG1hY3JvIENI RUNLcyBpZgp1c2luZyAtLXN0cmljdC4KCkFsc28gdGhlIG92ZXJhbGwgcy9SZXR1cm5zOi9SZXR1 cm4vIChhbmQgcG9zc2libHkgZnVuY3Rpb24gbGluZSBicmVhaykuCgoKPiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2RybV9ncHV2bS5jCj4gYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dwdXZt LmMKPiBpbmRleCAyODI4MjI4M2RkYWYuLjY5NzdiZDMwZWNhNSAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vZHJtX2dwdXZtLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2dwdXZt LmMKPiBAQCAtODIsNiArODIsMjEgQEAKPiDCoCAqICZkcm1fZ2VtX29iamVjdCBsaXN0IG9mICZk cm1fZ3B1dm1fYm9zIGZvciBhbiBleGlzdGluZyBpbnN0YW5jZQo+IG9mIHRoaXMKPiDCoCAqIHBh cnRpY3VsYXIgY29tYmluYXRpb24uIElmIG5vdCBleGlzdGVudCBhIG5ldyBpbnN0YW5jZSBpcyBj cmVhdGVkCj4gYW5kIGxpbmtlZAo+IMKgICogdG8gdGhlICZkcm1fZ2VtX29iamVjdC4KPiArICoK PiArICogJmRybV9ncHV2bV9ibyBzdHJ1Y3R1cmVzLCBzaW5jZSB1bmlxdWUgZm9yIGEgZ2l2ZW4g JmRybV9ncHV2bSwKPiBhcmUgYWxzbyB1c2VkCj4gKyAqIGFzIGVudHJ5IGZvciB0aGUgJmRybV9n cHV2bSdzIGxpc3RzIG9mIGV4dGVybmFsIGFuZCBldmljdGVkCj4gb2JqZWN0cy4gVGhvc2UKPiAr ICogbGlzdCBhcmUgbWFpbnRhaW5lZCBpbiBvcmRlciB0byBhY2NlbGVyYXRlIGxvY2tpbmcgb2Yg ZG1hLXJlc3YKPiBsb2NrcyBhbmQKcy9saXN0L2xpc3RzLwo+ICsgKiB2YWxpZGF0aW9uIG9mIGV2 aWN0ZWQgb2JqZWN0cyBib3VuZCBpbiBhICZkcm1fZ3B1dm0uIEZvcgo+IGluc3RhbmNlLCBhbGwK PiArICogJmRybV9nZW1fb2JqZWN0J3MgJmRtYV9yZXN2IG9mIGEgZ2l2ZW4gJmRybV9ncHV2bSBj YW4gYmUgbG9ja2VkCj4gYnkgY2FsbGluZwo+ICsgKiBkcm1fZ3B1dm1fZXhlY19sb2NrKCkuIE9u Y2UgbG9ja2VkIGRyaXZlcnMgY2FuIGNhbGwKPiBkcm1fZ3B1dm1fdmFsaWRhdGUoKSBpbgo+ICsg KiBvcmRlciB0byB2YWxpZGF0ZSBhbGwgZXZpY3RlZCAmZHJtX2dlbV9vYmplY3RzLiBJdCBpcyBh bHNvCj4gcG9zc2libGUgdG8gbG9jawo+ICsgKiBhZGRpdGlvbmFsICZkcm1fZ2VtX29iamVjdHMg YnkgcHJvdmlkaW5nIHRoZSBjb3JyZXNwb25kaW5nCj4gcGFyYW1ldGVycyB0bwo+ICsgKiBkcm1f Z3B1dm1fZXhlY19sb2NrKCkgYXMgd2VsbCBhcyBvcGVuIGNvZGUgdGhlICZkcm1fZXhlYyBsb29w Cj4gd2hpbGUgbWFraW5nCj4gKyAqIHVzZSBvZiBoZWxwZXIgZnVuY3Rpb25zIHN1Y2ggYXMgZHJt X2dwdXZtX3ByZXBhcmVfcmFuZ2UoKSBvcgo+ICsgKiBkcm1fZ3B1dm1fcHJlcGFyZV9vYmplY3Rz KCkuCj4gKyAqCj4gKyAqIEV2ZXJ5IGJvdW5kICZkcm1fZ2VtX29iamVjdCBpcyB0cmVhdGVkIGFz IGV4dGVybmFsIG9iamVjdCB3aGVuCj4gaXRzICZkbWFfcmVzdgo+ICsgKiBzdHJ1Y3R1cmUgaXMg ZGlmZmVyZW50IHRoYW4gdGhlICZkcm1fZ3B1dm0ncyBjb21tb24gJmRtYV9yZXN2Cj4gc3RydWN0 dXJlLgo+IMKgICovCj4gwqAKPiDCoC8qKgo+IEBAIC00MjksNiArNDQ0LDIwIEBACj4gwqAgKiBT dWJzZXF1ZW50IGNhbGxzIHRvIGRybV9ncHV2bV9ib19vYnRhaW4oKSBmb3IgdGhlIHNhbWUgJmRy bV9ncHV2bQo+IGFuZAo+IMKgICogJmRybV9nZW1fb2JqZWN0IG11c3QgYmUgYWJsZSB0byBvYnNl cnZlIHByZXZpb3VzIGNyZWF0aW9ucyBhbmQKPiBkZXN0cnVjdGlvbnMKPiDCoCAqIG9mICZkcm1f Z3B1dm1fYm9zIGluIG9yZGVyIHRvIGtlZXAgaW5zdGFuY2VzIHVuaXF1ZS4KPiArICoKPiArICog VGhlICZkcm1fZ3B1dm0ncyBsaXN0cyBmb3Iga2VlcGluZyB0cmFjayBvZiBleHRlcm5hbCBhbmQg ZXZpY3RlZAo+IG9iamVjdHMgYXJlCj4gKyAqIHByb3RlY3RlZCBhZ2FpbnN0IGNvbmN1cnJlbnQg aW5zZXJ0aW9uIC8gcmVtb3ZhbCBhbmQgaXRlcmF0aW9uCj4gaW50ZXJuYWxseS4KCj4gKyAqCj4g KyAqIEhvd2V2ZXIsIGRyaXZlcnMgc3RpbGwgbmVlZCBlbnN1cmUgdG8gcHJvdGVjdCBjb25jdXJy ZW50IGNhbGxzIHRvCj4gZnVuY3Rpb25zCj4gKyAqIGl0ZXJhdGluZyB0aG9zZSBsaXN0cywgbmFt ZWx5IGRybV9ncHV2bV9wcmVwYXJlX29iamVjdHMoKSBhbmQKPiArICogZHJtX2dwdXZtX3ZhbGlk YXRlKCkuCgoKPiArICoKPiArICogQWx0ZXJuYXRpdmVseSwgZHJpdmVycyBjYW4gc2V0IHRoZSAm RFJNX0dQVVZNX1JFU1ZfUFJPVEVDVEVEIGZsYWcKPiB0byBpbmRpY2F0ZQo+ICsgKiB0aGF0IHRo ZSBjb3JyZXNwb25kaW5nICZkbWFfcmVzdiBsb2NrcyBhcmUgaGVsZCBpbiBvcmRlciB0bwo+IHBy b3RlY3QgdGhlCj4gKyAqIGxpc3RzLiBJZiAmRFJNX0dQVVZNX1JFU1ZfUFJPVEVDVEVEIGlzIHNl dCwgaW50ZXJuYWwgbG9ja2luZyBpcwo+IGRpc2FibGVkIGFuZAo+ICsgKiB0aGUgY29ycmVzcG9u ZGluZyBsb2NrZGVwIGNoZWNrcyBhcmUgZW5hYmxlZC4gVGhpcyBpcyBhbgo+IG9wdGltaXphdGlv biBmb3IKPiArICogZHJpdmVycyB3aGljaCBhcmUgY2FwYWJsZSBvZiB0YWtpbmcgdGhlIGNvcnJl c3BvbmRpbmcgJmRtYV9yZXN2Cj4gbG9ja3MgYW5kCj4gKyAqIGhlbmNlIGRvIG5vdCByZXF1aXJl IGludGVybmFsIGxvY2tpbmcuCj4gwqAgKi8KPiDCoAo+IMKgLyoqCj4gQEAgLTY0MSw2ICs2NzAs MTk1IEBACj4gwqAgKsKgwqDCoMKgwqB9Cj4gwqAgKi8KPiDCoAo+ICsvKioKPiArICogZ2V0X25l eHRfdm1fYm9fZnJvbV9saXN0KCkgLSBnZXQgdGhlIG5leHQgdm1fYm8gZWxlbWVudAoKbWFjcm9z IHVzZSBhIGRpZmZlcmVudCBrZXJuZWxkb2Mgc3ludGF4OgpodHRwczovL3JldHVybjQyLmdpdGh1 Yi5pby9saW51eGRvYy9saW51eGRvYy1ob3d0by9rZXJuZWwtZG9jLXN5bnRheC5odG1sI21hY3Jv Cgo+ICsgKiBAX19ncHV2bTogVGhlIEdQVSBWTQo+ICsgKiBAX19saXN0X25hbWU6IFRoZSBuYW1l IG9mIHRoZSBsaXN0IHdlJ3JlIGl0ZXJhdGluZyBvbgo+ICsgKiBAX19sb2NhbF9saXN0OiBBIHBv aW50ZXIgdG8gdGhlIGxvY2FsIGxpc3QgdXNlZCB0byBzdG9yZSBhbHJlYWR5Cj4gaXRlcmF0ZWQg aXRlbXMKPiArICogQF9fcHJldl92bV9ibzogVGhlIHByZXZpb3VzIGVsZW1lbnQgd2UgZ290IGZy b20KPiBkcm1fZ3B1dm1fZ2V0X25leHRfY2FjaGVkX3ZtX2JvKCkKPiArICoKPiArICogVGhpcyBo ZWxwZXIgaXMgaGVyZSB0byBwcm92aWRlIGxvY2tsZXNzIGxpc3QgaXRlcmF0aW9uLiBMb2NrbGVz cwo+IGFzIGluLCB0aGUKPiArICogaXRlcmF0b3IgcmVsZWFzZXMgdGhlIGxvY2sgaW1tZWRpYXRl bHkgYWZ0ZXIgcGlja2luZyB0aGUgZmlyc3QKPiBlbGVtZW50IGZyb20KPiArICogdGhlIGxpc3Qs IHNvIGxpc3QgaW5zZXJ0aW9uIGRlbGV0aW9uIGNhbiBoYXBwZW4gY29uY3VycmVudGx5Lgo+ICsg Kgo+ICsgKiBFbGVtZW50cyBwb3BwZWQgZnJvbSB0aGUgb3JpZ2luYWwgbGlzdCBhcmUga2VwdCBp biBhIGxvY2FsIGxpc3QsCj4gc28gcmVtb3ZhbAo+ICsgKiBhbmQgaXNfZW1wdHkgY2hlY2tzIGNh biBzdGlsbCBoYXBwZW4gd2hpbGUgd2UncmUgaXRlcmF0aW5nIHRoZQo+IGxpc3QuCj4gKyAqLwo+ ICsjZGVmaW5lIGdldF9uZXh0X3ZtX2JvX2Zyb21fbGlzdChfX2dwdXZtLCBfX2xpc3RfbmFtZSwg X19sb2NhbF9saXN0LAo+IF9fcHJldl92bV9ibynCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDC oCh7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dwdXZtX2JvICpfX3ZtX2JvID0K PiBOVUxMO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBkcm1fZ3B1dm1fYm9fcHV0KF9fcHJldl92bV9ibyk7wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBzcGluX2xvY2soJihfX2dwdXZtKS0KPiA+X19saXN0X25hbWUubG9jayk7wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCEoX19ncHV2bSktCj4gPl9fbGlzdF9u YW1lLmxvY2FsX2xpc3QpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgKF9fZ3B1dm0pLT5fX2xpc3RfbmFtZS5sb2NhbF9saXN0ID0KPiBf X2xvY2FsX2xpc3Q7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBlbHNlwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFdBUk5fT04oKF9fZ3B1 dm0pLT5fX2xpc3RfbmFtZS5sb2NhbF9saXN0ICE9Cj4gX19sb2NhbF9saXN0KTvCoMKgwqDCoMKg XAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHdoaWxlICghbGlz dF9lbXB0eSgmKF9fZ3B1dm0pLT5fX2xpc3RfbmFtZS5saXN0KSkKPiB7wqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgX192bV9ibyA9IGxpc3RfZmlyc3RfZW50cnkoJihfX2dwdXZt KS0KPiA+X19saXN0X25hbWUubGlzdCzCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QKPiBkcm1fZ3B1dm1fYm8swqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAKPiBsaXN0LmVudHJ5Ll9fbGlzdF9uYW1lKTvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoGlmIChrcmVmX2dldF91bmxlc3NfemVybygmX192bV9iby0+a3JlZikpCj4ge8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0X21vdmVf dGFpbCgmKF9fdm1fYm8pLQo+ID5saXN0LmVudHJ5Ll9fbGlzdF9uYW1lLMKgwqDCoMKgwqDCoFwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gX19sb2NhbF9saXN0KTvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgYnJlYWs7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0gZWxzZQo+ IHvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg XAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGxpc3RfZGVsX2luaXQoJihfX3ZtX2JvKS0KPiA+bGlzdC5lbnRyeS5fX2xpc3Rf bmFtZSk7wqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9fdm1fYm8gPQo+IE5VTEw7wqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoH3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgCj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oH3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBzcGluX3VubG9jaygmKF9fZ3B1dm0pLQo+ID5fX2xpc3RfbmFtZS5sb2NrKTvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgX192bV9ibzvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqB9KQo+ICsKPiArLyoqCj4gKyAqIGZv cl9lYWNoX3ZtX2JvX2luX2xpc3QoKSAtIGludGVybmFsIHZtX2JvIGxpc3QgaXRlcmF0b3IKClNh bWUgaGVyZS4gQWxzbyBtaXNzaW5nIHRoZSBhcmd1bWVudCBsaXN0LCAiaXRlcmF0b3IiIGlzIHVz ZWQgZm9yIHRoZQpmdW5jdGlvbiBtYWNybyB3aGVuIGl0J3MgdHlwaWNhbGx5IGFuIG9iamVjdC4g UGVyaGFwcyAiaXRlcmF0ZSBvdmVyCmludGVybmFsIHZtX2JvIGxpc3RzIj8KCj4gKyAqCj4gKyAq IFRoaXMgaGVscGVyIGlzIGhlcmUgdG8gcHJvdmlkZSBsb2NrbGVzcyBsaXN0IGl0ZXJhdGlvbi4g TG9ja2xlc3MKPiBhcyBpbiwgdGhlCj4gKyAqIGl0ZXJhdG9yIHJlbGVhc2VzIHRoZSBsb2NrIGlt bWVkaWF0ZWx5IGFmdGVyIHBpY2tpbmcgdGhlIGZpcnN0Cj4gZWxlbWVudCBmcm9tIHRoZQo+ICsg KiBsaXN0LCBoZW5jZSBsaXN0IGluc2VydGlvbiBhbmQgZGVsZXRpb24gY2FuIGhhcHBlbiBjb25j dXJyZW50bHkuCj4gKyAqCj4gKyAqIEl0IGlzIG5vdCBhbGxvd2VkIHRvIHJlLWFzc2lnbiB0aGUg dm1fYm8gcG9pbnRlciBmcm9tIGluc2lkZSB0aGlzCj4gbG9vcC4KPiArICoKPiArICogVHlwaWNh bCB1c2U6Cj4gKyAqCj4gKyAqwqDCoMKgwqDCoHN0cnVjdCBkcm1fZ3B1dm1fYm8gKnZtX2JvOwo+ ICsgKsKgwqDCoMKgwqBMSVNUX0hFQUQobXlfbG9jYWxfbGlzdCk7Cj4gKyAqCj4gKyAqwqDCoMKg wqDCoHJldCA9IDA7Cj4gKyAqwqDCoMKgwqDCoGZvcl9lYWNoX3ZtX2JvX2luX2xpc3QoZ3B1dm0s IDxsaXN0X25hbWU+LCAmbXlfbG9jYWxfbGlzdCwKPiB2bV9ibykgewo+ICsgKsKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgcmV0ID0gZG9fc29tZXRoaW5nX3dpdGhfdm1fYm8oLi4uLCB2bV9ibyk7 Cj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0KQo+ICsgKsKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ICsgKsKgwqDCoMKgwqB9Cj4g KyAqwqDCoMKgwqDCoGRybV9ncHV2bV9ib19wdXQodm1fYm8pOwo+ICsgKsKgwqDCoMKgwqByZXN0 b3JlX3ZtX2JvX2xpc3QoZ3B1dm0sIDxsaXN0X25hbWU+LCAmbXlfbG9jYWxfbGlzdCk7Cj4gKyAq Cj4gKyAqCj4gKyAqIE9ubHkgdXNlZCBmb3IgaW50ZXJuYWwgbGlzdCBpdGVyYXRpb25zLCBub3Qg bWVhbnQgdG8gYmUgZXhwb3NlZAo+IHRvIHRoZSBvdXRzaWRlCj4gKyAqIHdvcmxkLgo+ICsgKi8K PiArI2RlZmluZSBmb3JfZWFjaF92bV9ib19pbl9saXN0KF9fZ3B1dm0sIF9fbGlzdF9uYW1lLCBf X2xvY2FsX2xpc3QsCj4gX192bV9ibynCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqBmb3IgKF9f dm1fYm8gPSBnZXRfbmV4dF92bV9ib19mcm9tX2xpc3QoX19ncHV2bSwKPiBfX2xpc3RfbmFtZSzC oMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgX19sb2NhbF9saXN0LAo+IE5VTEwpO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+IF9fdm1fYm87wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBfX3ZtX2JvID0gZ2V0X25leHRfdm1fYm9fZnJvbV9saXN0KF9fZ3B1dm0sCj4gX19s aXN0X25hbWUswqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoF9fbG9jYWxfbGlzdCwKPiBfX3ZtX2JvKSkKPiArCj4gK3N0YXRpYyB2 b2lkCj4gK19fcmVzdG9yZV92bV9ib19saXN0KHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtLCBzcGlu bG9ja190ICpsb2NrLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz dHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBzdHJ1Y3QgbGlzdF9oZWFkCj4gKipsb2NhbF9saXN0KQo+ ICt7Cj4gK8KgwqDCoMKgwqDCoMKgLyogTWVyZ2UgYmFjayB0aGUgdHdvIGxpc3RzLCBtb3Zpbmcg bG9jYWwgbGlzdCBlbGVtZW50cyB0bwo+IHRoZQo+ICvCoMKgwqDCoMKgwqDCoCAqIGhlYWQgdG8g cHJlc2VydmUgcHJldmlvdXMgb3JkZXJpbmcsIGluIGNhc2UgaXQgbWF0dGVycy4KPiArwqDCoMKg wqDCoMKgwqAgKi8KPiArwqDCoMKgwqDCoMKgwqBzcGluX2xvY2sobG9jayk7Cj4gK8KgwqDCoMKg wqDCoMKgaWYgKCpsb2NhbF9saXN0KSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGxpc3Rfc3BsaWNlKCpsb2NhbF9saXN0LCBsaXN0KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgKmxvY2FsX2xpc3QgPSBOVUxMOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKg wqDCoMKgwqBzcGluX3VubG9jayhsb2NrKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIHJlc3RvcmVf dm1fYm9fbGlzdCgpIC0gbW92ZSB2bV9ibyBlbGVtZW50cyBiYWNrIHRvIHRoZWlyIG9yaWdpbmFs Cj4gbGlzdAoKbWFjcm8KCj4gKyAqIEBfX2dwdXZtOiBUaGUgR1BVIFZNCj4gKyAqIEBfX2xpc3Rf bmFtZTogVGhlIG5hbWUgb2YgdGhlIGxpc3Qgd2UncmUgaXRlcmF0aW5nIG9uCj4gKyAqCj4gKyAq IFdoZW4gd2UncmUgZG9uZSBpdGVyYXRpbmcgYSB2bV9ibyBsaXN0LCB3ZSBzaG91bGQgY2FsbAo+ IHJlc3RvcmVfdm1fYm9fbGlzdCgpCj4gKyAqIHRvIHJlc3RvcmUgdGhlIG9yaWdpbmFsIHN0YXRl IGFuZCBsZXQgbmV3IGl0ZXJhdGlvbnMgdGFrZSBwbGFjZS4KPiArICovCj4gKyNkZWZpbmUgcmVz dG9yZV92bV9ib19saXN0KF9fZ3B1dm0sCj4gX19saXN0X25hbWUpwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqBfX3Jlc3RvcmVf dm1fYm9fbGlzdCgoX19ncHV2bSksICYoX19ncHV2bSktCj4gPl9fbGlzdF9uYW1lLmxvY2sswqDC oMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgJihfX2dwdXZtKS0KPiA+X19saXN0X25hbWUubGlzdCzCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgJihfX2dwdXZtKS0+X19saXN0X25hbWUubG9jYWxfbGlzdCkKPiArCj4gK3N0 YXRpYyB2b2lkCj4gK2NvbmRfc3Bpbl9sb2NrKHNwaW5sb2NrX3QgKmxvY2ssIGJvb2wgY29uZCkK PiArewo+ICvCoMKgwqDCoMKgwqDCoGlmIChjb25kKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzcGluX2xvY2sobG9jayk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkCj4gK2NvbmRf c3Bpbl91bmxvY2soc3BpbmxvY2tfdCAqbG9jaywgYm9vbCBjb25kKQo+ICt7Cj4gK8KgwqDCoMKg wqDCoMKgaWYgKGNvbmQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNwaW5fdW5s b2NrKGxvY2spOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZAo+ICtfX2RybV9ncHV2bV9ib19saXN0 X2FkZChzdHJ1Y3QgZHJtX2dwdXZtICpncHV2bSwgc3BpbmxvY2tfdCAqbG9jaywKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBsaXN0X2hlYWQg KmVudHJ5LCBzdHJ1Y3QgbGlzdF9oZWFkCj4gKmxpc3QpCj4gK3sKPiArwqDCoMKgwqDCoMKgwqBj b25kX3NwaW5fbG9jayhsb2NrLCAhIWxvY2spOwo+ICvCoMKgwqDCoMKgwqDCoGlmIChsaXN0X2Vt cHR5KGVudHJ5KSkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlzdF9hZGRfdGFp bChlbnRyeSwgbGlzdCk7Cj4gK8KgwqDCoMKgwqDCoMKgY29uZF9zcGluX3VubG9jayhsb2NrLCAh IWxvY2spOwo+ICt9Cj4gKwo+ICsvKioKPiArICogZHJtX2dwdXZtX2JvX2xpc3RfYWRkKCkgLSBp bnNlcnQgYSB2bV9ibyBpbnRvIHRoZSBnaXZlbiBsaXN0Cm1hY3JvCgo+ICsgKiBAX192bV9ibzog dGhlICZkcm1fZ3B1dm1fYm8KPiArICogQF9fbGlzdF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgbGlz dCB0byBpbnNlcnQgaW50bwo+ICsgKiBAX19sb2NrOiB3aGV0aGVyIHRvIGxvY2sgd2l0aCB0aGUg aW50ZXJuYWwgc3BpbmxvY2sKPiArICoKPiArICogSW5zZXJ0cyB0aGUgZ2l2ZW4gQF9fdm1fYm8g aW50byB0aGUgbGlzdCBzcGVjaWZpZWQgYnkKPiBAX19saXN0X25hbWUuCj4gKyAqLwo+ICsjZGVm aW5lIGRybV9ncHV2bV9ib19saXN0X2FkZChfX3ZtX2JvLCBfX2xpc3RfbmFtZSwKPiBfX2xvY2sp wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKg wqBfX2RybV9ncHV2bV9ib19saXN0X2FkZCgoX192bV9ibyktCj4gPnZtLMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoF9fbG9jayA/ICYoX192bV9ibyktPnZtLQo+ID5fX2xpc3RfbmFtZS5sb2NrIDrCoMKg wqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiBOVUxMLMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCYoX192bV9ibyktCj4gPmxpc3QuZW50cnkuX19saXN0X25hbWUswqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgJihfX3ZtX2JvKS0+dm0tPl9fbGlzdF9uYW1lLmxpc3QpCj4g Kwo+ICtzdGF0aWMgdm9pZAo+ICtfX2RybV9ncHV2bV9ib19saXN0X2RlbChzdHJ1Y3QgZHJtX2dw dXZtICpncHV2bSwgc3BpbmxvY2tfdCAqbG9jaywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5LCBib29sIGluaXQp Cj4gK3sKPiArwqDCoMKgwqDCoMKgwqBjb25kX3NwaW5fbG9jayhsb2NrLCAhIWxvY2spOwo+ICvC oMKgwqDCoMKgwqDCoGlmIChpbml0KSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICghbGlzdF9lbXB0eShlbnRyeSkpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBsaXN0X2RlbF9pbml0KGVudHJ5KTsKPiArwqDCoMKgwqDCoMKgwqB9 IGVsc2Ugewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaXN0X2RlbChlbnRyeSk7 Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDCoMKgwqDCoGNvbmRfc3Bpbl91bmxvY2sobG9j aywgISFsb2NrKTsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGRybV9ncHV2bV9ib19saXN0X2RlbF9p bml0KCkgLSByZW1vdmUgYSB2bV9ibyBmcm9tIHRoZSBnaXZlbiBsaXN0Cm1hY3JvCj4gKyAqIEBf X3ZtX2JvOiB0aGUgJmRybV9ncHV2bV9ibwo+ICsgKiBAX19saXN0X25hbWU6IHRoZSBuYW1lIG9m IHRoZSBsaXN0IHRvIGluc2VydCBpbnRvCj4gKyAqIEBfX2xvY2s6IHdoZXRoZXIgdG8gbG9jayB3 aXRoIHRoZSBpbnRlcm5hbCBzcGlubG9jawo+ICsgKgo+ICsgKiBSZW1vdmVzIHRoZSBnaXZlbiBA X192bV9ibyBmcm9tIHRoZSBsaXN0IHNwZWNpZmllZCBieQo+IEBfX2xpc3RfbmFtZS4KPiArICov Cj4gKyNkZWZpbmUgZHJtX2dwdXZtX2JvX2xpc3RfZGVsX2luaXQoX192bV9ibywgX19saXN0X25h bWUsCj4gX19sb2NrKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDC oMKgwqBfX2RybV9ncHV2bV9ib19saXN0X2RlbCgoX192bV9ibyktCj4gPnZtLMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg XAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoF9fbG9jayA/ICYoX192bV9ibyktPnZtLQo+ID5fX2xpc3RfbmFtZS5sb2NrIDrC oMKgwqDCoMKgXAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAKPiBOVUxMLMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCYoX192bV9ibyktCj4gPmxpc3QuZW50cnkuX19saXN0X25hbWUswqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdHJ1ZSkKPiArCj4gKy8qKgo+ICsgKiBkcm1fZ3B1dm1f Ym9fbGlzdF9kZWwoKSAtIHJlbW92ZSBhIHZtX2JvIGZyb20gdGhlIGdpdmVuIGxpc3QKLi4uCj4g KyAqIEBfX3ZtX2JvOiB0aGUgJmRybV9ncHV2bV9ibwo+ICsgKiBAX19saXN0X25hbWU6IHRoZSBu YW1lIG9mIHRoZSBsaXN0IHRvIGluc2VydCBpbnRvCj4gKyAqIEBfX2xvY2s6IHdoZXRoZXIgdG8g bG9jayB3aXRoIHRoZSBpbnRlcm5hbCBzcGlubG9jawo+ICsgKgo+ICsgKiBSZW1vdmVzIHRoZSBn aXZlbiBAX192bV9ibyBmcm9tIHRoZSBsaXN0IHNwZWNpZmllZCBieQo+IEBfX2xpc3RfbmFtZS4K PiArICovCj4gKyNkZWZpbmUgZHJtX2dwdXZtX2JvX2xpc3RfZGVsKF9fdm1fYm8sIF9fbGlzdF9u YW1lLAo+IF9fbG9jaynCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgXAo+ ICvCoMKgwqDCoMKgwqDCoF9fZHJtX2dwdXZtX2JvX2xpc3RfZGVsKChfX3ZtX2JvKS0KPiA+dm0s wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgX19sb2NrID8gJihfX3ZtX2JvKS0+dm0tCj4gPl9fbGlzdF9u YW1lLmxvY2sgOsKgwqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoAo+IE5VTEwswqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBcCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgJihfX3ZtX2JvKS0KPiA+bGlzdC5lbnRyeS5fX2xpc3RfbmFtZSzC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoFwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmYWxzZSkKPiArCj4gwqAjZGVmaW5l IHRvX2RybV9ncHV2YShfX25vZGUpwqDCoMKgY29udGFpbmVyX29mKChfX25vZGUpLCBzdHJ1Y3QK PiBkcm1fZ3B1dmEsIHJiLm5vZGUpCj4gwqAKPiDCoCNkZWZpbmUgR1BVVkFfU1RBUlQobm9kZSkg KChub2RlKS0+dmEuYWRkcikKPiBAQCAtNzYwLDYgKzk3OCwxMiBAQCBkcm1fZ3B1dm1faW5pdChz dHJ1Y3QgZHJtX2dwdXZtICpncHV2bSwgc3RydWN0Cj4gZHJtX2dlbV9vYmplY3QgKnJfb2JqLAo+ IMKgwqDCoMKgwqDCoMKgwqBncHV2bS0+cmIudHJlZSA9IFJCX1JPT1RfQ0FDSEVEOwo+IMKgwqDC oMKgwqDCoMKgwqBJTklUX0xJU1RfSEVBRCgmZ3B1dm0tPnJiLmxpc3QpOwo+IMKgCj4gK8KgwqDC oMKgwqDCoMKgSU5JVF9MSVNUX0hFQUQoJmdwdXZtLT5leHRvYmoubGlzdCk7Cj4gK8KgwqDCoMKg wqDCoMKgc3Bpbl9sb2NrX2luaXQoJmdwdXZtLT5leHRvYmoubG9jayk7Cj4gKwo+ICvCoMKgwqDC oMKgwqDCoElOSVRfTElTVF9IRUFEKCZncHV2bS0+ZXZpY3QubGlzdCk7Cj4gK8KgwqDCoMKgwqDC oMKgc3Bpbl9sb2NrX2luaXQoJmdwdXZtLT5ldmljdC5sb2NrKTsKPiArCj4gwqDCoMKgwqDCoMKg wqDCoGRybV9ncHV2bV9jaGVja19vdmVyZmxvdyhzdGFydF9vZmZzZXQsIHJhbmdlKTsKPiDCoMKg wqDCoMKgwqDCoMKgZ3B1dm0tPm1tX3N0YXJ0ID0gc3RhcnRfb2Zmc2V0Owo+IMKgwqDCoMKgwqDC oMKgwqBncHV2bS0+bW1fcmFuZ2UgPSByYW5nZTsKPiBAQCAtODAyLDEwICsxMDI2LDM3MiBAQCBk cm1fZ3B1dm1fZGVzdHJveShzdHJ1Y3QgZHJtX2dwdXZtICpncHV2bSkKPiDCoMKgwqDCoMKgwqDC oMKgV0FSTighUkJfRU1QVFlfUk9PVCgmZ3B1dm0tPnJiLnRyZWUucmJfcm9vdCksCj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgICJHUFVWQSB0cmVlIGlzIG5vdCBlbXB0eSwgcG90ZW50aWFsbHkg bGVha2luZwo+IG1lbW9yeS5cbiIpOwo+IMKgCj4gK8KgwqDCoMKgwqDCoMKgV0FSTighbGlzdF9l bXB0eSgmZ3B1dm0tPmV4dG9iai5saXN0KSwgIkV4dG9iaiBsaXN0IHNob3VsZCBiZQo+IGVtcHR5 LlxuIik7Cj4gK8KgwqDCoMKgwqDCoMKgV0FSTighbGlzdF9lbXB0eSgmZ3B1dm0tPmV2aWN0Lmxp c3QpLCAiRXZpY3QgbGlzdCBzaG91bGQgYmUKPiBlbXB0eS5cbiIpOwo+ICsKCmRybV9XQVJOKCk/ Cgo+IMKgwqDCoMKgwqDCoMKgwqBkcm1fZ2VtX29iamVjdF9wdXQoZ3B1dm0tPnJfb2JqKTsKPiDC oH0KPiDCoEVYUE9SVF9TWU1CT0xfR1BMKGRybV9ncHV2bV9kZXN0cm95KTsKPiDCoAo+ICtzdGF0 aWMgaW50Cj4gK19fZHJtX2dwdXZtX3ByZXBhcmVfb2JqZWN0cyhzdHJ1Y3QgZHJtX2dwdXZtICpn cHV2bSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IG51bV9mZW5jZXMpCj4gK3sK PiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dwdXZtX2JvICp2bV9ibzsKPiArwqDCoMKgwqDC oMKgwqBMSVNUX0hFQUQoZXh0b2Jqcyk7Cj4gK8KgwqDCoMKgwqDCoMKgaW50IHJldCA9IDA7Cj4g Kwo+ICvCoMKgwqDCoMKgwqDCoGZvcl9lYWNoX3ZtX2JvX2luX2xpc3QoZ3B1dm0sIGV4dG9iaiwg JmV4dG9ianMsIHZtX2JvKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9 IGRybV9leGVjX3ByZXBhcmVfb2JqKGV4ZWMsIHZtX2JvLT5vYmosCj4gbnVtX2ZlbmNlcyk7Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlmIChyZXQpCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiArwqDCoMKgwqDCoMKgwqB9 Cj4gK8KgwqDCoMKgwqDCoMKgLyogRHJvcCByZWYgaW4gY2FzZSB3ZSBicmVhayBvdXQgb2YgdGhl IGxvb3AuICovCj4gK8KgwqDCoMKgwqDCoMKgZHJtX2dwdXZtX2JvX3B1dCh2bV9ibyk7Cj4gK8Kg wqDCoMKgwqDCoMKgcmVzdG9yZV92bV9ib19saXN0KGdwdXZtLCBleHRvYmopOwo+ICsKPiArwqDC oMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK2RybV9ncHV2 bV9wcmVwYXJlX29iamVjdHNfbG9ja2VkKHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtLAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBudW1fZmVuY2Vz KQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgc3RydWN0IGRybV9ncHV2bV9ibyAqdm1fYm87Cj4gK8Kg wqDCoMKgwqDCoMKgaW50IHJldCA9IDA7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGRybV9ncHV2bV9y ZXN2X2Fzc2VydF9oZWxkKGdwdXZtKTsKPiArwqDCoMKgwqDCoMKgwqBsaXN0X2Zvcl9lYWNoX2Vu dHJ5KHZtX2JvLCAmZ3B1dm0tPmV4dG9iai5saXN0LAo+IGxpc3QuZW50cnkuZXh0b2JqKSB7Cj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IGRybV9leGVjX3ByZXBhcmVfb2Jq KGV4ZWMsIHZtX2JvLT5vYmosCj4gbnVtX2ZlbmNlcyk7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIChyZXQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBicmVhazsKPiArCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGlm ICh2bV9iby0+ZXZpY3RlZCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGRybV9ncHV2bV9ib19saXN0X2FkZCh2bV9ibywgZXZpY3QsIGZhbHNlKTsKClBy ZXZpb3VzIGRpc2N1c3Npb24KCj4gK8KgwqDCoMKgwqDCoMKgfQo+ICsKPiArwqDCoMKgwqDCoMKg wqByZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICsvKioKPiArICogZHJtX2dwdXZtX3ByZXBhcmVfb2Jq ZWN0cygpIC0gcHJlcGFyZSBhbGwgYXNzb2ljaWF0ZWQgQk9zCj4gKyAqIEBncHV2bTogdGhlICZk cm1fZ3B1dm0KPiArICogQGV4ZWM6IHRoZSAmZHJtX2V4ZWMgbG9ja2luZyBjb250ZXh0Cj4gKyAq IEBudW1fZmVuY2VzOiB0aGUgYW1vdW50IG9mICZkbWFfZmVuY2VzIHRvIHJlc2VydmUKPiArICoK PiArICogQ2FsbHMgZHJtX2V4ZWNfcHJlcGFyZV9vYmooKSBmb3IgYWxsICZkcm1fZ2VtX29iamVj dHMgdGhlIGdpdmVuCj4gKyAqICZkcm1fZ3B1dm0gY29udGFpbnMgbWFwcGluZ3Mgb2YuCj4gKyAq Cj4gKyAqIFVzaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHksIGl0IGlzIHRoZSBkcml2ZXJzIHJl c3BvbnNpYmlsaXR5IHRvCj4gY2FsbAo+ICsgKiBkcm1fZXhlY19pbml0KCkgYW5kIGRybV9leGVj X2ZpbmkoKSBhY2NvcmRpbmdseS4KPiArICoKPiArICogTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBz YWZlIGFnYWluc3QgY29uY3VycmVudCBpbnNlcnRpb24gYW5kCj4gcmVtb3ZhbCBvZgo+ICsgKiBl eHRlcm5hbCBvYmplY3RzLCBob3dldmVyIGl0IGlzIG5vdCBzYWZlIGFnYWluc3QgY29uY3VycmVu dCB1c2FnZQo+IGl0c2VsZi4KPiArICoKPiArICogRHJpdmVycyBuZWVkIHRvIG1ha2Ugc3VyZSB0 byBwcm90ZWN0IHRoaXMgY2FzZSB3aXRoIGVpdGhlciBhbgo+IG91dGVyIFZNIGxvY2sKPiArICog b3IgYnkgY2FsbGluZyBkcm1fZ3B1dm1fcHJlcGFyZV92bSgpIGJlZm9yZSB0aGlzIGZ1bmN0aW9u IHdpdGhpbgo+IHRoZQo+ICsgKiBkcm1fZXhlY191bnRpbF9hbGxfbG9ja2VkKCkgbG9vcCwgc3Vj aCB0aGF0IHRoZSBHUFVWTSdzIGRtYS1yZXN2Cj4gbG9jayBlbnN1cmVzCj4gKyAqIG11dHVhbCBl eGNsdXNpb24uCj4gKyAqCj4gKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJy b3IgY29kZSBvbiBmYWlsdXJlLgo+ICsgKi8KPiAraW50Cj4gK2RybV9ncHV2bV9wcmVwYXJlX29i amVjdHMoc3RydWN0IGRybV9ncHV2bSAqZ3B1dm0sCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQg bnVtX2ZlbmNlcykKPiArewo+ICvCoMKgwqDCoMKgwqDCoGlmIChkcm1fZ3B1dm1fcmVzdl9wcm90 ZWN0ZWQoZ3B1dm0pKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gZHJt X2dwdXZtX3ByZXBhcmVfb2JqZWN0c19sb2NrZWQoZ3B1dm0sIGV4ZWMsCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbnVtX2ZlbmNlcyk7Cj4g K8KgwqDCoMKgwqDCoMKgZWxzZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1 cm4gX19kcm1fZ3B1dm1fcHJlcGFyZV9vYmplY3RzKGdwdXZtLCBleGVjLAo+IG51bV9mZW5jZXMp Owo+ICsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChkcm1fZ3B1dm1fcHJlcGFyZV9vYmplY3Rz KTsKPiArCj4gKy8qKgo+ICsgKiBkcm1fZ3B1dm1fcHJlcGFyZV9yYW5nZSgpIC0gcHJlcGFyZSBh bGwgQk9zIG1hcHBlZCB3aXRoaW4gYSBnaXZlbgo+IHJhbmdlCj4gKyAqIEBncHV2bTogdGhlICZk cm1fZ3B1dm0KPiArICogQGV4ZWM6IHRoZSAmZHJtX2V4ZWMgbG9ja2luZyBjb250ZXh0Cj4gKyAq IEBhZGRyOiB0aGUgc3RhcnQgYWRkcmVzcyB3aXRoaW4gdGhlIFZBIHNwYWNlCj4gKyAqIEByYW5n ZTogdGhlIHJhbmdlIHRvIGl0ZXJhdGUgd2l0aGluIHRoZSBWQSBzcGFjZQo+ICsgKiBAbnVtX2Zl bmNlczogdGhlIGFtb3VudCBvZiAmZG1hX2ZlbmNlcyB0byByZXNlcnZlCj4gKyAqCj4gKyAqIENh bGxzIGRybV9leGVjX3ByZXBhcmVfb2JqKCkgZm9yIGFsbCAmZHJtX2dlbV9vYmplY3RzIG1hcHBl ZAo+IGJldHdlZW4gQGFkZHIKPiArICogYW5kIEBhZGRyICsgQHJhbmdlLgo+ICsgKgo+ICsgKiBS ZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KPiAr ICovCj4gK2ludAo+ICtkcm1fZ3B1dm1fcHJlcGFyZV9yYW5nZShzdHJ1Y3QgZHJtX2dwdXZtICpn cHV2bSwgc3RydWN0IGRybV9leGVjCj4gKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1NjQgYWRkciwgdTY0IHJhbmdlLCB1bnNpZ25lZCBpbnQg bnVtX2ZlbmNlcykKPiArewo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBkcm1fZ3B1dmEgKnZhOwo+ ICvCoMKgwqDCoMKgwqDCoHU2NCBlbmQgPSBhZGRyICsgcmFuZ2U7Cj4gK8KgwqDCoMKgwqDCoMKg aW50IHJldDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgZHJtX2dwdXZtX2Zvcl9lYWNoX3ZhX3Jhbmdl KHZhLCBncHV2bSwgYWRkciwgZW5kKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqID0gdmEtPmdlbS5vYmo7Cj4gKwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZXhlY19wcmVwYXJlX29iaihleGVjLCBv YmosIG51bV9mZW5jZXMpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0 KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJu IHJldDsKPiArwqDCoMKgwqDCoMKgwqB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHJldHVybiAwOwo+ ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKGRybV9ncHV2bV9wcmVwYXJlX3JhbmdlKTsKPiArCj4g Ky8qKgo+ICsgKiBkcm1fZ3B1dm1fZXhlY19sb2NrKCkgLSBsb2NrIGFsbCBkbWEtcmVzdiBvZiBh bGwgYXNzb2ljaWF0ZWQgQk9zCj4gKyAqIEB2bV9leGVjOiB0aGUgJmRybV9ncHV2bV9leGVjIHdy YXBwZXIKPiArICogQG51bV9mZW5jZXM6IHRoZSBhbW91bnQgb2YgJmRtYV9mZW5jZXMgdG8gcmVz ZXJ2ZQo+ICsgKiBAaW50ZXJydXB0aWJsZTogc2xlZXAgaW50ZXJydXB0aWJsZSBpZiB3YWl0aW5n Cj4gKyAqCj4gKyAqIEFjcXVpcmVzIGFsbCBkbWEtcmVzdiBsb2NrcyBvZiBhbGwgJmRybV9nZW1f b2JqZWN0cyB0aGUgZ2l2ZW4KPiArICogJmRybV9ncHV2bSBjb250YWlucyBtYXBwaW5ncyBvZi4K PiArICoKPiArICogQWRkaW9uYWxseSwgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBz dHJ1Y3QKPiBkcm1fZ3B1dm1fZXhlYzo6ZXh0cmEKPiArICogYmVpbmcgc2V0IHRoZSBkcml2ZXIg cmVjZWl2ZXMgdGhlIGdpdmVuIEBmbiBjYWxsYmFjayB0byBsb2NrCj4gYWRkaXRpb25hbAo+ICsg KiBkbWEtcmVzdiBpbiB0aGUgY29udGV4dCBvZiB0aGUgJmRybV9ncHV2bV9leGVjIGluc3RhbmNl Lgo+IFR5cGljYWxseSwgZHJpdmVycwo+ICsgKiB3b3VsZCBjYWxsIGRybV9leGVjX3ByZXBhcmVf b2JqKCkgZnJvbSB3aXRoaW4gdGhpcyBjYWxsYmFjay4KPiArICoKPiArICogUmV0dXJuczogMCBv biBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCj4gKyAqLwo+ICtpbnQK PiArZHJtX2dwdXZtX2V4ZWNfbG9jayhzdHJ1Y3QgZHJtX2dwdXZtX2V4ZWMgKnZtX2V4ZWMsCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgbnVtX2Zl bmNlcywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvb2wgaW50ZXJy dXB0aWJsZSkKCkNvdWxkIHdlIGxldCB0aGUgZHJpdmVyIHNlbGVjdCBhbGwgZHJtX2V4ZWMgZmxh Z3MgaGVyZT8gQXZvaWRpbmcKRFJNX0VYRUNfSUdOT1JFX0RVUExJQ0FURVMgaXMgSU1PIGEgZ29v ZCBjb25zaXN0ZW5jeSBjaGVjayBpZiB0aGUKZHJpdmVyIHN1cHBvcnRzIGl0LgoKPiArewo+ICvC oMKgwqDCoMKgwqDCoHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtID0gdm1fZXhlYy0+dm07Cj4gK8Kg wqDCoMKgwqDCoMKgc3RydWN0IGRybV9leGVjICpleGVjID0gJnZtX2V4ZWMtPmV4ZWM7Cj4gK8Kg wqDCoMKgwqDCoMKgdWludDMyX3QgZmxhZ3M7CgpJdCdzIHVuZm9ydHVuYXRlIHRoYXQgZHJtX2V4 ZWMgdXNlcyB1aW50MzJfdCByYXRoZXIgdGhhbiB1MzIgZm9yIHRoZQpmbGFncyBhcmd1bWVudCwg KEknbGwgc2VuZCBhIHBhdGNoIHRvIGZpeCB0aGF0KSBidXQgd2Ugc2hvdWxkIGJlIGZpbmUKdXNp bmcgdTMyPwoKPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0Owo+ICsKPiArwqDCoMKgwqDCoMKgwqBm bGFncyA9IGludGVycnVwdGlibGUgPyBEUk1fRVhFQ19JTlRFUlJVUFRJQkxFX1dBSVQgOiAwIHwK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgRFJNX0VYRUNfSUdOT1JFX0RVUExJQ0FU RVM7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGRybV9leGVjX2luaXQoZXhlYywgZmxhZ3MpOwo+ICsK PiArwqDCoMKgwqDCoMKgwqBkcm1fZXhlY191bnRpbF9hbGxfbG9ja2VkKGV4ZWMpIHsKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gZHJtX2dwdXZtX3ByZXBhcmVfdm0oZ3B1 dm0sIGV4ZWMsIG51bV9mZW5jZXMpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBk cm1fZXhlY19yZXRyeV9vbl9jb250ZW50aW9uKGV4ZWMpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiAocmV0KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgZ290byBlcnI7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqByZXQgPSBkcm1fZ3B1dm1fcHJlcGFyZV9vYmplY3RzKGdwdXZtLCBleGVjLAo+IG51bV9mZW5j ZXMpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBkcm1fZXhlY19yZXRyeV9vbl9j b250ZW50aW9uKGV4ZWMpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmV0 KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBl cnI7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAodm1fZXhlYy0+ZXh0 cmEuZm4pIHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJldCA9IHZtX2V4ZWMtPmV4dHJhLmZuKHZtX2V4ZWMsIG51bV9mZW5jZXMpOwo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2V4ZWNfcmV0cnlfb25f Y29udGVudGlvbihleGVjKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGlmIChyZXQpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ290byBlcnI7Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDCoMKgwqB9Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiAwOwo+ICsKPiArZXJyOgo+ICvCoMKgwqDCoMKgwqDCoGRybV9leGVjX2ZpbmkoZXhlYyk7 Cj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIHJldDsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChk cm1fZ3B1dm1fZXhlY19sb2NrKTsKPiArCj4gK3N0YXRpYyBpbnQKPiArZm5fbG9ja19hcnJheShz dHJ1Y3QgZHJtX2dwdXZtX2V4ZWMgKnZtX2V4ZWMsIHVuc2lnbmVkIGludAo+IG51bV9mZW5jZXMp Cj4gK3sKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3Qgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKipvYmpzOwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgbnVtX29ianM7Cj4gK8KgwqDCoMKgwqDCoMKgfSAq YXJncyA9IHZtX2V4ZWMtPmV4dHJhLnByaXY7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoHJldHVybiBk cm1fZXhlY19wcmVwYXJlX2FycmF5KCZ2bV9leGVjLT5leGVjLCBhcmdzLT5vYmpzLAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgYXJncy0+bnVtX29ianMsIG51bV9mZW5jZXMpOwo+ICt9Cj4gKwo+ICsvKioK PiArICogZHJtX2dwdXZtX2V4ZWNfbG9ja19hcnJheSgpIC0gbG9jayBhbGwgZG1hLXJlc3Ygb2Yg YWxsCj4gYXNzb2ljaWF0ZWQgQk9zCj4gKyAqIEB2bV9leGVjOiB0aGUgJmRybV9ncHV2bV9leGVj IHdyYXBwZXIKPiArICogQG9ianM6IGFkZGl0aW9uYWwgJmRybV9nZW1fb2JqZWN0cyB0byBsb2Nr Cj4gKyAqIEBudW1fb2JqczogdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsICZkcm1fZ2VtX29iamVj dHMgdG8gbG9jawo+ICsgKiBAbnVtX2ZlbmNlczogdGhlIGFtb3VudCBvZiAmZG1hX2ZlbmNlcyB0 byByZXNlcnZlCj4gKyAqIEBpbnRlcnJ1cHRpYmxlOiBzbGVlcCBpbnRlcnJ1cHRpYmxlIGlmIHdh aXRpbmcKPiArICoKPiArICogQWNxdWlyZXMgYWxsIGRtYS1yZXN2IGxvY2tzIG9mIGFsbCAmZHJt X2dlbV9vYmplY3RzIHRoZSBnaXZlbgo+ICZkcm1fZ3B1dm0KPiArICogY29udGFpbnMgbWFwcGlu Z3Mgb2YsIHBsdXMgdGhlIG9uZXMgZ2l2ZW4gdGhyb3VnaCBAb2Jqcy4KPiArICoKPiArICogUmV0 dXJuczogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCj4gKyAq Lwo+ICtpbnQKPiArZHJtX2dwdXZtX2V4ZWNfbG9ja19hcnJheShzdHJ1Y3QgZHJtX2dwdXZtX2V4 ZWMgKnZtX2V4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKipvYmpzLAo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IG51bV9vYmpzLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWdu ZWQgaW50IG51bV9mZW5jZXMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBib29sIGludGVycnVwdGlibGUpCnUzMiBleGVjX2ZsYWdzPwoKPiArewo+ ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9ianM7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHVuc2lnbmVkIGludCBudW1fb2JqczsKPiArwqDCoMKgwqDCoMKgwqB9IGFyZ3M7Cj4g Kwo+ICvCoMKgwqDCoMKgwqDCoGFyZ3Mub2JqcyA9IG9ianM7Cj4gK8KgwqDCoMKgwqDCoMKgYXJn cy5udW1fb2JqcyA9IG51bV9vYmpzOwo+ICsKPiArwqDCoMKgwqDCoMKgwqB2bV9leGVjLT5leHRy YS5mbiA9IGZuX2xvY2tfYXJyYXk7Cj4gK8KgwqDCoMKgwqDCoMKgdm1fZXhlYy0+ZXh0cmEucHJp diA9ICZhcmdzOwo+ICsKPiArwqDCoMKgwqDCoMKgwqByZXR1cm4gZHJtX2dwdXZtX2V4ZWNfbG9j ayh2bV9leGVjLCBudW1fZmVuY2VzLAo+IGludGVycnVwdGlibGUpOwo+ICt9Cj4gK0VYUE9SVF9T WU1CT0xfR1BMKGRybV9ncHV2bV9leGVjX2xvY2tfYXJyYXkpOwo+ICsKPiArLyoqCj4gKyAqIGRy bV9ncHV2bV9leGVjX2xvY2tfcmFuZ2UoKSAtIHByZXBhcmUgYWxsIEJPcyBtYXBwZWQgd2l0aGlu IGEKPiBnaXZlbiByYW5nZQo+ICsgKiBAdm1fZXhlYzogdGhlICZkcm1fZ3B1dm1fZXhlYyB3cmFw cGVyCj4gKyAqIEBhZGRyOiB0aGUgc3RhcnQgYWRkcmVzcyB3aXRoaW4gdGhlIFZBIHNwYWNlCj4g KyAqIEByYW5nZTogdGhlIHJhbmdlIHRvIGl0ZXJhdGUgd2l0aGluIHRoZSBWQSBzcGFjZQo+ICsg KiBAbnVtX2ZlbmNlczogdGhlIGFtb3VudCBvZiAmZG1hX2ZlbmNlcyB0byByZXNlcnZlCj4gKyAq IEBpbnRlcnJ1cHRpYmxlOiBzbGVlcCBpbnRlcnJ1cHRpYmxlIGlmIHdhaXRpbmcKPiArICoKPiAr ICogQWNxdWlyZXMgYWxsIGRtYS1yZXN2IGxvY2tzIG9mIGFsbCAmZHJtX2dlbV9vYmplY3RzIG1h cHBlZAo+IGJldHdlZW4gQGFkZHIgYW5kCj4gKyAqIEBhZGRyICsgQHJhbmdlLgo+ICsgKgo+ICsg KiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4K PiArICovCj4gK2ludAo+ICtkcm1fZ3B1dm1fZXhlY19sb2NrX3JhbmdlKHN0cnVjdCBkcm1fZ3B1 dm1fZXhlYyAqdm1fZXhlYywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHU2NCBhZGRyLCB1NjQgcmFuZ2UsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBpbnQgbnVtX2ZlbmNlcywKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvb2wgaW50 ZXJydXB0aWJsZSkKU2FtZSBoZXJlCj4gK3sKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dw dXZtICpncHV2bSA9IHZtX2V4ZWMtPnZtOwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBkcm1fZXhl YyAqZXhlYyA9ICZ2bV9leGVjLT5leGVjOwo+ICvCoMKgwqDCoMKgwqDCoHVpbnQzMl90IGZsYWdz Owo+ICvCoMKgwqDCoMKgwqDCoGludCByZXQ7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGZsYWdzID0g aW50ZXJydXB0aWJsZSA/IERSTV9FWEVDX0lOVEVSUlVQVElCTEVfV0FJVCA6IDAgfAo+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBEUk1fRVhFQ19JR05PUkVfRFVQTElDQVRFUzsKPiAr Cj4gK8KgwqDCoMKgwqDCoMKgZHJtX2V4ZWNfaW5pdChleGVjLCBmbGFncyk7Cj4gKwo+ICvCoMKg wqDCoMKgwqDCoGRybV9leGVjX3VudGlsX2FsbF9sb2NrZWQoZXhlYykgewo+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBkcm1fZ3B1dm1fcHJlcGFyZV9yYW5nZShncHV2bSwg ZXhlYywgYWRkciwKPiByYW5nZSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBu dW1fZmVuY2VzKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2V4ZWNfcmV0 cnlfb25fY29udGVudGlvbihleGVjKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg aWYgKHJldCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGdvdG8gZXJyOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArCj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJu IHJldDsKPiArCj4gK2VycjoKPiArwqDCoMKgwqDCoMKgwqBkcm1fZXhlY19maW5pKGV4ZWMpOwo+ ICvCoMKgwqDCoMKgwqDCoHJldHVybiByZXQ7Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwoZHJt X2dwdXZtX2V4ZWNfbG9ja19yYW5nZSk7Cj4gKwo+ICtzdGF0aWMgaW50Cj4gK19fZHJtX2dwdXZt X3ZhbGlkYXRlKHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtLCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMp Cj4gK3sKPiArwqDCoMKgwqDCoMKgwqBjb25zdCBzdHJ1Y3QgZHJtX2dwdXZtX29wcyAqb3BzID0g Z3B1dm0tPm9wczsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dwdXZtX2JvICp2bV9ibzsK PiArwqDCoMKgwqDCoMKgwqBMSVNUX0hFQUQoZXZpY3QpOwo+ICvCoMKgwqDCoMKgwqDCoGludCBy ZXQgPSAwOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBmb3JfZWFjaF92bV9ib19pbl9saXN0KGdwdXZt LCBldmljdCwgJmV2aWN0LCB2bV9ibykgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqByZXQgPSBvcHMtPnZtX2JvX3ZhbGlkYXRlKHZtX2JvLCBleGVjKTsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJldCkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ICvCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDC oMKgwqAvKiBEcm9wIHJlZiBpbiBjYXNlIHdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4gKi8KPiAr wqDCoMKgwqDCoMKgwqBkcm1fZ3B1dm1fYm9fcHV0KHZtX2JvKTsKPiArwqDCoMKgwqDCoMKgwqBy ZXN0b3JlX3ZtX2JvX2xpc3QoZ3B1dm0sIGV2aWN0KTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgcmV0 dXJuIHJldDsKPiArfQo+ICsKPiArc3RhdGljIGludAo+ICtkcm1fZ3B1dm1fdmFsaWRhdGVfbG9j a2VkKHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtLCBzdHJ1Y3QgZHJtX2V4ZWMKPiAqZXhlYykKPiAr ewo+ICvCoMKgwqDCoMKgwqDCoGNvbnN0IHN0cnVjdCBkcm1fZ3B1dm1fb3BzICpvcHMgPSBncHV2 bS0+b3BzOwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBkcm1fZ3B1dm1fYm8gKnZtX2JvLCAqbmV4 dDsKPiArwqDCoMKgwqDCoMKgwqBpbnQgcmV0ID0gMDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgZHJt X2dwdXZtX3Jlc3ZfYXNzZXJ0X2hlbGQoZ3B1dm0pOwo+ICsKPiArwqDCoMKgwqDCoMKgwqAvKiBJ dGVyYXRlIGxpc3Qgc2FmZWx5LCBkcml2ZXJzIHR5cGljYWxseSByZW1vdmUgdGhlIGN1cnJlbnQK PiBlbnRyeSBmcm9tCj4gK8KgwqDCoMKgwqDCoMKgICogdGhlaXIgZHJtX2dwdXZtX29wczo6dm1f Ym9fdmFsaWRhdGUgY2FsbGJhY2suIERyaXZlcnMKPiBtaWdodCBhbHNvCj4gK8KgwqDCoMKgwqDC oMKgICogcmUtYWRkIHRoZSBlbnRyeSBvbiBmYWlsdXJlOyB0aGlzIGlzIHNhZmUgc2luY2Ugb24g ZmFpbHVyZQo+IHdlIGJyZWFrCj4gK8KgwqDCoMKgwqDCoMKgICogb3V0IG9mIHRoZSBsb29wLgo+ ICvCoMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoGxpc3RfZm9yX2VhY2hfZW50cnlf c2FmZSh2bV9ibywgbmV4dCwgJmdwdXZtLT5ldmljdC5saXN0LAo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsaXN0LmVudHJ5 LmV2aWN0KSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IG9wcy0+dm1f Ym9fdmFsaWRhdGUodm1fYm8sIGV4ZWMpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBpZiAocmV0KQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICsKPiArwqDCoMKgwqDCoMKgwqByZXR1cm4g cmV0Owo+ICt9Cj4gKwo+ICsvKioKPiArICogZHJtX2dwdXZtX3ZhbGlkYXRlKCkgLSB2YWxpZGF0 ZSBhbGwgQk9zIG1hcmtlZCBhcyBldmljdGVkCj4gKyAqIEBncHV2bTogdGhlICZkcm1fZ3B1dm0g dG8gdmFsaWRhdGUgZXZpY3RlZCBCT3MKPiArICogQGV4ZWM6IHRoZSAmZHJtX2V4ZWMgaW5zdGFu Y2UgdXNlZCBmb3IgbG9ja2luZyB0aGUgR1BVVk0KPiArICoKPiArICogQ2FsbHMgdGhlICZkcm1f Z3B1dm1fb3BzOjp2bV9ib192YWxpZGF0ZSBjYWxsYmFjayBmb3IgYWxsIGV2aWN0ZWQKPiBidWZm ZXIKPiArICogb2JqZWN0cyBiZWluZyBtYXBwZWQgaW4gdGhlIGdpdmVuICZkcm1fZ3B1dm0uCj4g KyAqCj4gKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBm YWlsdXJlLgo+ICsgKi8KPiAraW50Cj4gK2RybV9ncHV2bV92YWxpZGF0ZShzdHJ1Y3QgZHJtX2dw dXZtICpncHV2bSwgc3RydWN0IGRybV9leGVjICpleGVjKQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKg Y29uc3Qgc3RydWN0IGRybV9ncHV2bV9vcHMgKm9wcyA9IGdwdXZtLT5vcHM7Cj4gKwo+ICvCoMKg wqDCoMKgwqDCoGlmICh1bmxpa2VseSghb3BzIHx8ICFvcHMtPnZtX2JvX3ZhbGlkYXRlKSkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIC1FTk9UU1VQUDsKPiArCj4gK8Kg wqDCoMKgwqDCoMKgaWYgKGRybV9ncHV2bV9yZXN2X3Byb3RlY3RlZChncHV2bSkpCj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiBkcm1fZ3B1dm1fdmFsaWRhdGVfbG9ja2Vk KGdwdXZtLCBleGVjKTsKPiArwqDCoMKgwqDCoMKgwqBlbHNlCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHJldHVybiBfX2RybV9ncHV2bV92YWxpZGF0ZShncHV2bSwgZXhlYyk7Cj4g Kwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0xfR1BMKGRybV9ncHV2bV92YWxpZGF0ZSk7Cj4gKwo+ICsv KioKPiArICogZHJtX2dwdXZtX3Jlc3ZfYWRkX2ZlbmNlIC0gYWRkIGZlbmNlIHRvIHByaXZhdGUg YW5kIGFsbCBleHRvYmoKPiArICogZG1hLXJlc3YKPiArICogQGdwdXZtOiB0aGUgJmRybV9ncHV2 bSB0byBhZGQgYSBmZW5jZSB0bwo+ICsgKiBAZXhlYzogdGhlICZkcm1fZXhlYyBsb2NraW5nIGNv bnRleHQKPiArICogQGZlbmNlOiBmZW5jZSB0byBhZGQKPiArICogQHByaXZhdGVfdXNhZ2U6IHBy aXZhdGUgZG1hLXJlc3YgdXNhZ2UKPiArICogQGV4dG9ial91c2FnZTogZXh0b2JqIGRtYS1yZXN2 IHVzYWdlCj4gKyAqLwo+ICt2b2lkCj4gK2RybV9ncHV2bV9yZXN2X2FkZF9mZW5jZShzdHJ1Y3Qg ZHJtX2dwdXZtICpncHV2bSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRtYV9mZW5jZSAqZmVuY2UsCj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBkbWFfcmVz dl91c2FnZSBwcml2YXRlX3VzYWdlLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGVudW0gZG1hX3Jlc3ZfdXNhZ2UgZXh0b2JqX3VzYWdlKQo+ICt7Cj4g K8KgwqDCoMKgwqDCoMKgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmo7Cj4gK8KgwqDCoMKgwqDC oMKgdW5zaWduZWQgbG9uZyBpbmRleDsKPiArCj4gK8KgwqDCoMKgwqDCoMKgZHJtX2V4ZWNfZm9y X2VhY2hfbG9ja2VkX29iamVjdChleGVjLCBpbmRleCwgb2JqKSB7Cj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGRtYV9yZXN2X2Fzc2VydF9oZWxkKG9iai0+cmVzdik7Cj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRtYV9yZXN2X2FkZF9mZW5jZShvYmotPnJlc3YsIGZl bmNlLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgZHJtX2dwdXZtX2lzX2V4dG9iaihncHV2bSwgb2JqKSA/Cj4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBwcml2YXRlX3VzYWdlIDogZXh0b2JqX3VzYWdlKTsKPiArwqDCoMKgwqDCoMKgwqB9 Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwoZHJtX2dwdXZtX3Jlc3ZfYWRkX2ZlbmNlKTsKPiAr Cj4gwqAvKioKPiDCoCAqIGRybV9ncHV2bV9ib19jcmVhdGUoKSAtIGNyZWF0ZSBhIG5ldyBpbnN0 YW5jZSBvZiBzdHJ1Y3QKPiBkcm1fZ3B1dm1fYm8KPiDCoCAqIEBncHV2bTogVGhlICZkcm1fZ3B1 dm0gdGhlIEBvYmogaXMgbWFwcGVkIGluLgo+IEBAIC04MzgsNiArMTQyNCw5IEBAIGRybV9ncHV2 bV9ib19jcmVhdGUoc3RydWN0IGRybV9ncHV2bSAqZ3B1dm0sCj4gwqDCoMKgwqDCoMKgwqDCoElO SVRfTElTVF9IRUFEKCZ2bV9iby0+bGlzdC5ncHV2YSk7Cj4gwqDCoMKgwqDCoMKgwqDCoElOSVRf TElTVF9IRUFEKCZ2bV9iby0+bGlzdC5lbnRyeS5nZW0pOwo+IMKgCj4gK8KgwqDCoMKgwqDCoMKg SU5JVF9MSVNUX0hFQUQoJnZtX2JvLT5saXN0LmVudHJ5LmV4dG9iaik7Cj4gK8KgwqDCoMKgwqDC oMKgSU5JVF9MSVNUX0hFQUQoJnZtX2JvLT5saXN0LmVudHJ5LmV2aWN0KTsKPiArCj4gwqDCoMKg wqDCoMKgwqDCoGRybV9nZW1fb2JqZWN0X2dldChvYmopOwo+IMKgCj4gwqDCoMKgwqDCoMKgwqDC oHJldHVybiB2bV9ibzsKPiBAQCAtODU4LDYgKzE0NDcsOSBAQCBkcm1fZ3B1dm1fYm9fZGVzdHJv eShzdHJ1Y3Qga3JlZiAqa3JlZikKPiDCoMKgwqDCoMKgwqDCoMKgaWYgKCFsb2NrKQo+IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2dwdXZtX3Jlc3ZfYXNzZXJ0X2hlbGQoZ3B1 dm0pOwo+IMKgCj4gK8KgwqDCoMKgwqDCoMKgZHJtX2dwdXZtX2JvX2xpc3RfZGVsKHZtX2JvLCBl eHRvYmosIGxvY2spOwo+ICvCoMKgwqDCoMKgwqDCoGRybV9ncHV2bV9ib19saXN0X2RlbCh2bV9i bywgZXZpY3QsIGxvY2spOwo+ICsKPiDCoMKgwqDCoMKgwqDCoMKgbGlzdF9kZWwoJnZtX2JvLT5s aXN0LmVudHJ5LmdlbSk7Cj4gwqAKPiDCoMKgwqDCoMKgwqDCoMKgZHJtX2dlbV9vYmplY3RfcHV0 KG9iaik7Cj4gQEAgLTk5NCw2ICsxNTg2LDYwIEBAIGRybV9ncHV2bV9ib19vYnRhaW5fcHJlYWxs b2Moc3RydWN0Cj4gZHJtX2dwdXZtX2JvICpfX3ZtX2JvKQo+IMKgfQo+IMKgRVhQT1JUX1NZTUJP TF9HUEwoZHJtX2dwdXZtX2JvX29idGFpbl9wcmVhbGxvYyk7Cj4gwqAKPiArLyoqCj4gKyAqIGRy bV9ncHV2bV9ib19leHRvYmpfYWRkKCkgLSBhZGRzIHRoZSAmZHJtX2dwdXZtX2JvIHRvIGl0cwo+ ICZkcm1fZ3B1dm0ncwo+ICsgKiBleHRvYmogbGlzdAo+ICsgKiBAdm1fYm86IFRoZSAmZHJtX2dw dXZtX2JvIHRvIGFkZCB0byBpdHMgJmRybV9ncHV2bSdzIHRoZSBleHRvYmoKPiBsaXN0Lgo+ICsg Kgo+ICsgKiBBZGRzIHRoZSBnaXZlbiBAdm1fYm8gdG8gaXRzICZkcm1fZ3B1dm0ncyBleHRvYmog bGlzdCBpZiBub3Qgb24KPiB0aGUgbGlzdAo+ICsgKiBhbHJlYWR5IGFuZCBpZiB0aGUgY29ycmVz cG9uZGluZyAmZHJtX2dlbV9vYmplY3QgaXMgYW4gZXh0ZXJuYWwKPiBvYmplY3QsCj4gKyAqIGFj dHVhbGx5Lgo+ICsgKi8KPiArdm9pZAo+ICtkcm1fZ3B1dm1fYm9fZXh0b2JqX2FkZChzdHJ1Y3Qg ZHJtX2dwdXZtX2JvICp2bV9ibykKPiArewo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBkcm1fZ3B1 dm0gKmdwdXZtID0gdm1fYm8tPnZtOwo+ICvCoMKgwqDCoMKgwqDCoGJvb2wgbG9jayA9ICFkcm1f Z3B1dm1fcmVzdl9wcm90ZWN0ZWQoZ3B1dm0pOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBpZiAoIWxv Y2spCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9ncHV2bV9yZXN2X2Fzc2Vy dF9oZWxkKGdwdXZtKTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgaWYgKGRybV9ncHV2bV9pc19leHRv YmooZ3B1dm0sIHZtX2JvLT5vYmopKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBk cm1fZ3B1dm1fYm9fbGlzdF9hZGQodm1fYm8sIGV4dG9iaiwgbG9jayk7Cj4gK30KPiArRVhQT1JU X1NZTUJPTF9HUEwoZHJtX2dwdXZtX2JvX2V4dG9ial9hZGQpOwo+ICsKPiArLyoqCj4gKyAqIGRy bV9ncHV2bV9ib19ldmljdCgpIC0gYWRkIC8gcmVtb3ZlIGEgJmRybV9ncHV2bV9ibyB0byAvIGZy b20gdGhlCj4gJmRybV9ncHV2bXMKPiArICogZXZpY3RlZCBsaXN0Cj4gKyAqIEB2bV9ibzogdGhl ICZkcm1fZ3B1dm1fYm8gdG8gYWRkIG9yIHJlbW92ZQo+ICsgKiBAZXZpY3Q6IGluZGljYXRlcyB3 aGV0aGVyIHRoZSBvYmplY3QgaXMgZXZpY3RlZAo+ICsgKgo+ICsgKiBBZGRzIGEgJmRybV9ncHV2 bV9ibyB0byBvciByZW1vdmVzIGl0IGZyb20gdGhlICZkcm1fZ3B1dm1zCj4gZXZpY3RlZCBsaXN0 Lgo+ICsgKi8KPiArdm9pZAo+ICtkcm1fZ3B1dm1fYm9fZXZpY3Qoc3RydWN0IGRybV9ncHV2bV9i byAqdm1fYm8sIGJvb2wgZXZpY3QpCj4gK3sKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dw dXZtICpncHV2bSA9IHZtX2JvLT52bTsKPiArwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dlbV9v YmplY3QgKm9iaiA9IHZtX2JvLT5vYmo7Cj4gK8KgwqDCoMKgwqDCoMKgYm9vbCBsb2NrID0gIWRy bV9ncHV2bV9yZXN2X3Byb3RlY3RlZChncHV2bSk7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGRtYV9y ZXN2X2Fzc2VydF9oZWxkKG9iai0+cmVzdik7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoGlmIChkcm1f Z3B1dm1faXNfZXh0b2JqKGdwdXZtLCBvYmopKSB7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoHZtX2JvLT5ldmljdGVkID0gZXZpY3Q7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBpZiAoIWxvY2spCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqByZXR1cm47Cj4gK8KgwqDCoMKgwqDCoMKgfQo+ICsKPiArwqDCoMKgwqDC oMKgwqBpZiAoZXZpY3QpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGRybV9ncHV2 bV9ib19saXN0X2FkZCh2bV9ibywgZXZpY3QsIGxvY2spOwo+ICvCoMKgwqDCoMKgwqDCoGVsc2UK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZHJtX2dwdXZtX2JvX2xpc3RfZGVsX2lu aXQodm1fYm8sIGV2aWN0LCBsb2NrKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MX0dQTChkcm1fZ3B1 dm1fYm9fZXZpY3QpOwo+ICsKPiDCoHN0YXRpYyBpbnQKPiDCoF9fZHJtX2dwdXZhX2luc2VydChz dHJ1Y3QgZHJtX2dwdXZtICpncHV2bSwKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3RydWN0IGRybV9ncHV2YSAqdmEpCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2Ry bV9ncHV2bS5oIGIvaW5jbHVkZS9kcm0vZHJtX2dwdXZtLmgKPiBpbmRleCBkZGIwYjhkMzIzY2Yu LmVhZGMzZWE1YmY1NyAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fZ3B1dm0uaAo+ICsr KyBiL2luY2x1ZGUvZHJtL2RybV9ncHV2bS5oCj4gQEAgLTMxLDYgKzMxLDcgQEAKPiDCoCNpbmNs dWRlIDxsaW51eC90eXBlcy5oPgo+IMKgCj4gwqAjaW5jbHVkZSA8ZHJtL2RybV9nZW0uaD4KPiAr I2luY2x1ZGUgPGRybS9kcm1fZXhlYy5oPgo+IMKgCj4gwqBzdHJ1Y3QgZHJtX2dwdXZtOwo+IMKg c3RydWN0IGRybV9ncHV2bV9ibzsKPiBAQCAtMjcyLDYgKzI3Myw1MCBAQCBzdHJ1Y3QgZHJtX2dw dXZtIHsKPiDCoMKgwqDCoMKgwqDCoMKgICogQHJfb2JqOiBSb290IEdFTSBvYmplY3Q7IHJlcHJl c2VudGluZyB0aGUgR1BVVk0ncyBjb21tb24KPiAmZG1hX3Jlc3YuCj4gwqDCoMKgwqDCoMKgwqDC oCAqLwo+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKnJfb2JqOwo+ICsK PiArwqDCoMKgwqDCoMKgwqAvKioKPiArwqDCoMKgwqDCoMKgwqAgKiBAZXh0b2JqOiBzdHJ1Y3R1 cmUgaG9sZGluZyB0aGUgZXh0b2JqIGxpc3QKPiArwqDCoMKgwqDCoMKgwqAgKi8KPiArwqDCoMKg wqDCoMKgwqBzdHJ1Y3Qgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKioKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQGxpc3Q6ICZsaXN0X2hlYWQgc3Rvcmlu ZyAmZHJtX2dwdXZtX2JvcyBzZXJ2aW5nCj4gYXMKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICogZXh0ZXJuYWwgb2JqZWN0Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbGlzdF9oZWFkIGxp c3Q7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKioKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQGxvY2FsX2xpc3Q6IHBvaW50ZXIgdG8gdGhlIGxvY2Fs IGxpc3QgdGVtcG9yYXJpbHkKPiBzdG9yaW5nCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAqIGVudHJpZXMgZnJvbSB0aGUgZXh0ZXJuYWwgb2JqZWN0IGxpc3QKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHN0cnVjdCBsaXN0X2hlYWQgKmxvY2FsX2xpc3Q7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAvKioKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQGxvY2s6 IHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIGV4dG9iaiBsaXN0Cj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzcGlubG9j a190IGxvY2s7Cj4gK8KgwqDCoMKgwqDCoMKgfSBleHRvYmo7Cj4gKwo+ICvCoMKgwqDCoMKgwqDC oC8qKgo+ICvCoMKgwqDCoMKgwqDCoCAqIEBldmljdDogc3RydWN0dXJlIGhvbGRpbmcgdGhlIGV2 aWN0IGxpc3QgYW5kIGV2aWN0IGxpc3QKPiBsb2NrCj4gK8KgwqDCoMKgwqDCoMKgICovCj4gK8Kg wqDCoMKgwqDCoMKgc3RydWN0IHsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoq Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIEBsaXN0OiAmbGlzdF9oZWFkIHN0 b3JpbmcgJmRybV9ncHV2bV9ib3MgY3VycmVudGx5Cj4gYmVpbmcKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICogZXZpY3RlZAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgKi8KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc3RydWN0IGxpc3RfaGVhZCBs aXN0Owo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoqCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIEBsb2NhbF9saXN0OiBwb2ludGVyIHRvIHRoZSBsb2Nh bCBsaXN0IHRlbXBvcmFyaWx5Cj4gc3RvcmluZwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKiBlbnRyaWVzIGZyb20gdGhlIGV2aWN0ZWQgb2JqZWN0IGxpc3QKPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHN0cnVjdCBsaXN0X2hlYWQgKmxvY2FsX2xpc3Q7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAvKioKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQGxvY2s6 IHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIGV2aWN0IGxpc3QKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNwaW5sb2Nr X3QgbG9jazsKPiArwqDCoMKgwqDCoMKgwqB9IGV2aWN0Owo+IMKgfTsKPiDCoAo+IMKgdm9pZCBk cm1fZ3B1dm1faW5pdChzdHJ1Y3QgZHJtX2dwdXZtICpncHV2bSwgc3RydWN0IGRybV9nZW1fb2Jq ZWN0Cj4gKnJfb2JqLAo+IEBAIC0zMjksNiArMzc0LDIyIEBAIGRybV9ncHV2bV9yZXN2X3Byb3Rl Y3RlZChzdHJ1Y3QgZHJtX2dwdXZtCj4gKmdwdXZtKQo+IMKgI2RlZmluZSBkcm1fZ3B1dm1fcmVz dl9hc3NlcnRfaGVsZChncHV2bV9fKSBcCj4gwqDCoMKgwqDCoMKgwqDCoGRtYV9yZXN2X2Fzc2Vy dF9oZWxkKGRybV9ncHV2bV9yZXN2KGdwdXZtX18pKQo+IMKgCj4gKy8qKgo+ICsgKiBkcm1fZ3B1 dm1faXNfZXh0b2JqKCkgLSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2l2ZW4KPiAmZHJtX2dlbV9v YmplY3QgaXMgYW4KPiArICogZXh0ZXJuYWwgb2JqZWN0Cj4gKyAqIEBncHV2bTogdGhlICZkcm1f Z3B1dm0gdG8gY2hlY2sKPiArICogQG9iajogdGhlICZkcm1fZ2VtX29iamVjdCB0byBjaGVjawo+ ICsgKgo+ICsgKiBSZXR1cm5zOiB0cnVlIGlmIHRoZSAmZHJtX2dlbV9vYmplY3QgJmRtYV9yZXN2 IGRpZmZlcnMgZnJvbSB0aGUKPiArICogJmRybV9ncHV2bXMgJmRtYV9yZXN2LCBmYWxzZSBvdGhl cndpc2UKPiArICovCj4gK3N0YXRpYyBpbmxpbmUgYm9vbAo+ICtkcm1fZ3B1dm1faXNfZXh0b2Jq KHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopCj4gK3sKPiArwqDCoMKgwqDCoMKg wqByZXR1cm4gb2JqICYmIG9iai0+cmVzdiAhPSBkcm1fZ3B1dm1fcmVzdihncHV2bSk7Cj4gK30K PiArCj4gwqBzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1fZ3B1dmEgKgo+IMKgX19kcm1fZ3B1dmFf bmV4dChzdHJ1Y3QgZHJtX2dwdXZhICp2YSkKPiDCoHsKPiBAQCAtNDA3LDYgKzQ2OCwxNDAgQEAg X19kcm1fZ3B1dmFfbmV4dChzdHJ1Y3QgZHJtX2dwdXZhICp2YSkKPiDCoCNkZWZpbmUgZHJtX2dw dXZtX2Zvcl9lYWNoX3ZhX3NhZmUodmFfXywgbmV4dF9fLCBncHV2bV9fKSBcCj4gwqDCoMKgwqDC oMKgwqDCoGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2YV9fLCBuZXh0X18sICYoZ3B1dm1fXykt PnJiLmxpc3QsCj4gcmIuZW50cnkpCj4gwqAKPiArLyoqCj4gKyAqIHN0cnVjdCBkcm1fZ3B1dm1f ZXhlYyAtICZkcm1fZ3B1dm0gYWJzdHJhY3Rpb24gb2YgJmRybV9leGVjCj4gKyAqCj4gKyAqIFRo aXMgc3RydWN0dXJlIHNob3VsZCBiZSBjcmVhdGVkIG9uIHRoZSBzdGFjayBhcyAmZHJtX2V4ZWMg c2hvdWxkCj4gYmUuCj4gKyAqCj4gKyAqIE9wdGlvbmFsbHksIEBleHRyYSBjYW4gYmUgc2V0IGlu IG9yZGVyIHRvIGxvY2sgYWRkaXRpb25hbAo+ICZkcm1fZ2VtX29iamVjdHMuCj4gKyAqLwo+ICtz dHJ1Y3QgZHJtX2dwdXZtX2V4ZWMgewo+ICvCoMKgwqDCoMKgwqDCoC8qKgo+ICvCoMKgwqDCoMKg wqDCoCAqIEBleGVjOiB0aGUgJmRybV9leGVjIHN0cnVjdHVyZQo+ICvCoMKgwqDCoMKgwqDCoCAq Lwo+ICvCoMKgwqDCoMKgwqDCoHN0cnVjdCBkcm1fZXhlYyBleGVjOwo+ICsKPiArwqDCoMKgwqDC oMKgwqAvKioKPiArwqDCoMKgwqDCoMKgwqAgKiBAdm06IHRoZSAmZHJtX2dwdXZtIHRvIGxvY2sg aXRzIERNQSByZXNlcnZhdGlvbnMKPiArwqDCoMKgwqDCoMKgwqAgKi8KPiArwqDCoMKgwqDCoMKg wqBzdHJ1Y3QgZHJtX2dwdXZtICp2bTsKPiArCj4gK8KgwqDCoMKgwqDCoMKgLyoqCj4gK8KgwqDC oMKgwqDCoMKgICogQGV4dHJhOiBDYWxsYmFjayBhbmQgY29ycmVzcG9uZGluZyBwcml2YXRlIGRh dGEgZm9yIHRoZQo+IGRyaXZlciB0bwo+ICvCoMKgwqDCoMKgwqDCoCAqIGxvY2sgYXJiaXRyYXJ5 IGFkZGl0aW9uYWwgJmRybV9nZW1fb2JqZWN0cy4KPiArwqDCoMKgwqDCoMKgwqAgKi8KPiArwqDC oMKgwqDCoMKgwqBzdHJ1Y3Qgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKioK PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogQGZuOiBUaGUgZHJpdmVyIGNhbGxi YWNrIHRvIGxvY2sgYWRkaXRpb25hbAo+ICZkcm1fZ2VtX29iamVjdHMuCj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp bnQgKCpmbikoc3RydWN0IGRybV9ncHV2bV9leGVjICp2bV9leGVjLAo+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IG51bV9mZW5j ZXMpOwo+ICsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoqCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIEBwcml2OiBkcml2ZXIgcHJpdmF0ZSBkYXRhIGZvciB0 aGUgQGZuIGNhbGxiYWNrCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB2b2lkICpwcml2Owo+ICvCoMKgwqDCoMKgwqDC oH0gZXh0cmE7Cj4gK307Cj4gKwo+ICsvKioKPiArICogZHJtX2dwdXZtX3ByZXBhcmVfdm0oKSAt IHByZXBhcmUgdGhlIEdQVVZNcyBjb21tb24gZG1hLXJlc3YKPiArICogQGdwdXZtOiB0aGUgJmRy bV9ncHV2bQo+ICsgKiBAZXhlYzogdGhlICZkcm1fZXhlYyBjb250ZXh0Cj4gKyAqIEBudW1fZmVu Y2VzOiB0aGUgYW1vdW50IG9mICZkbWFfZmVuY2VzIHRvIHJlc2VydmUKPiArICoKPiArICogQ2Fs bHMgZHJtX2V4ZWNfcHJlcGFyZV9vYmooKSBmb3IgdGhlIEdQVVZNcyBkdW1teQo+ICZkcm1fZ2Vt X29iamVjdC4KPiArICoKPiArICogVXNpbmcgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSwgaXQgaXMg dGhlIGRyaXZlcnMgcmVzcG9uc2liaWxpdHkgdG8KPiBjYWxsCj4gKyAqIGRybV9leGVjX2luaXQo KSBhbmQgZHJtX2V4ZWNfZmluaSgpIGFjY29yZGluZ2x5Lgo+ICsgKgo+ICsgKiBSZXR1cm5zOiAw IG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KPiArICovCj4gK3N0 YXRpYyBpbmxpbmUgaW50Cj4gK2RybV9ncHV2bV9wcmVwYXJlX3ZtKHN0cnVjdCBkcm1fZ3B1dm0g KmdwdXZtLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qg ZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHVuc2lnbmVkIGludCBudW1fZmVuY2VzKQo+ICt7Cj4gK8KgwqDCoMKgwqDCoMKgcmV0dXJuIGRy bV9leGVjX3ByZXBhcmVfb2JqKGV4ZWMsIGdwdXZtLT5yX29iaiwgbnVtX2ZlbmNlcyk7Cj4gK30K PiArCj4gK2ludCBkcm1fZ3B1dm1fcHJlcGFyZV9vYmplY3RzKHN0cnVjdCBkcm1fZ3B1dm0gKmdw dXZtLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBudW1fZmVuY2Vz KTsKPiArCj4gK2ludCBkcm1fZ3B1dm1fcHJlcGFyZV9yYW5nZShzdHJ1Y3QgZHJtX2dwdXZtICpn cHV2bSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCBzdHJ1Y3QgZHJtX2V4ZWMgKmV4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdTY0IGFkZHIsIHU2NCByYW5nZSwKPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBp bnQgbnVtX2ZlbmNlcyk7Cj4gKwo+ICtpbnQgZHJtX2dwdXZtX2V4ZWNfbG9jayhzdHJ1Y3QgZHJt X2dwdXZtX2V4ZWMgKnZtX2V4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgbnVtX2ZlbmNlcywKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJvb2wgaW50ZXJydXB0aWJsZSk7Cj4gKwo+ ICtpbnQgZHJtX2dwdXZtX2V4ZWNfbG9ja19hcnJheShzdHJ1Y3QgZHJtX2dwdXZtX2V4ZWMgKnZt X2V4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqKm9ianMsCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBu dW1fb2JqcywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IG51bV9mZW5jZXMsCj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJvb2wgaW50ZXJydXB0aWJs ZSk7Cj4gKwo+ICtpbnQgZHJtX2dwdXZtX2V4ZWNfbG9ja19yYW5nZShzdHJ1Y3QgZHJtX2dwdXZt X2V4ZWMgKnZtX2V4ZWMsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHU2NCBhZGRyLCB1NjQgcmFuZ2UsCj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCBu dW1fZmVuY2VzLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBib29sIGludGVycnVwdGlibGUpOwo+ICsKPiArLyoqCj4gKyAqIGRybV9n cHV2bV9leGVjX3VubG9jaygpIC0gbG9jayBhbGwgZG1hLXJlc3Ygb2YgYWxsIGFzc29pY2lhdGVk Cj4gQk9zCj4gKyAqIEB2bV9leGVjOiB0aGUgJmRybV9ncHV2bV9leGVjIHdyYXBwZXIKPiArICoK PiArICogUmVsZWFzZXMgYWxsIGRtYS1yZXN2IGxvY2tzIG9mIGFsbCAmZHJtX2dlbV9vYmplY3Rz IHByZXZpb3VzbHkKPiBhY3F1aXJlZAo+ICsgKiB0aHJvdWdoIGRybV9ncHV2bV9leGVjX2xvY2so KSBvciBpdHMgdmFyaWFudHMuCj4gKyAqCj4gKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgbmVn YXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgo+ICsgKi8KPiArc3RhdGljIGlubGluZSB2b2lk Cj4gK2RybV9ncHV2bV9leGVjX3VubG9jayhzdHJ1Y3QgZHJtX2dwdXZtX2V4ZWMgKnZtX2V4ZWMp Cj4gK3sKPiArwqDCoMKgwqDCoMKgwqBkcm1fZXhlY19maW5pKCZ2bV9leGVjLT5leGVjKTsKPiAr fQo+ICsKPiAraW50IGRybV9ncHV2bV92YWxpZGF0ZShzdHJ1Y3QgZHJtX2dwdXZtICpncHV2bSwg c3RydWN0IGRybV9leGVjCj4gKmV4ZWMpOwo+ICt2b2lkIGRybV9ncHV2bV9yZXN2X2FkZF9mZW5j ZShzdHJ1Y3QgZHJtX2dwdXZtICpncHV2bSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRybV9leGVjICpleGVjLAo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBz dHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBkbWFfcmVzdl91c2FnZSBwcml2YXRlX3Vz YWdlLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBlbnVtIGRtYV9yZXN2X3VzYWdlIGV4dG9ial91c2FnZSk7Cj4gKwo+ICsvKioKPiAr ICogZHJtX2dwdXZtX2V4ZWNfcmVzdl9hZGRfZmVuY2UoKQo+ICsgKiBAdm1fZXhlYzogdGhlICZk cm1fZ3B1dm1fZXhlYyB3cmFwcGVyCj4gKyAqIEBmZW5jZTogZmVuY2UgdG8gYWRkCj4gKyAqIEBw cml2YXRlX3VzYWdlOiBwcml2YXRlIGRtYS1yZXN2IHVzYWdlCj4gKyAqIEBleHRvYmpfdXNhZ2U6 IGV4dG9iaiBkbWEtcmVzdiB1c2FnZQo+ICsgKgo+ICsgKiBTZWUgZHJtX2dwdXZtX3Jlc3ZfYWRk X2ZlbmNlKCkuCj4gKyAqLwo+ICtzdGF0aWMgaW5saW5lIHZvaWQKPiArZHJtX2dwdXZtX2V4ZWNf cmVzdl9hZGRfZmVuY2Uoc3RydWN0IGRybV9ncHV2bV9leGVjICp2bV9leGVjLAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qg ZG1hX2ZlbmNlICpmZW5jZSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgZW51bSBkbWFfcmVzdl91c2FnZSBwcml2YXRlX3VzYWdlLAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBlbnVtIGRtYV9yZXN2X3VzYWdlIGV4dG9ial91c2FnZSkKPiArewo+ICvCoMKgwqDCoMKgwqDC oGRybV9ncHV2bV9yZXN2X2FkZF9mZW5jZSh2bV9leGVjLT52bSwgJnZtX2V4ZWMtPmV4ZWMsIGZl bmNlLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBwcml2YXRlX3VzYWdlLCBleHRvYmpfdXNhZ2UpOwo+ICt9Cj4gKwo+ICsv KioKPiArICogZHJtX2dwdXZtX2V4ZWNfdmFsaWRhdGUoKQo+ICsgKiBAdm1fZXhlYzogdGhlICZk cm1fZ3B1dm1fZXhlYyB3cmFwcGVyCj4gKyAqCj4gKyAqIFNlZSBkcm1fZ3B1dm1fdmFsaWRhdGUo KS4KPiArICovCj4gK3N0YXRpYyBpbmxpbmUgaW50Cj4gK2RybV9ncHV2bV9leGVjX3ZhbGlkYXRl KHN0cnVjdCBkcm1fZ3B1dm1fZXhlYyAqdm1fZXhlYykKPiArewo+ICvCoMKgwqDCoMKgwqDCoHJl dHVybiBkcm1fZ3B1dm1fdmFsaWRhdGUodm1fZXhlYy0+dm0sICZ2bV9leGVjLT5leGVjKTsKPiAr fQo+ICsKPiDCoC8qKgo+IMKgICogc3RydWN0IGRybV9ncHV2bV9ibyAtIHN0cnVjdHVyZSByZXBy ZXNlbnRpbmcgYSAmZHJtX2dwdXZtIGFuZAo+IMKgICogJmRybV9nZW1fb2JqZWN0IGNvbWJpbmF0 aW9uCj4gQEAgLTQzNSw2ICs2MzAsMTIgQEAgc3RydWN0IGRybV9ncHV2bV9ibyB7Cj4gwqDCoMKg wqDCoMKgwqDCoCAqLwo+IMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9i ajsKPiDCoAo+ICvCoMKgwqDCoMKgwqDCoC8qKgo+ICvCoMKgwqDCoMKgwqDCoCAqIEBldmljdGVk OiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgJmRybV9nZW1fb2JqZWN0IGlzCj4gZXZpY3RlZDsgZmll bGQKPiArwqDCoMKgwqDCoMKgwqAgKiBwcm90ZWN0ZWQgYnkgdGhlICZkcm1fZ2VtX29iamVjdCdz IGRtYS1yZXN2IGxvY2suCj4gK8KgwqDCoMKgwqDCoMKgICovCj4gK8KgwqDCoMKgwqDCoMKgYm9v bCBldmljdGVkOwo+ICsKPiDCoMKgwqDCoMKgwqDCoMKgLyoqCj4gwqDCoMKgwqDCoMKgwqDCoCAq IEBrcmVmOiBUaGUgcmVmZXJlbmNlIGNvdW50IGZvciB0aGlzICZkcm1fZ3B1dm1fYm8uCj4gwqDC oMKgwqDCoMKgwqDCoCAqLwo+IEBAIC00NTksNiArNjYwLDE4IEBAIHN0cnVjdCBkcm1fZ3B1dm1f Ym8gewo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAq IGdwdXZhIGxpc3QuCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICovCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgc3RydWN0IGxpc3RfaGVhZCBnZW07Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoqCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgKiBAZXZpY3Q6IExpc3QgZW50cnkgdG8gYXR0YWNoIHRvIHRoZQo+ ICZkcm1fZ3B1dm1zCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgKiBleHRvYmogbGlzdC4KPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgc3RydWN0IGxpc3RfaGVhZCBleHRvYmo7Cj4gKwo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyoqCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBAZXZpY3Q6IExpc3QgZW50cnkgdG8gYXR0YWNo IHRvIHRoZQo+ICZkcm1fZ3B1dm1zIGV2aWN0Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBsaXN0Lgo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICovCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBzdHJ1Y3QgbGlzdF9oZWFkIGV2aWN0Owo+IMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgfSBlbnRyeTsKPiDCoMKgwqDCoMKgwqDCoMKgfSBsaXN0Owo+IMKg fTsKPiBAQCAtNDkzLDYgKzcwNiwyNyBAQCBzdHJ1Y3QgZHJtX2dwdXZtX2JvICoKPiDCoGRybV9n cHV2bV9ib19maW5kKHN0cnVjdCBkcm1fZ3B1dm0gKmdwdXZtLAo+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpvYmopOwo+IMKgCj4gK3Zv aWQgZHJtX2dwdXZtX2JvX2V2aWN0KHN0cnVjdCBkcm1fZ3B1dm1fYm8gKnZtX2JvLCBib29sIGV2 aWN0KTsKPiArCj4gKy8qKgo+ICsgKiBkcm1fZ3B1dm1fYm9fZ2VtX2V2aWN0KCkKPiArICogQG9i ajogdGhlICZkcm1fZ2VtX29iamVjdAo+ICsgKiBAZXZpY3Q6IGluZGljYXRlcyB3aGV0aGVyIEBv YmogaXMgZXZpY3RlZAo+ICsgKgo+ICsgKiBTZWUgZHJtX2dwdXZtX2JvX2V2aWN0KCkuCj4gKyAq Lwo+ICtzdGF0aWMgaW5saW5lIHZvaWQKPiArZHJtX2dwdXZtX2JvX2dlbV9ldmljdChzdHJ1Y3Qg ZHJtX2dlbV9vYmplY3QgKm9iaiwgYm9vbCBldmljdCkKPiArewo+ICvCoMKgwqDCoMKgwqDCoHN0 cnVjdCBkcm1fZ3B1dm1fYm8gKnZtX2JvOwo+ICsKPiArwqDCoMKgwqDCoMKgwqBkcm1fZ2VtX2dw dXZhX2Fzc2VydF9sb2NrX2hlbGQob2JqKTsKPiArwqDCoMKgwqDCoMKgwqBkcm1fZ2VtX2Zvcl9l YWNoX2dwdXZtX2JvKHZtX2JvLCBvYmopCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGRybV9ncHV2bV9ib19ldmljdCh2bV9ibywgZXZpY3QpOwo+ICt9Cj4gKwo+ICt2b2lkIGRybV9n cHV2bV9ib19leHRvYmpfYWRkKHN0cnVjdCBkcm1fZ3B1dm1fYm8gKnZtX2JvKTsKPiArCj4gwqAv KioKPiDCoCAqIGRybV9ncHV2bV9ib19mb3JfZWFjaF92YSgpIC0gaXRlcmF0b3IgdG8gd2FsayBv dmVyIGEgbGlzdCBvZgo+ICZkcm1fZ3B1dmEKPiDCoCAqIEB2YV9fOiAmZHJtX2dwdXZhIHN0cnVj dHVyZSB0byBhc3NpZ24gdG8gaW4gZWFjaCBpdGVyYXRpb24gc3RlcAo+IEBAIC04NTUsNiArMTA4 OSwxOCBAQCBzdHJ1Y3QgZHJtX2dwdXZtX29wcyB7Cj4gwqDCoMKgwqDCoMKgwqDCoCAqLwo+IMKg wqDCoMKgwqDCoMKgwqB2b2lkICgqdm1fYm9fZnJlZSkoc3RydWN0IGRybV9ncHV2bV9ibyAqdm1f Ym8pOwo+IMKgCj4gK8KgwqDCoMKgwqDCoMKgLyoqCj4gK8KgwqDCoMKgwqDCoMKgICogQHZtX2Jv X3ZhbGlkYXRlOiBjYWxsZWQgZnJvbSBkcm1fZ3B1dm1fdmFsaWRhdGUoKQo+ICvCoMKgwqDCoMKg wqDCoCAqCj4gK8KgwqDCoMKgwqDCoMKgICogRHJpdmVycyByZWNlaXZlIHRoaXMgY2FsbGJhY2sg Zm9yIGV2ZXJ5IGV2aWN0ZWQKPiAmZHJtX2dlbV9vYmplY3QgYmVpbmcKPiArwqDCoMKgwqDCoMKg wqAgKiBtYXBwZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgJmRybV9ncHV2bS4KPiArwqDCoMKgwqDC oMKgwqAgKgo+ICvCoMKgwqDCoMKgwqDCoCAqIFR5cGljYWxseSwgZHJpdmVycyB3b3VsZCBjYWxs IHRoZWlyIGRyaXZlciBzcGVjaWZpYwo+IHZhcmlhbnQgb2YKPiArwqDCoMKgwqDCoMKgwqAgKiB0 dG1fYm9fdmFsaWRhdGUoKSBmcm9tIHdpdGhpbiB0aGlzIGNhbGxiYWNrLgo+ICvCoMKgwqDCoMKg wqDCoCAqLwo+ICvCoMKgwqDCoMKgwqDCoGludCAoKnZtX2JvX3ZhbGlkYXRlKShzdHJ1Y3QgZHJt X2dwdXZtX2JvICp2bV9ibywKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGRybV9leGVjICpleGVjKTsKPiArCj4gwqDCoMKg wqDCoMKgwqDCoC8qKgo+IMKgwqDCoMKgwqDCoMKgwqAgKiBAc21fc3RlcF9tYXA6IGNhbGxlZCBm cm9tICZkcm1fZ3B1dm1fc21fbWFwIHRvIGZpbmFsbHkKPiBpbnNlcnQgdGhlCj4gwqDCoMKgwqDC oMKgwqDCoCAqIG1hcHBpbmcgb25jZSBhbGwgcHJldmlvdXMgc3RlcHMgd2VyZSBjb21wbGV0ZWQK Cg==