From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 309A1C4167B for ; Wed, 6 Dec 2023 15:45:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:References:Cc:To:From: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=p49yxXwNIltvz6IhOtIMbqEghVy+KmBow9gbrRuGF90=; b=44pcNedaCoCiI3 zKT33hPzhIVIdtHCenALNyORpOO1qZ47ve4HQ3dCQ7+u0erUJiipqUiWEHcOhraVZGsSKJeYWYyZD R3A57plqJTAB40kHCOFt55Ke67YdFGQ0Ev84W110j9a0/G4gxG9UaF6B762+0P9/JaKrm3OOZOCJ0 rIsFH+jYPmBFtjLSya9V2x9gyPyTOPwuGR6+1bv1OVlRA/Pzgh09WUy7cVsLZ7wVCNYLurJ0gt6CB 5pdtV4gysmAfWm0o6PTmOfugNcrCtAsKxmPi+eVg25I6ih9f2H6XburKU4XjunAGOhUD+Hyv1sLTo 53r80KuwAco/aRhGc6xA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rAu51-00Aex8-21; Wed, 06 Dec 2023 15:44:55 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1rAu4x-00Aevm-1A for linux-arm-kernel@lists.infradead.org; Wed, 06 Dec 2023 15:44:54 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 0A21C143D; Wed, 6 Dec 2023 07:45:35 -0800 (PST) Received: from [10.57.73.130] (unknown [10.57.73.130]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id B8AB83F5A1; Wed, 6 Dec 2023 07:44:45 -0800 (PST) Message-ID: <5c06e3fc-e8f0-4896-ab71-2317a71e812a@arm.com> Date: Wed, 6 Dec 2023 15:44:44 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v8 04/10] mm: thp: Support allocation of anonymous multi-size THP Content-Language: en-GB From: Ryan Roberts To: David Hildenbrand , Andrew Morton , Matthew Wilcox , Yin Fengwei , Yu Zhao , Catalin Marinas , Anshuman Khandual , Yang Shi , "Huang, Ying" , Zi Yan , Luis Chamberlain , Itaru Kitayama , "Kirill A. Shutemov" , John Hubbard , David Rientjes , Vlastimil Babka , Hugh Dickins , Kefeng Wang , Barry Song <21cnbao@gmail.com>, Alistair Popple Cc: linux-mm@kvack.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org References: <20231204102027.57185-1-ryan.roberts@arm.com> <20231204102027.57185-5-ryan.roberts@arm.com> <71040a8c-4ea1-4f21-8ac8-65f7c25c217e@redhat.com> In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231206_074451_501252_25DEE954 X-CRM114-Status: GOOD ( 54.35 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMDYvMTIvMjAyMyAxNDoxOSwgUnlhbiBSb2JlcnRzIHdyb3RlOgo+IE9uIDA1LzEyLzIwMjMg MTY6MzIsIERhdmlkIEhpbGRlbmJyYW5kIHdyb3RlOgo+PiBPbiAwNC4xMi4yMyAxMToyMCwgUnlh biBSb2JlcnRzIHdyb3RlOgo+Pj4gSW50cm9kdWNlIHRoZSBsb2dpYyB0byBhbGxvdyBUSFAgdG8g YmUgY29uZmlndXJlZCAodGhyb3VnaCB0aGUgbmV3IHN5c2ZzCj4+PiBpbnRlcmZhY2Ugd2UganVz dCBhZGRlZCkgdG8gYWxsb2NhdGUgbGFyZ2UgZm9saW9zIHRvIGJhY2sgYW5vbnltb3VzCj4+PiBt ZW1vcnksIHdoaWNoIGFyZSBsYXJnZXIgdGhhbiB0aGUgYmFzZSBwYWdlIHNpemUgYnV0IHNtYWxs ZXIgdGhhbgo+Pj4gUE1ELXNpemUuIFdlIGNhbGwgdGhpcyBuZXcgVEhQIGV4dGVuc2lvbiAibXVs dGktc2l6ZSBUSFAiIChtVEhQKS4KPj4+Cj4+PiBtVEhQIGNvbnRpbnVlcyB0byBiZSBQVEUtbWFw cGVkLCBidXQgaW4gbWFueSBjYXNlcyBjYW4gc3RpbGwgcHJvdmlkZQo+Pj4gc2ltaWxhciBiZW5l Zml0cyB0byB0cmFkaXRpb25hbCBQTUQtc2l6ZWQgVEhQOiBQYWdlIGZhdWx0cyBhcmUKPj4+IHNp Z25pZmljYW50bHkgcmVkdWNlZCAoYnkgYSBmYWN0b3Igb2YgZS5nLiA0LCA4LCAxNiwgZXRjLiBk ZXBlbmRpbmcgb24KPj4+IHRoZSBjb25maWd1cmVkIG9yZGVyKSwgYnV0IGxhdGVuY3kgc3Bpa2Vz IGFyZSBtdWNoIGxlc3MgcHJvbWluZW50Cj4+PiBiZWNhdXNlIHRoZSBzaXplIG9mIGVhY2ggcGFn ZSBpc24ndCBhcyBodWdlIGFzIHRoZSBQTUQtc2l6ZWQgdmFyaWFudCBhbmQKPj4+IHRoZXJlIGlz IGxlc3MgbWVtb3J5IHRvIGNsZWFyIGluIGVhY2ggcGFnZSBmYXVsdC4gVGhlIG51bWJlciBvZiBw ZXItcGFnZQo+Pj4gb3BlcmF0aW9ucyAoZS5nLiByZWYgY291bnRpbmcsIHJtYXAgbWFuYWdlbWVu dCwgbHJ1IGxpc3QgbWFuYWdlbWVudCkgYXJlCj4+PiBhbHNvIHNpZ25pZmljYW50bHkgcmVkdWNl ZCBzaW5jZSB0aG9zZSBvcHMgbm93IGJlY29tZSBwZXItZm9saW8uCj4+Pgo+Pj4gU29tZSBhcmNo aXRlY3R1cmVzIGFsc28gZW1wbG95IFRMQiBjb21wcmVzc2lvbiBtZWNoYW5pc21zIHRvIHNxdWVl emUKPj4+IG1vcmUgZW50cmllcyBpbiB3aGVuIGEgc2V0IG9mIFBURXMgYXJlIHZpcnR1YWxseSBh bmQgcGh5c2ljYWxseQo+Pj4gY29udGlndW91cyBhbmQgYXBwcm9wb3JpYXRlbHkgYWxpZ25lZC4g SW4gdGhpcyBjYXNlLCBUTEIgbWlzc2VzIHdpbGwKPj4+IG9jY3VyIGxlc3Mgb2Z0ZW4uCj4+Pgo+ Pj4gVGhlIG5ldyBiZWhhdmlvdXIgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYnV0IGNhbiBiZSBl bmFibGVkIGF0IHJ1bnRpbWUKPj4+IGJ5IHdyaXRpbmcgdG8gL3N5cy9rZXJuZWwvbW0vdHJhbnNw YXJlbnRfaHVnZXBhZ2UvaHVnZXBhZ2UtWFhrYi9lbmFibGVkCj4+PiAoc2VlIGRvY3VtZW50YXRp b24gaW4gcHJldmlvdXMgY29tbWl0KS4gVGhlIGxvbmcgdGVybSBhaW0gaXMgdG8gY2hhbmdlCj4+ PiB0aGUgZGVmYXVsdCB0byBpbmNsdWRlIHN1aXRhYmxlIGxvd2VyIG9yZGVycywgYnV0IHRoZXJl IGFyZSBzb21lIHJpc2tzCj4+PiBhcm91bmQgaW50ZXJuYWwgZnJhZ21lbnRhdGlvbiB0aGF0IG5l ZWQgdG8gYmUgYmV0dGVyIHVuZGVyc3Rvb2QgZmlyc3QuCj4+Pgo+Pj4gU2lnbmVkLW9mZi1ieTog UnlhbiBSb2JlcnRzIDxyeWFuLnJvYmVydHNAYXJtLmNvbT4KPj4KPj4gSW4gZ2VuZXJhbCwgbG9v a3MgZ29vZCB0byBtZSwgc29tZSBjb21tZW50cy9uaXRzLiBBbmQgdGhlIHVzdWFsICJsZXQncyBt YWtlIHN1cmUKPj4gd2UgZG9uJ3QgZGVncmFkZSBvcmRlci0wIGFuZCBrZWVwIHRoYXQgYXMgZmFz dCBhcyBwb3NzaWJsZSIgY29tbWVudC4KPj4KPj4+IC0tLQo+Pj4gwqAgaW5jbHVkZS9saW51eC9o dWdlX21tLmggfMKgwqAgNiArKy0KPj4+IMKgIG1tL21lbW9yeS5jwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHwgMTA2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0KPj4+ IMKgIDIgZmlsZXMgY2hhbmdlZCwgMTAxIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQo+ Pj4KPj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2h1Z2VfbW0uaCBiL2luY2x1ZGUvbGlu dXgvaHVnZV9tbS5oCj4+PiBpbmRleCBiZDBlYWRkM2JlZmIuLjkxYTUzYjk4MzVhNCAxMDA2NDQK Pj4+IC0tLSBhL2luY2x1ZGUvbGludXgvaHVnZV9tbS5oCj4+PiArKysgYi9pbmNsdWRlL2xpbnV4 L2h1Z2VfbW0uaAo+Pj4gQEAgLTY4LDkgKzY4LDExIEBAIGV4dGVybiBzdHJ1Y3Qga29ial9hdHRy aWJ1dGUgc2htZW1fZW5hYmxlZF9hdHRyOwo+Pj4gwqAgI2RlZmluZSBIUEFHRV9QTURfTlIgKDE8 PEhQQUdFX1BNRF9PUkRFUikKPj4+IMKgIMKgIC8qCj4+PiAtICogTWFzayBvZiBhbGwgbGFyZ2Ug Zm9saW8gb3JkZXJzIHN1cHBvcnRlZCBmb3IgYW5vbnltb3VzIFRIUC4KPj4+ICsgKiBNYXNrIG9m IGFsbCBsYXJnZSBmb2xpbyBvcmRlcnMgc3VwcG9ydGVkIGZvciBhbm9ueW1vdXMgVEhQOyBhbGwg b3JkZXJzIHVwIHRvCj4+PiArICogYW5kIGluY2x1ZGluZyBQTURfT1JERVIsIGV4Y2VwdCBvcmRl ci0wICh3aGljaCBpcyBub3QgImh1Z2UiKSBhbmQgb3JkZXItMQo+Pj4gKyAqICh3aGljaCBpcyBh IGxpbWl0YXRpb24gb2YgdGhlIFRIUCBpbXBsZW1lbnRhdGlvbikuCj4+PiDCoMKgICovCj4+PiAt I2RlZmluZSBUSFBfT1JERVJTX0FMTF9BTk9OwqDCoMKgIEJJVChQTURfT1JERVIpCj4+PiArI2Rl ZmluZSBUSFBfT1JERVJTX0FMTF9BTk9OwqDCoMKgICgoQklUKFBNRF9PUkRFUiArIDEpIC0gMSkg JiB+KEJJVCgwKSB8IEJJVCgxKSkpCj4+PiDCoCDCoCAvKgo+Pj4gwqDCoCAqIE1hc2sgb2YgYWxs IGxhcmdlIGZvbGlvIG9yZGVycyBzdXBwb3J0ZWQgZm9yIGZpbGUgVEhQLgo+Pj4gZGlmZiAtLWdp dCBhL21tL21lbW9yeS5jIGIvbW0vbWVtb3J5LmMKPj4+IGluZGV4IDNjZWViMGY0NWJmNS4uYmY3 ZTkzODEzMDE4IDEwMDY0NAo+Pj4gLS0tIGEvbW0vbWVtb3J5LmMKPj4+ICsrKyBiL21tL21lbW9y eS5jCj4+PiBAQCAtNDEyNSw2ICs0MTI1LDg0IEBAIHZtX2ZhdWx0X3QgZG9fc3dhcF9wYWdlKHN0 cnVjdCB2bV9mYXVsdCAqdm1mKQo+Pj4gwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+Pj4gwqAgfQo+ Pj4gwqAgK3N0YXRpYyBib29sIHB0ZV9yYW5nZV9ub25lKHB0ZV90ICpwdGUsIGludCBucl9wYWdl cykKPj4+ICt7Cj4+PiArwqDCoMKgIGludCBpOwo+Pj4gKwo+Pj4gK8KgwqDCoCBmb3IgKGkgPSAw OyBpIDwgbnJfcGFnZXM7IGkrKykgewo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmICghcHRlX25vbmUo cHRlcF9nZXRfbG9ja2xlc3MocHRlICsgaSkpKQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuIGZhbHNlOwo+Pj4gK8KgwqDCoCB9Cj4+PiArCj4+PiArwqDCoMKgIHJldHVybiB0cnVl Owo+Pj4gK30KPj4+ICsKPj4+ICsjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCj4+ PiArc3RhdGljIHN0cnVjdCBmb2xpbyAqYWxsb2NfYW5vbl9mb2xpbyhzdHJ1Y3Qgdm1fZmF1bHQg KnZtZikKPj4+ICt7Cj4+PiArwqDCoMKgIGdmcF90IGdmcDsKPj4+ICvCoMKgwqAgcHRlX3QgKnB0 ZTsKPj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyBhZGRyOwo+Pj4gK8KgwqDCoCBzdHJ1Y3QgZm9s aW8gKmZvbGlvOwo+Pj4gK8KgwqDCoCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IHZtZi0+ dm1hOwo+Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIG9yZGVyczsKPj4+ICvCoMKgwqAgaW50IG9y ZGVyOwo+Pgo+PiBOaXQ6IHJldmVyc2UgY2hyaXN0bWFzIHRyZWUgZW5jb3VyYWdlZCA7KQo+IAo+ IEFDSyB3aWxsIGZpeC4KPiAKPj4KPj4+ICsKPj4+ICvCoMKgwqAgLyoKPj4+ICvCoMKgwqDCoCAq IElmIHVmZmQgaXMgYWN0aXZlIGZvciB0aGUgdm1hIHdlIG5lZWQgcGVyLXBhZ2UgZmF1bHQgZmlk ZWxpdHkgdG8KPj4+ICvCoMKgwqDCoCAqIG1haW50YWluIHRoZSB1ZmZkIHNlbWFudGljcy4KPj4+ ICvCoMKgwqDCoCAqLwo+Pj4gK8KgwqDCoCBpZiAodXNlcmZhdWx0ZmRfYXJtZWQodm1hKSkKPj4K Pj4gTml0OiB1bmxpa2VseSgpCj4gCj4gQUNLIHdpbGwgZml4Lgo+IAo+Pgo+Pj4gK8KgwqDCoMKg wqDCoMKgIGdvdG8gZmFsbGJhY2s7Cj4+PiArCj4+PiArwqDCoMKgIC8qCj4+PiArwqDCoMKgwqAg KiBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgKGxhcmdlKSBvcmRlcnMgYmVsb3cgUE1EX09SREVSIHRo YXQgYXJlIGVuYWJsZWQKPj4+ICvCoMKgwqDCoCAqIGZvciB0aGlzIHZtYS4gVGhlbiBmaWx0ZXIg b3V0IHRoZSBvcmRlcnMgdGhhdCBjYW4ndCBiZSBhbGxvY2F0ZWQgb3Zlcgo+Pj4gK8KgwqDCoMKg ICogdGhlIGZhdWx0aW5nIGFkZHJlc3MgYW5kIHN0aWxsIGJlIGZ1bGx5IGNvbnRhaW5lZCBpbiB0 aGUgdm1hLgo+Pj4gK8KgwqDCoMKgICovCj4+PiArwqDCoMKgIG9yZGVycyA9IHRocF92bWFfYWxs b3dhYmxlX29yZGVycyh2bWEsIHZtYS0+dm1fZmxhZ3MsIGZhbHNlLCB0cnVlLCB0cnVlLAo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBCSVQoUE1EX09SREVS KSAtIDEpOwo+Pj4gK8KgwqDCoCBvcmRlcnMgPSB0aHBfdm1hX3N1aXRhYmxlX29yZGVycyh2bWEs IHZtZi0+YWRkcmVzcywgb3JkZXJzKTsKPj4KPj4gQ29tbWVudDogQm90aCB3aWxsIGV2ZW50dWFs bHkgbG9vcCBvdmVyIGFsbCBvcmRlcnMsIGNvcnJlY3Q/IENvdWxkIGV2ZW50dWFsbHkgYmUKPj4g c3BlZCB1cCBpbiB0aGUgZnV0dXJlLgo+IAo+IE5vIG9ubHkgdGhwX3ZtYV9zdWl0YWJsZV9vcmRl cnMoKSB3aWxsIGxvb3AuIHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIG9ubHkKPiBsb29wcyBp ZiBpbl9wZj1mYWxzZSAoaXQncyB0cnVlIGhlcmUpLgo+IAo+Pgo+PiBOaXQ6IHRoZSBvcmRlcnMg PSAuLi4gb3JkZXIgPSAuLi4gbG9va3MgbGlrZSB0aGlzIG1pZ2h0IGRlc2VydmUgYSBoZWxwZXIK Pj4gZnVuY3Rpb24gdGhhdCBtYWtlcyB0aGlzIGVhc2llciB0byByZWFkLgo+IAo+IFRvIGJlIGhv bmVzdCwgdGhlIGV4aXN0aW5nIGZ1bmN0aW9uIHRoYXQgSSd2ZSBtb2RpZmllZCBpcyBhIGJpdCBv ZiBhIG1lc3MuCj4gdGhwX3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgY2FsbHMgdGhwX3ZtYV9zdWl0 YWJsZV9vcmRlcnMoKSBpZiB3ZSBhcmUgbm90IGluIGEKPiBwYWdlIGZhdWx0LCBiZWNhdXNlIHRo ZSBwYWdlIGZhdWx0IGhhbmRsZXJzIGFscmVhZHkgZG8gdGhhdCBjaGVjayB0aGVtc2VsdmVzLiBJ dAo+IHdvdWxkIGJlIG5pY2UgdG8gcmVmYWN0b3IgdGhlIHdob2xlIHRoaW5nIHNvIHRoYXQgdGhw X3ZtYV9hbGxvd2FibGVfb3JkZXJzKCkgaXMKPiBhIHN0cmljdCBzdXBlcnNldCBvZiB0aHBfdm1h X3N1aXRhYmxlX29yZGVycygpLiBUaGVuIHRoaXMgY2FuIGp1c3QgY2FsbAo+IHRocF92bWFfYWxs b3dhYmxlX29yZGVycygpLiBCdXQgdGhhdCdzIGdvaW5nIHRvIHN0YXJ0IHRvdWNoaW5nIHRoZSBQ TUQgYW5kIFBVRAo+IGhhbmRsZXJzLCBzbyBwcmVmZXIgaWYgd2UgbGVhdmUgdGhhdCBmb3IgYSBz ZXBhcmF0ZSBwYXRjaCBzZXQuCj4gCj4+Cj4+IE5pdDogV2h5IGNhbGwgdGhwX3ZtYV9zdWl0YWJs ZV9vcmRlcnMgaWYgdGhlIG9yZGVycyBhcmUgYWxyZWFkeSAwPyBBZ2Fpbiwgc29tZQo+PiBoZWxw ZXIgbWlnaHQgYmUgcmVhc29uYWJsZSB3aGVyZSB0aGF0IGlzIGhhbmRsZWQgaW50ZXJuYWxseS4K PiAKPiBCZWNhdXNlIHRocF92bWFfc3VpdGFibGVfb3JkZXJzKCkgd2lsbCBoYW5kbGUgaXQgc2Fm ZWx5IGFuZCBpcyBpbmxpbmUsIHNvIGl0Cj4gc2hvdWxkIGp1c3QgYXMgZWZmaWNpZW50PyBUaGlz IHdvdWxkIGdvIGF3YXkgd2l0aCB0aGUgcmVmYWN0b3JpbmcgZGVzY3JpYmVkIGFib3ZlLgo+IAo+ Pgo+PiBDb21tZW50OiBGb3Igb3JkZXItMCB3ZSdsbCBhbHdheXMgcGVyZm9ybSBhIGZ1bmN0aW9u IGNhbGwgdG8gYm90aAo+PiB0aHBfdm1hX2FsbG93YWJsZV9vcmRlcnMoKSAvIHRocF92bWFfc3Vp dGFibGVfb3JkZXJzKCkuIFdlIHNob3VsZCBwZXJmb3JtIHNvbWUKPj4gZmFzdCBhbmQgZWZmaWNp ZW50IGNoZWNrIGlmIGFueSA8UE1EIFRIUCBhcmUgZXZlbiBlbmFibGVkIGluIHRoZSBzeXN0ZW0g LyBmb3IKPj4gdGhpcyBWTUEsIGFuZCBpbiB0aGF0IGNhc2UganVzdCBmYWxsYmFjayBiZWZvcmUg ZG9pbmcgbW9yZSBleHBlbnNpdmUgY2hlY2tzLgo+IAoKSSBqdXN0IG5vdGljZWQgSSBnb3QgdGhl c2UgZnVuY3Rpb25zIHJvdW5kIHRoZSB3cm9uZyB3YXkgaW4gbXkgcHJldmlvdXMgcmVzcG9uc2U6 Cgo+IHRocF92bWFfYWxsb3dhYmxlX29yZGVycygpIGlzIGlubGluZSBhcyB5b3UgbWVudGlvbmVk LgoKXiBNZWFudCB0aHBfdm1hX3N1aXRhYmxlX29yZGVycygpIGhlcmUuCgo+IAo+IEkgd2FzIGRl bGliZXJhdGVseSB0cnlpbmcgdG8ga2VlcCBhbGwgdGhlIGRlY2lzaW9uIGxvZ2ljIGluIG9uZSBw bGFjZQo+ICh0aHBfdm1hX3N1aXRhYmxlX29yZGVycykgYmVjYXVzZSBpdCdzIGFscmVhZHkgcHJl dHR5IGNvbXBsaWNhdGVkLiBCdXQgaWYgeW91CgpeIE1lYW50IHRocF92bWFfYWxsb3dhYmxlX29y ZGVycygpIGhlcmUuCgpTb3JyeSBmb3IgdGhlIGNvbmZ1c2lvbi4KCj4gaW5zaXN0LCBob3cgYWJv dXQgdGhpcyBpbiB0aGUgaGVhZGVyOgo+IAo+IHN0YXRpYyBpbmxpbmUKPiB1bnNpZ25lZCBsb25n IHRocF92bWFfYWxsb3dhYmxlX29yZGVycyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKPiAJ CQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MsIGJvb2wgc21hcHMsCj4gCQkJCSAgICAg ICBib29sIGluX3BmLCBib29sIGVuZm9yY2Vfc3lzZnMsCj4gCQkJCSAgICAgICB1bnNpZ25lZCBs b25nIG9yZGVycykKPiB7Cj4gCS8qIE9wdGltaXphdGlvbiB0byBjaGVjayBpZiByZXF1aXJlZCBv cmRlcnMgYXJlIGVuYWJsZWQgZWFybHkuICovCj4gCWlmIChlbmZvcmNlX3N5c2ZzICYmIHZtYV9p c19hbm9ueW1vdXModm1hKSkgewo+IAkJdW5zaWduZWQgbG9uZyBtYXNrID0gUkVBRF9PTkNFKGh1 Z2VfYW5vbl9vcmRlcnNfYWx3YXlzKTsKPiAKPiAJCWlmICh2bV9mbGFncyAmIFZNX0hVR0VQQUdF KQo+IAkJCW1hc2sgfD0gUkVBRF9PTkNFKGh1Z2VfYW5vbl9vcmRlcnNfbWFkdmlzZSk7Cj4gCQlp ZiAoaHVnZXBhZ2VfZ2xvYmFsX2Fsd2F5cygpIHx8Cj4gCQkJKCh2bV9mbGFncyAmIFZNX0hVR0VQ QUdFKSAmJiBodWdlcGFnZV9nbG9iYWxfZW5hYmxlZCgpKSkKPiAJCQltYXNrIHw9IFJFQURfT05D RShodWdlX2Fub25fb3JkZXJzX2luaGVyaXQpOwo+IAo+IAkJb3JkZXJzICY9IG1hc2s7Cj4gCQlp ZiAoIW9yZGVycykKPiAJCQlyZXR1cm4gMDsKPiAJCQo+IAkJZW5mb3JjZV9zeXNmcyA9IGZhbHNl Owo+IAl9Cj4gCj4gCXJldHVybiBfX3RocF92bWFfYWxsb3dhYmxlX29yZGVycyh2bWEsIHZtX2Zs YWdzLCBzbWFwcywgaW5fcGYsCj4gCQkJCQkgIGVuZm9yY2Vfc3lzZnMsIG9yZGVycyk7Cj4gfQo+ IAo+IFRoZW4gdGhlIGFib3ZlIGNoZWNrIGNhbiBiZSByZW1vdmVkIGZyb20gX190aHBfdm1hX2Fs bG93YWJsZV9vcmRlcnMoKSAtIGl0IHdpbGwKPiBzdGlsbCByZXRhaW4gdGhlIGBpZiAoZW5mb3Jj ZV9zeXNmcyAmJiAhdm1hX2lzX2Fub255bW91cyh2bWEpKWAgcGFydC4KPiAKPiAKPj4KPj4+ICsK Pj4+ICvCoMKgwqAgaWYgKCFvcmRlcnMpCj4+PiArwqDCoMKgwqDCoMKgwqAgZ290byBmYWxsYmFj azsKPj4+ICsKPj4+ICvCoMKgwqAgcHRlID0gcHRlX29mZnNldF9tYXAodm1mLT5wbWQsIHZtZi0+ YWRkcmVzcyAmIFBNRF9NQVNLKTsKPj4+ICvCoMKgwqAgaWYgKCFwdGUpCj4+PiArwqDCoMKgwqDC oMKgwqAgcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Cj4+PiArCj4+PiArwqDCoMKgIG9yZGVyID0g Zmlyc3Rfb3JkZXIob3JkZXJzKTsKPj4+ICvCoMKgwqAgd2hpbGUgKG9yZGVycykgewo+Pj4gK8Kg wqDCoMKgwqDCoMKgIGFkZHIgPSBBTElHTl9ET1dOKHZtZi0+YWRkcmVzcywgUEFHRV9TSVpFIDw8 IG9yZGVyKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB2bWYtPnB0ZSA9IHB0ZSArIHB0ZV9pbmRleChh ZGRyKTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAocHRlX3JhbmdlX25vbmUodm1mLT5wdGUsIDEg PDwgb3JkZXIpKQo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+Cj4+IENvbW1l bnQ6IExpa2VseSBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIHNjYW4gb25seSBvbmNlIGFuZCBkZXRl cm1pbmUgdGhlICJsYXJnZXN0Cj4+IG5vbmUgcmFuZ2UiIGFyb3VuZCB0aGF0IGFkZHJlc3MsIGhh dmluZyB0aGUgbGFyZ2VzdCBzdWl0YWJsZSBvcmRlciBpbiBtaW5kLgo+IAo+IFllcywgdGhhdCdz IGhvdyBJIHVzZWQgdG8gZG8gaXQsIGJ1dCBZdSBaaG91IHJlcXVlc3RlZCBzaW1wbGlmeWluZyB0 byB0aGlzLAo+IElJUkMuIFBlcmhhcHMgdGhpcyBhbiBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdHkg Zm9yIGxhdGVyPwo+IAo+Pgo+Pj4gK8KgwqDCoMKgwqDCoMKgIG9yZGVyID0gbmV4dF9vcmRlcigm b3JkZXJzLCBvcmRlcik7Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4+ICvCoMKgwqAgdm1mLT5wdGUg PSBOVUxMOwo+Pgo+PiBOaXQ6IENhbiB5b3UgZWxhYm9yYXRlIHdoeSB5b3UgYXJlIG1lc3Npbmcg d2l0aCB2bWYtPnB0ZSBoZXJlPyBBIHNpbXBsZSBoZWxwZXIKPj4gdmFyaWFibGUgd2lsbCBtYWtl IHRoaXMgY29kZSBsb29rIGxlc3MgbWFnaWNhbC4gVW5sZXNzIEkgYW0gbWlzc2luZyBzb21ldGhp bmcKPj4gaW1wb3J0YW50IDopCj4gCj4gR2FoaCwgSSB1c2VkIHRvIHBhc3MgdGhlIHZtZiB0byB3 aGF0IHB0ZV9yYW5nZV9ub25lKCkgd2FzIHJlZmFjdG9yZWQgaW50byAoYW4KPiBhcHByb2FjaCB0 aGF0IHdhcyBzdWdnZXN0ZWQgYnkgWXUgWmhvdSBJSVJDKS4gQnV0IHNpbmNlIEkgZGlkIHNvbWUg cmVmYWN0b3JpbmcKPiBiYXNlZCBvbiBzb21lIGNvbW1lbnRzIGZyb20gSm9obkgsIEkgc2VlIEkg ZG9uJ3QgbmVlZCB0aGF0IGFueW1vcmUuIEFncmVlZDsgaXQKPiB3aWxsIGJlIG11Y2ggY2xlYXJl ciBqdXN0IHRvIHVzZSBhIGxvY2FsIHZhcmlhYmxlLiBXaWxsIGZpeC4KPiAKPj4KPj4+ICvCoMKg wqAgcHRlX3VubWFwKHB0ZSk7Cj4+PiArCj4+PiArwqDCoMKgIGdmcCA9IHZtYV90aHBfZ2ZwX21h c2sodm1hKTsKPj4+ICsKPj4+ICvCoMKgwqAgd2hpbGUgKG9yZGVycykgewo+Pj4gK8KgwqDCoMKg wqDCoMKgIGFkZHIgPSBBTElHTl9ET1dOKHZtZi0+YWRkcmVzcywgUEFHRV9TSVpFIDw8IG9yZGVy KTsKPj4+ICvCoMKgwqDCoMKgwqDCoCBmb2xpbyA9IHZtYV9hbGxvY19mb2xpbyhnZnAsIG9yZGVy LCB2bWEsIGFkZHIsIHRydWUpOwo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChmb2xpbykgewo+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2xlYXJfaHVnZV9wYWdlKCZmb2xpby0+cGFnZSwgYWRk ciwgMSA8PCBvcmRlcik7Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gZm9saW87 Cj4+PiArwqDCoMKgwqDCoMKgwqAgfQo+Pj4gK8KgwqDCoMKgwqDCoMKgIG9yZGVyID0gbmV4dF9v cmRlcigmb3JkZXJzLCBvcmRlcik7Cj4+PiArwqDCoMKgIH0KPj4+ICsKPj4KPj4gUXVlZXN0aW9u OiB3b3VsZCBpdCBtYWtlIHNlbnNlIHRvIGNvbWJpbmUgYm90aCBsb29wcz8gSSBzdXNwZWN0IG1l bW9yeQo+PiBhbGxvY2F0aW9ucyB3aXRoIHB0ZV9vZmZzZXRfbWFwKCkva21hbyBhcmUgcHJvYmxl bWF0aWMuCj4gCj4gVGhleSBhcmUgYm90aCBvcGVyYXRpbmcgb24gc2VwYXJhdGUgb3JkZXJzOyBu ZXh0X29yZGVyKCkgaXMgImNvbnN1bWluZyIgYW4gb3JkZXIKPiBieSByZW1vdmluZyB0aGUgY3Vy cmVudCBvbmUgZnJvbSB0aGUgb3JkZXJzIGJpdGZpZWxkIGFuZCByZXR1cm5pbmcgdGhlIG5leHQg b25lLgo+IAo+IFNvIHRoZSBmaXJzdCBsb29wIHN0YXJ0cyBhdCB0aGUgaGlnaGVzdCBvcmRlciBh bmQga2VlcHMgY2hlY2tpbmcgbG93ZXIgb3JkZXJzCj4gdW50aWwgb25lIGZ1bGx5IGZpdHMgaW4g dGhlIFZNQS4gQW5kIHRoZSBzZWNvbmQgbG9vcCBzdGFydHMgYXQgdGhlIGZpcnN0IG9yZGVyCj4g dGhhdCB3YXMgZm91bmQgdG8gZnVsbHkgZml0cyBhbmQgbG9vcHMgdG8gbG93ZXIgb3JkZXJzIHVu dGlsIGFuIGFsbG9jYXRpb24gaXMKPiBzdWNjZXNzZnVsLgo+IAo+IFNvIEkgZG9uJ3Qgc2VlIGEg bmVlZCB0byBjb21iaW5lIHRoZSBsb29wcy4KPiAKPj4KPj4+ICtmYWxsYmFjazoKPj4+ICvCoMKg wqAgcmV0dXJuIHZtYV9hbGxvY196ZXJvZWRfbW92YWJsZV9mb2xpbyh2bWEsIHZtZi0+YWRkcmVz cyk7Cj4+PiArfQo+Pj4gKyNlbHNlCj4+PiArI2RlZmluZSBhbGxvY19hbm9uX2ZvbGlvKHZtZikg XAo+Pj4gK8KgwqDCoMKgwqDCoMKgIHZtYV9hbGxvY196ZXJvZWRfbW92YWJsZV9mb2xpbygodm1m KS0+dm1hLCAodm1mKS0+YWRkcmVzcykKPj4+ICsjZW5kaWYKPj4+ICsKPj4+IMKgIC8qCj4+PiDC oMKgICogV2UgZW50ZXIgd2l0aCBub24tZXhjbHVzaXZlIG1tYXBfbG9jayAodG8gZXhjbHVkZSB2 bWEgY2hhbmdlcywKPj4+IMKgwqAgKiBidXQgYWxsb3cgY29uY3VycmVudCBmYXVsdHMpLCBhbmQg cHRlIG1hcHBlZCBidXQgbm90IHlldCBsb2NrZWQuCj4+PiBAQCAtNDEzMiw2ICs0MjEwLDkgQEAg dm1fZmF1bHRfdCBkb19zd2FwX3BhZ2Uoc3RydWN0IHZtX2ZhdWx0ICp2bWYpCj4+PiDCoMKgICov Cj4+PiDCoCBzdGF0aWMgdm1fZmF1bHRfdCBkb19hbm9ueW1vdXNfcGFnZShzdHJ1Y3Qgdm1fZmF1 bHQgKnZtZikKPj4+IMKgIHsKPj4+ICvCoMKgwqAgaW50IGk7Cj4+PiArwqDCoMKgIGludCBucl9w YWdlcyA9IDE7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgYWRkciA9IHZtZi0+YWRkcmVzczsK Pj4+IMKgwqDCoMKgwqAgYm9vbCB1ZmZkX3dwID0gdm1mX29yaWdfcHRlX3VmZmRfd3Aodm1mKTsK Pj4+IMKgwqDCoMKgwqAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB2bWYtPnZtYTsKPj4+ IMKgwqDCoMKgwqAgc3RydWN0IGZvbGlvICpmb2xpbzsKPj4KPj4gTml0OiByZXZlcnNlIGNocmlz dG1hcyB0cmVlIDopCj4gCj4gQUNLCj4gCj4+Cj4+PiBAQCAtNDE3NiwxMCArNDI1NywxNSBAQCBz dGF0aWMgdm1fZmF1bHRfdCBkb19hbm9ueW1vdXNfcGFnZShzdHJ1Y3Qgdm1fZmF1bHQgKnZtZikK Pj4+IMKgwqDCoMKgwqAgLyogQWxsb2NhdGUgb3VyIG93biBwcml2YXRlIHBhZ2UuICovCj4+PiDC oMKgwqDCoMKgIGlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQo+Pj4gwqDCoMKg wqDCoMKgwqDCoMKgIGdvdG8gb29tOwo+Pj4gLcKgwqDCoCBmb2xpbyA9IHZtYV9hbGxvY196ZXJv ZWRfbW92YWJsZV9mb2xpbyh2bWEsIHZtZi0+YWRkcmVzcyk7Cj4+PiArwqDCoMKgIGZvbGlvID0g YWxsb2NfYW5vbl9mb2xpbyh2bWYpOwo+Pj4gK8KgwqDCoCBpZiAoSVNfRVJSKGZvbGlvKSkKPj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4+IMKgwqDCoMKgwqAgaWYgKCFmb2xpbykKPj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG9vbTsKPj4+IMKgICvCoMKgwqAgbnJfcGFnZXMgPSBm b2xpb19ucl9wYWdlcyhmb2xpbyk7Cj4+PiArwqDCoMKgIGFkZHIgPSBBTElHTl9ET1dOKHZtZi0+ YWRkcmVzcywgbnJfcGFnZXMgKiBQQUdFX1NJWkUpOwo+Pj4gKwo+Pj4gwqDCoMKgwqDCoCBpZiAo bWVtX2Nncm91cF9jaGFyZ2UoZm9saW8sIHZtYS0+dm1fbW0sIEdGUF9LRVJORUwpKQo+Pj4gwqDC oMKgwqDCoMKgwqDCoMKgIGdvdG8gb29tX2ZyZWVfcGFnZTsKPj4+IMKgwqDCoMKgwqAgZm9saW9f dGhyb3R0bGVfc3dhcHJhdGUoZm9saW8sIEdGUF9LRVJORUwpOwo+Pj4gQEAgLTQxOTYsMTIgKzQy ODIsMTMgQEAgc3RhdGljIHZtX2ZhdWx0X3QgZG9fYW5vbnltb3VzX3BhZ2Uoc3RydWN0IHZtX2Zh dWx0ICp2bWYpCj4+PiDCoMKgwqDCoMKgIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCj4+ PiDCoMKgwqDCoMKgwqDCoMKgwqAgZW50cnkgPSBwdGVfbWt3cml0ZShwdGVfbWtkaXJ0eShlbnRy eSksIHZtYSk7Cj4+PiDCoCAtwqDCoMKgIHZtZi0+cHRlID0gcHRlX29mZnNldF9tYXBfbG9jayh2 bWEtPnZtX21tLCB2bWYtPnBtZCwgdm1mLT5hZGRyZXNzLAo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgJnZtZi0+cHRsKTsKPj4+ICvCoMKgwqAgdm1mLT5wdGUgPSBwdGVfb2Zmc2V0X21hcF9s b2NrKHZtYS0+dm1fbW0sIHZtZi0+cG1kLCBhZGRyLCAmdm1mLT5wdGwpOwo+Pj4gwqDCoMKgwqDC oCBpZiAoIXZtZi0+cHRlKQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgIGdvdG8gcmVsZWFzZTsKPj4+ IC3CoMKgwqAgaWYgKHZtZl9wdGVfY2hhbmdlZCh2bWYpKSB7Cj4+PiAtwqDCoMKgwqDCoMKgwqAg dXBkYXRlX21tdV90bGIodm1hLCB2bWYtPmFkZHJlc3MsIHZtZi0+cHRlKTsKPj4+ICvCoMKgwqAg aWYgKChucl9wYWdlcyA9PSAxICYmIHZtZl9wdGVfY2hhbmdlZCh2bWYpKSB8fAo+Pj4gK8KgwqDC oMKgwqDCoMKgIChucl9wYWdlc8KgID4gMSAmJiAhcHRlX3JhbmdlX25vbmUodm1mLT5wdGUsIG5y X3BhZ2VzKSkpIHsKPj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKGkgPSAwOyBpIDwgbnJfcGFnZXM7 IGkrKykKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVwZGF0ZV9tbXVfdGxiKHZtYSwgYWRk ciArIFBBR0VfU0laRSAqIGksIHZtZi0+cHRlICsgaSk7Cj4+Cj4+IENvbW1lbnQ6IHNlcGFyYXRp bmcgdGhlIG9yZGVyLTAgY2FzZSBmcm9tIHRoZSBvdGhlciBjYXNlIG1pZ2h0IG1ha2UgdGhpcyBl YXNpZXIKPj4gdG8gcmVhZC4KPiAKPiBZZWFoIGZhaXIgZW5vdWdoLiBXaWxsIGZpeC4KPiAKPj4K Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIHJlbGVhc2U7Cj4+PiDCoMKgwqDCoMKgIH0KPj4+ IMKgIEBAIC00MjE2LDE2ICs0MzAzLDE3IEBAIHN0YXRpYyB2bV9mYXVsdF90IGRvX2Fub255bW91 c19wYWdlKHN0cnVjdCB2bV9mYXVsdAo+Pj4gKnZtZikKPj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBy ZXR1cm4gaGFuZGxlX3VzZXJmYXVsdCh2bWYsIFZNX1VGRkRfTUlTU0lORyk7Cj4+PiDCoMKgwqDC oMKgIH0KPj4+IMKgIC3CoMKgwqAgaW5jX21tX2NvdW50ZXIodm1hLT52bV9tbSwgTU1fQU5PTlBB R0VTKTsKPj4+IC3CoMKgwqAgZm9saW9fYWRkX25ld19hbm9uX3JtYXAoZm9saW8sIHZtYSwgdm1m LT5hZGRyZXNzKTsKPj4+ICvCoMKgwqAgZm9saW9fcmVmX2FkZChmb2xpbywgbnJfcGFnZXMgLSAx KTsKPj4+ICvCoMKgwqAgYWRkX21tX2NvdW50ZXIodm1hLT52bV9tbSwgTU1fQU5PTlBBR0VTLCBu cl9wYWdlcyk7Cj4+PiArwqDCoMKgIGZvbGlvX2FkZF9uZXdfYW5vbl9ybWFwKGZvbGlvLCB2bWEs IGFkZHIpOwo+Pj4gwqDCoMKgwqDCoCBmb2xpb19hZGRfbHJ1X3ZtYShmb2xpbywgdm1hKTsKPj4+ IMKgIHNldHB0ZToKPj4+IMKgwqDCoMKgwqAgaWYgKHVmZmRfd3ApCj4+PiDCoMKgwqDCoMKgwqDC oMKgwqAgZW50cnkgPSBwdGVfbWt1ZmZkX3dwKGVudHJ5KTsKPj4+IC3CoMKgwqAgc2V0X3B0ZV9h dCh2bWEtPnZtX21tLCB2bWYtPmFkZHJlc3MsIHZtZi0+cHRlLCBlbnRyeSk7Cj4+PiArwqDCoMKg IHNldF9wdGVzKHZtYS0+dm1fbW0sIGFkZHIsIHZtZi0+cHRlLCBlbnRyeSwgbnJfcGFnZXMpOwo+ Pj4gwqAgwqDCoMKgwqDCoCAvKiBObyBuZWVkIHRvIGludmFsaWRhdGUgLSBpdCB3YXMgbm9uLXBy ZXNlbnQgYmVmb3JlICovCj4+PiAtwqDCoMKgIHVwZGF0ZV9tbXVfY2FjaGVfcmFuZ2Uodm1mLCB2 bWEsIHZtZi0+YWRkcmVzcywgdm1mLT5wdGUsIDEpOwo+Pj4gK8KgwqDCoCB1cGRhdGVfbW11X2Nh Y2hlX3JhbmdlKHZtZiwgdm1hLCBhZGRyLCB2bWYtPnB0ZSwgbnJfcGFnZXMpOwo+Pj4gwqAgdW5s b2NrOgo+Pj4gwqDCoMKgwqDCoCBpZiAodm1mLT5wdGUpCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAg cHRlX3VubWFwX3VubG9jayh2bWYtPnB0ZSwgdm1mLT5wdGwpOwo+Pgo+PiBCZW5jaG1hcmtpbmcg b3JkZXItMCBhbGxvY2F0aW9ucyBtaWdodCBiZSBpbnRlcmVzdGluZy4gVGhlcmUgd2lsbCBiZSBz b21lIGFkZGVkCj4+IGNoZWNrcyArIG11bHRpcGxlIGxvb3BzL2NvbmRpdGlvbmFscyBmb3Igb3Jk ZXItMCB0aGF0IGNvdWxkIGJlIGF2b2lkZWQgYnkgaGF2aW5nCj4+IHR3byBzZXBhcmF0ZSBjb2Rl IHBhdGhzLiBJZiB3ZSBjYW4ndCBtZWFzdXJlIGEgZGlmZmVyZW5jZSwgYWxsIGdvb2QuCj4gCj4g WWVwIHdpbGwgZG8gLSB3aWxsIHBvc3QgbnVtYmVycyBvbmNlIEkgaGF2ZSB0aGVtLiBJJ3ZlIGJl ZW4gYXNzdW1pbmcgdGhhdCB0aGUKPiBtYWpvciBjb3N0IGlzIGNsZWFyaW5nIHRoZSBwYWdlLCBi dXQgcGVyaGFwcyBJJ20gd3JvbmcuCj4gCj4+Cj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGlu dXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=