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 DBE43C433EF for ; Thu, 9 Jun 2022 14:48:34 +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-Type: Content-Transfer-Encoding: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=FgrEX4xkvc+fYBFsyOxCVzDyuMvAJV2eZwWI9McmBEg=; b=cDBQW4zSOKDvCx Gt5GiQ3r8DNAmpNj9AJjO0ek+d6BWugZG/fkqwJsERAkdr1L6WQ7PHt4X2xirThE8+3YpqY76PVgQ UV2cX7Z9Qkz6Pei2fQDmsKJitEKqMf+VmGjil/VUjK3eE5AFlQVU5O/kQWFDr3dtnglR3/mGhl5Oo dyYlD0yzu1wrH3mkyClmBwzPcMH2EO6vcgmNBDhfbyWaZiqhXcvao8DfqOQccPtfIx0nWJGrVbWXX S7BbKT2SbUga9FI5VanfKsbBzxiUA8EKUl6TkzHLeTe7BBDOFflzyb7iCvyiHbq0pEBTLlHie9zAv SRE+GAtpqEIV1uJmxDNg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nzJR9-002YHU-PX; Thu, 09 Jun 2022 14:47:03 +0000 Received: from out30-54.freemail.mail.aliyun.com ([115.124.30.54]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nzJR0-002YF5-OV for linux-arm-kernel@lists.infradead.org; Thu, 09 Jun 2022 14:47:01 +0000 X-Alimail-AntiSpam: AC=PASS;BC=-1|-1;BR=01201311R651e4;CH=green;DM=||false|;DS=||;FP=0|-1|-1|-1|0|-1|-1|-1;HT=ay29a033018045168;MF=zhongjiang-ali@linux.alibaba.com;NM=1;PH=DS;RN=38;SR=0;TI=SMTPD_---0VFuGevJ_1654786002; Received: from 30.225.24.138(mailfrom:zhongjiang-ali@linux.alibaba.com fp:SMTPD_---0VFuGevJ_1654786002) by smtp.aliyun-inc.com; Thu, 09 Jun 2022 22:46:45 +0800 Message-ID: Date: Thu, 9 Jun 2022 22:46:42 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:101.0) Gecko/20100101 Thunderbird/101.0 Subject: Re: [PATCH v11 06/14] mm: multi-gen LRU: minimal implementation Content-Language: en-US From: zhong jiang To: Yu Zhao , Andrew Morton , linux-mm@kvack.org Cc: Andi Kleen , Aneesh Kumar , Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Johannes Weiner , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Mel Gorman , Michael Larabel , Michal Hocko , Mike Rapoport , Peter Zijlstra , Tejun Heo , Vlastimil Babka , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, x86@kernel.org, page-reclaim@google.com, Brian Geffon , Jan Alexander Steffens , Oleksandr Natalenko , Steven Barrett , Suleiman Souhlal , Daniel Byrne , Donald Carr , =?UTF-8?Q?Holger_Hoffst=c3=a4tte?= , Konstantin Kharlamov , Shuang Zhai , Sofia Trinh , Vaibhav Jain References: <20220518014632.922072-1-yuzhao@google.com> <20220518014632.922072-7-yuzhao@google.com> In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220609_074655_442062_55402C13 X-CRM114-Status: GOOD ( 26.67 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Ck9uIDIwMjIvNi85IDg6MzQg5LiL5Y2ILCB6aG9uZyBqaWFuZyB3cm90ZToKPgo+IE9uIDIwMjIv NS8xOCA5OjQ2IOS4iuWNiCwgWXUgWmhhbyB3cm90ZToKPj4gVG8gYXZvaWQgY29uZnVzaW9uLCB0 aGUgdGVybXMgInByb21vdGlvbiIgYW5kICJkZW1vdGlvbiIgd2lsbCBiZQo+PiBhcHBsaWVkIHRv IHRoZSBtdWx0aS1nZW4gTFJVLCBhcyBhIG5ldyBjb252ZW50aW9uOyB0aGUgdGVybXMKPj4gImFj dGl2YXRpb24iIGFuZCAiZGVhY3RpdmF0aW9uIiB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGFjdGl2 ZS9pbmFjdGl2ZQo+PiBMUlUsIGFzIHVzdWFsLgo+Pgo+PiBUaGUgYWdpbmcgcHJvZHVjZXMgeW91 bmcgZ2VuZXJhdGlvbnMuIEdpdmVuIGFuIGxydXZlYywgaXQgaW5jcmVtZW50cwo+PiBtYXhfc2Vx IHdoZW4gbWF4X3NlcS1taW5fc2VxKzEgYXBwcm9hY2hlcyBNSU5fTlJfR0VOUy4gVGhlIGFnaW5n Cj4+IHByb21vdGVzIGhvdCBwYWdlcyB0byB0aGUgeW91bmdlc3QgZ2VuZXJhdGlvbiB3aGVuIGl0 IGZpbmRzIHRoZW0KPj4gYWNjZXNzZWQgdGhyb3VnaCBwYWdlIHRhYmxlczsgdGhlIGRlbW90aW9u IG9mIGNvbGQgcGFnZXMgaGFwcGVucwo+PiBjb25zZXF1ZW50bHkgd2hlbiBpdCBpbmNyZW1lbnRz IG1heF9zZXEuIFRoZSBhZ2luZyBoYXMgdGhlIGNvbXBsZXhpdHkKPj4gTyhucl9ob3RfcGFnZXMp LCBzaW5jZSBpdCBpcyBvbmx5IGludGVyZXN0ZWQgaW4gaG90IHBhZ2VzLiBQcm9tb3Rpb24KPj4g aW4gdGhlIGFnaW5nIHBhdGggZG9lcyBub3QgaW52b2x2ZSBhbnkgTFJVIGxpc3Qgb3BlcmF0aW9u cywgb25seSB0aGUKPj4gdXBkYXRlcyBvZiB0aGUgZ2VuIGNvdW50ZXIgYW5kIGxydWdlbi0+bnJf cGFnZXNbXTsgZGVtb3Rpb24sIHVubGVzcyBhcwo+PiB0aGUgcmVzdWx0IG9mIHRoZSBpbmNyZW1l bnQgb2YgbWF4X3NlcSwgcmVxdWlyZXMgTFJVIGxpc3Qgb3BlcmF0aW9ucywKPj4gZS5nLiwgbHJ1 X2RlYWN0aXZhdGVfZm4oKS4KPj4KPj4gVGhlIGV2aWN0aW9uIGNvbnN1bWVzIG9sZCBnZW5lcmF0 aW9ucy4gR2l2ZW4gYW4gbHJ1dmVjLCBpdCBpbmNyZW1lbnRzCj4+IG1pbl9zZXEgd2hlbiB0aGUg bGlzdHMgaW5kZXhlZCBieSBtaW5fc2VxJU1BWF9OUl9HRU5TIGJlY29tZSBlbXB0eS4gQQo+PiBm ZWVkYmFjayBsb29wIG1vZGVsZWQgYWZ0ZXIgdGhlIFBJRCBjb250cm9sbGVyIG1vbml0b3JzIHJl ZmF1bHRzIG92ZXIKPj4gYW5vbiBhbmQgZmlsZSB0eXBlcyBhbmQgZGVjaWRlcyB3aGljaCB0eXBl IHRvIGV2aWN0IHdoZW4gYm90aCB0eXBlcwo+PiBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIHNhbWUg Z2VuZXJhdGlvbi4KPj4KPj4gRWFjaCBnZW5lcmF0aW9uIGlzIGRpdmlkZWQgaW50byBtdWx0aXBs ZSB0aWVycy4gVGllcnMgcmVwcmVzZW50Cj4+IGRpZmZlcmVudCByYW5nZXMgb2YgbnVtYmVycyBv ZiBhY2Nlc3NlcyB0aHJvdWdoIGZpbGUgZGVzY3JpcHRvcnMuIEEKPj4gcGFnZSBhY2Nlc3NlZCBO IHRpbWVzIHRocm91Z2ggZmlsZSBkZXNjcmlwdG9ycyBpcyBpbiB0aWVyCj4+IG9yZGVyX2Jhc2Vf MihOKS4gVGllcnMgZG8gbm90IGhhdmUgZGVkaWNhdGVkIGxydWdlbi0+bGlzdHNbXSwgb25seQo+ PiBiaXRzIGluIGZvbGlvLT5mbGFncy4gSW4gY29udHJhc3QgdG8gbW92aW5nIGFjcm9zcyBnZW5l cmF0aW9ucywgd2hpY2gKPj4gcmVxdWlyZXMgdGhlIExSVSBsb2NrLCBtb3ZpbmcgYWNyb3NzIHRp ZXJzIG9ubHkgaW52b2x2ZXMgb3BlcmF0aW9ucyBvbgo+PiBmb2xpby0+ZmxhZ3MuIFRoZSBmZWVk YmFjayBsb29wIGFsc28gbW9uaXRvcnMgcmVmYXVsdHMgb3ZlciBhbGwgdGllcnMKPj4gYW5kIGRl Y2lkZXMgd2hlbiB0byBwcm90ZWN0IHBhZ2VzIGluIHdoaWNoIHRpZXJzIChOPjEpLCB1c2luZyB0 aGUKPj4gZmlyc3QgdGllciAoTj0wLDEpIGFzIGEgYmFzZWxpbmUuIFRoZSBmaXJzdCB0aWVyIGNv bnRhaW5zIHNpbmdsZS11c2UKPj4gdW5tYXBwZWQgY2xlYW4gcGFnZXMsIHdoaWNoIGFyZSBtb3N0 IGxpa2VseSB0aGUgYmVzdCBjaG9pY2VzLiBUaGUKPj4gZXZpY3Rpb24gbW92ZXMgYSBwYWdlIHRv IHRoZSBuZXh0IGdlbmVyYXRpb24sIGkuZS4sIG1pbl9zZXErMSwgaWYgdGhlCj4+IGZlZWRiYWNr IGxvb3AgZGVjaWRlcyBzby4gVGhpcyBhcHByb2FjaCBoYXMgdGhlIGZvbGxvd2luZyBhZHZhbnRh Z2VzOgo+PiAxLiBJdCByZW1vdmVzIHRoZSBjb3N0IG9mIGFjdGl2YXRpb24gaW4gdGhlIGJ1ZmZl cmVkIGFjY2VzcyBwYXRoIGJ5Cj4+IMKgwqDCoCBpbmZlcnJpbmcgd2hldGhlciBwYWdlcyBhY2Nl c3NlZCBtdWx0aXBsZSB0aW1lcyB0aHJvdWdoIGZpbGUKPj4gwqDCoMKgIGRlc2NyaXB0b3JzIGFy ZSBzdGF0aXN0aWNhbGx5IGhvdCBhbmQgdGh1cyB3b3J0aCBwcm90ZWN0aW5nIGluIHRoZQo+PiDC oMKgwqAgZXZpY3Rpb24gcGF0aC4KPj4gMi4gSXQgdGFrZXMgcGFnZXMgYWNjZXNzZWQgdGhyb3Vn aCBwYWdlIHRhYmxlcyBpbnRvIGFjY291bnQgYW5kIGF2b2lkcwo+PiDCoMKgwqAgb3ZlcnByb3Rl Y3RpbmcgcGFnZXMgYWNjZXNzZWQgbXVsdGlwbGUgdGltZXMgdGhyb3VnaCBmaWxlCj4+IMKgwqDC oCBkZXNjcmlwdG9ycy4gKFBhZ2VzIGFjY2Vzc2VkIHRocm91Z2ggcGFnZSB0YWJsZXMgYXJlIGlu IHRoZSBmaXJzdAo+PiDCoMKgwqAgdGllciwgc2luY2UgTj0wLikKPj4gMy4gTW9yZSB0aWVycyBw cm92aWRlIGJldHRlciBwcm90ZWN0aW9uIGZvciBwYWdlcyBhY2Nlc3NlZCBtb3JlIHRoYW4KPj4g wqDCoMKgIHR3aWNlIHRocm91Z2ggZmlsZSBkZXNjcmlwdG9ycywgd2hlbiB1bmRlciBoZWF2eSBi dWZmZXJlZCBJL08KPj4gwqDCoMKgIHdvcmtsb2Fkcy4KPj4KPj4gU2VydmVyIGJlbmNobWFyayBy ZXN1bHRzOgo+PiDCoMKgIFNpbmdsZSB3b3JrbG9hZDoKPj4gwqDCoMKgwqAgZmlvIChidWZmZXJl ZCBJL08pOiArWzQwLCA0Ml0lCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIElP UFPCoMKgwqDCoMKgwqDCoMKgIEJXCj4+IMKgwqDCoMKgwqDCoCA1LjE4LXJjMTogMjQ2M2vCoMKg wqDCoMKgwqDCoCA5NjIxTWlCL3MKPj4gwqDCoMKgwqDCoMKgIHBhdGNoMS02OiAzNDg0a8KgwqDC oMKgwqDCoMKgIDEzLjNHaUIvcwo+Pgo+PiDCoMKgIFNpbmdsZSB3b3JrbG9hZDoKPj4gwqDCoMKg wqAgbWVtY2FjaGVkIChhbm9uKTogK1s0NCwgNDZdJQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBPcHMvc2VjwqDCoMKgwqDCoCBLQi9zZWMKPj4gwqDCoMKgwqDCoMKgIDUuMTgt cmMxOiA3NzE0MDMuMjfCoMKgwqAgMzAwMDQuMTcKPj4gwqDCoMKgwqDCoMKgIHBhdGNoMS02OiAx MTIwNjQzLjcwwqDCoCA0MzU4OC4wNgo+Pgo+PiDCoMKgIENvbmZpZ3VyYXRpb25zOgo+PiDCoMKg wqDCoCBDUFU6IHR3byBYZW9uIDYxNTQKPj4gwqDCoMKgwqAgTWVtOiB0b3RhbCAyNTZHCj4+Cj4+ IMKgwqDCoMKgIE5vZGUgMSB3YXMgb25seSB1c2VkIGFzIGEgcmFtIGRpc2sgdG8gcmVkdWNlIHRo ZSB2YXJpYW5jZSBpbiB0aGUKPj4gwqDCoMKgwqAgcmVzdWx0cy4KPj4KPj4gwqDCoMKgwqAgcGF0 Y2ggZHJpdmVycy9ibG9jay9icmQuYyA8PEVPRgo+PiDCoMKgwqDCoCA5OSwxMDBjOTksMTAwCj4+ IMKgwqDCoMKgIDzCoMKgwqDCoCBnZnBfZmxhZ3MgPSBHRlBfTk9JTyB8IF9fR0ZQX1pFUk8gfCBf X0dGUF9ISUdITUVNOwo+PiDCoMKgwqDCoCA8wqDCoMKgwqAgcGFnZSA9IGFsbG9jX3BhZ2UoZ2Zw X2ZsYWdzKTsKPj4gwqDCoMKgwqAgLS0tCj4+IMKgwqDCoMKgID7CoMKgwqDCoCBnZnBfZmxhZ3Mg PSBHRlBfTk9JTyB8IF9fR0ZQX1pFUk8gfCBfX0dGUF9ISUdITUVNIHwgCj4+IF9fR0ZQX1RISVNO T0RFOwo+PiDCoMKgwqDCoCA+wqDCoMKgwqAgcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUoMSwgZ2Zw X2ZsYWdzLCAwKTsKPj4gwqDCoMKgwqAgRU9GCj4+Cj4+IMKgwqDCoMKgIGNhdCA+Pi9ldGMvc3lz dGVtZC9zeXN0ZW0uY29uZiA8PEVPRgo+PiDCoMKgwqDCoCBDUFVBZmZpbml0eT1udW1hCj4+IMKg wqDCoMKgIE5VTUFQb2xpY3k9YmluZAo+PiDCoMKgwqDCoCBOVU1BTWFzaz0wCj4+IMKgwqDCoMKg IEVPRgo+Pgo+PiDCoMKgwqDCoCBjYXQgPj4vZXRjL21lbWNhY2hlZC5jb25mIDw8RU9GCj4+IMKg wqDCoMKgIC1tIDE4NDMyMAo+PiDCoMKgwqDCoCAtcyAvdmFyL3J1bi9tZW1jYWNoZWQvbWVtY2Fj aGVkLnNvY2sKPj4gwqDCoMKgwqAgLWEgMDc2Ngo+PiDCoMKgwqDCoCAtdCAzNgo+PiDCoMKgwqDC oCAtQiBiaW5hcnkKPj4gwqDCoMKgwqAgRU9GCj4+Cj4+IMKgwqDCoMKgIGNhdCBmaW8uc2gKPj4g wqDCoMKgwqAgbW9kcHJvYmUgYnJkIHJkX25yPTEgcmRfc2l6ZT0xMTMyNDYyMDgKPj4gwqDCoMKg wqAgc3dhcG9mZiAtYQo+PiDCoMKgwqDCoCBta2ZzLmV4dDQgL2Rldi9yYW0wCj4+IMKgwqDCoMKg IG1vdW50IC10IGV4dDQgL2Rldi9yYW0wIC9tbnQKPj4KPj4gwqDCoMKgwqAgbWtkaXIgL3N5cy9m cy9jZ3JvdXAvdXNlci5zbGljZS90ZXN0Cj4+IMKgwqDCoMKgIGVjaG8gMzg2NTQ3MDU2NjQgPi9z eXMvZnMvY2dyb3VwL3VzZXIuc2xpY2UvdGVzdC9tZW1vcnkubWF4Cj4+IMKgwqDCoMKgIGVjaG8g JCQgPi9zeXMvZnMvY2dyb3VwL3VzZXIuc2xpY2UvdGVzdC9jZ3JvdXAucHJvY3MKPj4gwqDCoMKg wqAgZmlvIC1uYW1lPW1nbHJ1IC0tbnVtam9icz03MiAtLWRpcmVjdG9yeT0vbW50IC0tc2l6ZT0x NDA4bSBcCj4+IMKgwqDCoMKgwqDCoCAtLWJ1ZmZlcmVkPTEgLS1pb2VuZ2luZT1pb191cmluZyAt LWlvZGVwdGg9MTI4IFwKPj4gwqDCoMKgwqDCoMKgIC0taW9kZXB0aF9iYXRjaF9zdWJtaXQ9MzIg LS1pb2RlcHRoX2JhdGNoX2NvbXBsZXRlPTMyIFwKPj4gwqDCoMKgwqDCoMKgIC0tcnc9cmFuZHJl YWQgLS1yYW5kb21fZGlzdHJpYnV0aW9uPXJhbmRvbSAtLW5vcmFuZG9tbWFwIFwKPj4gwqDCoMKg wqDCoMKgIC0tdGltZV9iYXNlZCAtLXJhbXBfdGltZT0xMG0gLS1ydW50aW1lPTVtIC0tZ3JvdXBf cmVwb3J0aW5nCj4+Cj4+IMKgwqDCoMKgIGNhdCBtZW1jYWNoZWQuc2gKPj4gwqDCoMKgwqAgbW9k cHJvYmUgYnJkIHJkX25yPTEgcmRfc2l6ZT0xMTMyNDYyMDgKPj4gwqDCoMKgwqAgc3dhcG9mZiAt YQo+PiDCoMKgwqDCoCBta3N3YXAgL2Rldi9yYW0wCj4+IMKgwqDCoMKgIHN3YXBvbiAvZGV2L3Jh bTAKPj4KPj4gwqDCoMKgwqAgbWVtdGllcl9iZW5jaG1hcmsgLVMgL3Zhci9ydW4vbWVtY2FjaGVk L21lbWNhY2hlZC5zb2NrIFwKPj4gwqDCoMKgwqDCoMKgIC1QIG1lbWNhY2hlX2JpbmFyeSAtbiBh bGxrZXlzIC0ta2V5LW1pbmltdW09MSBcCj4+IMKgwqDCoMKgwqDCoCAtLWtleS1tYXhpbXVtPTY1 MDAwMDAwIC0ta2V5LXBhdHRlcm49UDpQIC1jIDEgLXQgMzYgXAo+PiDCoMKgwqDCoMKgwqAgLS1y YXRpbyAxOjAgLS1waXBlbGluZSA4IC1kIDIwMDAKPj4KPj4gwqDCoMKgwqAgbWVtdGllcl9iZW5j aG1hcmsgLVMgL3Zhci9ydW4vbWVtY2FjaGVkL21lbWNhY2hlZC5zb2NrIFwKPj4gwqDCoMKgwqDC oMKgIC1QIG1lbWNhY2hlX2JpbmFyeSAtbiBhbGxrZXlzIC0ta2V5LW1pbmltdW09MSBcCj4+IMKg wqDCoMKgwqDCoCAtLWtleS1tYXhpbXVtPTY1MDAwMDAwIC0ta2V5LXBhdHRlcm49UjpSIC1jIDEg LXQgMzYgXAo+PiDCoMKgwqDCoMKgwqAgLS1yYXRpbyAwOjEgLS1waXBlbGluZSA4IC0tcmFuZG9t aXplIC0tZGlzdGluY3QtY2xpZW50LXNlZWQKPj4KPj4gQ2xpZW50IGJlbmNobWFyayByZXN1bHRz Ogo+PiDCoMKgIGtzd2FwZCBwcm9maWxlczoKPj4gwqDCoMKgwqAgNS4xOC1yYzEKPj4gwqDCoMKg wqDCoMKgIDQwLjUzJcKgIHBhZ2Vfdm1hX21hcHBlZF93YWxrCj4+IMKgwqDCoMKgwqDCoCAyMC4z NyXCoCBsem8xeF8xX2RvX2NvbXByZXNzIChyZWFsIHdvcmspCj4+IMKgwqDCoMKgwqDCoMKgIDYu OTklwqAgZG9fcmF3X3NwaW5fbG9jawo+PiDCoMKgwqDCoMKgwqDCoCAzLjkzJcKgIF9yYXdfc3Bp bl91bmxvY2tfaXJxCj4+IMKgwqDCoMKgwqDCoMKgIDIuMDglwqAgdm1hX2ludGVydmFsX3RyZWVf c3VidHJlZV9zZWFyY2gKPj4gwqDCoMKgwqDCoMKgwqAgMi4wNiXCoCB2bWFfaW50ZXJ2YWxfdHJl ZV9pdGVyX25leHQKPj4gwqDCoMKgwqDCoMKgwqAgMS45NSXCoCBmb2xpb19yZWZlcmVuY2VkX29u ZQo+PiDCoMKgwqDCoMKgwqDCoCAxLjkzJcKgIGFub25fdm1hX2ludGVydmFsX3RyZWVfaXRlcl9m aXJzdAo+PiDCoMKgwqDCoMKgwqDCoCAxLjUxJcKgIHB0ZXBfY2xlYXJfZmx1c2gKPj4gwqDCoMKg wqDCoMKgwqAgMS4zNSXCoCBfX2Fub25fdm1hX2ludGVydmFsX3RyZWVfc3VidHJlZV9zZWFyY2gK Pj4KPj4gwqDCoMKgwqAgcGF0Y2gxLTYKPj4gwqDCoMKgwqDCoMKgIDM1Ljk5JcKgIGx6bzF4XzFf ZG9fY29tcHJlc3MgKHJlYWwgd29yaykKPj4gwqDCoMKgwqDCoMKgIDE5LjQwJcKgIHBhZ2Vfdm1h X21hcHBlZF93YWxrCj4+IMKgwqDCoMKgwqDCoMKgIDYuMzElwqAgX3Jhd19zcGluX3VubG9ja19p cnEKPj4gwqDCoMKgwqDCoMKgwqAgMy45NSXCoCBkb19yYXdfc3Bpbl9sb2NrCj4+IMKgwqDCoMKg wqDCoMKgIDIuMzklwqAgYW5vbl92bWFfaW50ZXJ2YWxfdHJlZV9pdGVyX2ZpcnN0Cj4+IMKgwqDC oMKgwqDCoMKgIDIuMjUlwqAgcHRlcF9jbGVhcl9mbHVzaAo+PiDCoMKgwqDCoMKgwqDCoCAxLjky JcKgIF9fYW5vbl92bWFfaW50ZXJ2YWxfdHJlZV9zdWJ0cmVlX3NlYXJjaAo+PiDCoMKgwqDCoMKg wqDCoCAxLjcwJcKgIGZvbGlvX3JlZmVyZW5jZWRfb25lCj4+IMKgwqDCoMKgwqDCoMKgIDEuNjgl wqAgX196cmFtX2J2ZWNfd3JpdGUKPj4gwqDCoMKgwqDCoMKgwqAgMS40MyXCoCBhbm9uX3ZtYV9p bnRlcnZhbF90cmVlX2l0ZXJfbmV4dAo+Pgo+PiDCoMKgIENvbmZpZ3VyYXRpb25zOgo+PiDCoMKg wqDCoCBDUFU6IHNpbmdsZSBTbmFwZHJhZ29uIDdjCj4+IMKgwqDCoMKgIE1lbTogdG90YWwgNEcK Pj4KPj4gwqDCoMKgwqAgQ2hyb21lIE9TIE1lbW9yeVByZXNzdXJlIFsxXQo+Pgo+PiBbMV0gaHR0 cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtb3MvcGxhdGZvcm0vdGFzdC10 ZXN0cy8KPj4KPj4gU2lnbmVkLW9mZi1ieTogWXUgWmhhbyA8eXV6aGFvQGdvb2dsZS5jb20+Cj4+ IEFja2VkLWJ5OiBCcmlhbiBHZWZmb24gPGJnZWZmb25AZ29vZ2xlLmNvbT4KPj4gQWNrZWQtYnk6 IEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGhlZnRpZ0BhcmNobGludXgub3JnPgo+ PiBBY2tlZC1ieTogT2xla3NhbmRyIE5hdGFsZW5rbyA8b2xla3NhbmRyQG5hdGFsZW5rby5uYW1l Pgo+PiBBY2tlZC1ieTogU3RldmVuIEJhcnJldHQgPHN0ZXZlbkBsaXF1b3JpeC5uZXQ+Cj4+IEFj a2VkLWJ5OiBTdWxlaW1hbiBTb3VobGFsIDxzdWxlaW1hbkBnb29nbGUuY29tPgo+PiBUZXN0ZWQt Ynk6IERhbmllbCBCeXJuZSA8ZGpieXJuZUBtdHUuZWR1Pgo+PiBUZXN0ZWQtYnk6IERvbmFsZCBD YXJyIDxkQGNoYW9zLXJlaW5zLmNvbT4KPj4gVGVzdGVkLWJ5OiBIb2xnZXIgSG9mZnN0w6R0dGUg PGhvbGdlckBhcHBsaWVkLWFzeW5jaHJvbnkuY29tPgo+PiBUZXN0ZWQtYnk6IEtvbnN0YW50aW4g S2hhcmxhbW92IDxIaS1BbmdlbEB5YW5kZXgucnU+Cj4+IFRlc3RlZC1ieTogU2h1YW5nIFpoYWkg PHN6aGFpMkBjcy5yb2NoZXN0ZXIuZWR1Pgo+PiBUZXN0ZWQtYnk6IFNvZmlhIFRyaW5oIDxzb2Zp YS50cmluaEBlZGkud29ya3M+Cj4+IFRlc3RlZC1ieTogVmFpYmhhdiBKYWluIDx2YWliaGF2QGxp bnV4LmlibS5jb20+Cj4+IC0tLQo+PiDCoCBpbmNsdWRlL2xpbnV4L21tX2lubGluZS5owqDCoMKg wqDCoMKgwqDCoCB8wqAgMzYgKysKPj4gwqAgaW5jbHVkZS9saW51eC9tbXpvbmUuaMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgfMKgIDQyICsrCj4+IMKgIGluY2x1ZGUvbGludXgvcGFnZS1mbGFncy1s YXlvdXQuaCB8wqDCoCA1ICstCj4+IMKgIGtlcm5lbC9ib3VuZHMuY8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAyICsKPj4gwqAgbW0vS2NvbmZpZ8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIDExICsKPj4gwqAgbW0vc3dh cC5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCAz OSArKwo+PiDCoCBtbS92bXNjYW4uY8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHwgNzk5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+PiDCoCBtbS93 b3JraW5nc2V0LmPCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCAxMTAgKysr LQo+PiDCoCA4IGZpbGVzIGNoYW5nZWQsIDEwMzQgaW5zZXJ0aW9ucygrKSwgMTAgZGVsZXRpb25z KC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oIGIvaW5jbHVk ZS9saW51eC9tbV9pbmxpbmUuaAo+PiBpbmRleCA5OGFlMjJiZmFmMTIuLjg1ZmU3ODgzMjQzNiAx MDA2NDQKPj4gLS0tIGEvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaAo+PiArKysgYi9pbmNsdWRl L2xpbnV4L21tX2lubGluZS5oCj4+IEBAIC0xMTksNiArMTE5LDMzIEBAIHN0YXRpYyBpbmxpbmUg aW50IGxydV9nZW5fZnJvbV9zZXEodW5zaWduZWQgbG9uZyAKPj4gc2VxKQo+PiDCoMKgwqDCoMKg IHJldHVybiBzZXEgJSBNQVhfTlJfR0VOUzsKPj4gwqAgfQo+PiDCoCArc3RhdGljIGlubGluZSBp bnQgbHJ1X2hpc3RfZnJvbV9zZXEodW5zaWduZWQgbG9uZyBzZXEpCj4+ICt7Cj4+ICvCoMKgwqAg cmV0dXJuIHNlcSAlIE5SX0hJU1RfR0VOUzsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGluZSBp bnQgbHJ1X3RpZXJfZnJvbV9yZWZzKGludCByZWZzKQo+PiArewo+PiArwqDCoMKgIFZNX1dBUk5f T05fT05DRShyZWZzID4gQklUKExSVV9SRUZTX1dJRFRIKSk7Cj4+ICsKPj4gK8KgwqDCoCAvKiBz ZWUgdGhlIGNvbW1lbnQgaW4gZm9saW9fbHJ1X3JlZnMoKSAqLwo+PiArwqDCoMKgIHJldHVybiBv cmRlcl9iYXNlXzIocmVmcyArIDEpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIGludCBm b2xpb19scnVfcmVmcyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQo+PiArewo+PiArwqDCoMKgIHVuc2ln bmVkIGxvbmcgZmxhZ3MgPSBSRUFEX09OQ0UoZm9saW8tPmZsYWdzKTsKPj4gK8KgwqDCoCBib29s IHdvcmtpbmdzZXQgPSBmbGFncyAmIEJJVChQR193b3JraW5nc2V0KTsKPj4gKwo+PiArwqDCoMKg IC8qCj4+ICvCoMKgwqDCoCAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGFjY2Vzc2VzIGJleW9uZCBQ R19yZWZlcmVuY2VkLCBpLmUuLCBOLTEgCj4+IGlmIHRoZQo+PiArwqDCoMKgwqAgKiB0b3RhbCBu dW1iZXIgb2YgYWNjZXNzZXMgaXMgTj4xLCBzaW5jZSBOPTAsMSBib3RoIG1hcCB0byB0aGUgCj4+ IGZpcnN0Cj4+ICvCoMKgwqDCoCAqIHRpZXIuIGxydV90aWVyX2Zyb21fcmVmcygpIHdpbGwgYWNj b3VudCBmb3IgdGhpcyBvZmYtYnktb25lLiAKPj4gQWxzbyBzZWUKPj4gK8KgwqDCoMKgICogdGhl IGNvbW1lbnQgb24gTUFYX05SX1RJRVJTLgo+PiArwqDCoMKgwqAgKi8KPj4gK8KgwqDCoCByZXR1 cm4gKChmbGFncyAmIExSVV9SRUZTX01BU0spID4+IExSVV9SRUZTX1BHT0ZGKSArIHdvcmtpbmdz ZXQ7Cj4+ICt9Cj4+ICsKPj4gwqAgc3RhdGljIGlubGluZSBpbnQgZm9saW9fbHJ1X2dlbihzdHJ1 Y3QgZm9saW8gKmZvbGlvKQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAgdW5zaWduZWQgbG9uZyBmbGFn cyA9IFJFQURfT05DRShmb2xpby0+ZmxhZ3MpOwo+PiBAQCAtMTcxLDYgKzE5OCwxNSBAQCBzdGF0 aWMgaW5saW5lIHZvaWQgbHJ1X2dlbl91cGRhdGVfc2l6ZShzdHJ1Y3QgCj4+IGxydXZlYyAqbHJ1 dmVjLCBzdHJ1Y3QgZm9saW8gKmZvbGkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIF9fdXBkYXRlX2xy dV9zaXplKGxydXZlYywgbHJ1LCB6b25lLCAtZGVsdGEpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg cmV0dXJuOwo+PiDCoMKgwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIC8qIHByb21vdGlvbiAqLwo+ PiArwqDCoMKgIGlmICghbHJ1X2dlbl9pc19hY3RpdmUobHJ1dmVjLCBvbGRfZ2VuKSAmJiAKPj4g bHJ1X2dlbl9pc19hY3RpdmUobHJ1dmVjLCBuZXdfZ2VuKSkgewo+PiArwqDCoMKgwqDCoMKgwqAg X191cGRhdGVfbHJ1X3NpemUobHJ1dmVjLCBscnUsIHpvbmUsIC1kZWx0YSk7Cj4+ICvCoMKgwqDC oMKgwqDCoCBfX3VwZGF0ZV9scnVfc2l6ZShscnV2ZWMsIGxydSArIExSVV9BQ1RJVkUsIHpvbmUs IGRlbHRhKTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKiBkZW1vdGlvbiByZXF1aXJl cyBpc29sYXRpb24sIGUuZy4sIGxydV9kZWFjdGl2YXRlX2ZuKCkgKi8KPj4gK8KgwqDCoCBWTV9X QVJOX09OX09OQ0UobHJ1X2dlbl9pc19hY3RpdmUobHJ1dmVjLCBvbGRfZ2VuKSAmJiAKPj4gIWxy dV9nZW5faXNfYWN0aXZlKGxydXZlYywgbmV3X2dlbikpOwo+PiDCoCB9Cj4+IMKgIMKgIHN0YXRp YyBpbmxpbmUgYm9vbCBscnVfZ2VuX2FkZF9mb2xpbyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIAo+ PiBzdHJ1Y3QgZm9saW8gKmZvbGlvLCBib29sIHJlY2xhaW1pbmcpCj4+IGRpZmYgLS1naXQgYS9p bmNsdWRlL2xpbnV4L21tem9uZS5oIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaAo+PiBpbmRleCA2 OTk0YWNlZjYzY2IuLjJkMDIzZDI0M2U3MyAxMDA2NDQKPj4gLS0tIGEvaW5jbHVkZS9saW51eC9t bXpvbmUuaAo+PiArKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCj4+IEBAIC0zNDgsNiArMzQ4 LDI5IEBAIGVudW0gbHJ1dmVjX2ZsYWdzIHsKPj4gwqAgI2RlZmluZSBNSU5fTlJfR0VOU8KgwqDC oMKgwqDCoMKgIDJVCj4+IMKgICNkZWZpbmUgTUFYX05SX0dFTlPCoMKgwqDCoMKgwqDCoCA0VQo+ PiDCoCArLyoKPj4gKyAqIEVhY2ggZ2VuZXJhdGlvbiBpcyBkaXZpZGVkIGludG8gbXVsdGlwbGUg dGllcnMuIFRpZXJzIHJlcHJlc2VudCAKPj4gZGlmZmVyZW50Cj4+ICsgKiByYW5nZXMgb2YgbnVt YmVycyBvZiBhY2Nlc3NlcyB0aHJvdWdoIGZpbGUgZGVzY3JpcHRvcnMuIEEgcGFnZSAKPj4gYWNj ZXNzZWQgTgo+PiArICogdGltZXMgdGhyb3VnaCBmaWxlIGRlc2NyaXB0b3JzIGlzIGluIHRpZXIg b3JkZXJfYmFzZV8yKE4pLiBBIHBhZ2UgCj4+IGluIHRoZQo+PiArICogZmlyc3QgdGllciAoTj0w LDEpIGlzIG1hcmtlZCBieSBQR19yZWZlcmVuY2VkIHVubGVzcyBpdCB3YXMgCj4+IGZhdWx0ZWQg aW4KPj4gKyAqIHRob3VnaCBwYWdlIHRhYmxlcyBvciByZWFkIGFoZWFkLiBBIHBhZ2UgaW4gYW55 IG90aGVyIHRpZXIgKE4+MSkgCj4+IGlzIG1hcmtlZAo+PiArICogYnkgUEdfcmVmZXJlbmNlZCBh bmQgUEdfd29ya2luZ3NldC4gVGhpcyBpbXBsaWVzIGEgbWluaW11bSBvZiB0d28gCj4+IHRpZXJz IGlzCj4+ICsgKiBzdXBwb3J0ZWQgd2l0aG91dCB1c2luZyBhZGRpdGlvbmFsIGJpdHMgaW4gZm9s aW8tPmZsYWdzLgo+PiArICoKPj4gKyAqIEluIGNvbnRyYXN0IHRvIG1vdmluZyBhY3Jvc3MgZ2Vu ZXJhdGlvbnMgd2hpY2ggcmVxdWlyZXMgdGhlIExSVSAKPj4gbG9jaywgbW92aW5nCj4+ICsgKiBh Y3Jvc3MgdGllcnMgb25seSBpbnZvbHZlcyBhdG9taWMgb3BlcmF0aW9ucyBvbiBmb2xpby0+Zmxh Z3MgYW5kIAo+PiB0aGVyZWZvcmUKPj4gKyAqIGhhcyBhIG5lZ2xpZ2libGUgY29zdCBpbiB0aGUg YnVmZmVyZWQgYWNjZXNzIHBhdGguIEluIHRoZSAKPj4gZXZpY3Rpb24gcGF0aCwKPj4gKyAqIGNv bXBhcmlzb25zIG9mIHJlZmF1bHRlZC8oZXZpY3RlZCtwcm90ZWN0ZWQpIGZyb20gdGhlIGZpcnN0 IHRpZXIgCj4+IGFuZCB0aGUKPj4gKyAqIHJlc3QgaW5mZXIgd2hldGhlciBwYWdlcyBhY2Nlc3Nl ZCBtdWx0aXBsZSB0aW1lcyB0aHJvdWdoIGZpbGUgCj4+IGRlc2NyaXB0b3JzCj4+ICsgKiBhcmUg c3RhdGlzdGljYWxseSBob3QgYW5kIHRodXMgd29ydGggcHJvdGVjdGluZy4KPj4gKyAqCj4+ICsg KiBNQVhfTlJfVElFUlMgaXMgc2V0IHRvIDQgc28gdGhhdCB0aGUgbXVsdGktZ2VuIExSVSBjYW4g c3VwcG9ydCAKPj4gdHdpY2UgdGhlCj4+ICsgKiBudW1iZXIgb2YgY2F0ZWdvcmllcyBvZiB0aGUg YWN0aXZlL2luYWN0aXZlIExSVSB3aGVuIGtlZXBpbmcgCj4+IHRyYWNrIG9mCj4+ICsgKiBhY2Nl c3NlcyB0aHJvdWdoIGZpbGUgZGVzY3JpcHRvcnMuIEl0IHVzZXMgTUFYX05SX1RJRVJTLTIgc3Bh cmUgCj4+IGJpdHMgaW4KPj4gKyAqIGZvbGlvLT5mbGFncyAoTFJVX1JFRlNfTUFTSykuCj4+ICsg Ki8KPj4gKyNkZWZpbmUgTUFYX05SX1RJRVJTwqDCoMKgwqDCoMKgwqAgNFUKPj4gKwo+PiDCoCAj aWZuZGVmIF9fR0VORVJBVElOR19CT1VORFNfSAo+PiDCoCDCoCBzdHJ1Y3QgbHJ1dmVjOwo+PiBA QCAtMzYyLDYgKzM4NSwxNiBAQCBlbnVtIHsKPj4gwqDCoMKgwqDCoCBMUlVfR0VOX0ZJTEUsCj4+ IMKgIH07Cj4+IMKgICsjZGVmaW5lIE1JTl9MUlVfQkFUQ0jCoMKgwqDCoMKgwqDCoCBCSVRTX1BF Ul9MT05HCj4+ICsjZGVmaW5lIE1BWF9MUlVfQkFUQ0jCoMKgwqDCoMKgwqDCoCAoTUlOX0xSVV9C QVRDSCAqIDEyOCkKPj4gKwo+PiArLyogd2hldGhlciB0byBrZWVwIGhpc3RvcmljYWwgc3RhdHMg ZnJvbSBldmljdGVkIGdlbmVyYXRpb25zICovCj4+ICsjaWZkZWYgQ09ORklHX0xSVV9HRU5fU1RB VFMKPj4gKyNkZWZpbmUgTlJfSElTVF9HRU5TwqDCoMKgwqDCoMKgwqAgTUFYX05SX0dFTlMKPj4g KyNlbHNlCj4+ICsjZGVmaW5lIE5SX0hJU1RfR0VOU8KgwqDCoMKgwqDCoMKgIDFVCj4+ICsjZW5k aWYKPj4gKwo+PiDCoCAvKgo+PiDCoMKgICogVGhlIHlvdW5nZXN0IGdlbmVyYXRpb24gbnVtYmVy IGlzIHN0b3JlZCBpbiBtYXhfc2VxIGZvciBib3RoIAo+PiBhbm9uIGFuZCBmaWxlCj4+IMKgwqAg KiB0eXBlcyBhcyB0aGV5IGFyZSBhZ2VkIG9uIGFuIGVxdWFsIGZvb3RpbmcuIFRoZSBvbGRlc3Qg Cj4+IGdlbmVyYXRpb24gbnVtYmVycyBhcmUKPj4gQEAgLTM4NCw2ICs0MTcsMTUgQEAgc3RydWN0 IGxydV9nZW5fc3RydWN0IHsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RzW01B WF9OUl9HRU5TXVtBTk9OX0FORF9GSUxFXVtNQVhfTlJfWk9ORVNdOwo+PiDCoMKgwqDCoMKgIC8q IHRoZSBzaXplcyBvZiB0aGUgYWJvdmUgbGlzdHMgKi8KPj4gwqDCoMKgwqDCoCBsb25nIG5yX3Bh Z2VzW01BWF9OUl9HRU5TXVtBTk9OX0FORF9GSUxFXVtNQVhfTlJfWk9ORVNdOwo+PiArwqDCoMKg IC8qIHRoZSBleHBvbmVudGlhbCBtb3ZpbmcgYXZlcmFnZSBvZiByZWZhdWx0ZWQgKi8KPj4gK8Kg wqDCoCB1bnNpZ25lZCBsb25nIGF2Z19yZWZhdWx0ZWRbQU5PTl9BTkRfRklMRV1bTUFYX05SX1RJ RVJTXTsKPj4gK8KgwqDCoCAvKiB0aGUgZXhwb25lbnRpYWwgbW92aW5nIGF2ZXJhZ2Ugb2YgZXZp Y3RlZCtwcm90ZWN0ZWQgKi8KPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIGF2Z190b3RhbFtBTk9O X0FORF9GSUxFXVtNQVhfTlJfVElFUlNdOwo+PiArwqDCoMKgIC8qIHRoZSBmaXJzdCB0aWVyIGRv ZXNuJ3QgbmVlZCBwcm90ZWN0aW9uLCBoZW5jZSB0aGUgbWludXMgb25lICovCj4+ICvCoMKgwqAg dW5zaWduZWQgbG9uZyAKPj4gcHJvdGVjdGVkW05SX0hJU1RfR0VOU11bQU5PTl9BTkRfRklMRV1b TUFYX05SX1RJRVJTIC0gMV07Cj4+ICvCoMKgwqAgLyogY2FuIGJlIG1vZGlmaWVkIHdpdGhvdXQg aG9sZGluZyB0aGUgTFJVIGxvY2sgKi8KPj4gK8KgwqDCoCBhdG9taWNfbG9uZ190IGV2aWN0ZWRb TlJfSElTVF9HRU5TXVtBTk9OX0FORF9GSUxFXVtNQVhfTlJfVElFUlNdOwo+PiArwqDCoMKgIGF0 b21pY19sb25nX3QgcmVmYXVsdGVkW05SX0hJU1RfR0VOU11bQU5PTl9BTkRfRklMRV1bTUFYX05S X1RJRVJTXTsKPj4gwqAgfTsKPj4gwqAgwqAgdm9pZCBscnVfZ2VuX2luaXRfbHJ1dmVjKHN0cnVj dCBscnV2ZWMgKmxydXZlYyk7Cj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxh Z3MtbGF5b3V0LmggCj4+IGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLWxheW91dC5oCj4+IGlu ZGV4IDI0MDkwNTQwN2ExOC4uN2Q3OTgxOGRjMDY1IDEwMDY0NAo+PiAtLS0gYS9pbmNsdWRlL2xp bnV4L3BhZ2UtZmxhZ3MtbGF5b3V0LmgKPj4gKysrIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdz LWxheW91dC5oCj4+IEBAIC0xMDYsNyArMTA2LDEwIEBACj4+IMKgICNlcnJvciAiTm90IGVub3Vn aCBiaXRzIGluIHBhZ2UgZmxhZ3MiCj4+IMKgICNlbmRpZgo+PiDCoCAtI2RlZmluZSBMUlVfUkVG U19XSURUSMKgwqDCoCAwCj4+ICsvKiBzZWUgdGhlIGNvbW1lbnQgb24gTUFYX05SX1RJRVJTICov Cj4+ICsjZGVmaW5lIExSVV9SRUZTX1dJRFRIwqDCoMKgIG1pbihfX0xSVV9SRUZTX1dJRFRILCBC SVRTX1BFUl9MT05HIC0gCj4+IE5SX1BBR0VGTEFHUyAtIFwKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBaT05FU19XSURUSCAtIExSVV9HRU5fV0lEVEggLSBTRUNUSU9OU19XSURU SCAtIFwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBOT0RFU19XSURUSCAtIEtB U0FOX1RBR19XSURUSCAtIExBU1RfQ1BVUElEX1dJRFRIKQo+PiDCoCDCoCAjZW5kaWYKPj4gwqAg I2VuZGlmIC8qIF9MSU5VWF9QQUdFX0ZMQUdTX0xBWU9VVCAqLwo+PiBkaWZmIC0tZ2l0IGEva2Vy bmVsL2JvdW5kcy5jIGIva2VybmVsL2JvdW5kcy5jCj4+IGluZGV4IDVlZTYwNzc3ZDhlNC4uYjUy OTE4MmU4YjA0IDEwMDY0NAo+PiAtLS0gYS9rZXJuZWwvYm91bmRzLmMKPj4gKysrIGIva2VybmVs L2JvdW5kcy5jCj4+IEBAIC0yNCw4ICsyNCwxMCBAQCBpbnQgbWFpbih2b2lkKQo+PiDCoMKgwqDC oMKgIERFRklORShTUElOTE9DS19TSVpFLCBzaXplb2Yoc3BpbmxvY2tfdCkpOwo+PiDCoCAjaWZk ZWYgQ09ORklHX0xSVV9HRU4KPj4gwqDCoMKgwqDCoCBERUZJTkUoTFJVX0dFTl9XSURUSCwgb3Jk ZXJfYmFzZV8yKE1BWF9OUl9HRU5TICsgMSkpOwo+PiArwqDCoMKgIERFRklORShfX0xSVV9SRUZT X1dJRFRILCBNQVhfTlJfVElFUlMgLSAyKTsKPj4gwqAgI2Vsc2UKPj4gwqDCoMKgwqDCoCBERUZJ TkUoTFJVX0dFTl9XSURUSCwgMCk7Cj4+ICvCoMKgwqAgREVGSU5FKF9fTFJVX1JFRlNfV0lEVEgs IDApOwo+PiDCoCAjZW5kaWYKPj4gwqDCoMKgwqDCoCAvKiBFbmQgb2YgY29uc3RhbnRzICovCj4+ IMKgIGRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwo+PiBpbmRleCBlNjJiZDUw MTA4MmIuLjBhZWFjYmQzMzYxYyAxMDA2NDQKPj4gLS0tIGEvbW0vS2NvbmZpZwo+PiArKysgYi9t bS9LY29uZmlnCj4+IEBAIC05MDksNiArOTA5LDcgQEAgY29uZmlnIEFOT05fVk1BX05BTUUKPj4g wqDCoMKgwqDCoMKgwqAgYXJlYSBmcm9tIGJlaW5nIG1lcmdlZCB3aXRoIGFkamFjZW50IHZpcnR1 YWwgbWVtb3J5IGFyZWFzIGR1ZSAKPj4gdG8gdGhlCj4+IMKgwqDCoMKgwqDCoMKgIGRpZmZlcmVu Y2UgaW4gdGhlaXIgbmFtZS4KPj4gwqAgKyMgbXVsdGktZ2VuIExSVSB7Cj4+IMKgIGNvbmZpZyBM UlVfR0VOCj4+IMKgwqDCoMKgwqAgYm9vbCAiTXVsdGktR2VuIExSVSIKPj4gwqDCoMKgwqDCoCBk ZXBlbmRzIG9uIE1NVQo+PiBAQCAtOTE3LDYgKzkxOCwxNiBAQCBjb25maWcgTFJVX0dFTgo+PiDC oMKgwqDCoMKgIGhlbHAKPj4gwqDCoMKgwqDCoMKgwqAgQSBoaWdoIHBlcmZvcm1hbmNlIExSVSBp bXBsZW1lbnRhdGlvbiB0byBvdmVyY29tbWl0IG1lbW9yeS4KPj4gwqAgK2NvbmZpZyBMUlVfR0VO X1NUQVRTCj4+ICvCoMKgwqAgYm9vbCAiRnVsbCBzdGF0cyBmb3IgZGVidWdnaW5nIgo+PiArwqDC oMKgIGRlcGVuZHMgb24gTFJVX0dFTgo+PiArwqDCoMKgIGhlbHAKPj4gK8KgwqDCoMKgwqAgRG8g bm90IGVuYWJsZSB0aGlzIG9wdGlvbiB1bmxlc3MgeW91IHBsYW4gdG8gbG9vayBhdCAKPj4gaGlz dG9yaWNhbCBzdGF0cwo+PiArwqDCoMKgwqDCoCBmcm9tIGV2aWN0ZWQgZ2VuZXJhdGlvbnMgZm9y IGRlYnVnZ2luZyBwdXJwb3NlLgo+PiArCj4+ICvCoMKgwqDCoMKgIFRoaXMgb3B0aW9uIGhhcyBh IHBlci1tZW1jZyBhbmQgcGVyLW5vZGUgbWVtb3J5IG92ZXJoZWFkLgo+PiArIyB9Cj4+ICsKPj4g wqAgc291cmNlICJtbS9kYW1vbi9LY29uZmlnIgo+PiDCoCDCoCBlbmRtZW51Cj4+IGRpZmYgLS1n aXQgYS9tbS9zd2FwLmMgYi9tbS9zd2FwLmMKPj4gaW5kZXggYTY4NzBiYTBiZDgzLi5hOTlkMjIz MDhmMjggMTAwNjQ0Cj4+IC0tLSBhL21tL3N3YXAuYwo+PiArKysgYi9tbS9zd2FwLmMKPj4gQEAg LTQwNSw2ICs0MDUsNDAgQEAgc3RhdGljIHZvaWQgX19scnVfY2FjaGVfYWN0aXZhdGVfZm9saW8o c3RydWN0IAo+PiBmb2xpbyAqZm9saW8pCj4+IMKgwqDCoMKgwqAgbG9jYWxfdW5sb2NrKCZscnVf cHZlY3MubG9jayk7Cj4+IMKgIH0KPj4gwqAgKyNpZmRlZiBDT05GSUdfTFJVX0dFTgo+PiArc3Rh dGljIHZvaWQgZm9saW9faW5jX3JlZnMoc3RydWN0IGZvbGlvICpmb2xpbykKPj4gK3sKPj4gK8Kg wqDCoCB1bnNpZ25lZCBsb25nIG5ld19mbGFncywgb2xkX2ZsYWdzID0gUkVBRF9PTkNFKGZvbGlv LT5mbGFncyk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoZm9saW9fdGVzdF91bmV2aWN0YWJsZShmb2xp bykpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIWZvbGlv X3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGZvbGlvX3NldF9y ZWZlcmVuY2VkKGZvbGlvKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gK8KgwqDCoCB9 Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIWZvbGlvX3Rlc3Rfd29ya2luZ3NldChmb2xpbykpIHsKPj4g K8KgwqDCoMKgwqDCoMKgIGZvbGlvX3NldF93b3JraW5nc2V0KGZvbGlvKTsKPj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybjsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKiBzZWUgdGhlIGNv bW1lbnQgb24gTUFYX05SX1RJRVJTICovCj4+ICvCoMKgwqAgZG8gewo+PiArwqDCoMKgwqDCoMKg wqAgbmV3X2ZsYWdzID0gb2xkX2ZsYWdzICYgTFJVX1JFRlNfTUFTSzsKPj4gK8KgwqDCoMKgwqDC oMKgIGlmIChuZXdfZmxhZ3MgPT0gTFJVX1JFRlNfTUFTSykKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgYnJlYWs7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIG5ld19mbGFncyArPSBCSVQoTFJV X1JFRlNfUEdPRkYpOwo+PiArwqDCoMKgwqDCoMKgwqAgbmV3X2ZsYWdzIHw9IG9sZF9mbGFncyAm IH5MUlVfUkVGU19NQVNLOwo+PiArwqDCoMKgIH0gd2hpbGUgKCF0cnlfY21weGNoZygmZm9saW8t PmZsYWdzLCAmb2xkX2ZsYWdzLCBuZXdfZmxhZ3MpKTsKPj4gK30KPj4gKyNlbHNlCj4+ICtzdGF0 aWMgdm9pZCBmb2xpb19pbmNfcmVmcyhzdHJ1Y3QgZm9saW8gKmZvbGlvKQo+PiArewo+PiArfQo+ PiArI2VuZGlmIC8qIENPTkZJR19MUlVfR0VOICovCj4+ICsKPj4gwqAgLyoKPj4gwqDCoCAqIE1h cmsgYSBwYWdlIGFzIGhhdmluZyBzZWVuIGFjdGl2aXR5Lgo+PiDCoMKgICoKPj4gQEAgLTQxNyw2 ICs0NTEsMTEgQEAgc3RhdGljIHZvaWQgX19scnVfY2FjaGVfYWN0aXZhdGVfZm9saW8oc3RydWN0 IAo+PiBmb2xpbyAqZm9saW8pCj4+IMKgwqAgKi8KPj4gwqAgdm9pZCBmb2xpb19tYXJrX2FjY2Vz c2VkKHN0cnVjdCBmb2xpbyAqZm9saW8pCj4+IMKgIHsKPj4gK8KgwqDCoCBpZiAobHJ1X2dlbl9l bmFibGVkKCkpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGZvbGlvX2luY19yZWZzKGZvbGlvKTsKPj4g K8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gwqDCoMKgwqDCoCBp ZiAoIWZvbGlvX3Rlc3RfcmVmZXJlbmNlZChmb2xpbykpIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKg IGZvbGlvX3NldF9yZWZlcmVuY2VkKGZvbGlvKTsKPj4gwqDCoMKgwqDCoCB9IGVsc2UgaWYgKGZv bGlvX3Rlc3RfdW5ldmljdGFibGUoZm9saW8pKSB7Cj4+IGRpZmYgLS1naXQgYS9tbS92bXNjYW4u YyBiL21tL3Ztc2Nhbi5jCj4+IGluZGV4IGI0MWZmOTc2NWNjNy4uODkxZjBhYjY5YjNhIDEwMDY0 NAo+PiAtLS0gYS9tbS92bXNjYW4uYwo+PiArKysgYi9tbS92bXNjYW4uYwo+PiBAQCAtMTI3NSw5 ICsxMjc1LDExIEBAIHN0YXRpYyBpbnQgX19yZW1vdmVfbWFwcGluZyhzdHJ1Y3QgCj4+IGFkZHJl c3Nfc3BhY2UgKm1hcHBpbmcsIHN0cnVjdCBmb2xpbyAqZm9saW8sCj4+IMKgIMKgwqDCoMKgwqAg aWYgKGZvbGlvX3Rlc3Rfc3dhcGNhY2hlKGZvbGlvKSkgewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAg c3dwX2VudHJ5X3Qgc3dhcCA9IGZvbGlvX3N3YXBfZW50cnkoZm9saW8pOwo+PiAtwqDCoMKgwqDC oMKgwqAgbWVtX2Nncm91cF9zd2Fwb3V0KGZvbGlvLCBzd2FwKTsKPj4gKwo+PiArwqDCoMKgwqDC oMKgwqAgLyogZ2V0IGEgc2hhZG93IGVudHJ5IGJlZm9yZSBtZW1fY2dyb3VwX3N3YXBvdXQoKSBj bGVhcnMgCj4+IGZvbGlvX21lbWNnKCkgKi8KPj4gwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChyZWNs YWltZWQgJiYgIW1hcHBpbmdfZXhpdGluZyhtYXBwaW5nKSkKPj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgc2hhZG93ID0gd29ya2luZ3NldF9ldmljdGlvbihmb2xpbywgdGFyZ2V0X21lbWNn KTsKPj4gK8KgwqDCoMKgwqDCoMKgIG1lbV9jZ3JvdXBfc3dhcG91dChmb2xpbywgc3dhcCk7Cj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCBfX2RlbGV0ZV9mcm9tX3N3YXBfY2FjaGUoJmZvbGlvLT5wYWdl LCBzd2FwLCBzaGFkb3cpOwo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgeGFfdW5sb2NrX2lycSgmbWFw cGluZy0+aV9wYWdlcyk7Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoCBwdXRfc3dhcF9wYWdlKCZmb2xp by0+cGFnZSwgc3dhcCk7Cj4+IEBAIC0yNjQ5LDYgKzI2NTEsOSBAQCBzdGF0aWMgdm9pZCBwcmVw YXJlX3NjYW5fY291bnQocGdfZGF0YV90IAo+PiAqcGdkYXQsIHN0cnVjdCBzY2FuX2NvbnRyb2wg KnNjKQo+PiDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmlsZTsKPj4gwqDCoMKgwqDCoCBzdHJ1 Y3QgbHJ1dmVjICp0YXJnZXRfbHJ1dmVjOwo+PiDCoCArwqDCoMKgIGlmIChscnVfZ2VuX2VuYWJs ZWQoKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gKwo+PiDCoMKgwqDCoMKgIHRhcmdl dF9scnV2ZWMgPSBtZW1fY2dyb3VwX2xydXZlYyhzYy0+dGFyZ2V0X21lbV9jZ3JvdXAsIHBnZGF0 KTsKPj4gwqAgwqDCoMKgwqDCoCAvKgo+PiBAQCAtMjk3NCw2ICsyOTc5LDE3IEBAIHN0YXRpYyBi b29sIGNhbl9hZ2VfYW5vbl9wYWdlcyhzdHJ1Y3QgCj4+IHBnbGlzdF9kYXRhICpwZ2RhdCwKPj4g wqDCoCAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg c2hvcnRoYW5kIGhlbHBlcnMKPj4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwo+PiDCoCArI2RlZmlu ZSBMUlVfUkVGU19GTEFHU8KgwqDCoCAoQklUKFBHX3JlZmVyZW5jZWQpIHwgQklUKFBHX3dvcmtp bmdzZXQpKQo+PiArCj4+ICsjZGVmaW5lIERFRklORV9NQVhfU0VRKGxydXZlYynCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4gK8KgwqDCoCB1bnNpZ25l ZCBsb25nIG1heF9zZXEgPSBSRUFEX09OQ0UoKGxydXZlYyktPmxydWdlbi5tYXhfc2VxKQo+PiAr Cj4+ICsjZGVmaW5lIERFRklORV9NSU5fU0VRKGxydXZlYynCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIG1pbl9z ZXFbQU5PTl9BTkRfRklMRV0gPSB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcCj4+ICsgUkVBRF9P TkNFKChscnV2ZWMpLT5scnVnZW4ubWluX3NlcVtMUlVfR0VOX0FOT05dKSzCoMKgwqAgXAo+PiAr IFJFQURfT05DRSgobHJ1dmVjKS0+bHJ1Z2VuLm1pbl9zZXFbTFJVX0dFTl9GSUxFXSkswqDCoMKg IFwKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gwqAgI2RlZmluZSBmb3JfZWFjaF9nZW5fdHlwZV96b25l KGdlbiwgdHlwZSwgem9uZSkgXAo+PiDCoMKgwqDCoMKgIGZvciAoKGdlbikgPSAwOyAoZ2VuKSA8 IE1BWF9OUl9HRU5TOyAoZ2VuKSsrKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXAo+PiDCoMKgwqDC oMKgwqDCoMKgwqAgZm9yICgodHlwZSkgPSAwOyAodHlwZSkgPCBBTk9OX0FORF9GSUxFOyAodHlw ZSkrKynCoMKgwqAgXAo+PiBAQCAtMjk5OSw2ICszMDE1LDc1MyBAQCBzdGF0aWMgc3RydWN0IGxy dXZlYyBfX21heWJlX3VudXNlZCAKPj4gKmdldF9scnV2ZWMoc3RydWN0IG1lbV9jZ3JvdXAgKm1l bWNnLCBpbnQgbmkKPj4gwqDCoMKgwqDCoCByZXR1cm4gcGdkYXQgPyAmcGdkYXQtPl9fbHJ1dmVj IDogTlVMTDsKPj4gwqAgfQo+PiDCoCArc3RhdGljIGludCBnZXRfc3dhcHBpbmVzcyhzdHJ1Y3Qg bHJ1dmVjICpscnV2ZWMsIHN0cnVjdCAKPj4gc2Nhbl9jb250cm9sICpzYykKPj4gK3sKPj4gK8Kg wqDCoCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBscnV2ZWNfbWVtY2cobHJ1dmVjKTsKPj4g K8KgwqDCoCBzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gbHJ1dmVjX3BnZGF0KGxydXZlYyk7 Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIWNhbl9kZW1vdGUocGdkYXQtPm5vZGVfaWQsIHNjKSAmJgo+ PiArwqDCoMKgwqDCoMKgwqAgbWVtX2Nncm91cF9nZXRfbnJfc3dhcF9wYWdlcyhtZW1jZykgPCBN SU5fTFJVX0JBVENIKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsKPj4gK8KgwqDC oCByZXR1cm4gbWVtX2Nncm91cF9zd2FwcGluZXNzKG1lbWNnKTsKPj4gK30KPj4gKwo+PiArc3Rh dGljIGludCBnZXRfbnJfZ2VucyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIGludCB0eXBlKQo+PiAr ewo+PiArwqDCoMKgIHJldHVybiBscnV2ZWMtPmxydWdlbi5tYXhfc2VxIC0gbHJ1dmVjLT5scnVn ZW4ubWluX3NlcVt0eXBlXSArIDE7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBib29sIF9fbWF5YmVf dW51c2VkIHNlcV9pc192YWxpZChzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMpCj4+ICt7Cj4+ICvCoMKg wqAgLyogc2VlIHRoZSBjb21tZW50IG9uIGxydV9nZW5fc3RydWN0ICovCj4+ICvCoMKgwqAgcmV0 dXJuIGdldF9ucl9nZW5zKGxydXZlYywgTFJVX0dFTl9GSUxFKSA+PSBNSU5fTlJfR0VOUyAmJgo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ2V0X25yX2dlbnMobHJ1dmVjLCBMUlVfR0VOX0ZJTEUp IDw9IGdldF9ucl9nZW5zKGxydXZlYywgCj4+IExSVV9HRU5fQU5PTikgJiYKPj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgIGdldF9ucl9nZW5zKGxydXZlYywgTFJVX0dFTl9BTk9OKSA8PSBNQVhfTlJf R0VOUzsKPj4gK30KPj4gKwo+PiArLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKPj4KPj4gKyAqwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmVmYXVsdCBm ZWVkYmFjayBsb29wCj4+ICsgCj4+ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KPj4gKwo+PiArLyoK Pj4gKyAqIEEgZmVlZGJhY2sgbG9vcCBiYXNlZCBvbiBQcm9wb3J0aW9uYWwtSW50ZWdyYWwtRGVy aXZhdGl2ZSAoUElEKSAKPj4gY29udHJvbGxlci4KPj4gKyAqCj4+ICsgKiBUaGUgUCB0ZXJtIGlz IHJlZmF1bHRlZC8oZXZpY3RlZCtwcm90ZWN0ZWQpIGZyb20gYSB0aWVyIGluIHRoZSAKPj4gZ2Vu ZXJhdGlvbgo+PiArICogY3VycmVudGx5IGJlaW5nIGV2aWN0ZWQ7IHRoZSBJIHRlcm0gaXMgdGhl IGV4cG9uZW50aWFsIG1vdmluZyAKPj4gYXZlcmFnZSBvZiB0aGUKPj4gKyAqIFAgdGVybSBvdmVy IHRoZSBnZW5lcmF0aW9ucyBwcmV2aW91c2x5IGV2aWN0ZWQsIHVzaW5nIHRoZSAKPj4gc21vb3Ro aW5nIGZhY3Rvcgo+PiArICogMS8yOyB0aGUgRCB0ZXJtIGlzbid0IHN1cHBvcnRlZC4KPj4gKyAq Cj4+ICsgKiBUaGUgc2V0cG9pbnQgKFNQKSBpcyBhbHdheXMgdGhlIGZpcnN0IHRpZXIgb2Ygb25l IHR5cGU7IHRoZSAKPj4gcHJvY2VzcyB2YXJpYWJsZQo+PiArICogKFBWKSBpcyBlaXRoZXIgYW55 IHRpZXIgb2YgdGhlIG90aGVyIHR5cGUgb3IgYW55IG90aGVyIHRpZXIgb2YgCj4+IHRoZSBzYW1l Cj4+ICsgKiB0eXBlLgo+PiArICoKPj4gKyAqIFRoZSBlcnJvciBpcyB0aGUgZGlmZmVyZW5jZSBi ZXR3ZWVuIHRoZSBTUCBhbmQgdGhlIFBWOyB0aGUgCj4+IGNvcnJlY3Rpb24gaXMKPj4gKyAqIHR1 cm4gb2ZmIHByb3RlY3Rpb24gd2hlbiBTUD5QViBvciB0dXJuIG9uIHByb3RlY3Rpb24gd2hlbiBT UDxQVi4KPj4gKyAqCj4+ICsgKiBGb3IgZnV0dXJlIG9wdGltaXphdGlvbnM6Cj4+ICsgKiAxLiBU aGUgRCB0ZXJtIG1heSBkaXNjb3VudCB0aGUgb3RoZXIgdHdvIHRlcm1zIG92ZXIgdGltZSBzbyB0 aGF0IAo+PiBsb25nLWxpdmVkCj4+ICsgKsKgwqDCoCBnZW5lcmF0aW9ucyBjYW4gcmVzaXN0IHN0 YWxlIGluZm9ybWF0aW9uLgo+PiArICovCj4+ICtzdHJ1Y3QgY3RybF9wb3Mgewo+PiArwqDCoMKg IHVuc2lnbmVkIGxvbmcgcmVmYXVsdGVkOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgdG90YWw7 Cj4+ICvCoMKgwqAgaW50IGdhaW47Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgdm9pZCByZWFkX2N0 cmxfcG9zKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgaW50IHR5cGUsIGludCB0aWVyLCAKPj4gaW50 IGdhaW4sCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgY3RybF9wb3MgKnBv cykKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgbHJ1X2dlbl9zdHJ1Y3QgKmxydWdlbiA9ICZscnV2 ZWMtPmxydWdlbjsKPj4gK8KgwqDCoCBpbnQgaGlzdCA9IGxydV9oaXN0X2Zyb21fc2VxKGxydWdl bi0+bWluX3NlcVt0eXBlXSk7Cj4+ICsKPj4gK8KgwqDCoCBwb3MtPnJlZmF1bHRlZCA9IGxydWdl bi0+YXZnX3JlZmF1bHRlZFt0eXBlXVt0aWVyXSArCj4+ICsgYXRvbWljX2xvbmdfcmVhZCgmbHJ1 Z2VuLT5yZWZhdWx0ZWRbaGlzdF1bdHlwZV1bdGllcl0pOwo+PiArwqDCoMKgIHBvcy0+dG90YWwg PSBscnVnZW4tPmF2Z190b3RhbFt0eXBlXVt0aWVyXSArCj4+ICsgYXRvbWljX2xvbmdfcmVhZCgm bHJ1Z2VuLT5ldmljdGVkW2hpc3RdW3R5cGVdW3RpZXJdKTsKPj4gK8KgwqDCoCBpZiAodGllcikK Pj4gK8KgwqDCoMKgwqDCoMKgIHBvcy0+dG90YWwgKz0gbHJ1Z2VuLT5wcm90ZWN0ZWRbaGlzdF1b dHlwZV1bdGllciAtIDFdOwo+PiArwqDCoMKgIHBvcy0+Z2FpbiA9IGdhaW47Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyB2b2lkIHJlc2V0X2N0cmxfcG9zKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgaW50 IHR5cGUsIGJvb2wgCj4+IGNhcnJ5b3ZlcikKPj4gK3sKPj4gK8KgwqDCoCBpbnQgaGlzdCwgdGll cjsKPj4gK8KgwqDCoCBzdHJ1Y3QgbHJ1X2dlbl9zdHJ1Y3QgKmxydWdlbiA9ICZscnV2ZWMtPmxy dWdlbjsKPj4gK8KgwqDCoCBib29sIGNsZWFyID0gY2FycnlvdmVyID8gTlJfSElTVF9HRU5TID09 IDEgOiBOUl9ISVNUX0dFTlMgPiAxOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgc2VxID0gY2Fy cnlvdmVyID8gbHJ1Z2VuLT5taW5fc2VxW3R5cGVdIDogCj4+IGxydWdlbi0+bWF4X3NlcSArIDE7 Cj4+ICsKPj4gK8KgwqDCoCBsb2NrZGVwX2Fzc2VydF9oZWxkKCZscnV2ZWMtPmxydV9sb2NrKTsK Pj4gKwo+PiArwqDCoMKgIGlmICghY2FycnlvdmVyICYmICFjbGVhcikKPj4gK8KgwqDCoMKgwqDC oMKgIHJldHVybjsKPj4gKwo+PiArwqDCoMKgIGhpc3QgPSBscnVfaGlzdF9mcm9tX3NlcShzZXEp Owo+PiArCj4+ICvCoMKgwqAgZm9yICh0aWVyID0gMDsgdGllciA8IE1BWF9OUl9USUVSUzsgdGll cisrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoY2FycnlvdmVyKSB7Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgc3VtOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHN1bSA9IGxydWdlbi0+YXZnX3JlZmF1bHRlZFt0eXBlXVt0aWVyXSArCj4+ICsgYXRv bWljX2xvbmdfcmVhZCgmbHJ1Z2VuLT5yZWZhdWx0ZWRbaGlzdF1bdHlwZV1bdGllcl0pOwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBXUklURV9PTkNFKGxydWdlbi0+YXZnX3JlZmF1bHRlZFt0 eXBlXVt0aWVyXSwgc3VtIC8gMik7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3Vt ID0gbHJ1Z2VuLT5hdmdfdG90YWxbdHlwZV1bdGllcl0gKwo+PiArIGF0b21pY19sb25nX3JlYWQo JmxydWdlbi0+ZXZpY3RlZFtoaXN0XVt0eXBlXVt0aWVyXSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGlmICh0aWVyKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN1bSAr PSBscnVnZW4tPnByb3RlY3RlZFtoaXN0XVt0eXBlXVt0aWVyIC0gMV07Cj4+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIFdSSVRFX09OQ0UobHJ1Z2VuLT5hdmdfdG90YWxbdHlwZV1bdGllcl0sIHN1 bSAvIDIpOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAo Y2xlYXIpIHsKPj4gKyBhdG9taWNfbG9uZ19zZXQoJmxydWdlbi0+cmVmYXVsdGVkW2hpc3RdW3R5 cGVdW3RpZXJdLCAwKTsKPj4gKyBhdG9taWNfbG9uZ19zZXQoJmxydWdlbi0+ZXZpY3RlZFtoaXN0 XVt0eXBlXVt0aWVyXSwgMCk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmICh0aWVyKQo+ PiArIFdSSVRFX09OQ0UobHJ1Z2VuLT5wcm90ZWN0ZWRbaGlzdF1bdHlwZV1bdGllciAtIDFdLCAw KTsKPj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBib29sIHBvc2l0aXZlX2N0cmxfZXJyKHN0cnVjdCBjdHJsX3BvcyAqc3AsIHN0cnVjdCBjdHJs X3BvcyAqcHYpCj4+ICt7Cj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogUmV0dXJuIHRydWUg aWYgdGhlIFBWIGhhcyBhIGxpbWl0ZWQgbnVtYmVyIG9mIHJlZmF1bHRzIG9yIGEgCj4+IGxvd2Vy Cj4+ICvCoMKgwqDCoCAqIHJlZmF1bHRlZC90b3RhbCB0aGFuIHRoZSBTUC4KPj4gK8KgwqDCoMKg ICovCj4+ICvCoMKgwqAgcmV0dXJuIHB2LT5yZWZhdWx0ZWQgPCBNSU5fTFJVX0JBVENIIHx8Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoCBwdi0+cmVmYXVsdGVkICogKHNwLT50b3RhbCArIE1JTl9M UlVfQkFUQ0gpICogc3AtPmdhaW4gPD0KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgIChzcC0+cmVm YXVsdGVkICsgMSkgKiBwdi0+dG90YWwgKiBwdi0+Z2FpbjsKPj4gK30KPj4gKwo+PiArLyoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiAKPj4KPj4gKyAqwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdGhlIGFnaW5nCj4+ICsgCj4+ICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KPj4gKwo+PiArc3RhdGljIGludCBmb2xpb19pbmNfZ2VuKHN0cnVjdCBscnV2ZWMgKmxy dXZlYywgc3RydWN0IGZvbGlvICpmb2xpbywgCj4+IGJvb2wgcmVjbGFpbWluZykKPj4gK3sKPj4g K8KgwqDCoCBpbnQgdHlwZSA9IGZvbGlvX2lzX2ZpbGVfbHJ1KGZvbGlvKTsKPj4gK8KgwqDCoCBz dHJ1Y3QgbHJ1X2dlbl9zdHJ1Y3QgKmxydWdlbiA9ICZscnV2ZWMtPmxydWdlbjsKPj4gK8KgwqDC oCBpbnQgbmV3X2dlbiwgb2xkX2dlbiA9IGxydV9nZW5fZnJvbV9zZXEobHJ1Z2VuLT5taW5fc2Vx W3R5cGVdKTsKPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIG5ld19mbGFncywgb2xkX2ZsYWdzID0g UkVBRF9PTkNFKGZvbGlvLT5mbGFncyk7Cj4+ICsKPj4gK8KgwqDCoCBWTV9XQVJOX09OX09OQ0Vf Rk9MSU8oIShvbGRfZmxhZ3MgJiBMUlVfR0VOX01BU0spLCBmb2xpbyk7Cj4+ICsKPj4gK8KgwqDC oCBkbyB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBuZXdfZ2VuID0gKG9sZF9nZW4gKyAxKSAlIE1BWF9O Ul9HRU5TOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBuZXdfZmxhZ3MgPSBvbGRfZmxhZ3MgJiB+ KExSVV9HRU5fTUFTSyB8IExSVV9SRUZTX01BU0sgfCAKPj4gTFJVX1JFRlNfRkxBR1MpOwo+PiAr wqDCoMKgwqDCoMKgwqAgbmV3X2ZsYWdzIHw9IChuZXdfZ2VuICsgMVVMKSA8PCBMUlVfR0VOX1BH T0ZGOwo+PiArwqDCoMKgwqDCoMKgwqAgLyogZm9yIGZvbGlvX2VuZF93cml0ZWJhY2soKSAqLwo+ PiArwqDCoMKgwqDCoMKgwqAgaWYgKHJlY2xhaW1pbmcpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIG5ld19mbGFncyB8PSBCSVQoUEdfcmVjbGFpbSk7Cj4+ICvCoMKgwqAgfSB3aGlsZSAoIXRy eV9jbXB4Y2hnKCZmb2xpby0+ZmxhZ3MsICZvbGRfZmxhZ3MsIG5ld19mbGFncykpOwo+PiArCj4+ ICvCoMKgwqAgbHJ1X2dlbl91cGRhdGVfc2l6ZShscnV2ZWMsIGZvbGlvLCBvbGRfZ2VuLCBuZXdf Z2VuKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBuZXdfZ2VuOwo+PiArfQo+PiArCj4+ICtzdGF0 aWMgdm9pZCBpbmNfbWluX3NlcShzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIGludCB0eXBlKQo+PiAr ewo+PiArwqDCoMKgIHN0cnVjdCBscnVfZ2VuX3N0cnVjdCAqbHJ1Z2VuID0gJmxydXZlYy0+bHJ1 Z2VuOwo+PiArCj4+ICvCoMKgwqAgcmVzZXRfY3RybF9wb3MobHJ1dmVjLCB0eXBlLCB0cnVlKTsK Pj4gK8KgwqDCoCBXUklURV9PTkNFKGxydWdlbi0+bWluX3NlcVt0eXBlXSwgbHJ1Z2VuLT5taW5f c2VxW3R5cGVdICsgMSk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBib29sIHRyeV90b19pbmNfbWlu X3NlcShzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIGJvb2wgY2FuX3N3YXApCj4+ICt7Cj4+ICvCoMKg wqAgaW50IGdlbiwgdHlwZSwgem9uZTsKPj4gK8KgwqDCoCBib29sIHN1Y2Nlc3MgPSBmYWxzZTsK Pj4gK8KgwqDCoCBzdHJ1Y3QgbHJ1X2dlbl9zdHJ1Y3QgKmxydWdlbiA9ICZscnV2ZWMtPmxydWdl bjsKPj4gK8KgwqDCoCBERUZJTkVfTUlOX1NFUShscnV2ZWMpOwo+PiArCj4+ICvCoMKgwqAgVk1f V0FSTl9PTl9PTkNFKCFzZXFfaXNfdmFsaWQobHJ1dmVjKSk7Cj4+ICsKPj4gK8KgwqDCoCAvKiBm aW5kIHRoZSBvbGRlc3QgcG9wdWxhdGVkIGdlbmVyYXRpb24gKi8KPj4gK8KgwqDCoCBmb3IgKHR5 cGUgPSAhY2FuX3N3YXA7IHR5cGUgPCBBTk9OX0FORF9GSUxFOyB0eXBlKyspIHsKPj4gK8KgwqDC oMKgwqDCoMKgIHdoaWxlIChtaW5fc2VxW3R5cGVdICsgTUlOX05SX0dFTlMgPD0gbHJ1Z2VuLT5t YXhfc2VxKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGdlbiA9IGxydV9nZW5fZnJvbV9z ZXEobWluX3NlcVt0eXBlXSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yICh6 b25lID0gMDsgem9uZSA8IE1BWF9OUl9aT05FUzsgem9uZSsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaWYgKCFsaXN0X2VtcHR5KCZscnVnZW4tPmxpc3RzW2dlbl1bdHlw ZV1bem9uZV0pKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290 byBuZXh0Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqAgbWluX3NlcVt0eXBlXSsrOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArbmV4 dDoKPj4gK8KgwqDCoMKgwqDCoMKgIDsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKiBz ZWUgdGhlIGNvbW1lbnQgb24gbHJ1X2dlbl9zdHJ1Y3QgKi8KPj4gK8KgwqDCoCBpZiAoY2FuX3N3 YXApIHsKPj4gK8KgwqDCoMKgwqDCoMKgIG1pbl9zZXFbTFJVX0dFTl9BTk9OXSA9IG1pbihtaW5f c2VxW0xSVV9HRU5fQU5PTl0sIAo+PiBtaW5fc2VxW0xSVV9HRU5fRklMRV0pOwo+PiArwqDCoMKg wqDCoMKgwqAgbWluX3NlcVtMUlVfR0VOX0ZJTEVdID0gbWF4KG1pbl9zZXFbTFJVX0dFTl9BTk9O XSwgCj4+IGxydWdlbi0+bWluX3NlcVtMUlVfR0VOX0ZJTEVdKTsKPj4gK8KgwqDCoCB9Cj4+ICsK Pj4gK8KgwqDCoCBmb3IgKHR5cGUgPSAhY2FuX3N3YXA7IHR5cGUgPCBBTk9OX0FORF9GSUxFOyB0 eXBlKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmIChtaW5fc2VxW3R5cGVdID09IGxydWdlbi0+ bWluX3NlcVt0eXBlXSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7Cj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgIHJlc2V0X2N0cmxfcG9zKGxydXZlYywgdHlwZSwgdHJ1ZSk7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBXUklURV9PTkNFKGxydWdlbi0+bWluX3NlcVt0eXBlXSwgbWluX3Nl cVt0eXBlXSk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBzdWNjZXNzID0gdHJ1ZTsKPj4gK8KgwqDCoCB9 Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gc3VjY2VzczsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZv aWQgaW5jX21heF9zZXEoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCB1bnNpZ25lZCBsb25nIAo+PiBt YXhfc2VxLCBib29sIGNhbl9zd2FwKQo+PiArewo+PiArwqDCoMKgIGludCBwcmV2LCBuZXh0Owo+ PiArwqDCoMKgIGludCB0eXBlLCB6b25lOwo+PiArwqDCoMKgIHN0cnVjdCBscnVfZ2VuX3N0cnVj dCAqbHJ1Z2VuID0gJmxydXZlYy0+bHJ1Z2VuOwo+PiArCj4+ICvCoMKgwqAgc3Bpbl9sb2NrX2ly cSgmbHJ1dmVjLT5scnVfbG9jayk7Cj4+ICsKPj4gK8KgwqDCoCBWTV9XQVJOX09OX09OQ0UoIXNl cV9pc192YWxpZChscnV2ZWMpKTsKPj4gKwo+PiArwqDCoMKgIGlmIChtYXhfc2VxICE9IGxydWdl bi0+bWF4X3NlcSkKPj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrOwo+PiArCj4+ICvCoMKg wqAgZm9yICh0eXBlID0gMDsgdHlwZSA8IEFOT05fQU5EX0ZJTEU7IHR5cGUrKykgewo+PiArwqDC oMKgwqDCoMKgwqAgaWYgKGdldF9ucl9nZW5zKGxydXZlYywgdHlwZSkgIT0gTUFYX05SX0dFTlMp Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnRpbnVlOwo+PiArCj4+ICvCoMKgwqDCoMKg wqDCoCBWTV9XQVJOX09OX09OQ0UodHlwZSA9PSBMUlVfR0VOX0ZJTEUgfHwgY2FuX3N3YXApOwo+ PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpbmNfbWluX3NlcShscnV2ZWMsIHR5cGUpOwo+PiArwqDC oMKgIH0KPj4gKwo+PiArwqDCoMKgIC8qCj4+ICvCoMKgwqDCoCAqIFVwZGF0ZSB0aGUgYWN0aXZl L2luYWN0aXZlIExSVSBzaXplcyBmb3IgY29tcGF0aWJpbGl0eS4gQm90aCAKPj4gc2lkZXMgb2YK Pj4gK8KgwqDCoMKgICogdGhlIGN1cnJlbnQgbWF4X3NlcSBuZWVkIHRvIGJlIGNvdmVyZWQsIHNp bmNlIG1heF9zZXErMSBjYW4gCj4+IG92ZXJsYXAKPj4gK8KgwqDCoMKgICogd2l0aCBtaW5fc2Vx W0xSVV9HRU5fQU5PTl0gaWYgc3dhcHBpbmcgaXMgY29uc3RyYWluZWQuIEFuZCBpZiAKPj4gdGhl eSBkbwo+PiArwqDCoMKgwqAgKiBvdmVybGFwLCBjb2xkL2hvdCBpbnZlcnNpb24gaGFwcGVucy4K Pj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgcHJldiA9IGxydV9nZW5fZnJvbV9zZXEobHJ1Z2Vu LT5tYXhfc2VxIC0gMSk7Cj4+ICvCoMKgwqAgbmV4dCA9IGxydV9nZW5fZnJvbV9zZXEobHJ1Z2Vu LT5tYXhfc2VxICsgMSk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgQU5P Tl9BTkRfRklMRTsgdHlwZSsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBmb3IgKHpvbmUgPSAwOyB6 b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg ZW51bSBscnVfbGlzdCBscnUgPSB0eXBlICogTFJVX0lOQUNUSVZFX0ZJTEU7Cj4+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIGxvbmcgZGVsdGEgPSBscnVnZW4tPm5yX3BhZ2VzW3ByZXZdW3R5cGVd W3pvbmVdIC0KPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbHJ1 Z2VuLT5ucl9wYWdlc1tuZXh0XVt0eXBlXVt6b25lXTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBpZiAoIWRlbHRhKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNv bnRpbnVlOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9fdXBkYXRlX2xydV9zaXpl KGxydXZlYywgbHJ1LCB6b25lLCBkZWx0YSk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9f dXBkYXRlX2xydV9zaXplKGxydXZlYywgbHJ1ICsgTFJVX0FDVElWRSwgem9uZSwgLWRlbHRhKTsK Pj4gK8KgwqDCoMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKHR5 cGUgPSAwOyB0eXBlIDwgQU5PTl9BTkRfRklMRTsgdHlwZSsrKQo+PiArwqDCoMKgwqDCoMKgwqAg cmVzZXRfY3RybF9wb3MobHJ1dmVjLCB0eXBlLCBmYWxzZSk7Cj4+ICsKPj4gK8KgwqDCoCAvKiBt YWtlIHN1cmUgcHJlY2VkaW5nIG1vZGlmaWNhdGlvbnMgYXBwZWFyICovCj4+ICvCoMKgwqAgc21w X3N0b3JlX3JlbGVhc2UoJmxydWdlbi0+bWF4X3NlcSwgbHJ1Z2VuLT5tYXhfc2VxICsgMSk7Cj4+ ICt1bmxvY2s6Cj4+ICvCoMKgwqAgc3Bpbl91bmxvY2tfaXJxKCZscnV2ZWMtPmxydV9sb2NrKTsK Pj4gK30KPj4gKwo+PiArc3RhdGljIGxvbmcgZ2V0X25yX2V2aWN0YWJsZShzdHJ1Y3QgbHJ1dmVj ICpscnV2ZWMsIHVuc2lnbmVkIGxvbmcgCj4+IG1heF9zZXEsCj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB1bnNpZ25lZCBsb25nICptaW5fc2VxLCBib29sIGNhbl9zd2FwLCBi b29sIAo+PiAqbmVlZF9hZ2luZykKPj4gK3sKPj4gK8KgwqDCoCBpbnQgZ2VuLCB0eXBlLCB6b25l Owo+PiArwqDCoMKgIGxvbmcgb2xkID0gMDsKPj4gK8KgwqDCoCBsb25nIHlvdW5nID0gMDsKPj4g K8KgwqDCoCBsb25nIHRvdGFsID0gMDsKPj4gK8KgwqDCoCBzdHJ1Y3QgbHJ1X2dlbl9zdHJ1Y3Qg KmxydWdlbiA9ICZscnV2ZWMtPmxydWdlbjsKPj4gKwo+PiArwqDCoMKgIGZvciAodHlwZSA9ICFj YW5fc3dhcDsgdHlwZSA8IEFOT05fQU5EX0ZJTEU7IHR5cGUrKykgewo+PiArwqDCoMKgwqDCoMKg wqAgdW5zaWduZWQgbG9uZyBzZXE7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGZvciAoc2VxID0g bWluX3NlcVt0eXBlXTsgc2VxIDw9IG1heF9zZXE7IHNlcSsrKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGxvbmcgc2l6ZSA9IDA7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Z2VuID0gbHJ1X2dlbl9mcm9tX3NlcShzZXEpOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGZvciAoem9uZSA9IDA7IHpvbmUgPCBNQVhfTlJfWk9ORVM7IHpvbmUrKykKPj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzaXplICs9IFJFQURfT05DRShscnVnZW4tPm5yX3Bh Z2VzW2dlbl1bdHlwZV1bem9uZV0pOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRv dGFsICs9IHNpemU7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChzZXEgPT0gbWF4X3Nl cSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB5b3VuZyArPSBzaXplOwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc2VxICsgTUlOX05SX0dFTlMgPT0gbWF4X3NlcSkK Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBvbGQgKz0gc2l6ZTsKPj4gK8KgwqDC oMKgwqDCoMKgIH0KPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAg KiBUaGUgYWdpbmcgdHJpZXMgdG8gYmUgbGF6eSB0byByZWR1Y2UgdGhlIG92ZXJoZWFkLiBPbiB0 aGUgCj4+IG90aGVyIGhhbmQsCj4+ICvCoMKgwqDCoCAqIHRoZSBldmljdGlvbiBzdGFsbHMgd2hl biB0aGUgbnVtYmVyIG9mIGdlbmVyYXRpb25zIHJlYWNoZXMKPj4gK8KgwqDCoMKgICogTUlOX05S X0dFTlMuIFNvIGlkZWFsbHksIHRoZXJlIHNob3VsZCBiZSBNSU5fTlJfR0VOUysxIAo+PiBnZW5l cmF0aW9ucywKPj4gK8KgwqDCoMKgICogaGVuY2UgdGhlIGZpcnN0IHR3byBpZidzLgo+PiArwqDC oMKgwqAgKgo+PiArwqDCoMKgwqAgKiBBbHNvIGl0J3MgaWRlYWwgdG8gc3ByZWFkIHBhZ2VzIG91 dCBldmVubHksIG1lYW5pbmcgCj4+IDEvKE1JTl9OUl9HRU5TKzEpCj4+ICvCoMKgwqDCoCAqIG9m IHRoZSB0b3RhbCBudW1iZXIgb2YgcGFnZXMgZm9yIGVhY2ggZ2VuZXJhdGlvbi4gQSAKPj4gcmVh c29uYWJsZSByYW5nZQo+PiArwqDCoMKgwqAgKiBmb3IgdGhpcyBhdmVyYWdlIHBvcnRpb24gaXMg WzEvTUlOX05SX0dFTlMsIAo+PiAxLyhNSU5fTlJfR0VOUysyKV0uIFRoZQo+PiArwqDCoMKgwqAg KiBldmljdGlvbiBjYXJlcyBhYm91dCB0aGUgbG93ZXIgYm91bmQgb2YgY29sZCBwYWdlcywgd2hl cmVhcyAKPj4gdGhlIGFnaW5nCj4+ICvCoMKgwqDCoCAqIGNhcmVzIGFib3V0IHRoZSB1cHBlciBi b3VuZCBvZiBob3QgcGFnZXMuCj4+ICvCoMKgwqDCoCAqLwo+PiArwqDCoMKgIGlmIChtaW5fc2Vx WyFjYW5fc3dhcF0gKyBNSU5fTlJfR0VOUyA+IG1heF9zZXEpCj4+ICvCoMKgwqDCoMKgwqDCoCAq bmVlZF9hZ2luZyA9IHRydWU7Cj4+ICvCoMKgwqAgZWxzZSBpZiAobWluX3NlcVshY2FuX3N3YXBd ICsgTUlOX05SX0dFTlMgPCBtYXhfc2VxKQo+PiArwqDCoMKgwqDCoMKgwqAgKm5lZWRfYWdpbmcg PSBmYWxzZTsKPj4gK8KgwqDCoCBlbHNlIGlmICh5b3VuZyAqIE1JTl9OUl9HRU5TID4gdG90YWwp Cj4+ICvCoMKgwqDCoMKgwqDCoCAqbmVlZF9hZ2luZyA9IHRydWU7Cj4+ICvCoMKgwqAgZWxzZSBp ZiAob2xkICogKE1JTl9OUl9HRU5TICsgMikgPCB0b3RhbCkKPj4gK8KgwqDCoMKgwqDCoMKgICpu ZWVkX2FnaW5nID0gdHJ1ZTsKPj4gK8KgwqDCoCBlbHNlCj4+ICvCoMKgwqDCoMKgwqDCoCAqbmVl ZF9hZ2luZyA9IGZhbHNlOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHRvdGFsID4gMCA/IHRvdGFs IDogMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgYWdlX2xydXZlYyhzdHJ1Y3QgbHJ1dmVj ICpscnV2ZWMsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQo+PiArewo+PiArwqDCoMKgIGJvb2wg bmVlZF9hZ2luZzsKPj4gK8KgwqDCoCBsb25nIG5yX3RvX3NjYW47Cj4+ICvCoMKgwqAgaW50IHN3 YXBwaW5lc3MgPSBnZXRfc3dhcHBpbmVzcyhscnV2ZWMsIHNjKTsKPj4gK8KgwqDCoCBzdHJ1Y3Qg bWVtX2Nncm91cCAqbWVtY2cgPSBscnV2ZWNfbWVtY2cobHJ1dmVjKTsKPj4gK8KgwqDCoCBERUZJ TkVfTUFYX1NFUShscnV2ZWMpOwo+PiArwqDCoMKgIERFRklORV9NSU5fU0VRKGxydXZlYyk7Cj4+ ICsKPj4gK8KgwqDCoCBWTV9XQVJOX09OX09OQ0Uoc2MtPm1lbWNnX2xvd19yZWNsYWltKTsKPj4g Kwo+PiArwqDCoMKgIG1lbV9jZ3JvdXBfY2FsY3VsYXRlX3Byb3RlY3Rpb24oTlVMTCwgbWVtY2cp Owo+PiArCj4+ICvCoMKgwqAgaWYgKG1lbV9jZ3JvdXBfYmVsb3dfbWluKG1lbWNnKSkKPj4gK8Kg wqDCoMKgwqDCoMKgIHJldHVybjsKPj4gKwo+PiArwqDCoMKgIG5yX3RvX3NjYW4gPSBnZXRfbnJf ZXZpY3RhYmxlKGxydXZlYywgbWF4X3NlcSwgbWluX3NlcSwgCj4+IHN3YXBwaW5lc3MsICZuZWVk X2FnaW5nKTsKPj4gK8KgwqDCoCBpZiAoIW5yX3RvX3NjYW4pCj4+ICvCoMKgwqDCoMKgwqDCoCBy ZXR1cm47Cj4+ICsKPj4gK8KgwqDCoCBucl90b19zY2FuID4+PSBzYy0+cHJpb3JpdHk7Cj4+ICsK Pj4gK8KgwqDCoCBpZiAoIW1lbV9jZ3JvdXBfb25saW5lKG1lbWNnKSkKPj4gK8KgwqDCoMKgwqDC oMKgIG5yX3RvX3NjYW4rKzsKPj4gKwo+PiArwqDCoMKgIGlmIChucl90b19zY2FuICYmIG5lZWRf YWdpbmcpCj4+ICvCoMKgwqDCoMKgwqDCoCBpbmNfbWF4X3NlcShscnV2ZWMsIG1heF9zZXEsIHN3 YXBwaW5lc3MpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBscnVfZ2VuX2FnZV9ub2RlKHN0 cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsIHN0cnVjdCAKPj4gc2Nhbl9jb250cm9sICpzYykKPj4g K3sKPj4gK8KgwqDCoCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7Cj4+ICsKPj4gK8KgwqDCoCBW TV9XQVJOX09OX09OQ0UoIWN1cnJlbnRfaXNfa3N3YXBkKCkpOwo+PiArCj4+ICvCoMKgwqAgbWVt Y2cgPSBtZW1fY2dyb3VwX2l0ZXIoTlVMTCwgTlVMTCwgTlVMTCk7Cj4+ICvCoMKgwqAgZG8gewo+ PiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IGxydXZlYyAqbHJ1dmVjID0gbWVtX2Nncm91cF9scnV2 ZWMobWVtY2csIHBnZGF0KTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgYWdlX2xydXZlYyhscnV2 ZWMsIHNjKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgY29uZF9yZXNjaGVkKCk7Cj4+ICvCoMKg wqAgfSB3aGlsZSAoKG1lbWNnID0gbWVtX2Nncm91cF9pdGVyKE5VTEwsIG1lbWNnLCBOVUxMKSkp Owo+PiArfQo+PiArCj4+ICsvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAo+Pgo+PiArICrCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0aGUgZXZpY3Rpb24K Pj4gKyAKPj4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwo+PiArCj4+ICtzdGF0aWMgYm9vbCBzb3J0 X2ZvbGlvKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgc3RydWN0IGZvbGlvICpmb2xpbywgCj4+IGlu dCB0aWVyX2lkeCkKPj4gK3sKPj4gK8KgwqDCoCBib29sIHN1Y2Nlc3M7Cj4+ICvCoMKgwqAgaW50 IGdlbiA9IGZvbGlvX2xydV9nZW4oZm9saW8pOwo+PiArwqDCoMKgIGludCB0eXBlID0gZm9saW9f aXNfZmlsZV9scnUoZm9saW8pOwo+PiArwqDCoMKgIGludCB6b25lID0gZm9saW9fem9uZW51bShm b2xpbyk7Cj4+ICvCoMKgwqAgaW50IGRlbHRhID0gZm9saW9fbnJfcGFnZXMoZm9saW8pOwo+PiAr wqDCoMKgIGludCByZWZzID0gZm9saW9fbHJ1X3JlZnMoZm9saW8pOwo+PiArwqDCoMKgIGludCB0 aWVyID0gbHJ1X3RpZXJfZnJvbV9yZWZzKHJlZnMpOwo+PiArwqDCoMKgIHN0cnVjdCBscnVfZ2Vu X3N0cnVjdCAqbHJ1Z2VuID0gJmxydXZlYy0+bHJ1Z2VuOwo+PiArCj4+ICvCoMKgwqAgVk1fV0FS Tl9PTl9PTkNFX0ZPTElPKGdlbiA+PSBNQVhfTlJfR0VOUywgZm9saW8pOwo+PiArCj4+ICvCoMKg wqAgLyogdW5ldmljdGFibGUgKi8KPj4gK8KgwqDCoCBpZiAoIWZvbGlvX2V2aWN0YWJsZShmb2xp bykpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHN1Y2Nlc3MgPSBscnVfZ2VuX2RlbF9mb2xpbyhscnV2 ZWMsIGZvbGlvLCB0cnVlKTsKPj4gK8KgwqDCoMKgwqDCoMKgIFZNX1dBUk5fT05fT05DRV9GT0xJ Tyghc3VjY2VzcywgZm9saW8pOwo+PiArwqDCoMKgwqDCoMKgwqAgZm9saW9fc2V0X3VuZXZpY3Rh YmxlKGZvbGlvKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGxydXZlY19hZGRfZm9saW8obHJ1dmVjLCBm b2xpbyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBfX2NvdW50X3ZtX2V2ZW50cyhVTkVWSUNUQUJMRV9Q R0NVTExFRCwgZGVsdGEpOwo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7Cj4+ICvCoMKg wqAgfQo+PiArCj4+ICvCoMKgwqAgLyogZGlydGllZCBsYXp5ZnJlZSAqLwo+PiArwqDCoMKgIGlm ICh0eXBlID09IExSVV9HRU5fRklMRSAmJiBmb2xpb190ZXN0X2Fub24oZm9saW8pICYmIAo+PiBm b2xpb190ZXN0X2RpcnR5KGZvbGlvKSkgewo+PiArwqDCoMKgwqDCoMKgwqAgc3VjY2VzcyA9IGxy dV9nZW5fZGVsX2ZvbGlvKGxydXZlYywgZm9saW8sIHRydWUpOwo+PiArwqDCoMKgwqDCoMKgwqAg Vk1fV0FSTl9PTl9PTkNFX0ZPTElPKCFzdWNjZXNzLCBmb2xpbyk7Cj4+ICvCoMKgwqDCoMKgwqDC oCBmb2xpb19zZXRfc3dhcGJhY2tlZChmb2xpbyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBscnV2ZWNf YWRkX2ZvbGlvX3RhaWwobHJ1dmVjLCBmb2xpbyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g dHJ1ZTsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCAvKiBwcm90ZWN0ZWQgKi8KPj4gK8Kg wqDCoCBpZiAodGllciA+IHRpZXJfaWR4KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBpbnQgaGlzdCA9 IGxydV9oaXN0X2Zyb21fc2VxKGxydWdlbi0+bWluX3NlcVt0eXBlXSk7Cj4+ICsKPj4gK8KgwqDC oMKgwqDCoMKgIGdlbiA9IGZvbGlvX2luY19nZW4obHJ1dmVjLCBmb2xpbywgZmFsc2UpOwo+PiAr wqDCoMKgwqDCoMKgwqAgbGlzdF9tb3ZlX3RhaWwoJmZvbGlvLT5scnUsICZscnVnZW4tPmxpc3Rz W2dlbl1bdHlwZV1bem9uZV0pOwo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBXUklURV9PTkNFKGxy dWdlbi0+cHJvdGVjdGVkW2hpc3RdW3R5cGVdW3RpZXIgLSAxXSwKPj4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgbHJ1Z2VuLT5wcm90ZWN0ZWRbaGlzdF1bdHlwZV1bdGllciAtIDFdICsg ZGVsdGEpOwo+PiArwqDCoMKgwqDCoMKgwqAgX19tb2RfbHJ1dmVjX3N0YXRlKGxydXZlYywgV09S S0lOR1NFVF9BQ1RJVkFURV9CQVNFICsgdHlwZSwgCj4+IGRlbHRhKTsKPj4gK8KgwqDCoMKgwqDC oMKgIHJldHVybiB0cnVlOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIC8qIHdhaXRpbmcg Zm9yIHdyaXRlYmFjayAqLwo+PiArwqDCoMKgIGlmIChmb2xpb190ZXN0X2xvY2tlZChmb2xpbykg fHwgZm9saW9fdGVzdF93cml0ZWJhY2soZm9saW8pIHx8Cj4+ICvCoMKgwqDCoMKgwqDCoCAodHlw ZSA9PSBMUlVfR0VOX0ZJTEUgJiYgZm9saW9fdGVzdF9kaXJ0eShmb2xpbykpKSB7Cj4+ICvCoMKg wqDCoMKgwqDCoCBnZW4gPSBmb2xpb19pbmNfZ2VuKGxydXZlYywgZm9saW8sIHRydWUpOwo+PiAr wqDCoMKgwqDCoMKgwqAgbGlzdF9tb3ZlKCZmb2xpby0+bHJ1LCAmbHJ1Z2VuLT5saXN0c1tnZW5d W3R5cGVdW3pvbmVdKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiB0cnVlOwo+PiArwqDCoMKg IH0KPj4gKwo+PiArwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGJv b2wgaXNvbGF0ZV9mb2xpbyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIHN0cnVjdCBmb2xpbyAKPj4g KmZvbGlvLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKPj4gK3sKPj4gK8KgwqDCoCBib29sIHN1 Y2Nlc3M7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXNjLT5tYXlfdW5tYXAgJiYgZm9saW9fbWFwcGVk KGZvbGlvKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gKwo+PiArwqDCoMKg IGlmICghKHNjLT5tYXlfd3JpdGVwYWdlICYmIChzYy0+Z2ZwX21hc2sgJiBfX0dGUF9JTykpICYm Cj4+ICvCoMKgwqDCoMKgwqDCoCAoZm9saW9fdGVzdF9kaXJ0eShmb2xpbykgfHwKPj4gK8KgwqDC oMKgwqDCoMKgwqAgKGZvbGlvX3Rlc3RfYW5vbihmb2xpbykgJiYgIWZvbGlvX3Rlc3Rfc3dhcGNh Y2hlKGZvbGlvKSkpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGZhbHNlOwo+PiArCj4+ICvC oMKgwqAgaWYgKCFmb2xpb190cnlfZ2V0KGZvbGlvKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBmYWxzZTsKPj4gKwo+PiArwqDCoMKgIGlmICghZm9saW9fdGVzdF9jbGVhcl9scnUoZm9saW8p KSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBmb2xpb19wdXQoZm9saW8pOwo+PiArwqDCoMKgwqDCoMKg wqAgcmV0dXJuIGZhbHNlOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHN1Y2Nlc3MgPSBs cnVfZ2VuX2RlbF9mb2xpbyhscnV2ZWMsIGZvbGlvLCB0cnVlKTsKPj4gK8KgwqDCoCBWTV9XQVJO X09OX09OQ0VfRk9MSU8oIXN1Y2Nlc3MsIGZvbGlvKTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiB0 cnVlOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHNjYW5fZm9saW9zKHN0cnVjdCBscnV2ZWMg KmxydXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIGludCB0eXBlLCBpbnQgdGllciwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKPj4g K3sKPj4gK8KgwqDCoCBpbnQgZ2VuLCB6b25lOwo+PiArwqDCoMKgIGVudW0gdm1fZXZlbnRfaXRl bSBpdGVtOwo+PiArwqDCoMKgIGludCBzb3J0ZWQgPSAwOwo+PiArwqDCoMKgIGludCBzY2FubmVk ID0gMDsKPj4gK8KgwqDCoCBpbnQgaXNvbGF0ZWQgPSAwOwo+PiArwqDCoMKgIGludCByZW1haW5p bmcgPSBNQVhfTFJVX0JBVENIOwo+PiArwqDCoMKgIHN0cnVjdCBscnVfZ2VuX3N0cnVjdCAqbHJ1 Z2VuID0gJmxydXZlYy0+bHJ1Z2VuOwo+PiArwqDCoMKgIHN0cnVjdCBtZW1fY2dyb3VwICptZW1j ZyA9IGxydXZlY19tZW1jZyhscnV2ZWMpOwo+PiArCj4+ICvCoMKgwqAgVk1fV0FSTl9PTl9PTkNF KCFsaXN0X2VtcHR5KGxpc3QpKTsKPj4gKwo+PiArwqDCoMKgIGlmIChnZXRfbnJfZ2VucyhscnV2 ZWMsIHR5cGUpID09IE1JTl9OUl9HRU5TKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ ICsKPj4gK8KgwqDCoCBnZW4gPSBscnVfZ2VuX2Zyb21fc2VxKGxydWdlbi0+bWluX3NlcVt0eXBl XSk7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKHpvbmUgPSBzYy0+cmVjbGFpbV9pZHg7IHpvbmUgPj0g MDsgem9uZS0tKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBMSVNUX0hFQUQobW92ZWQpOwo+PiArwqDC oMKgwqDCoMKgwqAgaW50IHNraXBwZWQgPSAwOwo+PiArwqDCoMKgwqDCoMKgwqAgc3RydWN0IGxp c3RfaGVhZCAqaGVhZCA9ICZscnVnZW4tPmxpc3RzW2dlbl1bdHlwZV1bem9uZV07Cj4+ICsKPj4g K8KgwqDCoMKgwqDCoMKgIHdoaWxlICghbGlzdF9lbXB0eShoZWFkKSkgewo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBzdHJ1Y3QgZm9saW8gKmZvbGlvID0gbHJ1X3RvX2ZvbGlvKGhlYWQpOwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQgZGVsdGEgPSBmb2xpb19ucl9wYWdlcyhmb2xp byk7Cj4+ICsKPj4gKyBWTV9XQVJOX09OX09OQ0VfRk9MSU8oZm9saW9fdGVzdF91bmV2aWN0YWJs ZShmb2xpbyksIGZvbGlvKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgVk1fV0FSTl9PTl9P TkNFX0ZPTElPKGZvbGlvX3Rlc3RfYWN0aXZlKGZvbGlvKSwgZm9saW8pOwo+PiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBWTV9XQVJOX09OX09OQ0VfRk9MSU8oZm9saW9faXNfZmlsZV9scnUoZm9s aW8pICE9IHR5cGUsIAo+PiBmb2xpbyk7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFZNX1dB Uk5fT05fT05DRV9GT0xJTyhmb2xpb196b25lbnVtKGZvbGlvKSAhPSB6b25lLCBmb2xpbyk7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc2Nhbm5lZCArPSBkZWx0YTsKPj4gKwo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoc29ydF9mb2xpbyhscnV2ZWMsIGZvbGlvLCB0aWVy KSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzb3J0ZWQgKz0gZGVsdGE7Cj4+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGVsc2UgaWYgKGlzb2xhdGVfZm9saW8obHJ1dmVjLCBm b2xpbywgc2MpKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbGlzdF9hZGQo JmZvbGlvLT5scnUsIGxpc3QpOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlz b2xhdGVkICs9IGRlbHRhOwo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9IGVsc2Ugewo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGxpc3RfbW92ZSgmZm9saW8tPmxydSwgJm1v dmVkKTsKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBza2lwcGVkICs9IGRlbHRh Owo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaWYgKCEtLXJlbWFpbmluZyB8fCBtYXgoaXNvbGF0ZWQsIHNraXBwZWQpID49IAo+PiBN SU5fTFJVX0JBVENIKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoc2tpcHBlZCkg ewo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBsaXN0X3NwbGljZSgmbW92ZWQsIGhlYWQpOwo+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX2NvdW50X3ppZF92bV9ldmVudHMoUEdTQ0FOX1NL SVAsIHpvbmUsIHNraXBwZWQpOwo+PiArwqDCoMKgwqDCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoCBpZiAoIXJlbWFpbmluZyB8fCBpc29sYXRlZCA+PSBNSU5fTFJVX0JBVENIKQo+PiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gK8KgwqDC oCBpdGVtID0gY3VycmVudF9pc19rc3dhcGQoKSA/IFBHU0NBTl9LU1dBUEQgOiBQR1NDQU5fRElS RUNUOwo+PiArwqDCoMKgIGlmICghY2dyb3VwX3JlY2xhaW0oc2MpKSB7Cj4+ICvCoMKgwqDCoMKg wqDCoCBfX2NvdW50X3ZtX2V2ZW50cyhpdGVtLCBpc29sYXRlZCk7Cj4+ICvCoMKgwqDCoMKgwqDC oCBfX2NvdW50X3ZtX2V2ZW50cyhQR1JFRklMTCwgc29ydGVkKTsKPj4gK8KgwqDCoCB9Cj4+ICvC oMKgwqAgX19jb3VudF9tZW1jZ19ldmVudHMobWVtY2csIGl0ZW0sIGlzb2xhdGVkKTsKPj4gK8Kg wqDCoCBfX2NvdW50X21lbWNnX2V2ZW50cyhtZW1jZywgUEdSRUZJTEwsIHNvcnRlZCk7Cj4+ICvC oMKgwqAgX19jb3VudF92bV9ldmVudHMoUEdTQ0FOX0FOT04gKyB0eXBlLCBpc29sYXRlZCk7Cj4+ ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAgKiBUaGVyZSBtaWdodCBub3QgYmUgZWxpZ2li bGUgcGFnZXMgZHVlIHRvIHJlY2xhaW1faWR4LCAKPj4gbWF5X3VubWFwIGFuZAo+PiArwqDCoMKg wqAgKiBtYXlfd3JpdGVwYWdlLiBDaGVjayB0aGUgcmVtYWluaW5nIHRvIHByZXZlbnQgbGl2ZWxv Y2sgaWYgCj4+IHRoZXJlIGlzIG5vCj4+ICvCoMKgwqDCoCAqIHByb2dyZXNzLgo+PiArwqDCoMKg wqAgKi8KPj4gK8KgwqDCoCByZXR1cm4gaXNvbGF0ZWQgfHwgIXJlbWFpbmluZyA/IHNjYW5uZWQg OiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGdldF90aWVyX2lkeChzdHJ1Y3QgbHJ1dmVj ICpscnV2ZWMsIGludCB0eXBlKQo+PiArewo+PiArwqDCoMKgIGludCB0aWVyOwo+PiArwqDCoMKg IHN0cnVjdCBjdHJsX3BvcyBzcCwgcHY7Cj4+ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAg KiBUbyBsZWF2ZSBhIG1hcmdpbiBmb3IgZmx1Y3R1YXRpb25zLCB1c2UgYSBsYXJnZXIgZ2FpbiBm YWN0b3IgCj4+ICgxOjIpLgo+PiArwqDCoMKgwqAgKiBUaGlzIHZhbHVlIGlzIGNob3NlbiBiZWNh dXNlIGFueSBvdGhlciB0aWVyIHdvdWxkIGhhdmUgYXQgCj4+IGxlYXN0IHR3aWNlCj4+ICvCoMKg wqDCoCAqIGFzIG1hbnkgcmVmYXVsdHMgYXMgdGhlIGZpcnN0IHRpZXIuCj4+ICvCoMKgwqDCoCAq Lwo+PiArwqDCoMKgIHJlYWRfY3RybF9wb3MobHJ1dmVjLCB0eXBlLCAwLCAxLCAmc3ApOwo+PiAr wqDCoMKgIGZvciAodGllciA9IDE7IHRpZXIgPCBNQVhfTlJfVElFUlM7IHRpZXIrKykgewo+PiAr wqDCoMKgwqDCoMKgwqAgcmVhZF9jdHJsX3BvcyhscnV2ZWMsIHR5cGUsIHRpZXIsIDIsICZwdik7 Cj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIXBvc2l0aXZlX2N0cmxfZXJyKCZzcCwgJnB2KSkKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKg wqAgcmV0dXJuIHRpZXIgLSAxOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGdldF90eXBlX3Rv X3NjYW4oc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBpbnQgc3dhcHBpbmVzcywgCj4+IGludCAqdGll cl9pZHgpCj4+ICt7Cj4+ICvCoMKgwqAgaW50IHR5cGUsIHRpZXI7Cj4+ICvCoMKgwqAgc3RydWN0 IGN0cmxfcG9zIHNwLCBwdjsKPj4gK8KgwqDCoCBpbnQgZ2FpbltBTk9OX0FORF9GSUxFXSA9IHsg c3dhcHBpbmVzcywgMjAwIC0gc3dhcHBpbmVzcyB9Owo+PiArCj4+ICvCoMKgwqAgLyoKPj4gK8Kg wqDCoMKgICogQ29tcGFyZSB0aGUgZmlyc3QgdGllciBvZiBhbm9uIHdpdGggdGhhdCBvZiBmaWxl IHRvIGRldGVybWluZSAKPj4gd2hpY2gKPj4gK8KgwqDCoMKgICogdHlwZSB0byBzY2FuLiBBbHNv IG5lZWQgdG8gY29tcGFyZSBvdGhlciB0aWVycyBvZiB0aGUgCj4+IHNlbGVjdGVkIHR5cGUKPj4g K8KgwqDCoMKgICogd2l0aCB0aGUgZmlyc3QgdGllciBvZiB0aGUgb3RoZXIgdHlwZSB0byBkZXRl cm1pbmUgdGhlIGxhc3QgCj4+IHRpZXIgKG9mCj4+ICvCoMKgwqDCoCAqIHRoZSBzZWxlY3RlZCB0 eXBlKSB0byBldmljdC4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgcmVhZF9jdHJsX3Bvcyhs cnV2ZWMsIExSVV9HRU5fQU5PTiwgMCwgZ2FpbltMUlVfR0VOX0FOT05dLCAmc3ApOwo+PiArwqDC oMKgIHJlYWRfY3RybF9wb3MobHJ1dmVjLCBMUlVfR0VOX0ZJTEUsIDAsIGdhaW5bTFJVX0dFTl9G SUxFXSwgJnB2KTsKPj4gK8KgwqDCoCB0eXBlID0gcG9zaXRpdmVfY3RybF9lcnIoJnNwLCAmcHYp Owo+PiArCj4+ICvCoMKgwqAgcmVhZF9jdHJsX3BvcyhscnV2ZWMsICF0eXBlLCAwLCBnYWluWyF0 eXBlXSwgJnNwKTsKPj4gK8KgwqDCoCBmb3IgKHRpZXIgPSAxOyB0aWVyIDwgTUFYX05SX1RJRVJT OyB0aWVyKyspIHsKPj4gK8KgwqDCoMKgwqDCoMKgIHJlYWRfY3RybF9wb3MobHJ1dmVjLCB0eXBl LCB0aWVyLCBnYWluW3R5cGVdLCAmcHYpOwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKCFwb3NpdGl2 ZV9jdHJsX2Vycigmc3AsICZwdikpCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+ PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgICp0aWVyX2lkeCA9IHRpZXIgLSAxOwo+PiArCj4+ ICvCoMKgwqAgcmV0dXJuIHR5cGU7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgaXNvbGF0ZV9m b2xpb3Moc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sIAo+PiAqc2Ms IGludCBzd2FwcGluZXNzLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW50ICp0eXBl X3NjYW5uZWQsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCj4+ICt7Cj4+ICvCoMKgwqAgaW50IGk7 Cj4+ICvCoMKgwqAgaW50IHR5cGU7Cj4+ICvCoMKgwqAgaW50IHNjYW5uZWQ7Cj4+ICvCoMKgwqAg aW50IHRpZXIgPSAtMTsKPj4gK8KgwqDCoCBERUZJTkVfTUlOX1NFUShscnV2ZWMpOwo+PiArCj4+ ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogVHJ5IHRvIG1ha2UgdGhlIG9idmlvdXMgY2hvaWNl IGZpcnN0LiBXaGVuIGFub24gYW5kIGZpbGUgYXJlIAo+PiBib3RoCj4+ICvCoMKgwqDCoCAqIGF2 YWlsYWJsZSBmcm9tIHRoZSBzYW1lIGdlbmVyYXRpb24sIGludGVycHJldCBzd2FwcGluZXNzIDEg YXMgCj4+IGZpbGUKPj4gK8KgwqDCoMKgICogZmlyc3QgYW5kIDIwMCBhcyBhbm9uIGZpcnN0Lgo+ PiArwqDCoMKgwqAgKi8KPj4gK8KgwqDCoCBpZiAoIXN3YXBwaW5lc3MpCj4+ICvCoMKgwqDCoMKg wqDCoCB0eXBlID0gTFJVX0dFTl9GSUxFOwo+PiArwqDCoMKgIGVsc2UgaWYgKG1pbl9zZXFbTFJV X0dFTl9BTk9OXSA8IG1pbl9zZXFbTFJVX0dFTl9GSUxFXSkKPj4gK8KgwqDCoMKgwqDCoMKgIHR5 cGUgPSBMUlVfR0VOX0FOT047Cj4+ICvCoMKgwqAgZWxzZSBpZiAoc3dhcHBpbmVzcyA9PSAxKQo+ PiArwqDCoMKgwqDCoMKgwqAgdHlwZSA9IExSVV9HRU5fRklMRTsKPj4gK8KgwqDCoCBlbHNlIGlm IChzd2FwcGluZXNzID09IDIwMCkKPj4gK8KgwqDCoMKgwqDCoMKgIHR5cGUgPSBMUlVfR0VOX0FO T047Cj4+ICvCoMKgwqAgZWxzZQo+PiArwqDCoMKgwqDCoMKgwqAgdHlwZSA9IGdldF90eXBlX3Rv X3NjYW4obHJ1dmVjLCBzd2FwcGluZXNzLCAmdGllcik7Cj4+ICsKPj4gK8KgwqDCoCBmb3IgKGkg PSAhc3dhcHBpbmVzczsgaSA8IEFOT05fQU5EX0ZJTEU7IGkrKykgewo+PiArwqDCoMKgwqDCoMKg wqAgaWYgKHRpZXIgPCAwKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0aWVyID0gZ2V0X3Rp ZXJfaWR4KGxydXZlYywgdHlwZSk7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIHNjYW5uZWQgPSBz Y2FuX2ZvbGlvcyhscnV2ZWMsIHNjLCB0eXBlLCB0aWVyLCBsaXN0KTsKPj4gK8KgwqDCoMKgwqDC oMKgIGlmIChzY2FubmVkKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPj4gKwo+ PiArwqDCoMKgwqDCoMKgwqAgdHlwZSA9ICF0eXBlOwo+PiArwqDCoMKgwqDCoMKgwqAgdGllciA9 IC0xOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgICp0eXBlX3NjYW5uZWQgPSB0eXBlOwo+ PiArCj4+ICvCoMKgwqAgcmV0dXJuIHNjYW5uZWQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQg ZXZpY3RfZm9saW9zKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAK Pj4gKnNjLCBpbnQgc3dhcHBpbmVzcykKPj4gK3sKPj4gK8KgwqDCoCBpbnQgdHlwZTsKPj4gK8Kg wqDCoCBpbnQgc2Nhbm5lZDsKPj4gK8KgwqDCoCBpbnQgcmVjbGFpbWVkOwo+PiArwqDCoMKgIExJ U1RfSEVBRChsaXN0KTsKPj4gK8KgwqDCoCBzdHJ1Y3QgZm9saW8gKmZvbGlvOwo+PiArwqDCoMKg IGVudW0gdm1fZXZlbnRfaXRlbSBpdGVtOwo+PiArwqDCoMKgIHN0cnVjdCByZWNsYWltX3N0YXQg c3RhdDsKPj4gK8KgwqDCoCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBscnV2ZWNfbWVtY2co bHJ1dmVjKTsKPj4gK8KgwqDCoCBzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gbHJ1dmVjX3Bn ZGF0KGxydXZlYyk7Cj4+ICsKPj4gK8KgwqDCoCBzcGluX2xvY2tfaXJxKCZscnV2ZWMtPmxydV9s b2NrKTsKPj4gKwo+PiArwqDCoMKgIHNjYW5uZWQgPSBpc29sYXRlX2ZvbGlvcyhscnV2ZWMsIHNj LCBzd2FwcGluZXNzLCAmdHlwZSwgJmxpc3QpOwo+PiArCj4+ICvCoMKgwqAgaWYgKHRyeV90b19p bmNfbWluX3NlcShscnV2ZWMsIHN3YXBwaW5lc3MpKQo+PiArwqDCoMKgwqDCoMKgwqAgc2Nhbm5l ZCsrOwo+PiArCj4+ICvCoMKgwqAgaWYgKGdldF9ucl9nZW5zKGxydXZlYywgIXN3YXBwaW5lc3Mp ID09IE1JTl9OUl9HRU5TKQo+PiArwqDCoMKgwqDCoMKgwqAgc2Nhbm5lZCA9IDA7Cj4+ICsKPj4g K8KgwqDCoCBzcGluX3VubG9ja19pcnEoJmxydXZlYy0+bHJ1X2xvY2spOwo+PiArCj4+ICvCoMKg wqAgaWYgKGxpc3RfZW1wdHkoJmxpc3QpKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHNjYW5u ZWQ7Cj4+ICsKPj4gK8KgwqDCoCByZWNsYWltZWQgPSBzaHJpbmtfcGFnZV9saXN0KCZsaXN0LCBw Z2RhdCwgc2MsICZzdGF0LCBmYWxzZSk7Cj4+ICsKPj4gK8KgwqDCoCAvKgo+PiArwqDCoMKgwqAg KiBUbyBhdm9pZCBsaXZlbG9jaywgZG9uJ3QgYWRkIHJlamVjdGVkIHBhZ2VzIGJhY2sgdG8gdGhl IHNhbWUgCj4+IGxpc3RzCj4+ICvCoMKgwqDCoCAqIHRoZXkgd2VyZSBpc29sYXRlZCBmcm9tLiBT ZWUgbHJ1X2dlbl9hZGRfZm9saW8oKS4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgbGlzdF9m b3JfZWFjaF9lbnRyeShmb2xpbywgJmxpc3QsIGxydSkgewo+PiArwqDCoMKgwqDCoMKgwqAgZm9s aW9fY2xlYXJfcmVmZXJlbmNlZChmb2xpbyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBmb2xpb19jbGVh cl93b3JraW5nc2V0KGZvbGlvKTsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgaWYgKGZvbGlvX3Rl c3RfcmVjbGFpbShmb2xpbykgJiYKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGZvbGlvX3Rl c3RfZGlydHkoZm9saW8pIHx8IGZvbGlvX3Rlc3Rfd3JpdGViYWNrKGZvbGlvKSkpCj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGZvbGlvX2NsZWFyX2FjdGl2ZShmb2xpbyk7Cj4+ICvCoMKgwqDC oMKgwqDCoCBlbHNlCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGZvbGlvX3NldF9hY3RpdmUo Zm9saW8pOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHNwaW5fbG9ja19pcnEoJmxydXZl Yy0+bHJ1X2xvY2spOwo+PiArCj4+ICvCoMKgwqAgbW92ZV9wYWdlc190b19scnUobHJ1dmVjLCAm bGlzdCk7Cj4+ICsKPj4gK8KgwqDCoCBpdGVtID0gY3VycmVudF9pc19rc3dhcGQoKSA/IFBHU1RF QUxfS1NXQVBEIDogUEdTVEVBTF9ESVJFQ1Q7Cj4+ICvCoMKgwqAgaWYgKCFjZ3JvdXBfcmVjbGFp bShzYykpCj4+ICvCoMKgwqDCoMKgwqDCoCBfX2NvdW50X3ZtX2V2ZW50cyhpdGVtLCByZWNsYWlt ZWQpOwo+PiArwqDCoMKgIF9fY291bnRfbWVtY2dfZXZlbnRzKG1lbWNnLCBpdGVtLCByZWNsYWlt ZWQpOwo+PiArwqDCoMKgIF9fY291bnRfdm1fZXZlbnRzKFBHU1RFQUxfQU5PTiArIHR5cGUsIHJl Y2xhaW1lZCk7Cj4+ICsKPj4gK8KgwqDCoCBzcGluX3VubG9ja19pcnEoJmxydXZlYy0+bHJ1X2xv Y2spOwo+PiArCj4+ICvCoMKgwqAgbWVtX2Nncm91cF91bmNoYXJnZV9saXN0KCZsaXN0KTsKPj4g K8KgwqDCoCBmcmVlX3VucmVmX3BhZ2VfbGlzdCgmbGlzdCk7Cj4+ICsKPj4gK8KgwqDCoCBzYy0+ bnJfcmVjbGFpbWVkICs9IHJlY2xhaW1lZDsKPj4gKwo+PiArwqDCoMKgIHJldHVybiBzY2FubmVk Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgbG9uZyBnZXRfbnJfdG9fc2NhbihzdHJ1Y3QgbHJ1dmVj ICpscnV2ZWMsIHN0cnVjdCAKPj4gc2Nhbl9jb250cm9sICpzYywgYm9vbCBjYW5fc3dhcCkKPj4g K3sKPj4gK8KgwqDCoCBib29sIG5lZWRfYWdpbmc7Cj4+ICvCoMKgwqAgbG9uZyBucl90b19zY2Fu Owo+PiArwqDCoMKgIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IGxydXZlY19tZW1jZyhscnV2 ZWMpOwo+PiArwqDCoMKgIERFRklORV9NQVhfU0VRKGxydXZlYyk7Cj4+ICvCoMKgwqAgREVGSU5F X01JTl9TRVEobHJ1dmVjKTsKPj4gKwo+PiArwqDCoMKgIGlmIChtZW1fY2dyb3VwX2JlbG93X21p bihtZW1jZykgfHwKPj4gK8KgwqDCoMKgwqDCoMKgIChtZW1fY2dyb3VwX2JlbG93X2xvdyhtZW1j ZykgJiYgIXNjLT5tZW1jZ19sb3dfcmVjbGFpbSkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4g MDsKPj4gKwo+PiArwqDCoMKgIG5yX3RvX3NjYW4gPSBnZXRfbnJfZXZpY3RhYmxlKGxydXZlYywg bWF4X3NlcSwgbWluX3NlcSwgCj4+IGNhbl9zd2FwLCAmbmVlZF9hZ2luZyk7Cj4+ICvCoMKgwqAg aWYgKCFucl90b19zY2FuKQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICsKPj4gK8Kg wqDCoCAvKiByZXNldCB0aGUgcHJpb3JpdHkgaWYgdGhlIHRhcmdldCBoYXMgYmVlbiBtZXQgKi8K Pj4gK8KgwqDCoCBucl90b19zY2FuID4+PSBzYy0+bnJfcmVjbGFpbWVkIDwgc2MtPm5yX3RvX3Jl Y2xhaW0gPyAKPj4gc2MtPnByaW9yaXR5IDogREVGX1BSSU9SSVRZOwo+PiArCj4+ICvCoMKgwqAg aWYgKCFtZW1fY2dyb3VwX29ubGluZShtZW1jZykpCj4+ICvCoMKgwqDCoMKgwqDCoCBucl90b19z Y2FuKys7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIW5yX3RvX3NjYW4pCj4+ICvCoMKgwqDCoMKgwqDC oCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIGlmICghbmVlZF9hZ2luZykKPj4gK8KgwqDCoMKg wqDCoMKgIHJldHVybiBucl90b19zY2FuOwo+PiArCj4+ICvCoMKgwqAgLyogbGVhdmUgdGhlIHdv cmsgdG8gbHJ1X2dlbl9hZ2Vfbm9kZSgpICovCj4+ICvCoMKgwqAgaWYgKGN1cnJlbnRfaXNfa3N3 YXBkKCkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIC8qIHRy eSBvdGhlciBtZW1jZ3MgYmVmb3JlIGdvaW5nIHRvIHRoZSBhZ2luZyBwYXRoICovCj4+ICvCoMKg wqAgaWYgKCFjZ3JvdXBfcmVjbGFpbShzYykgJiYgIXNjLT5mb3JjZV9kZWFjdGl2YXRlKSB7Cj4+ ICvCoMKgwqDCoMKgwqDCoCBzYy0+c2tpcHBlZF9kZWFjdGl2YXRlID0gdHJ1ZTsKPj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybiAwOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIGluY19tYXhf c2VxKGxydXZlYywgbWF4X3NlcSwgY2FuX3N3YXApOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIG5y X3RvX3NjYW47Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGxydV9nZW5fc2hyaW5rX2xydXZl YyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIHN0cnVjdCAKPj4gc2Nhbl9jb250cm9sICpzYykKPj4g K3sKPj4gK8KgwqDCoCBzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKPj4gK8KgwqDCoCBsb25nIHNjYW5u ZWQgPSAwOwo+PiArCj4+ICvCoMKgwqAgbHJ1X2FkZF9kcmFpbigpOwo+PiArCj4+ICvCoMKgwqAg YmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwo+PiArCj4+ICvCoMKgwqAgd2hpbGUgKHRydWUpIHsKPj4g K8KgwqDCoMKgwqDCoMKgIGludCBkZWx0YTsKPj4gK8KgwqDCoMKgwqDCoMKgIGludCBzd2FwcGlu ZXNzOwo+PiArwqDCoMKgwqDCoMKgwqAgbG9uZyBucl90b19zY2FuOwo+PiArCj4+ICvCoMKgwqDC oMKgwqDCoCBpZiAoc2MtPm1heV9zd2FwKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzd2Fw cGluZXNzID0gZ2V0X3N3YXBwaW5lc3MobHJ1dmVjLCBzYyk7Cj4+ICvCoMKgwqDCoMKgwqDCoCBl bHNlIGlmICghY2dyb3VwX3JlY2xhaW0oc2MpICYmIGdldF9zd2FwcGluZXNzKGxydXZlYywgc2Mp KQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzd2FwcGluZXNzID0gMTsKPj4gK8KgwqDCoMKg wqDCoMKgIGVsc2UKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3dhcHBpbmVzcyA9IDA7Cj4+ ICsKPj4gK8KgwqDCoMKgwqDCoMKgIG5yX3RvX3NjYW4gPSBnZXRfbnJfdG9fc2NhbihscnV2ZWMs IHNjLCBzd2FwcGluZXNzKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGlmICghbnJfdG9fc2NhbikKPj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICsKPj4gK8KgwqDCoMKgwqDCoMKgIGRl bHRhID0gZXZpY3RfZm9saW9zKGxydXZlYywgc2MsIHN3YXBwaW5lc3MpOwo+PiArwqDCoMKgwqDC oMKgwqAgaWYgKCFkZWx0YSkKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYnJlYWs7Cj4+ICsK Pj4gK8KgwqDCoMKgwqDCoMKgIHNjYW5uZWQgKz0gZGVsdGE7Cj4+ICvCoMKgwqDCoMKgwqDCoCBp ZiAoc2Nhbm5lZCA+PSBucl90b19zY2FuKQo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVh azsKPj4gKwo+PiArwqDCoMKgwqDCoMKgwqAgY29uZF9yZXNjaGVkKCk7Cj4+ICvCoMKgwqAgfQo+ PiArCj4+ICvCoMKgwqAgYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKPj4gK30KPj4gKwo+PiAvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCj4+IMKgwqAgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIGluaXRpYWxpemF0aW9uCj4+ICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKi8KPj4gQEAgLTMwNDEsNiArMzgwNCwxNiBAQCBzdGF0aWMgaW50IF9faW5pdCBpbml0X2xy dV9nZW4odm9pZCkKPj4gwqAgfTsKPj4gwqAgbGF0ZV9pbml0Y2FsbChpbml0X2xydV9nZW4pOwo+ PiDCoCArI2Vsc2UKPj4gKwo+PiArc3RhdGljIHZvaWQgbHJ1X2dlbl9hZ2Vfbm9kZShzdHJ1Y3Qg cGdsaXN0X2RhdGEgKnBnZGF0LCBzdHJ1Y3QgCj4+IHNjYW5fY29udHJvbCAqc2MpCj4+ICt7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGxydV9nZW5fc2hyaW5rX2xydXZlYyhzdHJ1Y3QgbHJ1 dmVjICpscnV2ZWMsIHN0cnVjdCAKPj4gc2Nhbl9jb250cm9sICpzYykKPj4gK3sKPj4gK30KPj4g Kwo+PiDCoCAjZW5kaWYgLyogQ09ORklHX0xSVV9HRU4gKi8KPj4gwqAgwqAgc3RhdGljIHZvaWQg c2hyaW5rX2xydXZlYyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIHN0cnVjdCAKPj4gc2Nhbl9jb250 cm9sICpzYykKPj4gQEAgLTMwNTQsNiArMzgyNywxMSBAQCBzdGF0aWMgdm9pZCBzaHJpbmtfbHJ1 dmVjKHN0cnVjdCBscnV2ZWMgCj4+ICpscnV2ZWMsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQo+ PiDCoMKgwqDCoMKgIHN0cnVjdCBibGtfcGx1ZyBwbHVnOwo+PiDCoMKgwqDCoMKgIGJvb2wgc2Nh bl9hZGp1c3RlZDsKPj4gwqAgK8KgwqDCoCBpZiAobHJ1X2dlbl9lbmFibGVkKCkpIHsKPj4gK8Kg wqDCoMKgwqDCoMKgIGxydV9nZW5fc2hyaW5rX2xydXZlYyhscnV2ZWMsIHNjKTsKPj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybjsKPj4gK8KgwqDCoCB9Cj4+ICsKPj4gwqDCoMKgwqDCoCBnZXRfc2Nh bl9jb3VudChscnV2ZWMsIHNjLCBucik7Cj4+IMKgIMKgwqDCoMKgwqAgLyogUmVjb3JkIHRoZSBv cmlnaW5hbCBzY2FuIHRhcmdldCBmb3IgcHJvcG9ydGlvbmFsIAo+PiBhZGp1c3RtZW50cyBsYXRl ciAqLwo+PiBAQCAtMzU1OCw2ICs0MzM2LDkgQEAgc3RhdGljIHZvaWQgc25hcHNob3RfcmVmYXVs dHMoc3RydWN0IG1lbV9jZ3JvdXAgCj4+ICp0YXJnZXRfbWVtY2csIHBnX2RhdGFfdCAqcGdkYXQp Cj4+IMKgwqDCoMKgwqAgc3RydWN0IGxydXZlYyAqdGFyZ2V0X2xydXZlYzsKPj4gwqDCoMKgwqDC oCB1bnNpZ25lZCBsb25nIHJlZmF1bHRzOwo+PiDCoCArwqDCoMKgIGlmIChscnVfZ2VuX2VuYWJs ZWQoKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gKwo+PiDCoMKgwqDCoMKgIHRhcmdl dF9scnV2ZWMgPSBtZW1fY2dyb3VwX2xydXZlYyh0YXJnZXRfbWVtY2csIHBnZGF0KTsKPj4gwqDC oMKgwqDCoCByZWZhdWx0cyA9IGxydXZlY19wYWdlX3N0YXRlKHRhcmdldF9scnV2ZWMsIAo+PiBX T1JLSU5HU0VUX0FDVElWQVRFX0FOT04pOwo+PiDCoMKgwqDCoMKgIHRhcmdldF9scnV2ZWMtPnJl ZmF1bHRzWzBdID0gcmVmYXVsdHM7Cj4+IEBAIC0zOTIyLDEyICs0NzAzLDE3IEBAIHVuc2lnbmVk IGxvbmcgCj4+IHRyeV90b19mcmVlX21lbV9jZ3JvdXBfcGFnZXMoc3RydWN0IG1lbV9jZ3JvdXAg Km1lbWNnLAo+PiDCoCB9Cj4+IMKgICNlbmRpZgo+PiDCoCAtc3RhdGljIHZvaWQgYWdlX2FjdGl2 ZV9hbm9uKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCj4+ICtzdGF0aWMgdm9pZCBrc3dhcGRf YWdlX25vZGUoc3RydWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwKPj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKPj4gwqAgewo+PiDCoMKg wqDCoMKgIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgbHJ1 dmVjICpscnV2ZWM7Cj4+IMKgICvCoMKgwqAgaWYgKGxydV9nZW5fZW5hYmxlZCgpKSB7Cj4+ICvC oMKgwqDCoMKgwqDCoCBscnVfZ2VuX2FnZV9ub2RlKHBnZGF0LCBzYyk7Cj4+ICvCoMKgwqDCoMKg wqDCoCByZXR1cm47Cj4+ICvCoMKgwqAgfQo+PiArCj4+IMKgwqDCoMKgwqAgaWYgKCFjYW5fYWdl X2Fub25fcGFnZXMocGdkYXQsIHNjKSkKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4g wqAgQEAgLTQyNDcsMTIgKzUwMzMsMTEgQEAgc3RhdGljIGludCBiYWxhbmNlX3BnZGF0KHBnX2Rh dGFfdCAqcGdkYXQsIAo+PiBpbnQgb3JkZXIsIGludCBoaWdoZXN0X3pvbmVpZHgpCj4+IMKgwqDC oMKgwqDCoMKgwqDCoCBzYy5tYXlfc3dhcCA9ICFucl9ib29zdF9yZWNsYWltOwo+PiDCoCDCoMKg wqDCoMKgwqDCoMKgwqAgLyoKPj4gLcKgwqDCoMKgwqDCoMKgwqAgKiBEbyBzb21lIGJhY2tncm91 bmQgYWdpbmcgb2YgdGhlIGFub24gbGlzdCwgdG8gZ2l2ZQo+PiAtwqDCoMKgwqDCoMKgwqDCoCAq IHBhZ2VzIGEgY2hhbmNlIHRvIGJlIHJlZmVyZW5jZWQgYmVmb3JlIHJlY2xhaW1pbmcuIEFsbAo+ PiAtwqDCoMKgwqDCoMKgwqDCoCAqIHBhZ2VzIGFyZSByb3RhdGVkIHJlZ2FyZGxlc3Mgb2YgY2xh c3N6b25lIGFzIHRoaXMgaXMKPj4gLcKgwqDCoMKgwqDCoMKgwqAgKiBhYm91dCBjb25zaXN0ZW50 IGFnaW5nLgo+PiArwqDCoMKgwqDCoMKgwqDCoCAqIERvIHNvbWUgYmFja2dyb3VuZCBhZ2luZywg dG8gZ2l2ZSBwYWdlcyBhIGNoYW5jZSB0byBiZQo+PiArwqDCoMKgwqDCoMKgwqDCoCAqIHJlZmVy ZW5jZWQgYmVmb3JlIHJlY2xhaW1pbmcuIEFsbCBwYWdlcyBhcmUgcm90YXRlZAo+PiArwqDCoMKg wqDCoMKgwqDCoCAqIHJlZ2FyZGxlc3Mgb2YgY2xhc3N6b25lIGFzIHRoaXMgaXMgYWJvdXQgY29u c2lzdGVudCBhZ2luZy4KPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8KPj4gLcKgwqDCoMKgwqDC oMKgIGFnZV9hY3RpdmVfYW5vbihwZ2RhdCwgJnNjKTsKPj4gK8KgwqDCoMKgwqDCoMKgIGtzd2Fw ZF9hZ2Vfbm9kZShwZ2RhdCwgJnNjKTsKPj4gwqAgwqDCoMKgwqDCoMKgwqDCoMKgIC8qCj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgICogSWYgd2UncmUgZ2V0dGluZyB0cm91YmxlIHJlY2xhaW1pbmcs IHN0YXJ0IGRvaW5nIHdyaXRlcGFnZQo+PiBkaWZmIC0tZ2l0IGEvbW0vd29ya2luZ3NldC5jIGIv bW0vd29ya2luZ3NldC5jCj4+IGluZGV4IDU5MjU2OWE4OTc0Yy4uZGI2ZjBjOGE5OGMyIDEwMDY0 NAo+PiAtLS0gYS9tbS93b3JraW5nc2V0LmMKPj4gKysrIGIvbW0vd29ya2luZ3NldC5jCj4+IEBA IC0xODcsNyArMTg3LDYgQEAgc3RhdGljIHVuc2lnbmVkIGludCBidWNrZXRfb3JkZXIgX19yZWFk X21vc3RseTsKPj4gwqAgc3RhdGljIHZvaWQgKnBhY2tfc2hhZG93KGludCBtZW1jZ2lkLCBwZ19k YXRhX3QgKnBnZGF0LCB1bnNpZ25lZCAKPj4gbG9uZyBldmljdGlvbiwKPj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBib29sIHdvcmtpbmdzZXQpCj4+IMKgIHsKPj4gLcKgwqDCoCBldmlj dGlvbiA+Pj0gYnVja2V0X29yZGVyOwo+PiDCoMKgwqDCoMKgIGV2aWN0aW9uICY9IEVWSUNUSU9O X01BU0s7Cj4+IMKgwqDCoMKgwqAgZXZpY3Rpb24gPSAoZXZpY3Rpb24gPDwgTUVNX0NHUk9VUF9J RF9TSElGVCkgfCBtZW1jZ2lkOwo+PiDCoMKgwqDCoMKgIGV2aWN0aW9uID0gKGV2aWN0aW9uIDw8 IE5PREVTX1NISUZUKSB8IHBnZGF0LT5ub2RlX2lkOwo+PiBAQCAtMjEyLDEwICsyMTEsMTA3IEBA IHN0YXRpYyB2b2lkIHVucGFja19zaGFkb3codm9pZCAqc2hhZG93LCBpbnQgCj4+ICptZW1jZ2lk cCwgcGdfZGF0YV90ICoqcGdkYXQsCj4+IMKgIMKgwqDCoMKgwqAgKm1lbWNnaWRwID0gbWVtY2dp ZDsKPj4gwqDCoMKgwqDCoCAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKPj4gLcKgwqDCoCAqZXZp Y3Rpb25wID0gZW50cnkgPDwgYnVja2V0X29yZGVyOwo+PiArwqDCoMKgICpldmljdGlvbnAgPSBl bnRyeTsKPj4gwqDCoMKgwqDCoCAqd29ya2luZ3NldHAgPSB3b3JraW5nc2V0Owo+PiDCoCB9Cj4+ IMKgICsjaWZkZWYgQ09ORklHX0xSVV9HRU4KPj4gKwo+PiArc3RhdGljIHZvaWQgKmxydV9nZW5f ZXZpY3Rpb24oc3RydWN0IGZvbGlvICpmb2xpbykKPj4gK3sKPj4gK8KgwqDCoCBpbnQgaGlzdDsK Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHRva2VuOwo+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcg bWluX3NlcTsKPj4gK8KgwqDCoCBzdHJ1Y3QgbHJ1dmVjICpscnV2ZWM7Cj4+ICvCoMKgwqAgc3Ry dWN0IGxydV9nZW5fc3RydWN0ICpscnVnZW47Cj4+ICvCoMKgwqAgaW50IHR5cGUgPSBmb2xpb19p c19maWxlX2xydShmb2xpbyk7Cj4+ICvCoMKgwqAgaW50IGRlbHRhID0gZm9saW9fbnJfcGFnZXMo Zm9saW8pOwo+PiArwqDCoMKgIGludCByZWZzID0gZm9saW9fbHJ1X3JlZnMoZm9saW8pOwo+PiAr wqDCoMKgIGludCB0aWVyID0gbHJ1X3RpZXJfZnJvbV9yZWZzKHJlZnMpOwo+PiArwqDCoMKgIHN0 cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IGZvbGlvX21lbWNnKGZvbGlvKTsKPj4gK8KgwqDCoCBz dHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0ID0gZm9saW9fcGdkYXQoZm9saW8pOwo+PiArCj4+ICvC oMKgwqAgQlVJTERfQlVHX09OKExSVV9HRU5fV0lEVEggKyBMUlVfUkVGU19XSURUSCA+IEJJVFNf UEVSX0xPTkcgLSAKPj4gRVZJQ1RJT05fU0hJRlQpOwo+PiArCj4+ICvCoMKgwqAgbHJ1dmVjID0g bWVtX2Nncm91cF9scnV2ZWMobWVtY2csIHBnZGF0KTsKPj4gK8KgwqDCoCBscnVnZW4gPSAmbHJ1 dmVjLT5scnVnZW47Cj4+ICvCoMKgwqAgbWluX3NlcSA9IFJFQURfT05DRShscnVnZW4tPm1pbl9z ZXFbdHlwZV0pOwo+PiArwqDCoMKgIHRva2VuID0gKG1pbl9zZXEgPDwgTFJVX1JFRlNfV0lEVEgp IHwgbWF4KHJlZnMgLSAxLCAwKTsKPj4gKwo+PiArwqDCoMKgIGhpc3QgPSBscnVfaGlzdF9mcm9t X3NlcShtaW5fc2VxKTsKPj4gK8KgwqDCoCBhdG9taWNfbG9uZ19hZGQoZGVsdGEsICZscnVnZW4t PmV2aWN0ZWRbaGlzdF1bdHlwZV1bdGllcl0pOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuIHBhY2tf c2hhZG93KG1lbV9jZ3JvdXBfaWQobWVtY2cpLCBwZ2RhdCwgdG9rZW4sIHJlZnMpOwo+Cj4gcGFj a19zaGFkb3cgcGFzcyByZWZzIHJhdGhlciB0aGFuIFBhZ2VXb3JraW5nc2V0KHBhZ2UpLCBpcyBp dCBkb25lIG9uIAo+IHB1cnBvc2U/Cj4KPiBJbiBteSBvcGluaW9uLMKgIFBhZ2VXb3JraW5nc2V0 IGNhbiBiZSByZW1vdmVkIGR1ZSB0byBmYWlsZWQgdG8gcmVjbGFpbQpsb29rIGF0IHRoaXMgYWdh aW4swqAgSXQncyBteSBmYXVsdCAsIHRoZSB3b3JraW5nc2V0IGRvIG5vdCBtZWFuIHRoZSAKb3Jp Z25hbMKgIHBhZ2Ugc3RhdHVzLsKgIFRoYW5rcywKPgo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCBscnVfZ2VuX3JlZmF1bHQoc3RydWN0IGZvbGlvICpmb2xpbywgdm9pZCAqc2hhZG93KQo+PiAr ewo+PiArwqDCoMKgIGludCBoaXN0LCB0aWVyLCByZWZzOwo+PiArwqDCoMKgIGludCBtZW1jZ19p ZDsKPj4gK8KgwqDCoCBib29sIHdvcmtpbmdzZXQ7Cj4+ICvCoMKgwqAgdW5zaWduZWQgbG9uZyB0 b2tlbjsKPj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIG1pbl9zZXE7Cj4+ICvCoMKgwqAgc3RydWN0 IGxydXZlYyAqbHJ1dmVjOwo+PiArwqDCoMKgIHN0cnVjdCBscnVfZ2VuX3N0cnVjdCAqbHJ1Z2Vu Owo+PiArwqDCoMKgIHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKPj4gK8KgwqDCoCBzdHJ1Y3Qg cGdsaXN0X2RhdGEgKnBnZGF0Owo+PiArwqDCoMKgIGludCB0eXBlID0gZm9saW9faXNfZmlsZV9s cnUoZm9saW8pOwo+PiArwqDCoMKgIGludCBkZWx0YSA9IGZvbGlvX25yX3BhZ2VzKGZvbGlvKTsK Pj4gKwo+PiArwqDCoMKgIHVucGFja19zaGFkb3coc2hhZG93LCAmbWVtY2dfaWQsICZwZ2RhdCwg JnRva2VuLCAmd29ya2luZ3NldCk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoZm9saW9fcGdkYXQoZm9s aW8pICE9IHBnZGF0KQo+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+PiArCj4+ICvCoMKgwqAg Lyogc2VlIHRoZSBjb21tZW50IGluIGZvbGlvX2xydV9yZWZzKCkgKi8KPj4gK8KgwqDCoCByZWZz ID0gKHRva2VuICYgKEJJVChMUlVfUkVGU19XSURUSCkgLSAxKSkgKyB3b3JraW5nc2V0Owo+PiAr wqDCoMKgIHRpZXIgPSBscnVfdGllcl9mcm9tX3JlZnMocmVmcyk7Cj4+ICsKPj4gK8KgwqDCoCBy Y3VfcmVhZF9sb2NrKCk7Cj4+ICvCoMKgwqAgbWVtY2cgPSBmb2xpb19tZW1jZ19yY3UoZm9saW8p Owo+PiArwqDCoMKgIGlmIChtZW1fY2dyb3VwX2lkKG1lbWNnKSAhPSBtZW1jZ19pZCkKPj4gK8Kg wqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrOwo+PiArCj4+ICvCoMKgwqAgbHJ1dmVjID0gbWVtX2Nn cm91cF9scnV2ZWMobWVtY2csIHBnZGF0KTsKPj4gK8KgwqDCoCBscnVnZW4gPSAmbHJ1dmVjLT5s cnVnZW47Cj4+ICvCoMKgwqAgbWluX3NlcSA9IFJFQURfT05DRShscnVnZW4tPm1pbl9zZXFbdHlw ZV0pOwo+PiArCj4+ICvCoMKgwqAgdG9rZW4gPj49IExSVV9SRUZTX1dJRFRIOwo+PiArwqDCoMKg IGlmICh0b2tlbiAhPSAobWluX3NlcSAmIChFVklDVElPTl9NQVNLID4+IExSVV9SRUZTX1dJRFRI KSkpCj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIHVubG9jazsKPj4gKwo+PiArwqDCoMKgIGhpc3Qg PSBscnVfaGlzdF9mcm9tX3NlcShtaW5fc2VxKTsKPj4gK8KgwqDCoCBhdG9taWNfbG9uZ19hZGQo ZGVsdGEsICZscnVnZW4tPnJlZmF1bHRlZFtoaXN0XVt0eXBlXVt0aWVyXSk7Cj4+ICvCoMKgwqAg bW9kX2xydXZlY19zdGF0ZShscnV2ZWMsIFdPUktJTkdTRVRfUkVGQVVMVF9CQVNFICsgdHlwZSwg ZGVsdGEpOwo+PiArCj4+ICvCoMKgwqAgLyoKPj4gK8KgwqDCoMKgICogQ291bnQgdGhlIGZvbGxv d2luZyB0d28gY2FzZXMgYXMgc3RhbGxzOgo+PiArwqDCoMKgwqAgKiAxLiBGb3IgcGFnZXMgYWNj ZXNzZWQgdGhyb3VnaCBwYWdlIHRhYmxlcywgaG90dGVyIHBhZ2VzIAo+PiBwdXNoZWQgb3V0Cj4+ ICvCoMKgwqDCoCAqwqDCoMKgIGhvdCBwYWdlcyB3aGljaCByZWZhdWx0ZWQgaW1tZWRpYXRlbHku Cj4+ICvCoMKgwqDCoCAqIDIuIEZvciBwYWdlcyBhY2Nlc3NlZCB0aHJvdWdoIGZpbGUgZGVzY3Jp cHRvcnMsIG51bWJlcnMgb2YgCj4+IGFjY2Vzc2VzCj4+ICvCoMKgwqDCoCAqwqDCoMKgIG1pZ2h0 IGhhdmUgYmVlbiBiZXlvbmQgdGhlIGxpbWl0Lgo+PiArwqDCoMKgwqAgKi8KPj4gK8KgwqDCoCBp ZiAobHJ1X2dlbl9pbl9mYXVsdCgpIHx8IHJlZnMgPT0gQklUKExSVV9SRUZTX1dJRFRIKSkgewo+ PiArwqDCoMKgwqDCoMKgwqAgZm9saW9fc2V0X3dvcmtpbmdzZXQoZm9saW8pOwo+PiArwqDCoMKg wqDCoMKgwqAgbW9kX2xydXZlY19zdGF0ZShscnV2ZWMsIFdPUktJTkdTRVRfUkVTVE9SRV9CQVNF ICsgdHlwZSwgCj4+IGRlbHRhKTsKPj4gK8KgwqDCoCB9Cj4+ICt1bmxvY2s6Cj4+ICvCoMKgwqAg cmN1X3JlYWRfdW5sb2NrKCk7Cj4+ICt9Cj4+ICsKPj4gKyNlbHNlCj4+ICsKPj4gK3N0YXRpYyB2 b2lkICpscnVfZ2VuX2V2aWN0aW9uKHN0cnVjdCBmb2xpbyAqZm9saW8pCj4+ICt7Cj4+ICvCoMKg wqAgcmV0dXJuIE5VTEw7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIGxydV9nZW5fcmVmYXVs dChzdHJ1Y3QgZm9saW8gKmZvbGlvLCB2b2lkICpzaGFkb3cpCj4+ICt7Cj4+ICt9Cj4+ICsKPj4g KyNlbmRpZiAvKiBDT05GSUdfTFJVX0dFTiAqLwo+PiArCj4+IMKgIC8qKgo+PiDCoMKgICogd29y a2luZ3NldF9hZ2Vfbm9ucmVzaWRlbnQgLSBhZ2Ugbm9uLXJlc2lkZW50IGVudHJpZXMgYXMgTFJV IGFnZXMKPj4gwqDCoCAqIEBscnV2ZWM6IHRoZSBscnV2ZWMgdGhhdCB3YXMgYWdlZAo+PiBAQCAt MjY0LDEwICszNjAsMTQgQEAgdm9pZCAqd29ya2luZ3NldF9ldmljdGlvbihzdHJ1Y3QgZm9saW8g KmZvbGlvLCAKPj4gc3RydWN0IG1lbV9jZ3JvdXAgKnRhcmdldF9tZW1jZykKPj4gwqDCoMKgwqDC oCBWTV9CVUdfT05fRk9MSU8oZm9saW9fcmVmX2NvdW50KGZvbGlvKSwgZm9saW8pOwo+PiDCoMKg wqDCoMKgIFZNX0JVR19PTl9GT0xJTyghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pLCBmb2xpbyk7 Cj4+IMKgICvCoMKgwqAgaWYgKGxydV9nZW5fZW5hYmxlZCgpKQo+PiArwqDCoMKgwqDCoMKgwqAg cmV0dXJuIGxydV9nZW5fZXZpY3Rpb24oZm9saW8pOwo+PiArCj4+IMKgwqDCoMKgwqAgbHJ1dmVj ID0gbWVtX2Nncm91cF9scnV2ZWModGFyZ2V0X21lbWNnLCBwZ2RhdCk7Cj4+IMKgwqDCoMKgwqAg LyogWFhYOiB0YXJnZXRfbWVtY2cgY2FuIGJlIE5VTEwsIGdvIHRocm91Z2ggbHJ1dmVjICovCj4+ IMKgwqDCoMKgwqAgbWVtY2dpZCA9IG1lbV9jZ3JvdXBfaWQobHJ1dmVjX21lbWNnKGxydXZlYykp Owo+PiDCoMKgwqDCoMKgIGV2aWN0aW9uID0gYXRvbWljX2xvbmdfcmVhZCgmbHJ1dmVjLT5ub25y ZXNpZGVudF9hZ2UpOwo+PiArwqDCoMKgIGV2aWN0aW9uID4+PSBidWNrZXRfb3JkZXI7Cj4+IMKg wqDCoMKgwqAgd29ya2luZ3NldF9hZ2Vfbm9ucmVzaWRlbnQobHJ1dmVjLCBmb2xpb19ucl9wYWdl cyhmb2xpbykpOwo+PiDCoMKgwqDCoMKgIHJldHVybiBwYWNrX3NoYWRvdyhtZW1jZ2lkLCBwZ2Rh dCwgZXZpY3Rpb24sCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9saW9f dGVzdF93b3JraW5nc2V0KGZvbGlvKSk7Cj4+IEBAIC0yOTgsNyArMzk4LDEzIEBAIHZvaWQgd29y a2luZ3NldF9yZWZhdWx0KHN0cnVjdCBmb2xpbyAqZm9saW8sIAo+PiB2b2lkICpzaGFkb3cpCj4+ IMKgwqDCoMKgwqAgaW50IG1lbWNnaWQ7Cj4+IMKgwqDCoMKgwqAgbG9uZyBucjsKPj4gwqAgK8Kg wqDCoCBpZiAobHJ1X2dlbl9lbmFibGVkKCkpIHsKPj4gK8KgwqDCoMKgwqDCoMKgIGxydV9nZW5f cmVmYXVsdChmb2xpbywgc2hhZG93KTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gK8Kg wqDCoCB9Cj4+ICsKPj4gwqDCoMKgwqDCoCB1bnBhY2tfc2hhZG93KHNoYWRvdywgJm1lbWNnaWQs ICZwZ2RhdCwgJmV2aWN0aW9uLCAmd29ya2luZ3NldCk7Cj4+ICvCoMKgwqAgZXZpY3Rpb24gPDw9 IGJ1Y2tldF9vcmRlcjsKPj4gwqAgwqDCoMKgwqDCoCByY3VfcmVhZF9sb2NrKCk7Cj4+IMKgwqDC oMKgwqAgLyoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFybS1rZXJuZWwK