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 63EE8C4167B for ; Tue, 28 Nov 2023 10:50:18 +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:From:References:Cc:To: 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=1kJYn5B3/Zij/+JqMhVMljGmIkdEFqcoD27AB6Ms5UY=; b=KLtK5e2Uyq2xM+ WIzsi0+BbOAXAgcG171dktdYvjFZfNWwzfyNHPliADJ1Id0qAeNBjBqFcB80hzkLx6FIOaOoN/LSM P3IzgbNZsqI4It/Tzc23IQKbZZJAv4dLtlZTWKKggrGzC9iJjyxatT7mSQEsJJThY9ye+JAdDrwtX RVRsD455pdVw+jH+PCyT2FBUEMEYAC4XBY1mVa5WsfpqYwhfAA1PLFvwjnk4qwZpSOyX5OyXOHfSA aZYVmdvU/1vSEwJ2gmANXj7WpOx/8gFalpdw2dRh5IoN+8iNoY4mKUfmpu9CjwkdCqgrklAHyw2yD 1Jy0X/2V/30592SdKirg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7vf4-004yhy-0q; Tue, 28 Nov 2023 10:49:50 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7vew-004yf6-04 for linux-arm-kernel@lists.infradead.org; Tue, 28 Nov 2023 10:49:45 +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 E1F00C15; Tue, 28 Nov 2023 02:50:20 -0800 (PST) Received: from [10.1.33.188] (XHFQ2J9959.cambridge.arm.com [10.1.33.188]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 423603F73F; Tue, 28 Nov 2023 02:49:30 -0800 (PST) Message-ID: <974feb64-d056-4f3c-9166-9b116bea1318@arm.com> Date: Tue, 28 Nov 2023 10:49:29 +0000 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v2 01/14] mm: Batch-copy PTE ranges during fork() Content-Language: en-GB To: Barry Song <21cnbao@gmail.com> Cc: david@redhat.com, akpm@linux-foundation.org, andreyknvl@gmail.com, anshuman.khandual@arm.com, ardb@kernel.org, catalin.marinas@arm.com, dvyukov@google.com, glider@google.com, james.morse@arm.com, jhubbard@nvidia.com, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, mark.rutland@arm.com, maz@kernel.org, oliver.upton@linux.dev, ryabinin.a.a@gmail.com, suzuki.poulose@arm.com, vincenzo.frascino@arm.com, wangkefeng.wang@huawei.com, will@kernel.org, willy@infradead.org, yuzenghui@huawei.com, yuzhao@google.com, ziy@nvidia.com References: <271f1e98-6217-4b40-bae0-0ac9fe5851cb@redhat.com> <20231127084217.13110-1-v-songbaohua@oppo.com> <7c4c8ab2-8eb2-472d-ad8d-9d6c20b2191c@arm.com> From: Ryan Roberts In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231128_024942_178759_A2C71625 X-CRM114-Status: GOOD ( 54.53 ) 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 T24gMjgvMTEvMjAyMyAwOTo0OSwgQmFycnkgU29uZyB3cm90ZToKPiBPbiBUdWUsIE5vdiAyOCwg MjAyMyBhdCAxMDoxNOKAr1BNIFJ5YW4gUm9iZXJ0cyA8cnlhbi5yb2JlcnRzQGFybS5jb20+IHdy b3RlOgo+Pgo+PiBPbiAyNy8xMS8yMDIzIDIwOjM0LCBCYXJyeSBTb25nIHdyb3RlOgo+Pj4gT24g VHVlLCBOb3YgMjgsIDIwMjMgYXQgMTI6MDfigK9BTSBSeWFuIFJvYmVydHMgPHJ5YW4ucm9iZXJ0 c0Bhcm0uY29tPiB3cm90ZToKPj4+Pgo+Pj4+IE9uIDI3LzExLzIwMjMgMTA6MjgsIEJhcnJ5IFNv bmcgd3JvdGU6Cj4+Pj4+IE9uIE1vbiwgTm92IDI3LCAyMDIzIGF0IDExOjEx4oCvUE0gUnlhbiBS b2JlcnRzIDxyeWFuLnJvYmVydHNAYXJtLmNvbT4gd3JvdGU6Cj4+Pj4+Pgo+Pj4+Pj4gT24gMjcv MTEvMjAyMyAwOTo1OSwgQmFycnkgU29uZyB3cm90ZToKPj4+Pj4+PiBPbiBNb24sIE5vdiAyNywg MjAyMyBhdCAxMDozNeKAr1BNIFJ5YW4gUm9iZXJ0cyA8cnlhbi5yb2JlcnRzQGFybS5jb20+IHdy b3RlOgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBPbiAyNy8xMS8yMDIzIDA4OjQyLCBCYXJyeSBTb25nIHdy b3RlOgo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnI7IGkrKywgcGFn ZSsrKSB7Cj4+Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgaWYgKGFub24pIHsKPj4+Pj4+ Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qCj4+Pj4+Pj4+Pj4+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgKiBJZiB0aGlzIHBhZ2UgbWF5IGhhdmUgYmVlbiBwaW5uZWQg YnkgdGhlCj4+Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYXJlbnQg cHJvY2VzcywgY29weSB0aGUgcGFnZSBpbW1lZGlhdGVseSBmb3IKPj4+Pj4+Pj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjaGlsZCBzbyB0aGF0IHdlJ2xsIGFsd2F5cyBn dWFyYW50ZWUgdGhlCj4+Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBw aW5uZWQgcGFnZSB3b24ndCBiZSByYW5kb21seSByZXBsYWNlZCBpbiB0aGUKPj4+Pj4+Pj4+Pj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZ1dHVyZS4KPj4+Pj4+Pj4+Pj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqLwo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgaWYgKHVubGlrZWx5KHBhZ2VfdHJ5X2R1cF9hbm9uX3JtYXAoCj4+Pj4+Pj4+Pj4+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSwgZmFsc2Us IHNyY192bWEpKSkgewo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBpZiAoaSAhPSAwKQo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGJyZWFrOwo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAvKiBQYWdlIG1heSBiZSBwaW5uZWQsIHdlIGhhdmUgdG8gY29weS4gKi8K Pj4+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNv cHlfcHJlc2VudF9wYWdlKAo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGRzdF92bWEsIHNyY192bWEsIGRzdF9wdGUsCj4+Pj4+Pj4+Pj4+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ZSwgYWRkciwg cnNzLCBwcmVhbGxvYywKPj4+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBwYWdlKTsKPj4+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgIH0KPj4+Pj4+Pj4+Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzc1tNTV9BTk9O UEFHRVNdKys7Cj4+Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBWTV9CVUdf T04oUGFnZUFub25FeGNsdXNpdmUocGFnZSkpOwo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAg ICAgIH0gZWxzZSB7Cj4+Pj4+Pj4+Pj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdl X2R1cF9maWxlX3JtYXAocGFnZSwgZmFsc2UpOwo+Pj4+Pj4+Pj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgcnNzW21tX2NvdW50ZXJfZmlsZShwYWdlKV0rKzsKPj4+Pj4+Pj4+Pj4gKyAg ICAgICAgICAgICAgICAgICB9Cj4+Pj4+Pj4+Pj4+ICAgICAgICAgICAgIH0KPj4+Pj4+Pj4+Pj4g LSAgICAgICAgICAgcnNzW01NX0FOT05QQUdFU10rKzsKPj4+Pj4+Pj4+Pj4gLSAgIH0gZWxzZSBp ZiAocGFnZSkgewo+Pj4+Pj4+Pj4+PiAtICAgICAgICAgICBmb2xpb19nZXQoZm9saW8pOwo+Pj4+ Pj4+Pj4+PiAtICAgICAgICAgICBwYWdlX2R1cF9maWxlX3JtYXAocGFnZSwgZmFsc2UpOwo+Pj4+ Pj4+Pj4+PiAtICAgICAgICAgICByc3NbbW1fY291bnRlcl9maWxlKHBhZ2UpXSsrOwo+Pj4+Pj4+ Pj4+PiArCj4+Pj4+Pj4+Pj4+ICsgICAgICAgICAgIG5yID0gaTsKPj4+Pj4+Pj4+Pj4gKyAgICAg ICAgICAgZm9saW9fcmVmX2FkZChmb2xpbywgbnIpOwo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4gWW91 J3JlIGNoYW5naW5nIHRoZSBvcmRlciBvZiBtYXBjb3VudCB2cy4gcmVmY291bnQgaW5jcmVtZW50 LiBEb24ndC4KPj4+Pj4+Pj4+PiBNYWtlIHN1cmUgeW91ciByZWZjb3VudCA+PSBtYXBjb3VudC4K Pj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4+IFlvdSBjYW4gZG8gdGhhdCBlYXNpbHkgYnkgZG9pbmcgdGhl IGZvbGlvX3JlZl9hZGQoZm9saW8sIG5yKSBmaXJzdCBhbmQKPj4+Pj4+Pj4+PiB0aGVuIGRlY3Jl bWVudGluZyBpbiBjYXNlIG9mIGVycm9yIGFjY29yZGluZ2x5LiBFcnJvcnMgZHVlIHRvIHBpbm5l ZAo+Pj4+Pj4+Pj4+IHBhZ2VzIGFyZSB0aGUgY29ybmVyIGNhc2UuCj4+Pj4+Pj4+Pj4KPj4+Pj4+ Pj4+PiBJJ2xsIG5vdGUgdGhhdCBpdCB3aWxsIG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgdG8gaGF2ZSBi YXRjaCB2YXJpYW50cyBvZgo+Pj4+Pj4+Pj4+IHBhZ2VfdHJ5X2R1cF9hbm9uX3JtYXAoKSBhbmQg cGFnZV9kdXBfZmlsZV9ybWFwKCkuCj4+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBpIHN0 aWxsIGRvbid0IHVuZGVyc3RhbmQgd2h5IGl0IGlzIG5vdCBhIGVudGlyZSBtYXArMSwgYnV0IGFu IGluY3JlbWVudAo+Pj4+Pj4+Pj4gaW4gZWFjaCBiYXNlcGFnZS4KPj4+Pj4+Pj4KPj4+Pj4+Pj4g QmVjYXVzZSB3ZSBhcmUgUFRFLW1hcHBpbmcgdGhlIGZvbGlvLCB3ZSBoYXZlIHRvIGFjY291bnQg ZWFjaCBpbmRpdmlkdWFsIHBhZ2UuCj4+Pj4+Pj4+IElmIHdlIGFjY291bnRlZCB0aGUgZW50aXJl IGZvbGlvLCB3aGVyZSB3b3VsZCB3ZSB1bmFjY291bnQgaXQ/IEVhY2ggcGFnZSBjYW4gYmUKPj4+ Pj4+Pj4gdW5tYXBwZWQgaW5kaXZpZHVhbGx5IChlLmcuIG11bm1hcCgpIHBhcnQgb2YgdGhlIGZv bGlvKSBzbyBuZWVkIHRvIGFjY291bnQgZWFjaAo+Pj4+Pj4+PiBwYWdlLiBXaGVuIFBNRCBtYXBw aW5nLCB0aGUgd2hvbGUgdGhpbmcgaXMgZWl0aGVyIG1hcHBlZCBvciB1bm1hcHBlZCwgYW5kIGl0 cwo+Pj4+Pj4+PiBhdG9taWMsIHNvIHdlIGNhbiBhY2NvdW50IHRoZSBlbnRpcmUgdGhpbmcuCj4+ Pj4+Pj4KPj4+Pj4+PiBIaSBSeWFuLAo+Pj4+Pj4+Cj4+Pj4+Pj4gVGhlcmUgaXMgbm8gcHJvYmxl bS4gZm9yIGV4YW1wbGUsIGEgbGFyZ2UgZm9saW8gaXMgZW50aXJlbHkgbWFwcGVkIGluCj4+Pj4+ Pj4gcHJvY2VzcyBBIHdpdGggQ09OUFRFLAo+Pj4+Pj4+IGFuZCBvbmx5IHBhZ2UyIGlzIG1hcHBl ZCBpbiBwcm9jZXNzIEIuCj4+Pj4+Pj4gdGhlbiB3ZSB3aWxsIGhhdmUKPj4+Pj4+Pgo+Pj4+Pj4+ IGVudGlyZV9tYXAgPSAwCj4+Pj4+Pj4gcGFnZTAubWFwID0gLTEKPj4+Pj4+PiBwYWdlMS5tYXAg PSAtMQo+Pj4+Pj4+IHBhZ2UyLm1hcCA9IDAKPj4+Pj4+PiBwYWdlMy5tYXAgPSAtMQo+Pj4+Pj4+ IC4uLi4KPj4+Pj4+Pgo+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IGFzIGxvbmcgYXMgaXQg aXMgYSBDT05UUFRFIGxhcmdlIGZvbGlvLCB0aGVyZSBpcyBubyBtdWNoIGRpZmZlcmVuY2Ugd2l0 aAo+Pj4+Pj4+Pj4gUE1ELW1hcHBlZCBsYXJnZSBmb2xpby4gaXQgaGFzIGFsbCB0aGUgY2hhbmNl IHRvIGJlIERvdWJsZU1hcCBhbmQgbmVlZAo+Pj4+Pj4+Pj4gc3BsaXQuCj4+Pj4+Pj4+Pgo+Pj4+ Pj4+Pj4gV2hlbiBBIGFuZCBCIHNoYXJlIGEgQ09OVFBURSBsYXJnZSBmb2xpbywgd2UgZG8gbWFk dmlzZShET05UTkVFRCkgb3IgYW55Cj4+Pj4+Pj4+PiBzaW1pbGFyIHRoaW5ncyBvbiBhIHBhcnQg b2YgdGhlIGxhcmdlIGZvbGlvIGluIHByb2Nlc3MgQSwKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiB0aGlz IGxhcmdlIGZvbGlvIHdpbGwgaGF2ZSBwYXJ0aWFsbHkgbWFwcGVkIHN1YnBhZ2UgaW4gQSAoYWxs IENPTlRQRSBiaXRzCj4+Pj4+Pj4+PiBpbiBhbGwgc3VicGFnZXMgbmVlZCB0byBiZSByZW1vdmVk IHRob3VnaCB3ZSBvbmx5IHVubWFwIGEgcGFydCBvZiB0aGUKPj4+Pj4+Pj4+IGxhcmdlIGZvbGlv YXMgSFcgcmVxdWlyZXMgY29uc2lzdGVudCBDT05UUFRFcyk7IGFuZCBpdCBoYXMgZW50aXJlIG1h cCBpbgo+Pj4+Pj4+Pj4gcHJvY2VzcyBCKGFsbCBQVEVzIGFyZSBzdGlsbCBDT05QVEVTIGluIHBy b2Nlc3MgQikuCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gaXNuJ3QgaXQgbW9yZSBzZW5zaWJsZSBmb3Ig dGhpcyBsYXJnZSBmb2xpb3MgdG8gaGF2ZSBlbnRpcmVfbWFwID0gMChmb3IKPj4+Pj4+Pj4+IHBy b2Nlc3MgQiksIGFuZCBzdWJwYWdlcyB3aGljaCBhcmUgc3RpbGwgbWFwcGVkIGluIHByb2Nlc3Mg QSBoYXMgbWFwX2NvdW50Cj4+Pj4+Pj4+PiA9MD8gKHN0YXJ0IGZyb20gLTEpLgo+Pj4+Pj4+Pj4K Pj4+Pj4+Pj4+PiBFc3BlY2lhbGx5LCB0aGUgYmF0Y2ggdmFyaWFudCBvZiBwYWdlX3RyeV9kdXBf YW5vbl9ybWFwKCkgd291bGQgb25seQo+Pj4+Pj4+Pj4+IGNoZWNrIG9uY2UgaWYgdGhlIGZvbGlv IG1heWJlIHBpbm5lZCwgYW5kIGluIHRoYXQgY2FzZSwgeW91IGNhbiBzaW1wbHkKPj4+Pj4+Pj4+ PiBkcm9wIGFsbCByZWZlcmVuY2VzIGFnYWluLiBTbyB5b3UgZWl0aGVyIGhhdmUgYWxsIG9yIG5v IHB0ZXMgdG8gcHJvY2VzcywKPj4+Pj4+Pj4+PiB3aGljaCBtYWtlcyB0aGF0IGNvZGUgZWFzaWVy Lgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJJ20gYWZyYWlkIHRoaXMgZG9lc24ndCBtYWtlIHNlbnNlIHRv IG1lLiBQZXJoYXBzIEkndmUgbWlzdW5kZXJzdG9vZC4gQnV0Cj4+Pj4+Pj4+IGZ1bmRhbWVudGFs bHkgeW91IGNhbiBvbmx5IHVzZSBlbnRpcmVfbWFwY291bnQgaWYgaXRzIG9ubHkgcG9zc2libGUg dG8gbWFwIGFuZAo+Pj4+Pj4+PiB1bm1hcCB0aGUgd2hvbGUgZm9saW8gYXRvbWljYWxseS4KPj4+ Pj4+Pgo+Pj4+Pj4+Cj4+Pj4+Pj4KPj4+Pj4+PiBNeSBwb2ludCBpcyB0aGF0IENPTlRQRXMgc2hv dWxkIGVpdGhlciBhbGwtc2V0IGluIGFsbCAxNiBQVEVzIG9yIGFsbCBhcmUgZHJvcHBlZAo+Pj4+ Pj4+IGluIDE2IFBURXMuIGlmIGFsbCBQVEVzIGhhdmUgQ09OVCwgaXQgaXMgZW50aXJlbHkgbWFw cGVkOyBvdGhlcndpc2UsCj4+Pj4+Pj4gaXQgaXMgcGFydGlhbGx5Cj4+Pj4+Pj4gbWFwcGVkLiBp ZiBhIGxhcmdlIGZvbGlvIGlzIG1hcHBlZCBpbiBvbmUgcHJvY2Vzc2VzIHdpdGggYWxsIENPTlRQ VEVzCj4+Pj4+Pj4gYW5kIG1lYW53aGlsZSBpbiBhbm90aGVyIHByb2Nlc3Mgd2l0aCBwYXJ0aWFs IG1hcHBpbmcody9vIENPTlRQVEUpLCBpdCBpcwo+Pj4+Pj4+IERvdWJsZU1hcHBlZC4KPj4+Pj4+ Cj4+Pj4+PiBUaGVyZSBhcmUgMiBwcm9ibGVtcyB3aXRoIHlvdXIgcHJvcG9zYWwsIGFzIEkgc2Vl IGl0Owo+Pj4+Pj4KPj4+Pj4+IDEpIHRoZSBjb3JlLW1tIGlzIG5vdCBlbmxpZ2h0ZW5lZCBmb3Ig Q09OVFBURSBtYXBwaW5ncy4gQXMgZmFyIGFzIGl0IGlzCj4+Pj4+PiBjb25jZXJuZWQsIGl0cyBq dXN0IG1hcHBpbmcgYSBidW5jaCBvZiBQVEVzLiBTbyBpdCBoYXMgbm8gaG9vayB0byBpbmMvZGVj Cj4+Pj4+PiBlbnRpcmVfbWFwY291bnQuIFRoZSBhcmNoIGNvZGUgaXMgb3Bwb3J0dW5pc3RpY2Fs bHkgYW5kICp0cmFuc3BhcmVudGx5KiBtYW5hZ2luZwo+Pj4+Pj4gdGhlIENPTlRfUFRFIGJpdC4K Pj4+Pj4+Cj4+Pj4+PiAyKSBUaGVyZSBpcyBub3RoaW5nIHRvIHNheSBhIGZvbGlvIGlzbid0ICpi aWdnZXIqIHRoYW4gdGhlIGNvbnRwdGUgYmxvY2s7IGl0IG1heQo+Pj4+Pj4gYmUgMTI4SyBhbmQg YmUgbWFwcGVkIHdpdGggMiBjb250cHRlIGJsb2Nrcy4gT3IgZXZlbiBhIFBURS1tYXBwZWQgVEhQ ICgyTSkgYW5kCj4+Pj4+PiBiZSBtYXBwZWQgd2l0aCAzMiBjb250cHRlIGJsb2Nrcy4gU28geW91 IGNhbid0IHNheSBpdCBpcyBlbnRpcmVseSBtYXBwZWQKPj4+Pj4+IHVubGVzcy91bnRpbCBBTEwg b2YgdGhvc2UgYmxvY2tzIGFyZSBzZXQgdXAuIEFuZCB0aGVuIG9mIGNvdXJzZSBlYWNoIGJsb2Nr IGNvdWxkCj4+Pj4+PiBiZSB1bm1hcHBlZCB1bmF0b21pY2FsbHkuCj4+Pj4+Pgo+Pj4+Pj4gRm9y IHRoZSBQTUQgY2FzZSB0aGVyZSBhcmUgYWN0dWFsbHkgMiBwcm9wZXJ0aWVzIHRoYXQgYWxsb3cg dXNpbmcgdGhlCj4+Pj4+PiBlbnRpcmVfbWFwY291bnQgb3B0aW1pemF0aW9uOyBJdCdzIGF0b21p Y2FsbHkgbWFwcGVkL3VubWFwcGVkIHRocm91Z2ggdGhlIFBNRAo+Pj4+Pj4gYW5kIHdlIGtub3cg dGhhdCB0aGUgZm9saW8gaXMgZXhhY3RseSBQTUQgc2l6ZWQgKHNpbmNlIGl0IG11c3QgYmUgYXQg bGVhc3QgUE1ECj4+Pj4+PiBzaXplZCB0byBiZSBhYmxlIHRvIG1hcCBpdCB3aXRoIHRoZSBQTUQs IGFuZCB3ZSBkb24ndCBhbGxvY2F0ZSBUSFBzIGFueSBiaWdnZXIKPj4+Pj4+IHRoYW4gUE1EIHNp emUpLiBTbyBvbmUgUE1EIG1hcCBvciB1bm1hcCBvcGVyYXRpb24gY29ycmVzcG9uZHMgdG8gZXhh Y3RseSBvbmUKPj4+Pj4+ICplbnRpcmUqIG1hcCBvciB1bm1hcC4gVGhhdCBpcyBub3QgdHJ1ZSB3 aGVuIHdlIGFyZSBQVEUgbWFwcGluZy4KPj4+Pj4KPj4+Pj4gd2VsbC4gVGhhbmtzIGZvciBjbGFy aWZpY2F0aW9uLiBiYXNlZCBvbiB0aGUgYWJvdmUgZGVzY3JpcHRpb24sIGkgYWdyZWUgdGhlCj4+ Pj4+IGN1cnJlbnQgY29kZSBtaWdodCBtYWtlIG1vcmUgc2Vuc2UgYnkgYWx3YXlzIHVzaW5nIG1h cGNvdW50IGluIHN1YnBhZ2UuCj4+Pj4+Cj4+Pj4+IEkgZ2F2ZSBteSBwcm9wb3NhbHMgYXMgIEkg dGhvdWdodCB3ZSB3ZXJlIGFsd2F5cyBDT05UUFRFIHNpemUgZm9yIHNtYWxsLVRIUAo+Pj4+PiB0 aGVuIHdlIGNvdWxkIGRyb3AgdGhlIGxvb3AgdG8gaXRlcmF0ZSAxNiB0aW1lcyBybWFwLiBpZiB3 ZSBkbyBpdAo+Pj4+PiBlbnRpcmVseSwgd2Ugb25seQo+Pj4+PiBuZWVkIHRvIGRvIGR1cCBybWFw IG9uY2UgZm9yIGFsbCAxNiBQVEVzIGJ5IGluY3JlYXNpbmcgZW50aXJlX21hcC4KPj4+Pgo+Pj4+ IFdlbGwgaXRzIGFsd2F5cyBnb29kIHRvIGhhdmUgdGhlIGRpc2N1c3Npb24gLSBzbyB0aGFua3Mg Zm9yIHRoZSBpZGVhcy4gSSB0aGluawo+Pj4+IHRoZXJlIGlzIGEgYmlnZ2VyIHF1ZXN0aW9uIGx1 cmtpbmcgaGVyZTsgc2hvdWxkIHdlIGJlIGV4cG9zaW5nIHRoZSBjb25jZXB0IG9mCj4+Pj4gY29u dHB0ZSBtYXBwaW5ncyB0byB0aGUgY29yZS1tbSByYXRoZXIgdGhhbiBidXJ5aW5nIGl0IGluIHRo ZSBhcm02NCBhcmNoIGNvZGU/Cj4+Pj4gSSdtIGNvbmZpZGVudCB0aGF0IHdvdWxkIGJlIGEgaHVn ZSBhbW91bnQgb2YgZWZmb3J0IGFuZCB0aGUgZW5kIHJlc3VsdCB3b3VsZCBiZQo+Pj4+IHNpbWls YXIgcGVyZm9ybWFjZSB0byB3aGF0IHRoaXMgYXBwcm9hY2ggZ2l2ZXMuIE9uZSBwb3RlbnRpYWwg YmVuZWZpdCBvZiBsZXR0aW5nCj4+Pj4gY29yZS1tbSBjb250cm9sIGl0IGlzIHRoYXQgaXQgd291 bGQgYWxzbyBnaXZlIGNvbnRyb2wgdG8gY29yZS1tbSBvdmVyIHRoZQo+Pj4+IGdyYW51bGFyaXR5 IG9mIGFjY2Vzcy9kaXJ0eSByZXBvcnRpbmcgKG15IGFwcHJvYWNoIGltcGxpY2l0bHkgdGllcyBp dCB0byB0aGUKPj4+PiBmb2xpbykuIEhhdmluZyBzdWItZm9saW8gYWNjZXNzIHRyYWNraW5nIF9j b3VsZF8gcG90ZW50aWFsbHkgaGVscCB3aXRoIGZ1dHVyZQo+Pj4+IHdvcmsgdG8gbWFrZSBUSFAg c2l6ZSBzZWxlY3Rpb24gYXV0b21hdGljLCBidXQgd2UgYXJlIG5vdCB0aGVyZSB5ZXQsIGFuZCBJ IHRoaW5rCj4+Pj4gdGhlcmUgYXJlIG90aGVyIChzaW1wbGVyKSB3YXlzIHRvIGFjaGlldmUgdGhl IHNhbWUgdGhpbmcuIFNvIG15IHZpZXcgaXMgdGhhdAo+Pj4+IF9ub3RfIGV4cG9zaW5nIGl0IHRv IGNvcmUtbW0gaXMgdGhlIHJpZ2h0IHdheSBmb3Igbm93Lgo+Pj4KPj4+IEhpIFJ5YW4sCj4+Pgo+ Pj4gV2UoT1BQTykgc3RhcnRlZCBhIHNpbWlsYXIgcHJvamVjdCBsaWtlIHlvdSBldmVuIGJlZm9y ZSBmb2xpbyB3YXMgaW1wb3J0ZWQgdG8KPj4+IG1haW5saW5lLCB3ZSBoYXZlIGRlcGxveWVkIHRo ZSBkeW5hbWljIGh1Z2VwYWdlKHRoYXQgaXMgaG93IHdlIG5hbWUgaXQpCj4+PiBvbiBtaWxsaW9u cyBvZiBtb2JpbGUgcGhvbmVzIG9uIHJlYWwgcHJvZHVjdHMgYW5kIGtlcm5lbHMgYmVmb3JlIDUu MTYsICBtYWtpbmcKPj4+IGEgaHVnZSBzdWNjZXNzIG9uIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50 LiBmb3IgZXhhbXBsZSwgeW91IG1heQo+Pj4gZmluZCB0aGUgb3V0LW9mLXRyZWUgNS4xNSBzb3Vy Y2UgY29kZSBoZXJlCj4+Cj4+IE9oIHdvdywgdGhhbmtzIGZvciByZWFjaGluZyBvdXQgYW5kIGV4 cGxhaW5pbmcgdGhpcyAtIEkgaGF2ZSB0byBhZG1pdCBJIGZlZWwKPj4gZW1iYXJyYXNzZWQgdGhh dCBJIGNsZWFybHkgZGlkbid0IGRvIGVub3VnaCByZXNlYXJjaCBvbiB0aGUgcHJpb3IgYXJ0IGJl Y2F1c2UgSQo+PiB3YXNuJ3QgYXdhcmUgb2YgeW91ciB3b3JrLiBTbyBzb3JyeSBhYm91dCB0aGF0 Lgo+Pgo+PiBJIHNlbnNlZCB0aGF0IHlvdSBoYWQgYSBkaWZmZXJlbnQgbW9kZWwgZm9yIGhvdyB0 aGlzIHNob3VsZCB3b3JrIHZzIHdoYXQgSSd2ZQo+PiBpbXBsZW1lbnRlZCBhbmQgbm93IEkgdW5k ZXJzdGFuZCB3aHkgOikuIEknbGwgcmV2aWV3IHlvdXIgc3R1ZmYgYW5kIEknbSBzdXJlCj4+IEkn bGwgaGF2ZSBxdWVzdGlvbnMuIEknbSBzdXJlIGVhY2ggc29sdXRpb24gaGFzIHByb3MgYW5kIGNv bnMuCj4+Cj4+Cj4+Pgo+Pj4gaHR0cHM6Ly9naXRodWIuY29tL09uZVBsdXNPU1MvYW5kcm9pZF9r ZXJuZWxfb25lcGx1c19zbTg1NTAvdHJlZS9vbmVwbHVzL3NtODU1MF91XzE0LjAuMF9vbmVwbHVz MTEKPj4+Cj4+PiBPdXIgbW9kaWZpY2F0aW9uIG1pZ2h0IG5vdCBiZSBzbyBjbGVhbiBhbmQgaGFz IGxvdHMgb2Ygd29ya2Fyb3VuZHMKPj4+IGp1c3QgZm9yIHRoZSBzdGFiaWxpdHkgb2YgcHJvZHVj dHMKPj4+Cj4+PiBXZSBtYWlubHkgaGF2ZQo+Pj4KPj4+IDEuIGh0dHBzOi8vZ2l0aHViLmNvbS9P bmVQbHVzT1NTL2FuZHJvaWRfa2VybmVsX29uZXBsdXNfc204NTUwL2Jsb2Ivb25lcGx1cy9zbTg1 NTBfdV8xNC4wLjBfb25lcGx1czExL21tL2NvbnRfcHRlX2h1Z2VwYWdlLmMKPj4+Cj4+PiBzb21l IENPTlRQVEUgaGVscGVycwo+Pj4KPj4+IDIuaHR0cHM6Ly9naXRodWIuY29tL09uZVBsdXNPU1Mv YW5kcm9pZF9rZXJuZWxfb25lcGx1c19zbTg1NTAvYmxvYi9vbmVwbHVzL3NtODU1MF91XzE0LjAu MF9vbmVwbHVzMTEvaW5jbHVkZS9saW51eC9tbS5oCj4+Pgo+Pj4gc29tZSBEeW5hbWljIEh1Z2Vw YWdlIEFQSXMKPj4+Cj4+PiAzLiBodHRwczovL2dpdGh1Yi5jb20vT25lUGx1c09TUy9hbmRyb2lk X2tlcm5lbF9vbmVwbHVzX3NtODU1MC9ibG9iL29uZXBsdXMvc204NTUwX3VfMTQuMC4wX29uZXBs dXMxMS9tbS9tZW1vcnkuYwo+Pj4KPj4+IG1vZGlmaWVkIGFsbCBwYWdlIGZhdWx0cyB0byBzdXBw b3J0Cj4+PiAgICAgICgxKS4gYWxsb2NhdGlvbiBvZiBodWdlcGFnZSBvZiA2NEtCIGluIGRvX2Fu b25fcGFnZQo+Pgo+PiBNeSBTbWFsbC1TaXplZCBUSFAgcGF0Y2ggc2V0IGlzIGhhbmRsaW5nIHRo ZSBlcXVpdmFsZW50IG9mIHRoaXMuCj4gCj4gcmlnaHQsIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMg dGhhdCB3ZSBkaWQgYSBodWdlLXplcm9wYWdlIGZvciByZWFkaW5nCj4gaW4gZG9fYW5vbl9wYWdl Lgo+IG1hcHBpbmcgYWxsIGxhcmdlIGZvbGlvcyB0byBDT05UUFRFIHRvIHplcm8gcGFnZS4KCkZX SVcsIEkgdG9vayBhIHNsaWdodGx5IGRpZmZlcmVudCBhcHByb2FjaCBpbiBteSBvcmlnaW5hbCBS RkMgZm9yIHRoZSB6ZXJvIHBhZ2UKLSBhbHRob3VnaCBJIHJpcHBlZCBpdCBhbGwgb3V0IHRvIHNp bXBsaWZ5IGZvciB0aGUgaW5pdGlhbCBzZXJpZXMuIEkgZm91bmQgdGhhdAppdCB3YXMgcHJldHR5 IHJhcmUgZm9yIHVzZXIgc3BhY2UgdG8gcmVhZCBtdWx0aXBsZSBjb25zZWN1dGl2ZSBwYWdlcyB3 aXRob3V0CmV2ZXIgaW50ZXJsZXZpbmcgYW55IHdyaXRlcywgc28gSSBrZXB0IHRoZSB6ZXJvIHBh Z2UgYXMgYSBiYXNlIHBhZ2UsIGJ1dCBhdCBDb1csCkkgd291bGQgZXhwYW5kIHRoZSBhbGxvY2F0 aW9uIHRvIGFuIGFwcHJvcHJhdGVseSBzaXplZCBUSFAuIEJ1dCBmb3IgdGhlIGNvdXBsZQpvZiB3 b3JrbG9hZHMgdGhhdCBJJ3ZlIGdvbmUgZGVlcCB3aXRoLCBJIGZvdW5kIHRoYXQgaXQgbWFkZSBi YXJlbHkgYW55IGRlbnQgb24KdGhlIGFtb3VudCBvZiBtZW1vcnkgdGhhdCBlbmRlZCB1cCBjb250 cHRlLW1hcHBlZDsgdGhlIHZhc3QgbWFqb3JpdHkgd2FzIGZyb20Kd3JpdGUgYWxsb2NhdGlvbiBp biBkb19hbm9ueW1vdXNfcGFnZSgpLgoKPiAKPj4KPj4+ICAgICAgKDIpLiBDb1cgaHVnZXBhZ2Ug aW4gZG9fd3BfcGFnZQo+Pgo+PiBUaGlzIGlzbid0IGhhbmRsZWQgeWV0IGluIG15IHBhdGNoIHNl dDsgdGhlIG9yaWdpbmFsIFJGQyBpbXBsZW1lbnRlZCBpdCBidXQgSQo+PiByZW1vdmVkIGl0IGlu IG9yZGVyIHRvIHN0cmlwIGJhY2sgdG8gdGhlIGVzc2VudGlhbCBjb21wbGV4aXR5IGZvciB0aGUg aW5pdGlhbAo+PiBzdWJtaXNzaW9uLiBEYXZpZEggaGFzIGJlZW4gd29ya2luZyBvbiBhIHByZWNp c2Ugc2hhcmVkIHZzIGV4Y2x1c2l2ZSBtYXAKPj4gdHJhY2tpbmcgbWVjaGFuaXNtIC0gaWYgdGhh dCBnb2VzIGluLCBpdCB3aWxsIG1ha2UgQ29XaW5nIGxhcmdlIGZvbGlvcyBzaW1wbGVyLgo+PiBP dXQgb2YgaW50ZXJlc3QsIHdoYXQgd29ya2xvYWRzIGJlbmVmaXQgbW9zdCBmcm9tIHRoaXM/Cj4g Cj4gYXMgYSBwaG9uZSwgQW5kcm9pZCBoYXMgYSBkZXNpZ24gYWxtb3N0IGFsbCBwcm9jZXNzZXMg YXJlIGZvcmtlZCBmcm9tIHp5Z290ZS4KPiB0aHVzLCBDb1cgaGFwcGVucyBxdWl0ZSBvZnRlbiB0 byBhbGwgYXBwcy4KClN1cmUuIEJ1dCBpbiBteSBhbmFseXNpcyBJIGNvbmNsdWRlZCB0aGF0IG1v c3Qgb2YgdGhlIG1lbW9yeSBtYXBwZWQgaW4genlnb3RlIGlzCmZpbGUtYmFja2VkIGFuZCBtb3N0 bHkgUk8gc28gdGhlcmVmb3JlIGRvaW5nIFRIUCBDb1cgZG9lc24ndCBoZWxwIG11Y2guIFBlcmhh cHMKdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoYXQgY29uY2x1c2lvbiBpcyB3cm9uZy4KCj4gCj4+ Cj4+PiAgICAgICgzKS4gY29weSBDT05QVEVzIGluIGNvcHlfcHRlX3JhbmdlCj4+Cj4+IEFzIGRp c2N1c3NlZCB0aGlzIGlzIGRvbmUgYXMgcGFydCBvZiB0aGUgY29udHB0ZSBwYXRjaCBzZXQsIGJ1 dCBpdHMgbm90IGp1c3QgYQo+PiBzaW1wbGUgY29weTsgdGhlIGFyY2ggY29kZSB3aWxsIG5vdGlj ZSBhbmQgc2V0IHRoZSBDT05UX1BURSBiaXQgYXMgbmVlZGVkLgo+IAo+IHJpZ2h0LCBpIGhhdmUg cmVhZCBhbGwgeW91ciB1bmZvbGQgYW5kIGZvbGQgc3R1ZmYgdG9kYXksIG5vdyBpIHVuZGVyc3Rh bmQgeW91cgo+IGFwcHJvYWNoIHNlZW1zIHF1aXRlIG5pY2UhCgpHcmVhdCAtIHRoYW5rcyEKCj4g Cj4gCj4+Cj4+PiAgICAgICg0KS4gYWxsb2NhdGUgYW5kIHN3YXAtaW4gSHVnZXBhZ2UgYXMgYSB3 aG9sZSBpbiBkb19zd2FwX3BhZ2UKPj4KPj4gVGhpcyBpcyBnb2luZyB0byBiZSBhIHByb2JsZW0g YnV0IEkgaGF2ZW4ndCBldmVuIGxvb2tlZCBhdCB0aGlzIHByb3Blcmx5IHlldC4KPj4gVGhlIGFk dmljZSBzbyBmYXIgaGFzIGJlZW4gdG8gY29udGludWUgdG8gc3dhcC1pbiBzbWFsbCBwYWdlcyBv bmx5LCBidXQgaW1wcm92ZQo+PiBraHVnZXBhZ2VkIHRvIGNvbGxhcHNlIHRvIHNtYWxsLXNpemVk IFRIUC4gSSdsbCB0YWtlIGEgbG9vayBhdCB5b3VyIGNvZGUgdG8KPj4gdW5kZXJzdGFuZCBob3cg eW91IGRpZCB0aGlzLgo+IAo+IHRoaXMgaXMgYWxzbyBjcnVjaWFsIHRvIGFuZHJvaWQgcGhvbmUg YXMgc3dhcCBpcyBhbHdheXMgaGFwcGVuaW5nCj4gb24gYW4gZW1iZWRkZWQgZGV2aWNlLiBpZiB3 ZSBkb24ndCBzdXBwb3J0IGxhcmdlIGZvbGlvcyBpbiBzd2FwaW4sCj4gb3VyIGxhcmdlIGZvbGlv cyB3aWxsIG5ldmVyIGNvbWUgYmFjayBhZnRlciBpdCBpcyBzd2FwcGVkLW91dC4KPiAKPiBhbmQg aSBoYXRlZCB0aGUgY29sbGFwc2Ugc29sdXRpb24gZnJvbSB0aGUgZmlyc3QgYmVnaW5uaW5nIGFz IHRoZXJlIGlzCj4gbmV2ZXIgYSBndWFyYW50ZWUgdG8gc3VjY2VlZCBhbmQgaXRzIG92ZXJoZWFk IGlzIHVuYWNjZXB0YWJsZSB0byB1c2VyIFVJLAo+IHNvIHdlIHN1cHBvcnRlZCBodWdlcGFnZSBh bGxvY2F0aW9uIGluIGRvX3N3YXBfcGFnZSBmcm9tIHRoZSBmaXJzdCBiZWdpbm5pbmcuCgpVbmRl cnN0b29kLiBJIGFncmVlIGl0IHdvdWxkIGJlIG5pY2UgdG8gcHJlc2VydmUgbGFyZ2UgZm9saW9z IGFjcm9zcyBzd2FwLiBJCnRoaW5rIHRoaXMgY2FuIGJlIGxheWVyZWQgb24gdG9wIG9mIHRoZSBj dXJyZW50IHdvcmsgdGhvdWdoLgoKPiAKPj4KPj4+Cj4+PiA0LiBodHRwczovL2dpdGh1Yi5jb20v T25lUGx1c09TUy9hbmRyb2lkX2tlcm5lbF9vbmVwbHVzX3NtODU1MC9ibG9iL29uZXBsdXMvc204 NTUwX3VfMTQuMC4wX29uZXBsdXMxMS9tbS92bXNjYW4uYwo+Pj4gaHR0cHM6Ly9naXRodWIuY29t L09uZVBsdXNPU1MvYW5kcm9pZF9rZXJuZWxfb25lcGx1c19zbTg1NTAvYmxvYi9vbmVwbHVzL3Nt ODU1MF91XzE0LjAuMF9vbmVwbHVzMTEvbW0vcm1hcC5jCj4+Pgo+Pj4gcmVjbGFpbSBodWdlcGFn ZSBhcyBhIHdob2xlIGFuZCBMUlUgb3B0aW1pemF0aW9uIGZvciA2NEtCIGR5bmFtaWMgaHVnZXBh Z2UuCj4+Cj4+IEkgdGhpbmsgdGhpcyBpcyBhbGwgbmF0dXJhbGx5IGhhbmRsZWQgYnkgdGhlIGZv bGlvIGNvZGUgdGhhdCBleGlzdHMgaW4gbW9kZXJuCj4+IGtlcm5lbHM/Cj4gCj4gV2UgaGFkIGEg Q09OVFBURSBodWdlcGFnZSBwb29sLCBpZiB0aGUgcG9vbCBpcyB2ZXJ5IGxpbWl0ZWQsIHdlIGxl dCBMUlUKPiByZWNsYWltIGxhcmdlIGZvbGlvcyB0byB0aGUgcG9vbC4gYXMgcGhvbmVzIGFyZSBy dW5uaW5nIGxvdHMgb2YgYXBwcwo+IGFuZCBkcml2ZXJzLCBhbmQgdGhlIG1lbW9yeSBpcyB2ZXJ5 IGxpbWl0ZWQsIGFmdGVyIGEgY291cGxlIG9mIGhvdXJzLAo+IGl0IHdpbGwgYmVjb21lIHZlcnkg aGFyZCB0byBhbGxvY2F0ZSBsYXJnZSBmb2xpb3MgaW4gdGhlIG9yaWdpbmFsIGJ1ZGR5LiB0aHVz LAo+IGxhcmdlIGZvbGlvcyB0b3RhbGx5IGRpc2FwcGVhcmVkIGFmdGVyIHJ1bm5pbmcgdGhlIHBo b25lIGZvciBzb21lIHRpbWUKPiBpZiB3ZSBkaWRuJ3QgaGF2ZSB0aGUgcG9vbC4KPiAKPj4KPj4+ Cj4+PiBTbyB3ZSBhcmUgMTAwJSBpbnRlcmVzdGVkIGluIHlvdXIgcGF0Y2hzZXQgYW5kIGhvcGUg aXQgY2FuIGZpbmQgYSB3YXkKPj4+IHRvIGxhbmQgb24gdGhlCj4+PiBtYWlubGluZSwgdGh1cyBk ZWNyZWFzaW5nIGFsbCB0aGUgY29zdCB3ZSBoYXZlIHRvIG1haW50YWluIG91dC1vZi10cmVlCj4+ PiBjb2RlIGZyb20gYQo+Pj4ga2VybmVsIHRvIGFub3RoZXIga2VybmVsIHZlcnNpb24gd2hpY2gg d2UgaGF2ZSBkb25lIG9uIGEgY291cGxlIG9mCj4+PiBrZXJuZWwgdmVyc2lvbnMKPj4+IGJlZm9y ZSA1LjE2LiBGaXJtbHksIHdlIGFyZSAxMDAlIHN1cHBvcnRpdmUgb2YgbGFyZ2UgYW5vbiBmb2xp b3MKPj4+IHRoaW5ncyB5b3UgYXJlIGxlYWRpbmcuCj4+Cj4+IFRoYXQncyBncmVhdCB0byBoZWFy ISBPZiBjb3Vyc2UgUmV2aWV3ZWQtQnkncyBhbmQgVGVzdGVkLUJ5J3Mgd2lsbCBhbGwgaGVscCBt b3ZlCj4+IGl0IGNsb3NlciA6KS4gSWYgeW91IGhhZCBhbnkgYWJpbGl0eSB0byBkbyBhbnkgQS9C IHBlcmZvcm1hbmNlIHRlc3RpbmcsIGl0IHdvdWxkCj4+IGJlIHZlcnkgaW50ZXJlc3RpbmcgdG8g c2VlIGhvdyB0aGlzIHN0YWNrcyB1cCBhZ2FpbnN0IHlvdXIgc29sdXRpb24gLSBpZiB0aGVyZQo+ PiBhcmUgZ2FwcyBpdCB3b3VsZCBiZSBnb29kIHRvIGtub3cgd2hlcmUgYW5kIGRldmVsb3AgYSBw bGFuIHRvIHBsdWcgdGhlIGdhcC4KPj4KPiAKPiBzdXJlLgo+IAo+Pj4KPj4+IEEgYmlnIHBhaW4g d2FzIHdlIGZvdW5kIGxvdHMgb2YgcmFjZXMgZXNwZWNpYWxseSBvbiBDT05UUFRFIHVuZm9sZGlu Zwo+Pj4gYW5kIGVzcGVjaWFsbHkgYSBwYXJ0Cj4+PiBvZiBiYXNlcGFnZXMgcmFuIGF3YXkgZnJv bSB0aGUgMTYgQ09OUFRFcyBncm91cCBzaW5jZSB1c2Vyc3BhY2UgaXMKPj4+IGFsd2F5cyB3b3Jr aW5nCj4+PiBvbiBiYXNlcGFnZXMsIGhhdmluZyBubyBpZGVhIG9mIHNtYWxsLVRIUC4gIFdlIHJh biBvdXIgY29kZSBvbiBtaWxsaW9ucyBvZgo+Pj4gcmVhbCBwaG9uZXMsIGFuZCBub3cgd2UgaGF2 ZSBnb3QgdGhlbSBmaXhlZCAob3IgbWF5YmUgImNhbid0IHJlcHJvZHVjZSIpLAo+Pj4gbm8gb3V0 c3RhbmRpbmcgaXNzdWUuCj4+Cj4+IEknbSBnb2luZyB0byBiZSBicmF2ZSBhbmQgc2F5IHRoYXQg bXkgc29sdXRpb24gc2hvdWxkbid0IHN1ZmZlciBmcm9tIHRoZXNlCj4+IHByb2JsZW1zOyBidXQg b2YgY291cnNlIHRoZSBwcm9vZiBpcyBvbmx5IGluIHRoZSB0ZXN0aW5nLiBJIGRpZCBhIGxvdCBv ZiB3b3JrCj4+IHdpdGggb3VyIGFyY2hpdGVjdHVyZSBncm91cCBhbmQgbWljcm8gYXJjaGl0ZWN0 cyB0byBkZXRlcm1pbmUgZXhhY3RseSB3aGF0IGlzCj4+IGFuZCBpc24ndCBzYWZlOyBXZSBldmVu IHRpZ2h0ZW5lZCB0aGUgQXJtIEFSTSBzcGVjIHZlcnkgc3VidGxlbHkgdG8gYWxsb3cgdGhlCj4+ IG9wdGltaXphdGlvbiBpbiBwYXRjaCAxMyAoc2VlIHRoZSBjb21taXQgbG9nIGZvciBkZXRhaWxz KS4gT2YgY291cnNlIHRoaXMgaGFzCj4+IGFsbCBiZWVuIGNoZWNrZWQgd2l0aCBwYXJ0bmVycyBh bmQgd2UgYXJlIGNvbmZpZGVudCB0aGF0IGFsbCBleGlzdGluZwo+PiBpbXBsZW1lbnRhdGlvbnMg Y29uZm9ybSB0byB0aGUgbW9kaWZpZWQgd29yZGluZy4KPiAKPiBjb29sLiBJIGxpa2UgeW91ciB0 cnlfdW5mb2xkL2ZvbGQgY29kZS4gaXQgc2VlbXMgeW91ciBjb2RlIGlzIHNldHRpbmcvZHJvcHBp bmcKPiBDT05UIGF1dG9tYXRpY2FsbHkgYmFzZWQgb24gQUxJR0hNRU5ULCBQYWdlIG51bWJlciBl dGMuIEFsdGVybmF0aXZlbHksCj4gb3VyIGNvZGUgaXMgYWx3YXlzIHN0dXBpZGx5IGNoZWNraW5n IHNvbWUgY29uZGl0aW9ucyBiZWZvcmUgc2V0dGluZyBhbmQgZHJvcHBpbmcKPiBDT05UIGV2ZXJ5 d2hlcmUuCj4gCj4+Cj4+Pgo+Pj4gUGFydGljdWxhcmx5IGZvciB0aGUgcm1hcCBpc3N1ZSB3ZSBh cmUgZGlzY3Vzc2luZywgb3VyIG91dC1vZi10cmVlIGlzCj4+PiB1c2luZyB0aGUgZW50aXJlX21h cCBmb3IKPj4+IENPTlRQVEUgaW4gdGhlIHdheSBJIHNlbnQgdG8geW91LiBCdXQgSSBndWVzcyB3 ZSBjYW4gbGVhcm4gZnJvbSB5b3UgdG8gZGVjb3VwbGUKPj4+IENPTlRQVEUgZnJvbSBtbS1jb3Jl Lgo+Pj4KPj4+IFdlIGFyZSBkb2luZyB0aGlzIGluIG1tL21lbW9yeS5jCj4+Pgo+Pj4gY29weV9w cmVzZW50X2NvbnRfcHRlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqZHN0X3ZtYSwgc3RydWN0Cj4+ PiB2bV9hcmVhX3N0cnVjdCAqc3JjX3ZtYSwKPj4+IHB0ZV90ICpkc3RfcHRlLCBwdGVfdCAqc3Jj X3B0ZSwgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgKnJzcywKPj4+IHN0cnVjdCBwYWdlICoqcHJl YWxsb2MpCj4+PiB7Cj4+PiAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpzcmNfbW0gPSBzcmNfdm1h LT52bV9tbTsKPj4+ICAgICAgIHVuc2lnbmVkIGxvbmcgdm1fZmxhZ3MgPSBzcmNfdm1hLT52bV9m bGFnczsKPj4+ICAgICAgIHB0ZV90IHB0ZSA9ICpzcmNfcHRlOwo+Pj4gICAgICAgc3RydWN0IHBh Z2UgKnBhZ2U7Cj4+Pgo+Pj4gICAgICAgIHBhZ2UgPSB2bV9ub3JtYWxfcGFnZShzcmNfdm1hLCBh ZGRyLCBwdGUpOwo+Pj4gICAgICAgLi4uCj4+Pgo+Pj4gICAgICBnZXRfcGFnZShwYWdlKTsKPj4+ ICAgICAgcGFnZV9kdXBfcm1hcChwYWdlLCB0cnVlKTsgICAvLyBhbiBlbnRpcmUgZHVwX3JtYXAg YXMgeW91IGNhbgo+Pj4gc2VlLi4uLi4uLi4uLi4uLgo+Pj4gICAgICByc3NbbW1fY291bnRlcihw YWdlKV0gKz0gSFBBR0VfQ09OVF9QVEVfTlI7Cj4+PiB9Cj4+Pgo+Pj4gYW5kIHdlIGhhdmUgYSBz cGxpdCBpbiBtbS9jb250X3B0ZV9odWdlcGFnZS5jIHRvIGhhbmRsZSBwYXJ0aWFsbHkgdW5tYXAs Cj4+Pgo+Pj4gc3RhdGljIHZvaWQgX19zcGxpdF9odWdlX2NvbnRfcHRlX2xvY2tlZChzdHJ1Y3Qg dm1fYXJlYV9zdHJ1Y3QgKnZtYSwgcHRlX3QgKnB0ZSwKPj4+IHVuc2lnbmVkIGxvbmcgaGFkZHIs IGJvb2wgZnJlZXplKQo+Pj4gewo+Pj4gLi4uCj4+PiAgICAgICAgICAgIGlmIChjb21wb3VuZF9t YXBjb3VudChoZWFkKSA+IDEgJiYgIVRlc3RTZXRQYWdlRG91YmxlTWFwKGhlYWQpKSB7Cj4+PiAg ICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSFBBR0VfQ09OVF9QVEVfTlI7IGkrKykK Pj4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21pY19pbmMoJmhlYWRbaV0uX21hcGNv dW50KTsKPj4+ICAgICAgICAgICAgICAgICAgYXRvbWljX2xvbmdfaW5jKCZjb250X3B0ZV9kb3Vi bGVfbWFwX2NvdW50KTsKPj4+ICAgICAgICAgICAgfQo+Pj4KPj4+Cj4+PiAgICAgICAgICAgICBp ZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgY29tcG91bmRfbWFwY291bnRfcHRyKGhlYWQpKSkg ewo+Pj4gICAgICAgICAgICAgICAuLi4KPj4+IH0KPj4+Cj4+PiBJIGFtIG5vdCBzZWxsaW5nIG91 ciBzb2x1dGlvbiBhbnkgbW9yZSwgYnV0IGp1c3Qgc2hvd2luZyB5b3Ugc29tZSBkaWZmZXJlbmNl cyB3ZQo+Pj4gaGF2ZSA6LSkKPj4KPj4gT0ssIEkgdW5kZXJzdGFuZCB3aGF0IHlvdSB3ZXJlIHNh eWluZyBub3cuIEknbSBjdXJyZW50bHkgc3RydWdnbGluZyB0byBzZWUgaG93Cj4+IHRoaXMgY291 bGQgZml0IGludG8gbXkgbW9kZWwuIERvIHlvdSBoYXZlIGFueSB3b3JrbG9hZHMgYW5kIG51bWJl cnMgb24gcGVyZgo+PiBpbXByb3ZlbWVudCBvZiB1c2luZyBlbnRpcmVfbWFwY291bnQ/Cj4gCj4g VEJILCBJIGRvbid0IGhhdmUgYW55IGRhdGEgb24gdGhpcyBhcyBmcm9tIHRoZSBmaXJzdCBiZWdp bm5pbmcsIHdlIHdlcmUgdXNpbmcKPiBlbnRpcmVfbWFwLiBTbyBJIGhhdmUgbm8gY29tcGFyaXNv biBhdCBhbGwuCj4gCj4+Cj4+Pgo+Pj4+Cj4+Pj4+Cj4+Pj4+IEJUVywgSSBoYXZlIGNvbmNlcm5z IHRoYXQgYSB2YXJpYWJsZSBzbWFsbC1USFAgc2l6ZSB3aWxsIHJlYWxseSB3b3JrCj4+Pj4+IGFz IHVzZXJzcGFjZQo+Pj4+PiBpcyBwcm9iYWJseSBmcmllbmRseSB0byBvbmx5IG9uZSBmaXhlZCBz aXplLiBmb3IgZXhhbXBsZSwgdXNlcnNwYWNlCj4+Pj4+IGhlYXAgbWFuYWdlbWVudAo+Pj4+PiBt aWdodCBiZSBvcHRpbWl6ZWQgdG8gYSBzaXplIGZvciBmcmVlaW5nIG1lbW9yeSB0byB0aGUga2Vy bmVsLiBpdCBpcwo+Pj4+PiB2ZXJ5IGRpZmZpY3VsdAo+Pj4+PiBmb3IgdGhlIGhlYXAgdG8gYWRh cHQgdG8gdmFyaW91cyBzaXplcyBhdCB0aGUgc2FtZSB0aW1lLiBmcmVxdWVudCB1bm1hcC9mcmVl Cj4+Pj4+IHNpemUgbm90IGVxdWFsIHdpdGgsIGFuZCBwYXJ0aWN1bGFybHkgc21hbGxlciB0aGFu IHNtYWxsLVRIUCBzaXplIHdpbGwKPj4+Pj4gZGVmZWF0IGFsbAo+Pj4+PiBlZmZvcnRzIHRvIHVz ZSBzbWFsbC1USFAuCj4+Pj4KPj4+PiBJJ2xsIGFkbWl0IHRvIG5vdCBrbm93aW5nIGEgaHVnZSBh bW91bnQgYWJvdXQgdXNlciBzcGFjZSBhbGxvY2F0b3JzLiBCdXQgSSB3aWxsCj4+Pj4gc2F5IHRo YXQgYXMgY3VycmVudGx5IGRlZmluZWQsIHRoZSBzbWFsbC1zaXplZCBUSFAgaW50ZXJmYWNlIHRv IHVzZXIgc3BhY2UKPj4+PiBhbGxvd3MgYSBzeXNhZG1pbiB0byBzcGVjaWZpY2FsbHkgZW5hYmxl IHRoZSBzZXQgb2Ygc2l6ZXMgdGhhdCB0aGV5IHdhbnQ7IHNvIGEKPj4+PiBzaW5nbGUgc2l6ZSBj YW4gYmUgZW5hYmxlZC4gSSdtIGRpbGliZXJhdGVseSBwdW50aW5nIHRoYXQgZGVjaXNpb24gYXdh eSBmcm9tIHRoZQo+Pj4+IGtlcm5lbCBmb3Igbm93Lgo+Pj4KPj4+IEJhc2ljYWxseSwgdXNlcnNw YWNlIGhlYXAgbGlicmFyeSBoYXMgYSBQQUdFU0laRSBzZXR0aW5nIGFuZCBhbGxvd3MgdXNlcnMK Pj4+IHRvIGFsbG9jYXRlL2ZyZWUgYWxsIGtpbmRzIG9mIHNtYWxsIG9iamVjdHMgc3VjaCBhcyAx NiwzMiw2NCwxMjgsMjU2LDUxMiBldGMuCj4+PiBUaGUgZGVmYXVsdCBzaXplIGlzIGZvciBzdXJl IGVxdWFsIHRvIHRoZSBiYXNlcGFnZSBTSVpFLiBvbmNlIHNvbWUgb2JqZWN0cyBhcmUKPj4+IGZy ZWVkIGJ5IGZyZWUoKSBhbmQgbGliYyBnZXQgYSBmcmVlICJwYWdlIiwgdXNlcnNwYWNlIGhlYXAg bGlicmFyaWVzIG1pZ2h0IGZyZWUKPj4+IHRoZSBQQUdFU0laRSBwYWdlIHRvIGtlcm5lbCBieSB0 aGluZ3MgbGlrZSBNQURWX0RPTlRORUVELCB0aGVuIHphcF9wdGVfcmFuZ2UoKS4KPj4+IGl0IGlz IHF1aXRlIHNpbWlsYXIgd2l0aCBrZXJuZWwgc2xhYi4KPj4+Cj4+PiBzbyBpbWFnaW5lIHdlIGhh dmUgc21hbGwtVEhQIG5vdywgYnV0IHVzZXJzcGFjZSBsaWJyYXJpZXMgaGF2ZSAqTk8qCj4+PiBp ZGVhIGF0IGFsbCwgIHNvIGl0IGNhbiBmcmVxdWVudGx5IGNhdXNlIHVuZm9sZGluZy4KPj4+Cj4+ Pj4KPj4+PiBGV0lXLCBNeSBleHBlcmllbmNlIHdpdGggdGhlIFNwZWVkb21ldGVyL0phdmFTY3Jp cHQgdXNlIGNhc2UgaXMgdGhhdCBwZXJmb3JtYW5jZQo+Pj4+IGlzIGEgbGl0dGxlIGJpdCBiZXR0 ZXIgd2hlbiBlbmFibGluZyA2NCszMisxNksgdnMganVzdCA2NEsgVEhQLgo+Pj4+Cj4+Pj4gRnVu Y3Rpb25hbGx5LCBpdCB3aWxsIG5vdCBtYXR0ZXIgaWYgdGhlIGFsbG9jYXRvciBpcyBub3QgZW5s aWdodGVuZWQgZm9yIHRoZSBUSFAKPj4+PiBzaXplOyBpdCBjYW4gY29udGludWUgdG8gZnJlZSwg YW5kIGlmIGEgcGFydGlhbCBmb2xpbyBpcyB1bm1hcHBlZCBpdCBpcyBwdXQgb24KPj4+PiB0aGUg ZGVmZXJyZWQgc3BsaXQgbGlzdCwgdGhlbiB1bmRlciBtZW1vcnkgcHJlc3N1cmUgaXQgaXMgc3Bs aXQgYW5kIHRoZSB1bnVzZWQKPj4+PiBwYWdlcyBhcmUgcmVjbGFpbWVkLiBJIGd1ZXNzIHRoaXMg aXMgdGhlIGJpdCB5b3UgYXJlIGNvbmNlcm5lZCBhYm91dCBoYXZpbmcgYQo+Pj4+IHBlcmZvcm1h bmNlIGltcGFjdD8KPj4+Cj4+PiByaWdodC4gSWYgdGhpcyBpcyBoYXBwZW5pbmcgb24gdGhlIG1h am9yaXR5IG9mIHNtYWxsLVRIUCBmb2xpb3MsIHdlCj4+PiBkb24ndCBoYXZlIHBlcmZvcm1hbmNl Cj4+PiBpbXByb3ZlbWVudCwgYW5kIHByb2JhYmx5IHJlZ3Jlc3Npb24gaW5zdGVhZC4gVGhpcyBp cyByZWFsbHkgdHJ1ZSBvbgo+Pj4gcmVhbCB3b3JrbG9hZHMhIQo+Pj4KPj4+IFNvIHRoYXQgaXMg d2h5IHdlIHJlYWxseSBsb3ZlIGEgcGVyLVZNQSBoaW50IHRvIGVuYWJsZSBzbWFsbC1USFAgYnV0 Cj4+PiBvYnZpb3VzbHkgeW91Cj4+PiBoYXZlIGFscmVhZHkgc3VwcG9ydGVkIGl0IG5vdyBieQo+ Pj4gbW06IHRocDogSW50cm9kdWNlIHBlci1zaXplIHRocCBzeXNmcyBpbnRlcmZhY2UKPj4+IGh0 dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xpbnV4LW1tLzIwMjMxMTIyMTYyOTUwLjM4NTQ4OTctNC1y eWFuLnJvYmVydHNAYXJtLmNvbS8KPj4+Cj4+PiB3ZSBjYW4gdXNlIE1BRFZJU0UgcmF0aGVyIHRo YW4gQUxXQVlTIGFuZCBzZXQgZml4ZWQgc2l6ZSBsaWtlIDY0S0IsIHNvIHVzZXJzcGFjZQo+Pj4g Y2FuIHNldCB0aGUgVk1BIGZsYWcgd2hlbiBpdCBpcyBxdWl0ZSBzdXJlIHRoaXMgVk1BIGlzIHdv cmtpbmcgd2l0aAo+Pj4gdGhlIGFsaWdubWVudAo+Pj4gb2YgNjRLQj8KPj4KPj4gWWVzLCB0aGF0 IGFsbCBleGlzdHMgaW4gdGhlIHNlcmllcyB0b2RheS4gV2UgaGF2ZSBhbHNvIGRpc2N1c3NlZCB0 aGUgcG9zc2liaWxpdHkKPj4gb2YgYWRkaW5nIGEgbmV3IG1hZHZpc2VfcHJvY2VzcygpIGNhbGwg dGhhdCB3b3VsZCB0YWtlIHRoZSBzZXQgb2YgVEhQIHNpemVzIHRoYXQKPj4gc2hvdWxkIGJlIGNv bnNpZGVyZWQuIFRoZW4geW91IGNhbiBzZXQgZGlmZmVyZW50IFZNQXMgdG8gdXNlIGRpZmZlcmVu dCBzaXplczsKPj4gdGhlIHBsYW4gd2FzIHRvIGxheWVyIHRoYXQgb24gdG9wIGlmL3doZW4gYSB3 b3JrbG9hZCB3YXMgaWRlbnRpZmllZC4gU291bmRzIGxpa2UKPj4geW91IG1pZ2h0IGJlIGFibGUg dG8gaGVscCB0aGVyZT8KPiAKPiBpJ20gbm90IHF1aXRlIHN1cmUgYXMgb24gcGhvbmVzLCB3ZSBh cmUgdXNpbmcgZml4ZWQtc2l6ZSBDT05UUFRFLiBzbyB3ZSBhc2sKPiBmb3IgZWl0aGVyIDY0S0Ig b3IgNEtCLiBJZiB3ZSB0aGluayBvbmUgVk1BIGlzIGFsbCBnb29kIHRvIHVzZSBDT05UUFRFLCB3 ZQo+IHNldCBhIGZsYWcgaW4gdGhpcyBWTUEgYW5kIHRyeSB0byBhbGxvY2F0ZSA2NEtCLgoKV2hl biB5b3Ugc2F5ICJ3ZSBzZXQgYSBmbGFnIiBkbyB5b3UgbWVhbiB1c2VyIHNwYWNlPyBPciBpcyB0 aGVyZSBzb21lIGhldXJpc3RpYwppbiB0aGUga2VybmVsPwoKPiAKPiBCdXQgSSB3aWxsIHRyeSB0 byB1bmRlcnN0YW5kIHRoaXMgcmVxdWlyZW1lbnQgdG8gbWFkdmlzZSBUSFBzIHNpemUgb24gYSBz cGVjaWZpYwo+IFZNQS4KPiAKPj4KPj4+Cj4+Pj4KPj4+PiBSZWdhcmRsZXNzLCBpdCB3b3VsZCBi ZSBnb29kIHRvIG1vdmUgdGhpcyBjb252ZXJzYXRpb24gdG8gdGhlIHNtYWxsLXNpemVkIFRIUAo+ Pj4+IHBhdGNoIHNlcmllcyBzaW5jZSB0aGlzIGlzIGFsbCBpbmRlcGVuZGVudCBvZiBjb250cHRl IG1hcHBpbmdzLgo+Pj4+Cj4+Pj4+Cj4+Pj4+Pgo+Pj4+Pj4+Cj4+Pj4+Pj4gU2luY2Ugd2UgYWx3 YXlzIGhvbGQgcHRsIHRvIHNldCBvciBkcm9wIENPTlRQVEUgYml0cywgc2V0L2Ryb3AgaXMKPj4+ Pj4+PiBzdGlsbCBhdG9taWMgaW4gYQo+Pj4+Pj4+IHNwaW5sb2NrIGFyZWEuCj4+Pj4+Pj4KPj4+ Pj4+Pj4KPj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4+IEJ1dCB0aGF0IGNhbiBiZSBhZGRlZCBvbiB0b3As IGFuZCBJJ2xsIGhhcHBpbHkgZG8gdGhhdC4KPj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4+IC0tCj4+Pj4+ Pj4+Pj4gQ2hlZXJzLAo+Pj4+Pj4+Pj4+Cj4+Pj4+Pj4+Pj4gRGF2aWQgLyBkaGlsZGVuYgo+Pj4+ Pj4+Pj4KPj4+Pj4+Pgo+Pj4+Pgo+IAo+IFRoYW5rcwo+IEJhcnJ5CgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5n IGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5p bmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=