Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u7B8s-00C4W6-0L for pgsql-hackers@arkaria.postgresql.org; Tue, 22 Apr 2025 10:46:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1u7B8q-00DF61-6O for pgsql-hackers@arkaria.postgresql.org; Tue, 22 Apr 2025 10:46:17 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1u7B8p-00DF2K-3D for pgsql-hackers@lists.postgresql.org; Tue, 22 Apr 2025 10:46:16 +0000 Received: from relay8-d.mail.gandi.net ([217.70.183.201]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1u7B8g-001KtA-31 for pgsql-hackers@lists.postgresql.org; Tue, 22 Apr 2025 10:46:14 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id B9BB143AFF; Tue, 22 Apr 2025 10:45:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1745318761; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=FgKIid7eS0QlxtFYUH+om+WTL0CJn54MHkpDSBrxFOI=; b=QqFVQ8fjjDkMFaDq/SZ9HetW5mF2m6JxvLaDUX9nRy/sxDWqbZ2CS/RJitH3DN162lrj0d rEOeMRyiFZASQbDVYFd04jDX+c7p5uUTDXJ+0IAIK8NLbas4THYUs4ENF6kaGMbWy0zD/L nQtCcJLQuiBXsfPwsQ21NJTzExoOf8xHVzFauG6Rpb0ZtS/BWmTZeVK/CG6IvZN3j8itmh Ee+ADjoMRoRxKk85e5nzs1o/KXRxaeKiO+y4W9KoLbReVu1rDH+0CBije0AvjnVG6p98x3 ima92+fVwPzLzl9ywif4krOhHQs6ZtLjTvsJ31sylv2Cf5i8etca3c0FXZl0Qg== Content-Type: multipart/mixed; boundary="------------TIm4EPVLTEyhZ61bk9DD3aiF" Message-ID: Date: Tue, 22 Apr 2025 12:45:55 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: index prefetching From: Tomas Vondra To: Andres Freund Cc: Robert Haas , Peter Geoghegan , Melanie Plageman , PostgreSQL Hackers , Georgios , Thomas Munro , Konstantin Knizhnik , Dilip Kumar References: <57d0e292-73d5-4ab9-9855-110ee9cbd90a@vondra.me> Content-Language: en-US In-Reply-To: <57d0e292-73d5-4ab9-9855-110ee9cbd90a@vondra.me> X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeefvddrtddtgddvgeefheefucetufdoteggodetrfdotffvucfrrhhofhhilhgvmecuifetpfffkfdpucggtfgfnhhsuhgsshgtrhhisggvnecuuegrihhlohhuthemuceftddunecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenucfjughrpegtkfffgggfuffhvfevfhgjsehmtderredtvdejnecuhfhrohhmpefvohhmrghsucggohhnughrrgcuoehtohhmrghssehvohhnughrrgdrmhgvqeenucggtffrrghtthgvrhhnpeehueeukeefudfftdetveegkeehtedtfedvheehgfeigfeikeetfeekkefhjeekheenucffohhmrghinhepphhoshhtghhrvghsqhhlrdhorhhgnecukfhppeegiedrudefhedrudeirddvvddunecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepgeeirddufeehrdduiedrvddvuddphhgvlhhopegluddtrddufeejrddtrddukegnpdhmrghilhhfrhhomhepthhomhgrshesvhhonhgurhgrrdhmvgdpnhgspghrtghpthhtohepledprhgtphhtthhopegrnhgurhgvshesrghnrghrrgiivghlrdguvgdprhgtphhtthhopehrohgsvghrthhmhhgrrghssehgmhgrihhlrdgtohhmpdhrtghpthhtohepphhgsegsohifthdrihgvpdhrtghpthhtohepmhgvlhgrnhhivghplhgrghgvmhgrnhesghhmrghilhdrtghomhdprhgtphhtthhopehpghhsqhhlqdhhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdro hhrghdprhgtphhtthhopehgkhhokhholhgrthhoshesphhrohhtohhnmhgrihhlrdgtohhmpdhrtghpthhtohepthhhohhmrghsrdhmuhhnrhhosehgmhgrihhlrdgtohhmpdhrtghpthhtohepkhhnihiihhhnihhksehgrghrrhgvthdrrhhu X-GND-Sasl: tomas@vondra.me List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------TIm4EPVLTEyhZ61bk9DD3aiF Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, here's an improved (rebased + updated) version of the patch series, with some significant fixes and changes. The patch adds infrastructure and modifies btree indexes to do prefetching - and AFAIK it passes all tests (no results, correct results). There's still a fair amount of work to be done, of course - the btree changes are not very polished, more time needs to be spent on profiling and optimization, etc. And I'm sure that while the patch passes tests, there certainly are bugs. Compared to the last patch version [1] shared on list (in November), there's a number of significant design changes - a lot of this is based on a number of off-list discussions I had with Peter Geoghegan, which was very helpful. Let me try to sum the main conclusions and changes: 1) patch now relies on read_stream The November patch still relied on sync I/O and PrefetchBuffer(). At some point I added a commit switching it to read_stream - which turned out non-trivial, especially for index-only scans. But it works, and for a while I kept it separate - with PrefetchBuffer first, and a switch to read_stream later. But then I realized it does not make much sense to keep the first part - why would we introduce a custom fadvise-based prefetch, only to immediately rip it out and replace it with with read_stream code with a comparable amount of complexity, right? So I squashed these two parts, and the patch now does read_stream (for the table reads) from the beginning. 2) two new index AM callbacks - amgetbatch + amfreebatch The [1] patch introduced a new callback for reading a "batch" (essentially a leaf page) from the index. But there was a limitation of only allowing a single batch at a time, which was causing trouble with prefetch distance and read_stream stalls at the end of the batch, etc. Based on the discussions with Peter I decided to make this a bit more ambitious, moving the whole batch management from the index AM to the indexam.c level. So now there are two callbacks - amgetbatch and amfreebatch, and it's up to indexam.c to manage the batches - decide how many batches to allow, etc. The index AM is responsible merely for loading the next batch, but does not decide when to load or free a batch, how many to keep in memory, etc. There's a section in indexam.c with a more detailed description of the design, I'm not going to explain all the design details here. In a way, this design is a compromise between the initial AM-level approach I presented as a PoC at pgconf.dev 2023, and the executor level approach I shared a couple months back. Each of those "extreme" cases had it's issues with either happening "too deep" or "too high" - being too integrated in the AM, or not having enough info about the AM. I think the indexam.c is a sensible layer for this. I was hoping doing this at the "executor level" would mean no need for AM code changes, but that turned out not possible - the AM clearly needs to know about the batch boundaries, so that it can e.g. do killtuples, etc. That's why we need the two callbacks (not just the "amgetbatch" one). At least this way it's "hidden" by the indexam.c API, like index_getnext_slot(). (You could argue indexam.c is "executor" and maybe it is - I don't know where exactly to draw the line. I don't think it matters, really. The "hidden in indexam API" is the important bit.) 3) btree prefetch The patch implements the new callbacks only for btree indexes, and it's not very pretty / clean - it's mostly a massaged version of the old code backing amgettuple(). This needs cleanup/improvements, and maybe refactoring to allow reusing more of the code, etc.. Or maybe we should even rip out the amgettuple() entirely, and only support one of those for each AM? That's what Peter suggested, but I'm not convinced we should do that. For now it was very useful to be able to flip between the APIs by setting a GUC, and I left prefetching disabled in some places (e.g. when accessing catalogs, ...) that are unlikely to benefit. But more importantly, I'm not 100% we want to require the index AMs to support prefetching for all cases - if we do, a single "can't prefetch" case would mean we can't prefetch anything for that AM. In particular, I'm thinking about GiST / SP-GiST and indexes ordered by distance, which don't return items in leaf pages but sort them through a binary heap. Maybe we can do prefetch for that, but if we can't it would be silly if it meant we can't do prefetch for any other SP-GiST queries. Anyway, the current patch only implements prefetch for btree. I expect it won't be difficult to do this for other index AMs, considering how similar the design usually is to btree. This is one of the next things on my TODO. I want to be able to validate the design works for multiple AMs, not just btree. 4) duplicate blocks While working on the patch, I realized the old index_fetch_heap code skips reads for duplicate blocks - index the TID matches the immediately preceding block, ReleaseAndReadBuffer() skips most of the work. But read_stream() doesn't do that - if the callback returns the same block, it starts a new read for it, pins it, etc. That can be quite expensive, and I've seen a couple cases where the impact was not negligible (correlated index, fits in memory, ...). I've speculated that maybe read_stream_next_buffer() should detect and handle these cases better - not unlike it detects sequential reads. It might even keep a small cache of already requested reads, etc. so that it can handle a wider range of workloads, not just perfect duplicates. But it does not do that, and I'm not sure if/when that will happen. So for now I simply reproduced the "skip duplicate blocks" behavior. It's not as simple with read_stream, because this logic needs to happen in two places - in the callback (when generating reads), and then also when reading the blocks from the stream - if these places get "out of sync" the stream won't return the blocks expected by the reader. But it does work, and it's not that complex. But there's an issue with prefetch distance ... 5) prefetch distance Traditionally, we measure distance in "tuples" - e.g. in bitmap heap scan, we make sure we prefetched pages for X tuples ahead. But that's not what read_stream does for prefetching - it works with pages. That can cause various issues. Consider for example the "skip duplicate blocks" optimization described in (4). And imagine a perfectly correlated index, with ~200 items per leaf page. The heap tuples are likely wider, let's say we have 50 of them per page. That means that for each leaf page, we have only ~4 blocks per leaf page. With effective_io_concurrency=16 the read_stream will try to prefetch 16 heap pages, that's 3200 index entries. Is that what we want? I'm not quite sure, maybe it's OK? It sure is not quite what I expected. But now imagine an index-only scan on nearly all-visible table. If the fraction of index entries that don't pass the visibility check is very low, we can quickly get into a situation when the read_stream has to read a lot of leaf pages to get the next block number. Sure, we'd need to read that block number eventually, but doing it this early means we may need to keep the batch (leaf page) - a lot of them, actually. Essentially, pick a number and I can construct an IOS that needs to keep more batches. I think this is a consequence of read_stream having an internal idea how far ahead to prefetch, based on the number of requests it got so far, measured in heap blocks. It has not idea about the context (how that maps to index entries, batches we need to keep in memory, ...). Ideally, we'd be able to give this feedback to read_stream in some way, say by "pausing" it when we get too far ahead in the index. But we don't have that - the only thing we can do is to return IndalidBlockNumber to the stream, so that it stops. And then we need to "reset" the stream, and let it continue - but only after we consumed all scheduled reads. In principle it's very similar to the "pause/resume" I mentioned, except that it requires completely draining the queue - a pipeline stall. That's not great, but hopefully it's not very common, and more importantly - it only happens when only a tiny fraction of the index items requires a heap block. So that's what the patch does. I think it's acceptable, but some optimizations may be necessary (see next section). 6) performance and optimization It's not difficult to construct cases where the prefetching is a huge improvement - 5-10x speedup for a query is common, depending on the hardware, dataset, etc. But there are also cases where it doesn't (and can't) help very much. For example fully-cached data, or index-only scans of all-visible tables. I've done basic benchmarking based on that (I'll share some results in the coming days), and in various cases I see a consistent regression in the 10-20% range. The queries are very short (~1ms) and there's a fair amount of noise, but it seems fairly consistent. I haven't figured out the root cause(s) yet, but I believe there's a couple contributing factors: (a) read_stream adds a bit of complexity/overhead, but these cases worked great with just the sync API, and can't benefit from that. (b) There's inefficiencies in how I integrated read_stream into the btree AM. For example every batch allocates the same buffer btbeginscan, which turned out to be an issue before [2] - and now we do that for every batch, not just once per scan - that's not great. (c) Possibly the prefetch distance issue from (4) might matter too. regards [1] https://www.postgresql.org/message-id/accd03eb-0379-416d-9936-41a4de3c47ef%40vondra.me [2] https://www.postgresql.org/message-id/510b887e-c0ce-4a0c-a17a-2c6abb8d9a5c@enterprisedb.com regards -- Tomas Vondra --------------TIm4EPVLTEyhZ61bk9DD3aiF Content-Type: text/x-patch; charset=UTF-8; name="v20250422-0001-WIP-index-prefetching.patch" Content-Disposition: attachment; filename="v20250422-0001-WIP-index-prefetching.patch" Content-Transfer-Encoding: base64 RnJvbSAyNGUzZjNhN2ExNmJmYjFjNzcwMjE5NTRhNTNiNzRmNDAyYjVkNmQ0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogTW9uLCAzMCBTZXAgMjAyNCAyMjo0ODoxMiArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djIwMjUwNDIyIDEvNV0gV0lQOiBpbmRleCBwcmVmZXRjaGluZwoKQWxsb3dzIHRoZSBpbmRl eCBBTSB0byBwcm92aWRlIGl0ZW1zIChUSURzIGFuZCB0dXBsZXMpIGluIGJhdGNoZXMsIHdo aWNoCmlzIHRoZW4gdXNlZCB0byBpbXBsZW1lbnQgcHJlZmV0Y2hpbmcgb2YgaGVhcCB0dXBs ZXMgaW4gaW5kZXggc2NhbnMKKGluY2x1ZGluZyBpbmRleC1vbmx5IHNjYW5zKS4gVGhpcyBp cyBzaW1pbGFyIHRvIHByZWZldGNoaW5nIGFscmVhZHkKZG9uZSBpbiBiaXRtYXAgc2NhbnMs IGFuZCBjYW4gcmVzdWx0IGluIHNpZ25pZmljYW50IHNwZWVkdXBzLgoKVGhlIGluZGV4IEFN IG1heSBpbXBsZW1lbnQgYW4gb3B0aW9uYWwgImFtZ2V0YmF0Y2giIGNhbGxiYWNrLCByZXR1 cm5pbmcKYSBiYXRjaCBvZiBpdGVtcy4gVGhlIGluZGV4YW0uYyBjb2RlIHRoZW4gaGFuZGxl cyB0aGlzIHRyYW5zcGFyZW50bHkKdGhyb3VnaCB0aGUgZXhpc3RpbmcgImdldG5leHQiIGlu dGVyZmFjZS4KCkl0IGlzIHVwIHRvIHRoZSBpbmRleCBBTSB0byByZXR1cm4gb25seSBiYXRj aGVzIHRoYXQgaXQgY2FuIGhhbmRsZQppbnRlcm5hbGx5LiBGb3IgZXhhbXBsZSwgbW9zdCBv ZiB0aGUgbGF0ZXIgcGF0Y2hlcyBhZGRpbmcgc3VwcG9ydCBmb3IKYmF0Y2hpbmcgdG8gcmVs ZXZhbnQgaW5kZXggQU1zIChidHJlZSwgaGFzaCwgZ2lzdCwgc3AtZ2lzdCkgcmVzdHJpY3Qg dGhlCmJhdGNoZXMgdG8gYSBzaW5nbGUgbGVhZiBwYWdlLiBUaGlzIG1ha2VzIGltcGxlbWVu dGF0aW9uIG9mIGJhdGNoaW5nCm11Y2ggc2ltcGxlciwgd2l0aCBvbmx5IG1pbmltYWwgY2hh bmdlcyB0byB0aGUgaW5kZXggQU1zLCBidXQgaXQncyBub3QgYQpoYXJkIHJlcXVpcmVtZW50 LiBUaGUgaW5kZXggQU0gY2FuIHByb2R1Y2UgYmF0Y2hlcyBzcGFubmluZyBhcmJpdHJhcnkK bnVtYmVyIG9mIGxlYWYgcGFnZXMuIFRoaXMgaXMgbGVmdCBhcyBhIHBvc3NpYmxlIGZ1dHVy ZSBpbXByb3ZlbWVudC4KCk1vc3Qgb2YgdGhlIGJhdGNoaW5nL3ByZWZldGNoaW5nIGxvZ2lj IGhhcHBlbnMgaW4gaW5kZXhhbS5jLiBUaGlzIG1lYW5zCnRoZSBleGVjdXRvciBjb2RlIGNh biBjb250aW51ZSB0byBjYWxsIHRoZSBpbnRlcmZhY2UganVzdCBsaWtlIGJlZm9yZS4KClRo ZSBvbmx5ICJ2aW9sYXRpb24iIGhhcHBlbnMgaW4gaW5kZXgtb25seSBzY2Fucywgd2hpY2gg bmVlZCB0byBjaGVjawp0aGUgdmlzaWJpbGl0eSBtYXAgYm90aCB3aGVuIHRoZSBwcmVmZXRj aGluZyBwYWdlcyAod2UgZG9uJ3Qgd2FudCB0bwpwcmVmZXRjaCBwYWdlcyB0aGF0IGFyZSB1 bm5lY2Vzc2FyeSkgYW5kIGxhdGVyIHdoZW4gcmVhZGluZyB0aGUgZGF0YS4KRm9yIGNhY2hl ZCBkYXRhIHRoZSB2aXNpYmlsaXR5IG1hcCBjaGVja3MgY2FuIGJlIGZhaXJseSBleHBlbnNp dmUsIHNvCml0J3MgZGVzaXJhYmxlIHRvIGtlZXAgYW5kIHJldXNlIHRoZSByZXN1bHQgb2Yg dGhlIGZpcnN0IGNoZWNrLgoKQXQgdGhlIG1vbWVudCwgdGhlIHByZWZldGNoaW5nIGRvZXMg bm90IGhhbmRsZSBtYXJrL3Jlc3RvcmUgcGxhbnMuIFRoaXMKaXMgZG9hYmxlLCBidXQgcmVx dWlyZXMgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiB0aGUgYmF0Y2hpbmcK YW5kIGluZGV4IEFNIGNvZGUgaW4gdGhlICJvcHBvc2l0ZSBkaXJlY3Rpb24iLgoKVGhpcyBw YXRjaCBkb2VzIG5vdCBhY3R1YWxseSBhZGQgYmF0Y2hpbmcgdG8gYW55IG9mIHRoZSBpbmRl eCBBTXMsIGl0J3MKanVzdCB0aGUgY29tbW9uIGluZnJhc3RydWN0dXJlLgoKVE9ETyBBZGQg dGhlIG5ldyBpbmRleCBBTSBjYWxsYmFjayB0byBzZ21sIGRvY3MuCgpSZS1pbnRyb2R1Y2Ug dGhlIGNhbGxiYWNrIHRvIGNoZWNrIFZNIGFuZCByZW1lbWJlciB0aGUgcmVzdWx0LgoKSXQg Y2FuIGhhcHBlbiB0aGUgZmlyc3QgZmV3IGJhdGNoZXMgKGxlYWYgcGFnZXMpIG1heSBiZSBy ZXR1cm5lZCBmcm9tCnRoZSBpbmRleCwgc2tpcHBpbmcgdGhlIGhlYXAgZmV0Y2hlcy4gV2hp Y2ggbWVhbnMgdGhlIHJlYWQgc3RyZWFtIGRvZXMKbm8gcmVhZHMgdW50aWwgbXVjaCBsYXRl ciBhZnRlciB0aGUgZmlyc3QgYmF0Y2hlcyBhcmUgYWxyZWFkeSBmcmVlZC4KQmVjYXVzZSB0 aGUgcmVhZHMgb25seSBoYXBwZW4gd2hlbiBmaXJzdCByZWFkaW5nIGZyb20gdGhlIHN0cmVh bS4gSW4KdGhhdCBjYXNlIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCBpbml0aWFsaXpp bmcgdGhlIHN0cmVhbSBwb3NpdGlvbgpiZWNhdXNlIHNldHRpbmcgaXQgdG8gKDAsMCkgd291 bGQgYmUgd3JvbmcgYXMgdGhlIGJhdGNoIGlzIGFscmVhZHkgZ29uZS4KU28ganVzdCBpbml0 aWFsaXplIHRvIHJlYWRQb3N0LCB3aGljaCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgYWxyZWFk eS4KCkNvdWxkIGl0IGhhcHBlbiBsYXRlciwgb3IganVzdCBvbiBmaXJzdCBjYWxsPyBQcm9i YWJseSBmaXJzdCBjYWxsIG9ubHksCmFzIHRoZSByZWFkIHN0cmVhbSBhbHdheXMgbG9va3Mg YWhlYWQgZm9yIHRoZSBibG9jayB0aGF0IGFjdHVhbGx5IG5lZWRzCnJlYWRpbmcuCi0tLQog c3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYyAgICAgIHwgICA4MSAr LQogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2dlbmFtLmMgICAgICAgICAgICAgIHwgICAz MCArLQogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyAgICAgICAgICAgIHwg MTM4MSArKysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvYWNjZXNzL3RhYmxlL3RhYmxl YW0uYyAgICAgICAgICAgIHwgICAgMiArLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvY29uc3Ry YWludC5jICAgICAgICAgICAgIHwgICAgMyArLQogc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhl Y0luZGV4aW5nLmMgICAgICAgICAgIHwgICAxMiArLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Iv ZXhlY1JlcGxpY2F0aW9uLmMgICAgICAgIHwgICAgOSArLQogc3JjL2JhY2tlbmQvZXhlY3V0 b3Ivbm9kZUluZGV4b25seXNjYW4uYyAgICAgIHwgIDEzMyArLQogc3JjL2JhY2tlbmQvZXhl Y3V0b3Ivbm9kZUluZGV4c2Nhbi5jICAgICAgICAgIHwgICAzMiArLQogc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3NlbGZ1bmNzLmMgICAgICAgICAgICAgIHwgICAgNyArLQogc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgICAgICAgICAgIHwgICAxMCArCiBzcmMvYmFj a2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgfCAgICAxICsKIHNyYy9p bmNsdWRlL2FjY2Vzcy9hbWFwaS5oICAgICAgICAgICAgICAgICAgICB8ICAgMTAgKwogc3Jj L2luY2x1ZGUvYWNjZXNzL2dlbmFtLmggICAgICAgICAgICAgICAgICAgIHwgICAxMyArLQog c3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCAgICAgICAgICAgICAgICAgIHwgIDE2MCAr Kwogc3JjL2luY2x1ZGUvYWNjZXNzL3RhYmxlYW0uaCAgICAgICAgICAgICAgICAgIHwgICAx MiArLQogc3JjL2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmggICAgICAgICAgICAgICAgIHwg ICAgNyArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dCAgICAgICAg fCAgICAzICstCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAgICAg ICAgfCAgICA1ICsKIDE5IGZpbGVzIGNoYW5nZWQsIDE4NzIgaW5zZXJ0aW9ucygrKSwgMzkg ZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVh cGFtX2hhbmRsZXIuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVy LmMKaW5kZXggYWMwODJmZWZhNzcuLmY3OWQ5N2E4YzY0IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMKQEAgLTc5LDExICs3OSwxMiBAQCBoZWFwYW1f c2xvdF9jYWxsYmFja3MoUmVsYXRpb24gcmVsYXRpb24pCiAgKi8KIAogc3RhdGljIEluZGV4 RmV0Y2hUYWJsZURhdGEgKgotaGVhcGFtX2luZGV4X2ZldGNoX2JlZ2luKFJlbGF0aW9uIHJl bCkKK2hlYXBhbV9pbmRleF9mZXRjaF9iZWdpbihSZWxhdGlvbiByZWwsIFJlYWRTdHJlYW0g KnJzKQogewogCUluZGV4RmV0Y2hIZWFwRGF0YSAqaHNjYW4gPSBwYWxsb2MwKHNpemVvZihJ bmRleEZldGNoSGVhcERhdGEpKTsKIAogCWhzY2FuLT54c19iYXNlLnJlbCA9IHJlbDsKKwlo c2Nhbi0+eHNfYmFzZS5ycyA9IHJzOwogCWhzY2FuLT54c19jYnVmID0gSW52YWxpZEJ1ZmZl cjsKIAogCXJldHVybiAmaHNjYW4tPnhzX2Jhc2U7CkBAIC05NCw2ICs5NSw5IEBAIGhlYXBh bV9pbmRleF9mZXRjaF9yZXNldChJbmRleEZldGNoVGFibGVEYXRhICpzY2FuKQogewogCUlu ZGV4RmV0Y2hIZWFwRGF0YSAqaHNjYW4gPSAoSW5kZXhGZXRjaEhlYXBEYXRhICopIHNjYW47 CiAKKwlpZiAoc2Nhbi0+cnMpCisJCXJlYWRfc3RyZWFtX3Jlc2V0KHNjYW4tPnJzKTsKKwog CWlmIChCdWZmZXJJc1ZhbGlkKGhzY2FuLT54c19jYnVmKSkKIAl7CiAJCVJlbGVhc2VCdWZm ZXIoaHNjYW4tPnhzX2NidWYpOwpAQCAtMTA4LDYgKzExMiw5IEBAIGhlYXBhbV9pbmRleF9m ZXRjaF9lbmQoSW5kZXhGZXRjaFRhYmxlRGF0YSAqc2NhbikKIAogCWhlYXBhbV9pbmRleF9m ZXRjaF9yZXNldChzY2FuKTsKIAorCWlmIChzY2FuLT5ycykKKwkJcmVhZF9zdHJlYW1fZW5k KHNjYW4tPnJzKTsKKwogCXBmcmVlKGhzY2FuKTsKIH0KIApAQCAtMTMwLDE1ICsxMzcsNzIg QEAgaGVhcGFtX2luZGV4X2ZldGNoX3R1cGxlKHN0cnVjdCBJbmRleEZldGNoVGFibGVEYXRh ICpzY2FuLAogCQkvKiBTd2l0Y2ggdG8gY29ycmVjdCBidWZmZXIgaWYgd2UgZG9uJ3QgaGF2 ZSBpdCBhbHJlYWR5ICovCiAJCUJ1ZmZlcgkJcHJldl9idWYgPSBoc2Nhbi0+eHNfY2J1ZjsK IAotCQloc2Nhbi0+eHNfY2J1ZiA9IFJlbGVhc2VBbmRSZWFkQnVmZmVyKGhzY2FuLT54c19j YnVmLAotCQkJCQkJCQkJCQkgIGhzY2FuLT54c19iYXNlLnJlbCwKLQkJCQkJCQkJCQkJICBJ dGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCkpOworCQkvKgorCQkgKiBSZWFkIHRoZSBi bG9jayBmb3IgdGhlIHJlcXVlc3RlZCBUSUQuIFdpdGggYSByZWFkIHN0cmVhbSwgc2ltcGx5 CisJCSAqIHJlYWQgdGhlIG5leHQgYmxvY2sgd2UgcXVldWVkIGVhcmxpZXIgKGZyb20gdGhl IGNhbGxiYWNrKS4KKwkJICogT3RoZXJ3aXNlIGp1c3QgZG8gdGhlIHJlZ3VsYXIgcmVhZCB1 c2luZyB0aGUgVElELgorCQkgKgorCQkgKiBYWFggSXQncyBhIGJpdCBmcmFnaWxlIHRvIGp1 c3QgcmVhZCBidWZmZXJzLCBleHBlY3RpbmcgdGhlIHJpZ2h0CisJCSAqIGJsb2NrLCB3aGlj aCB3ZSBxdWV1ZWQgZnJvbSB0aGUgY2FsbGJhY2sgc29tZXRpbWUgbXVjaCBlYXJsaWVyLiBJ ZgorCQkgKiB0aGUgdHdvIHN0cmVhbXMgZ2V0IG91dCBvZiBzeW5jIGluIGFueSB3YXkgKHdo aWNoIGNhbiBoYXBwZW4KKwkJICogZWFzaWx5LCBkdWUgdG8gc29tZSBvcHRpbWl6YXRpb24g aGV1cmlzdGljcyksIGl0IG1heSBtaXNiZWhhdmUgaW4KKwkJICogc3RyYW5nZSB3YXlzLgor CQkgKgorCQkgKiBYWFggV2UgbmVlZCB0byBzdXBwb3J0IGJvdGggdGhlIG9sZCBSZWFkQnVm ZmVyIGFuZCBSZWFkU3RyZWFtLCBhcworCQkgKiBzb21lIHBsYWNlcyBhcmUgdW5saWtlbHkg dG8gYmVuZWZpdCBmcm9tIGEgcmVhZCBzdHJlYW0gLSBlLmcuCisJCSAqIGJlY2F1c2UgdGhl eSBvbmx5IGZldGNoIGEgc2luZ2xlIHR1cGxlLiBTbyBiZXR0ZXIgdG8gc3VwcG9ydCB0aGlz LgorCQkgKgorCQkgKiBYWFggQW5vdGhlciByZWFzb24gaXMgdGhhdCBzb21lIGluZGV4IEFN cyBtYXkgbm90IHN1cHBvcnQgdGhlCisJCSAqIGJhdGNoaW5nIGludGVyZmFjZSwgd2hpY2gg aXMgYSBwcmVyZXF1aXNpdGUgZm9yIHVzaW5nIHJlYWRfc3RyZWFtCisJCSAqIEFQSS4KKwkJ ICovCisJCWlmIChzY2FuLT5ycykKKwkJCWhzY2FuLT54c19jYnVmID0gcmVhZF9zdHJlYW1f bmV4dF9idWZmZXIoc2Nhbi0+cnMsIE5VTEwpOworCQllbHNlCisJCQloc2Nhbi0+eHNfY2J1 ZiA9IFJlbGVhc2VBbmRSZWFkQnVmZmVyKGhzY2FuLT54c19jYnVmLAorCQkJCQkJCQkJCQkJ ICBoc2Nhbi0+eHNfYmFzZS5yZWwsCisJCQkJCQkJCQkJCQkgIEl0ZW1Qb2ludGVyR2V0Qmxv Y2tOdW1iZXIodGlkKSk7CisKKwkJLyogV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSB2YWxpZCBi dWZmZXIgZm9yIGEgdmFsaWQgVElELiAqLworCQlBc3NlcnQoQnVmZmVySXNWYWxpZChoc2Nh bi0+eHNfY2J1ZikpOworCisJCS8qCisJCSAqIERpZCB3ZSByZWFkIHRoZSBleHBlY3RlZCBi bG9jayBudW1iZXIgKHBlciB0aGUgVElEKT8gRm9yIHRoZQorCQkgKiByZWd1bGFyIGJ1ZmZl ciByZWFkcyB0aGlzIHNob3VsZCBhbHdheXMgbWF0Y2gsIGJ1dCB3aXRoIHRoZSByZWFkCisJ CSAqIHN0cmVhbSBpdCBtaWdodCBkaXNhZ3JlZSBkdWUgdG8gYSBidWcgZWxzZXdoZXJlICho YXBwZW5lZAorCQkgKiByZXBlYXRlZGx5KS4KKwkJICovCisJCUFzc2VydChCdWZmZXJHZXRC bG9ja051bWJlcihoc2Nhbi0+eHNfY2J1ZikgPT0gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJl cih0aWQpKTsKIAogCQkvKgogCQkgKiBQcnVuZSBwYWdlLCBidXQgb25seSBpZiB3ZSB3ZXJl bid0IGFscmVhZHkgb24gdGhpcyBwYWdlCiAJCSAqLwogCQlpZiAocHJldl9idWYgIT0gaHNj YW4tPnhzX2NidWYpCiAJCQloZWFwX3BhZ2VfcHJ1bmVfb3B0KGhzY2FuLT54c19iYXNlLnJl bCwgaHNjYW4tPnhzX2NidWYpOworCisJCS8qCisJCSAqIFdoZW4gdXNpbmcgdGhlIHJlYWQg c3RyZWFtLCByZWxlYXNlIHRoZSBvbGQgYnVmZmVyLgorCQkgKgorCQkgKiBYWFggTm90IHN1 cmUgdGhpcyBpcyByZWFsbHkgbmVlZGVkLCBvciBtYXliZSB0aGlzIGlzIG5vdCB0aGUgcmln aHQKKwkJICogcGxhY2UgdG8gZG8gdGhpcywgYW5kIGJ1ZmZlcnMgc2hvdWxkIGJlIHJlbGVh c2VkIGVsc2V3aGVyZS4gVGhlCisJCSAqIHByb2JsZW0gaXMgdGhhdCBvdGhlciBwbGFjZSBt YXkgbm90IHJlYWxseSBrbm93IGlmIHRoZSBpbmRleCBzY2FuCisJCSAqIHVzZXMgcmVhZCBz dHJlYW0gQVBJLgorCQkgKgorCQkgKiBYWFggV2UgbmVlZCB0byBkbyB0aGlzLCBiZWNhdXNl IG90aGVyd2lzZSB0aGUgY2FsbGVyIHdvdWxkIG5lZWQgdG8KKwkJICogZG8gZGlmZmVyZW50 IHRoaW5ncyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmVhZF9zdHJlYW0gd2FzIHVzZWQK KwkJICogb3Igbm90LiBXaXRoIHRoZSByZWFkX3N0cmVhbSBpdCdkIGhhdmUgdG8gYWxzbyBl eHBsaWNpdGx5IHJlbGVhc2UKKwkJICogdGhlIGJ1ZmZlcnMsIGJ1dCBkb2luZyB0aGF0IGZv ciBldmVyeSBjYWxsZXIgc2VlbXMgZXJyb3IgcHJvbmUKKwkJICogKGVhc3kgdG8gZm9yZ2V0 KS4gSXQncyBhbHNvIG5vdCBjbGVhciB3aGV0aGVyIGl0IHdvdWxkIGZyZWUgdGhlCisJCSAq IGJ1ZmZlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGluZGV4X2ZldGNoX3R1cGxlIGNhbGwgKHdl IGRvbid0IGtub3cgaWYKKwkJICogdGhlIGJ1ZmZlciBjaGFuZ2VkIHVudGlsICphZnRlciog dGhlIGNhbGwsIGV0Yy4pLgorCQkgKgorCQkgKiBYWFggRG9lcyB0aGlzIGRvIHRoZSByaWdo dCB0aGluZyB3aGVuIHJlYWRpbmcgdGhlIHNhbWUgcGFnZT8gVGhhdAorCQkgKiBzaG91bGQg cmV0dXJuIHRoZSBzYW1lIGJ1ZmZlciwgc28gd29uJ3Qgd2UgcmVsZWFzZSBpdCBwcmVtYXR1 cmVseT8KKwkJICovCisJCWlmIChzY2FuLT5ycyAmJiAocHJldl9idWYgIT0gSW52YWxpZEJ1 ZmZlcikpCisJCXsKKwkJCVJlbGVhc2VCdWZmZXIocHJldl9idWYpOworCQl9CiAJfQogCiAJ LyogT2J0YWluIHNoYXJlLWxvY2sgb24gdGhlIGJ1ZmZlciBzbyB3ZSBjYW4gZXhhbWluZSB2 aXNpYmlsaXR5ICovCkBAIC03NTMsNyArODE3LDE0IEBAIGhlYXBhbV9yZWxhdGlvbl9jb3B5 X2Zvcl9jbHVzdGVyKFJlbGF0aW9uIE9sZEhlYXAsIFJlbGF0aW9uIE5ld0hlYXAsCiAKIAkJ dGFibGVTY2FuID0gTlVMTDsKIAkJaGVhcFNjYW4gPSBOVUxMOwotCQlpbmRleFNjYW4gPSBp bmRleF9iZWdpbnNjYW4oT2xkSGVhcCwgT2xkSW5kZXgsIFNuYXBzaG90QW55LCBOVUxMLCAw LCAwKTsKKworCQkvKgorCQkgKiBYWFggTWF5YmUgZW5hYmxlIGJhdGNoaW5nL3ByZWZldGNo IGZvciBjbHVzdGVyaW5nPyBTZWVtcyBsaWtlIGl0CisJCSAqIG1pZ2h0IGJlIGEgcHJldHR5 IHN1YnN0YW50aWFsIHdpbiBpZiB0aGUgdGFibGUgaXMgbm90IHlldCB3ZWxsCisJCSAqIGNs dXN0ZXJlZCBieSB0aGUgaW5kZXguCisJCSAqLworCQlpbmRleFNjYW4gPSBpbmRleF9iZWdp bnNjYW4oT2xkSGVhcCwgT2xkSW5kZXgsIFNuYXBzaG90QW55LCBOVUxMLCAwLCAwLAorCQkJ CQkJCQkJZmFsc2UpOwogCQlpbmRleF9yZXNjYW4oaW5kZXhTY2FuLCBOVUxMLCAwLCBOVUxM LCAwKTsKIAl9CiAJZWxzZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4 L2dlbmFtLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvZ2VuYW0uYwppbmRleCA4ZjUz MmUxNDU5MC4uODI2NmQ1ZTBlODcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9p bmRleC9nZW5hbS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9nZW5hbS5jCkBA IC00NDYsOCArNDQ2LDIxIEBAIHN5c3RhYmxlX2JlZ2luc2NhbihSZWxhdGlvbiBoZWFwUmVs YXRpb24sCiAJCQkJZWxvZyhFUlJPUiwgImNvbHVtbiBpcyBub3QgaW4gaW5kZXgiKTsKIAkJ fQogCisJCS8qCisJCSAqIE5vIGJhdGNoaW5nL3ByZWZldGNoIGZvciBjYXRhbG9ncy4gV2Ug ZG9uJ3QgZXhwZWN0IHRoYXQgdG8gaGVscAorCQkgKiB2ZXJ5IG11Y2gsIGJlY2F1c2Ugd2Ug dXN1YWxseSBuZWVkIGp1c3Qgb25lIHJvdywgYW5kIGV2ZW4gaWYgd2UKKwkJICogbmVlZCBt dWx0aXBsZSByb3dzLCB0aGV5IHRlbmQgdG8gYmUgY29sb2NhdGVkIGluIGhlYXAuCisJCSAq CisJCSAqIFhYWCBNYXliZSB3ZSBjb3VsZCBkbyB0aGF0LCB0aGUgcHJlZmV0Y2hpbmcgb25s eSByYW1wcyB1cCBvdmVyIHRpbWUKKwkJICogYW55d2F5PyBUaGVyZSB3YXMgYSBwcm9ibGVt IHdpdGggaW5maW5pdGUgcmVjdXJzaW9uIHdoZW4gbG9va2luZyB1cAorCQkgKiBlZmZlY3Rp dmVfaW9fY29uY3VycmVuY3kgZm9yIGEgdGFibGVzcGFjZSAod2hpY2ggbWF5IGRvIGFuIGlu ZGV4CisJCSAqIHNjYW4gaW50ZXJuYWxseSksIGJ1dCB0aGUgcmVhZF9zdHJlYW0gc2hvdWxk IGNhcmUgb2YgdGhhdC4gU3RpbGwsCisJCSAqIHdlIGRvbid0IGV4cGVjdCB0aGlzIHRvIGhl bHAgYSBsb3QuCisJCSAqCisJCSAqIFhYWCBUaGlzIGFsc28gbWVhbnMgc2NhbnMgb24gY2F0 YWxvZ3Mgd29uJ3QgdXNlIHJlYWRfc3RyZWFtLgorCQkgKi8KIAkJc3lzc2Nhbi0+aXNjYW4g PSBpbmRleF9iZWdpbnNjYW4oaGVhcFJlbGF0aW9uLCBpcmVsLAotCQkJCQkJCQkJCSBzbmFw c2hvdCwgTlVMTCwgbmtleXMsIDApOworCQkJCQkJCQkJCSBzbmFwc2hvdCwgTlVMTCwgbmtl eXMsIDAsIGZhbHNlKTsKIAkJaW5kZXhfcmVzY2FuKHN5c3NjYW4tPmlzY2FuLCBpZHhrZXks IG5rZXlzLCBOVUxMLCAwKTsKIAkJc3lzc2Nhbi0+c2NhbiA9IE5VTEw7CiAKQEAgLTcwNyw4 ICs3MjAsMjEgQEAgc3lzdGFibGVfYmVnaW5zY2FuX29yZGVyZWQoUmVsYXRpb24gaGVhcFJl bGF0aW9uLAogCQkJZWxvZyhFUlJPUiwgImNvbHVtbiBpcyBub3QgaW4gaW5kZXgiKTsKIAl9 CiAKKwkvKgorCSAqIE5vIGJhdGNoaW5nL3ByZWZldGNoIGZvciBjYXRhbG9ncy4gV2UgZG9u J3QgZXhwZWN0IHRoYXQgdG8gaGVscCB2ZXJ5CisJICogbXVjaCwgYmVjYXVzZSB3ZSB1c3Vh bGx5IG5lZWQganVzdCBvbmUgcm93LCBhbmQgZXZlbiBpZiB3ZSBuZWVkCisJICogbXVsdGlw bGUgcm93cywgdGhleSB0ZW5kIHRvIGJlIGNvbG9jYXRlZCBpbiBoZWFwLgorCSAqCisJICog WFhYIE1heWJlIHdlIGNvdWxkIGRvIHRoYXQsIHRoZSBwcmVmZXRjaGluZyBvbmx5IHJhbXBz IHVwIG92ZXIgdGltZQorCSAqIGFueXdheT8gVGhlcmUgd2FzIGEgcHJvYmxlbSB3aXRoIGlu ZmluaXRlIHJlY3Vyc2lvbiB3aGVuIGxvb2tpbmcgdXAKKwkgKiBlZmZlY3RpdmVfaW9fY29u Y3VycmVuY3kgZm9yIGEgdGFibGVzcGFjZSAod2hpY2ggbWF5IGRvIGFuIGluZGV4IHNjYW4K KwkgKiBpbnRlcm5hbGx5KSwgYnV0IHRoZSByZWFkX3N0cmVhbSBzaG91bGQgY2FyZSBvZiB0 aGF0LiBTdGlsbCwgd2UgZG9uJ3QKKwkgKiBleHBlY3QgdGhpcyB0byBoZWxwIGEgbG90Lgor CSAqCisJICogWFhYIFRoaXMgYWxzbyBtZWFucyBzY2FucyBvbiBjYXRhbG9ncyB3b24ndCB1 c2UgcmVhZF9zdHJlYW0uCisJICovCiAJc3lzc2Nhbi0+aXNjYW4gPSBpbmRleF9iZWdpbnNj YW4oaGVhcFJlbGF0aW9uLCBpbmRleFJlbGF0aW9uLAotCQkJCQkJCQkJIHNuYXBzaG90LCBO VUxMLCBua2V5cywgMCk7CisJCQkJCQkJCQkgc25hcHNob3QsIE5VTEwsIG5rZXlzLCAwLCBm YWxzZSk7CiAJaW5kZXhfcmVzY2FuKHN5c3NjYW4tPmlzY2FuLCBpZHhrZXksIG5rZXlzLCBO VUxMLCAwKTsKIAlzeXNzY2FuLT5zY2FuID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRl eC9pbmRleGFtLmMKaW5kZXggMjE5ZGYxOTcxZGEuLjE5MGExMTJlNDU3IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCisrKyBiL3NyYy9iYWNrZW5k L2FjY2Vzcy9pbmRleC9pbmRleGFtLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlICJw b3N0Z3Jlcy5oIgogCiAjaW5jbHVkZSAiYWNjZXNzL2FtYXBpLmgiCisjaW5jbHVkZSAiYWNj ZXNzL25idHJlZS5oIgkJLyogWFhYIGZvciBNYXhUSURzUGVyQlRyZWVQYWdlIChzaG91bGQg cmVtb3ZlKSAqLwogI2luY2x1ZGUgImFjY2Vzcy9yZWxhdGlvbi5oIgogI2luY2x1ZGUgImFj Y2Vzcy9yZWxvcHRpb25zLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3JlbHNjYW4uaCIKQEAgLTU4 LDYgKzU5LDggQEAKICNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgiCiAjaW5jbHVkZSAidXRp bHMvc3lzY2FjaGUuaCIKIAorLyogZW5hYmxlIGJhdGNoaW5nIC8gcHJlZmV0Y2hpbmcgZHVy aW5nIGluZGV4IHNjYW5zICovCitib29sCQllbmFibGVfaW5kZXhzY2FuX2JhdGNoaW5nID0g ZmFsc2U7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQkJCQltYWNyb3MgdXNlZCBpbiBpbmRleF8g cm91dGluZXMKQEAgLTEwOSw2ICsxMTIsMzYgQEAgc3RhdGljIEluZGV4U2NhbkRlc2MgaW5k ZXhfYmVnaW5zY2FuX2ludGVybmFsKFJlbGF0aW9uIGluZGV4UmVsYXRpb24sCiAJCQkJCQkJ CQkJCSAgUGFyYWxsZWxJbmRleFNjYW5EZXNjIHBzY2FuLCBib29sIHRlbXBfc25hcCk7CiBz dGF0aWMgaW5saW5lIHZvaWQgdmFsaWRhdGVfcmVsYXRpb25fa2luZChSZWxhdGlvbiByKTsK IAorLyogaW5kZXggYmF0Y2hpbmcgKi8KK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNoX2luaXQo SW5kZXhTY2FuRGVzYyBzY2FuKTsKK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNoX3Jlc2V0KElu ZGV4U2NhbkRlc2Mgc2NhbiwgYm9vbCBjb21wbGV0ZSk7CitzdGF0aWMgdm9pZCBpbmRleF9i YXRjaF9lbmQoSW5kZXhTY2FuRGVzYyBzY2FuKTsKK3N0YXRpYyBib29sIGluZGV4X2JhdGNo X2dldG5leHQoSW5kZXhTY2FuRGVzYyBzY2FuKTsKK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNo X2ZyZWUoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFNjYW5CYXRjaCBiYXRjaCk7CitzdGF0 aWMgSXRlbVBvaW50ZXIgaW5kZXhfYmF0Y2hfZ2V0bmV4dF90aWQoSW5kZXhTY2FuRGVzYyBz Y2FuLAorCQkJCQkJCQkJCSAgIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKKworc3RhdGlj IEJsb2NrTnVtYmVyIGluZGV4X3NjYW5fc3RyZWFtX3JlYWRfbmV4dChSZWFkU3RyZWFtICpz dHJlYW0sCisJCQkJCQkJCQkJCSAgIHZvaWQgKmNhbGxiYWNrX3ByaXZhdGVfZGF0YSwKKwkJ CQkJCQkJCQkJICAgdm9pZCAqcGVyX2J1ZmZlcl9kYXRhKTsKKworc3RhdGljIGJvb2wgaW5k ZXhfYmF0Y2hfcG9zX2FkdmFuY2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFNjYW5CYXRj aFBvcyAqcG9zKTsKK3N0YXRpYyB2b2lkIGluZGV4X2JhdGNoX3Bvc19yZXNldChJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoUG9zICpwb3MpOworc3RhdGljIHZvaWQgaW5k ZXhfYmF0Y2hfa2lsbF9pdGVtKEluZGV4U2NhbkRlc2Mgc2Nhbik7CisKK3N0YXRpYyB2b2lk IEFzc2VydENoZWNrQmF0Y2hQb3NWYWxpZChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2Nh bkJhdGNoUG9zICpwb3MpOworc3RhdGljIHZvaWQgQXNzZXJ0Q2hlY2tCYXRjaChJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoIGJhdGNoKTsKK3N0YXRpYyB2b2lkIEFzc2Vy dENoZWNrQmF0Y2hlcyhJbmRleFNjYW5EZXNjIHNjYW4pOworCisKKyNkZWZpbmUgSU5ERVhf U0NBTl9CQVRDSChzY2FuLCBpZHgpCVwKKwkJKChzY2FuKS0+eHNfYmF0Y2hlcy0+YmF0Y2hl c1soaWR4KSAlIChzY2FuKS0+eHNfYmF0Y2hlcy0+bWF4QmF0Y2hlc10pCisKKyNpZmRlZiBJ TkRFWEFNX0RFQlVHCisjZGVmaW5lIERFQlVHX0xPRyguLi4pIGVsb2coV0FSTklORywgX19W QV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBERUJVR19MT0coLi4uKQorI2VuZGlmCiAKIC8q IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KICAqCQkJCSAgIGluZGV4XyBpbnRlcmZhY2UgZnVuY3Rpb25zCkBAIC0y NTAsNiArMjgzLDEwIEBAIGluZGV4X2luc2VydF9jbGVhbnVwKFJlbGF0aW9uIGluZGV4UmVs YXRpb24sCiAvKgogICogaW5kZXhfYmVnaW5zY2FuIC0gc3RhcnQgYSBzY2FuIG9mIGFuIGlu ZGV4IHdpdGggYW1nZXR0dXBsZQogICoKKyAqIGVuYWJsZV9iYXRjaGluZyBkZXRlcm1pbmVz IHdoZXRoZXIgdGhlIHNjYW4gc2hvdWxkIHRyeSB1c2luZyB0aGUgYmF0Y2hpbmcKKyAqIGlu dGVyZmFjZSAoYW1nZXRiYXRjaC9hbWZyZWViYXRjaCksIGlmIHN1cHBvcnRlZCBieSB0aGUg aW5kZXggQU0sIG9yIHRoZQorICogcmVndWxhciBhbWdldHR1cGxlIGludGVyZmFjZS4KKyAq CiAgKiBDYWxsZXIgbXVzdCBiZSBob2xkaW5nIHN1aXRhYmxlIGxvY2tzIG9uIHRoZSBoZWFw IGFuZCB0aGUgaW5kZXguCiAgKi8KIEluZGV4U2NhbkRlc2MKQEAgLTI1Nyw4ICsyOTQsMTAg QEAgaW5kZXhfYmVnaW5zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAkJCQlSZWxhdGlv biBpbmRleFJlbGF0aW9uLAogCQkJCVNuYXBzaG90IHNuYXBzaG90LAogCQkJCUluZGV4U2Nh bkluc3RydW1lbnRhdGlvbiAqaW5zdHJ1bWVudCwKLQkJCQlpbnQgbmtleXMsIGludCBub3Jk ZXJieXMpCisJCQkJaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlzLAorCQkJCWJvb2wgZW5hYmxl X2JhdGNoaW5nKQogeworCVJlYWRTdHJlYW0gKnJzID0gTlVMTDsKIAlJbmRleFNjYW5EZXNj IHNjYW47CiAKIAlBc3NlcnQoc25hcHNob3QgIT0gSW52YWxpZFNuYXBzaG90KTsKQEAgLTI3 Myw4ICszMTIsNDUgQEAgaW5kZXhfYmVnaW5zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwK IAlzY2FuLT54c19zbmFwc2hvdCA9IHNuYXBzaG90OwogCXNjYW4tPmluc3RydW1lbnQgPSBp bnN0cnVtZW50OwogCisJLyoKKwkgKiBJZiBleHBsaWNpdGx5IHJlcXVlc3RlZCBhbmQgc3Vw cG9ydGVkIGJ5IGJvdGggdGhlIGluZGV4IEFNIGFuZCB0aGUKKwkgKiBwbGFuLCBpbml0aWFs aXplIGJhdGNoaW5nIGluZm8uIFdlIG9ubHkgdXNlIHN0cmVhbSByZWFkIEFQSSB3aXRoCisJ ICogYmF0Y2hpbmcgZW5hYmxlZCAoc28gbm90IHdpdGggc3lzdGFibGUgc2NhbnMpLiBCdXQg bWF5YmUgd2Ugc2hvdWxkCisJICogY2hhbmdlIHRoYXQsIGFuZCBqdXN0IHVzZSBkaWZmZXJl bnQgcmVhZF9uZXh0IGNhbGxiYWNrcyAob3Igc29tZXRoaW5nCisJICogbGlrZSB0aGF0KT8K KwkgKgorCSAqIFhYWCBNYXliZSB3ZSBzaG91bGQgaGF2ZSBhIHNlcGFyYXRlICJhbWNhbmJh dGNoIiBjYWxsLCB0byBsZXQgdGhlIEFNCisJICogZGVjaWRlIGlmIGJhdGNoaW5nIGlzIHN1 cHBvcnRlZCBkZXBlbmRpbmcgb24gdGhlIHNjYW4gZGV0YWlscy4gVGhhdAorCSAqIG1pZ2h0 IGJlIG5lZWRlZCBmb3IgY2VydGFpbiBpbmRleCBBTXMsIHRoYXQgY2FuIGRvIGJhdGNoaW5n IG9ubHkgZm9yCisJICogc29tZSBzY2FucyAoSSdtIHRoaW5raW5nIGFib3V0IEdpU1QvU1At R2lTVCBpbmRleGVzLCB3aXRoIE9SREVSIEJZKS4KKwkgKgorCSAqIFhYWCBEbyB0aGlzIGJl Zm9yZSBpbml0aWFsaXppbmcgeHNfaGVhcGZldGNoLCBzbyB0aGF0IHdlIGNhbiBwYXNzIHRo ZQorCSAqIHJlYWQgc3RyZWFtIHRvIGl0LgorCSAqLworCWlmICgoaW5kZXhSZWxhdGlvbi0+ cmRfaW5kYW0tPmFtZ2V0YmF0Y2ggIT0gTlVMTCkgJiYKKwkJZW5hYmxlX2JhdGNoaW5nICYm CisJCWVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmcpCisJeworCQkvKgorCQkgKiBYWFggV2Ug ZG8gdGhpcyBhZnRlciBpbmRleF9iZWdpbnNjYW5faW50ZXJuYWwoKSwgd2hpY2ggbWVhbnMg d2UKKwkJICogY2FuJ3QgaW5pdCB0aGUgYmF0Y2ggc3RhdGUgaW4gdGhlcmUgKGl0IGRvZXNu J3QgZXZlbiBrbm93IGlmCisJCSAqIGJhdGNoaW5nIHdpbGwgYmUgdXNlZCBhdCB0aGF0IHBv aW50KS4gV2UgY2FuJ3QgaW5pdCB0aGUgcmVhZF9zdHJlYW0KKwkJICogdGhlcmUsIGJlY2F1 c2UgaXQgbmVlZHMgdGhlIGhlYXBSZWxhdGlvbi4KKwkJICovCisJCWluZGV4X2JhdGNoX2lu aXQoc2Nhbik7CisKKwkJLyogaW5pdGlhbGl6ZSBzdHJlYW0gKi8KKwkJcnMgPSByZWFkX3N0 cmVhbV9iZWdpbl9yZWxhdGlvbihSRUFEX1NUUkVBTV9ERUZBVUxULAorCQkJCQkJCQkJCU5V TEwsCisJCQkJCQkJCQkJaGVhcFJlbGF0aW9uLAorCQkJCQkJCQkJCU1BSU5fRk9SS05VTSwK KwkJCQkJCQkJCQlpbmRleF9zY2FuX3N0cmVhbV9yZWFkX25leHQsCisJCQkJCQkJCQkJc2Nh biwKKwkJCQkJCQkJCQkwKTsKKwl9CisKIAkvKiBwcmVwYXJlIHRvIGZldGNoIGluZGV4IG1h dGNoZXMgZnJvbSB0YWJsZSAqLwotCXNjYW4tPnhzX2hlYXBmZXRjaCA9IHRhYmxlX2luZGV4 X2ZldGNoX2JlZ2luKGhlYXBSZWxhdGlvbik7CisJc2Nhbi0+eHNfaGVhcGZldGNoID0gdGFi bGVfaW5kZXhfZmV0Y2hfYmVnaW4oaGVhcFJlbGF0aW9uLCBycyk7CiAKIAlyZXR1cm4gc2Nh bjsKIH0KQEAgLTMzNyw2ICs0MTMsMTIgQEAgaW5kZXhfYmVnaW5zY2FuX2ludGVybmFsKFJl bGF0aW9uIGluZGV4UmVsYXRpb24sCiAJc2Nhbi0+cGFyYWxsZWxfc2NhbiA9IHBzY2FuOwog CXNjYW4tPnhzX3RlbXBfc25hcCA9IHRlbXBfc25hcDsKIAorCS8qCisJICogTm8gYmF0Y2hp bmcgYnkgZGVmYXVsdCwgc28gc2V0IGl0IHRvIE5VTEwuIFdpbGwgYmUgaW5pdGlhbGl6ZWQg bGF0ZXIgaWYKKwkgKiBiYXRjaGluZyBpcyByZXF1ZXN0ZWQgYW5kIEFNIHN1cHBvcnRzIGl0 LgorCSAqLworCXNjYW4tPnhzX2JhdGNoZXMgPSBOVUxMOworCiAJcmV0dXJuIHNjYW47CiB9 CiAKQEAgLTM3MCw2ICs0NTIsMTkgQEAgaW5kZXhfcmVzY2FuKEluZGV4U2NhbkRlc2Mgc2Nh biwKIAlzY2FuLT5raWxsX3ByaW9yX3R1cGxlID0gZmFsc2U7IC8qIGZvciBzYWZldHkgKi8K IAlzY2FuLT54c19oZWFwX2NvbnRpbnVlID0gZmFsc2U7CiAKKwkvKgorCSAqIFJlc2V0IHRo ZSBiYXRjaGluZy4gVGhpcyBtYWtlcyBpdCBsb29rIGxpa2UgdGhlcmUgYXJlIG5vIGJhdGNo ZXMsCisJICogZGlzY2FyZHMgcmVhZHMgYWxyZWFkeSBzY2hlZHVsZWQgdG8gdGhlIHJlYWQg c3RyZWFtLCBldGMuCisJICoKKwkgKiBYWFggV2UgZG8gdGhpcyBiZWZvcmUgY2FsbGluZyBh bXJlc2Nhbiwgc28gdGhhdCBpdCBjb3VsZCByZWluaXRpYWxpemUKKwkgKiBldmVyeXRoaW5n ICh0aGlzIHByb2JhYmx5IGRvZXMgbm90IG1hdHRlciB2ZXJ5IG11Y2gsIG5vdyB0aGF0IHdl J3ZlCisJICogbW92ZWQgYWxsIHRoZSBiYXRjaGluZyBsb2dpYyB0byBpbmRleGFtLmMsIGl0 IHdhcyBtb3JlIGltcG9ydGFudCB3aGVuCisJICogdGhlIGluZGV4IEFNIHdhcyByZXNwb25z aWJsZSBmb3IgbW9yZSBvZiBpdCkuCisJICoKKwkgKiBYWFggTWF5YmUgdGhpcyBzaG91bGQg YWxzbyBoYXBwZW4gYmVmb3JlIHRhYmxlX2luZGV4X2ZldGNoX3Jlc2V0PworCSAqLworCWlu ZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIHRydWUpOworCiAJc2Nhbi0+aW5kZXhSZWxhdGlvbi0+ cmRfaW5kYW0tPmFtcmVzY2FuKHNjYW4sIGtleXMsIG5rZXlzLAogCQkJCQkJCQkJCQlvcmRl cmJ5cywgbm9yZGVyYnlzKTsKIH0KQEAgLTM4NCw2ICs0NzksOSBAQCBpbmRleF9lbmRzY2Fu KEluZGV4U2NhbkRlc2Mgc2NhbikKIAlTQ0FOX0NIRUNLUzsKIAlDSEVDS19TQ0FOX1BST0NF RFVSRShhbWVuZHNjYW4pOwogCisJLyogQ2xlYW51cCBiYXRjaGluZywgc28gdGhhdCB0aGUg QU0gY2FuIHJlbGVhc2UgcGlucyBhbmQgc28gb24uICovCisJaW5kZXhfYmF0Y2hfZW5kKHNj YW4pOworCiAJLyogUmVsZWFzZSByZXNvdXJjZXMgKGxpa2UgYnVmZmVyIHBpbnMpIGZyb20g dGFibGUgYWNjZXNzZXMgKi8KIAlpZiAoc2Nhbi0+eHNfaGVhcGZldGNoKQogCXsKQEAgLTQx NCw3ICs1MTIsNDYgQEAgaW5kZXhfbWFya3BvcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJU0NB Tl9DSEVDS1M7CiAJQ0hFQ0tfU0NBTl9QUk9DRURVUkUoYW1tYXJrcG9zKTsKIAotCXNjYW4t PmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbW1hcmtwb3Moc2Nhbik7CisJLyoKKwkgKiBX aXRob3V0IGJhdGNoaW5nLCBqdXN0IHVzZSB0aGUgYW1tYXJrcG9zKCkgY2FsbGJhY2suIFdp dGggYmF0Y2hpbmcKKwkgKiBldmVyeXRoaW5nIGlzIGhhbmRsZWQgYXQgdGhpcyBsYXllciwg d2l0aG91dCBjYWxsaW5nIHRoZSBBTS4KKwkgKi8KKwlpZiAoc2Nhbi0+eHNfYmF0Y2hlcyA9 PSBOVUxMKQorCXsKKwkJc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFtbWFya3Bv cyhzY2FuKTsKKwl9CisJZWxzZQorCXsKKwkJSW5kZXhTY2FuQmF0Y2hlcyAqYmF0Y2hlcyA9 IHNjYW4tPnhzX2JhdGNoZXM7CisJCUluZGV4U2NhbkJhdGNoUG9zICpwb3MgPSAmYmF0Y2hl cy0+bWFya1BvczsKKwkJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaCA9IGJhdGNoZXMtPm1h cmtCYXRjaDsKKworCQkvKgorCQkgKiBGcmVlIHRoZSBwcmV2aW91cyBtYXJrIGJhdGNoIChp ZiBhbnkpLCBidXQgb25seSBpZiB0aGUgYmF0Y2ggaXMgbm8KKwkJICogbG9uZ2VyIHZhbGlk IChpbiB0aGUgY3VycmVudCBmaXJzdC9uZXh0IHJhbmdlKS4gVGhpcyBtZWFucyB0aGF0IGlm CisJCSAqIHdlJ3JlIG1hcmtpbmcgdGhlIHNhbWUgYmF0Y2ggKGRpZmZlcmVudCBpdGVtKSwg d2UgZG9uJ3QgcmVhbGx5IGRvCisJCSAqIGFueXRoaW5nLgorCQkgKgorCQkgKiBYWFggU2hv dWxkIGhhdmUgc29tZSBtYWNybyBmb3IgdGhpcyBjaGVjaywgSSBndWVzcy4KKwkJICovCisJ CWlmICgoYmF0Y2ggIT0gTlVMTCkgJiYKKwkJCShwb3MtPmJhdGNoIDwgYmF0Y2hlcy0+Zmly c3RCYXRjaCB8fCBwb3MtPmJhdGNoID49IGJhdGNoZXMtPm5leHRCYXRjaCkpCisJCXsKKwkJ CWJhdGNoZXMtPm1hcmtCYXRjaCA9IE5VTEw7CisJCQlpbmRleF9iYXRjaF9mcmVlKHNjYW4s IGJhdGNoKTsKKwkJfQorCisJCS8qIGp1c3QgY29weSB0aGUgcmVhZCBwb3NpdGlvbiAod2hp Y2ggaGFzIHRvIGJlIHZhbGlkKSAqLworCQliYXRjaGVzLT5tYXJrUG9zID0gYmF0Y2hlcy0+ cmVhZFBvczsKKwkJYmF0Y2hlcy0+bWFya0JhdGNoID0gSU5ERVhfU0NBTl9CQVRDSChzY2Fu LCBiYXRjaGVzLT5tYXJrUG9zLmJhdGNoKTsKKworCQkvKgorCQkgKiBGSVhNRSB3ZSBuZWVk IHRvIG1ha2Ugc3VyZSB0aGUgYmF0Y2ggZG9lcyBub3QgZ2V0IGZyZWVkIGR1cmluZyB0aGUK KwkJICogcmVndWxhciBhZHZhbmNlcy4KKwkJICovCisKKwkJQXNzZXJ0Q2hlY2tCYXRjaFBv c1ZhbGlkKHNjYW4sICZiYXRjaGVzLT5tYXJrUG9zKTsKKwl9CiB9CiAKIC8qIC0tLS0tLS0t LS0tLS0tLS0KQEAgLTQ0Nyw3ICs1ODQsNTggQEAgaW5kZXhfcmVzdHJwb3MoSW5kZXhTY2Fu RGVzYyBzY2FuKQogCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBmYWxzZTsgLyogZm9yIHNh ZmV0eSAqLwogCXNjYW4tPnhzX2hlYXBfY29udGludWUgPSBmYWxzZTsKIAotCXNjYW4tPmlu ZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbXJlc3RycG9zKHNjYW4pOworCS8qCisJICogV2l0 aG91dCBiYXRjaGluZywganVzdCB1c2UgdGhlIGFtcmVzdHJwb3MoKSBjYWxsYmFjay4gV2l0 aCBiYXRjaGluZworCSAqIGV2ZXJ5dGhpbmcgaXMgaGFuZGxlZCBhdCB0aGlzIGxheWVyLCB3 aXRob3V0IGNhbGxpbmcgdGhlIEFNLgorCSAqLworCWlmIChzY2FuLT54c19iYXRjaGVzID09 IE5VTEwpCisJCXNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbXJlc3RycG9zKHNj YW4pOworCWVsc2UKKwl7CisJCUluZGV4U2NhbkJhdGNoZXMgKmJhdGNoZXMgPSBzY2FuLT54 c19iYXRjaGVzOworCQlJbmRleFNjYW5CYXRjaFBvcyAqcG9zID0gJmJhdGNoZXMtPm1hcmtQ b3M7CisJCUluZGV4U2NhbkJhdGNoRGF0YSAqYmF0Y2ggPSBzY2FuLT54c19iYXRjaGVzLT5t YXJrQmF0Y2g7CisKKwkJQXNzZXJ0KGJhdGNoICE9IE5VTEwpOworCisJCS8qCisJCSAqIFhY WCBUaGUgcG9zIGNhbiBiZSBpbnZhbGlkLCBpZiB3ZSBhbHJlYWR5IGFkdmFuY2VkIHBhc3Qg dGhlIHRoZQorCQkgKiBtYXJrZWQgYmF0Y2ggKGFuZCBzdGFzaGVkIGl0IGluIG1hcmtCYXRj aCBpbnN0ZWFkIG9mIGZyZWVpbmcpLiBTbworCQkgKiB0aGlzIGFzc2VydCB3b3VsZCBiZSBp bmNvcnJlY3QuCisJCSAqLworCQkvKiBBc3NlcnRDaGVja0JhdGNoUG9zVmFsaWQoc2Nhbiwg JnBvcyk7ICovCisKKwkJLyogRklYTUUgd2Ugc2hvdWxkIHN0aWxsIGNoZWNrIHRoZSBiYXRj aCB3YXMgbm90IGZyZWVkIHlldCAqLworCisJCS8qCisJCSAqIFJlc2V0IHRoZSBiYXRjaGlu ZyBzdGF0ZSwgZXhjZXB0IGZvciB0aGUgbWFya2VkIGJhdGNoLCBhbmQgbWFrZSBpdAorCQkg KiBsb29rIGxpa2Ugd2UgaGF2ZSBhIHNpbmdsZSBiYXRjaCAtIHRoZSBtYXJrZWQgb25lLgor CQkgKgorCQkgKiBYWFggVGhpcyBzZWVtcyBhIGJpdCB1Z2x5IC8gaGFja3ksIG1heWJlIHRo ZXJlJ3MgYSBtb3JlIGVsZWdhbnQgd2F5CisJCSAqIHRvIGRvIHRoaXM/CisJCSAqLworCQlp bmRleF9iYXRjaF9yZXNldChzY2FuLCBmYWxzZSk7CisKKwkJYmF0Y2hlcy0+bWFya1BvcyA9 ICpwb3M7CisJCWJhdGNoZXMtPnJlYWRQb3MgPSAqcG9zOworCQliYXRjaGVzLT5maXJzdEJh dGNoID0gcG9zLT5iYXRjaDsKKwkJYmF0Y2hlcy0+bmV4dEJhdGNoID0gKGJhdGNoZXMtPmZp cnN0QmF0Y2ggKyAxKTsKKworCQlJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIGJhdGNoZXMtPm1h cmtQb3MuYmF0Y2gpID0gYmF0Y2g7CisKKwkJLyoKKwkJICogWFhYIEkgcmVhbGx5IGRpc2xp a2UgdGhhdCB3ZSBoYXZlIHNvIG1hbnkgZGVmaW5pdGlvbnMgb2YgImN1cnJlbnQiCisJCSAq IGJhdGNoLiBXZSBoYXZlIHJlYWRQb3MsIHN0cmVhbVBvcywgY3VycmVudEJhdGNoLCAuLi4g c2VlbXMgdmVyeSBhZAorCQkgKiBob2MgLSBJIGp1c3QgYWRkZWQgYSBuZXcgImN1cnJlbnQi IGZpZWxkIHdoZW4gSSBuZWVkZWQgb25lLiBXZQorCQkgKiBzaG91bGQgbWFrZSB0aGF0IHNv bWV3aGF0IG1vcmUgY29uc2lzdGVudCwgb3IgYXQgbGVhc3QgZXhwbGFpbiBpdAorCQkgKiBj bGVhcmx5IHNvbWV3aGVyZS4KKwkJICoKKwkJICogWFhYIERvIHdlIGV2ZW4gbmVlZCBjdXJy ZW50QmF0Y2g/IEl0J3Mgbm90IGFjY2Vzc2VkIGFueXdoZXJlLCBhdAorCQkgKiBsZWFzdCBu b3QgaW4gdGhpcyBwYXRjaC4KKwkJICovCisJCS8vIGJhdGNoZXMtPmN1cnJlbnRCYXRjaCA9 IGJhdGNoOworCQliYXRjaGVzLT5tYXJrQmF0Y2ggPSBiYXRjaDsgLyogYWxzbyByZW1lbWJl ciB0aGlzICovCisJfQogfQogCiAvKgpAQCAtNTY5LDYgKzc1NywxOCBAQCBpbmRleF9wYXJh bGxlbHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAJaWYgKHNjYW4tPnhzX2hlYXBmZXRj aCkKIAkJdGFibGVfaW5kZXhfZmV0Y2hfcmVzZXQoc2Nhbi0+eHNfaGVhcGZldGNoKTsKIAor CS8qCisJICogUmVzZXQgdGhlIGJhdGNoaW5nLiBUaGlzIG1ha2VzIGl0IGxvb2sgbGlrZSB0 aGVyZSBhcmUgbm8gYmF0Y2hlcywKKwkgKiBkaXNjYXJkcyByZWFkcyBhbHJlYWR5IHNjaGVk dWxlZCB0byB0aGUgcmVhZCBzdHJlYW0sIGV0Yy4gV2UgRG8gdGhpcworCSAqIGJlZm9yZSBj YWxsaW5nIGFtcmVzY2FuLCBzbyB0aGF0IGl0IGNhbiByZWluaXRpYWxpemUgZXZlcnl0aGlu Zy4KKwkgKgorCSAqIFhYWCBXZSBkbyB0aGlzIGJlZm9yZSBjYWxsaW5nIGFtcGFyYWxsZWxy ZXNjYW4sIHNvIHRoYXQgaXQgY291bGQKKwkgKiByZWluaXRpYWxpemUgZXZlcnl0aGluZyAo dGhpcyBwcm9iYWJseSBkb2VzIG5vdCBtYXR0ZXIgdmVyeSBtdWNoLCBub3cKKwkgKiB0aGF0 IHdlJ3ZlIG1vdmVkIGFsbCB0aGUgYmF0Y2hpbmcgbG9naWMgdG8gaW5kZXhhbS5jLCBpdCB3 YXMgbW9yZQorCSAqIGltcG9ydGFudCB3aGVuIHRoZSBpbmRleCBBTSB3YXMgcmVzcG9uc2li bGUgZm9yIG1vcmUgb2YgaXQpLgorCSAqLworCWluZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIHRy dWUpOworCiAJLyogYW1wYXJhbGxlbHJlc2NhbiBpcyBvcHRpb25hbDsgYXNzdW1lIG5vLW9w IGlmIG5vdCBwcm92aWRlZCBieSBBTSAqLwogCWlmIChzY2FuLT5pbmRleFJlbGF0aW9uLT5y ZF9pbmRhbS0+YW1wYXJhbGxlbHJlc2NhbiAhPSBOVUxMKQogCQlzY2FuLT5pbmRleFJlbGF0 aW9uLT5yZF9pbmRhbS0+YW1wYXJhbGxlbHJlc2NhbihzY2FuKTsKQEAgLTU4MywxMCArNzgz LDEyIEBAIEluZGV4U2NhbkRlc2MKIGluZGV4X2JlZ2luc2Nhbl9wYXJhbGxlbChSZWxhdGlv biBoZWFwcmVsLCBSZWxhdGlvbiBpbmRleHJlbCwKIAkJCQkJCSBJbmRleFNjYW5JbnN0cnVt ZW50YXRpb24gKmluc3RydW1lbnQsCiAJCQkJCQkgaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlz LAotCQkJCQkJIFBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwc2NhbikKKwkJCQkJCSBQYXJhbGxl bEluZGV4U2NhbkRlc2MgcHNjYW4sCisJCQkJCQkgYm9vbCBlbmFibGVfYmF0Y2hpbmcpCiB7 CiAJU25hcHNob3QJc25hcHNob3Q7CiAJSW5kZXhTY2FuRGVzYyBzY2FuOworCVJlYWRTdHJl YW0gKnJzID0gTlVMTDsKIAogCUFzc2VydChSZWxGaWxlTG9jYXRvckVxdWFscyhoZWFwcmVs LT5yZF9sb2NhdG9yLCBwc2Nhbi0+cHNfbG9jYXRvcikpOwogCUFzc2VydChSZWxGaWxlTG9j YXRvckVxdWFscyhpbmRleHJlbC0+cmRfbG9jYXRvciwgcHNjYW4tPnBzX2luZGV4bG9jYXRv cikpOwpAQCAtNjA0LDggKzgwNiw0OCBAQCBpbmRleF9iZWdpbnNjYW5fcGFyYWxsZWwoUmVs YXRpb24gaGVhcHJlbCwgUmVsYXRpb24gaW5kZXhyZWwsCiAJc2Nhbi0+eHNfc25hcHNob3Qg PSBzbmFwc2hvdDsKIAlzY2FuLT5pbnN0cnVtZW50ID0gaW5zdHJ1bWVudDsKIAorCS8qCisJ ICogSWYgZXhwbGljaXRseSByZXF1ZXN0ZWQgYW5kIHN1cHBvcnRlZCBieSBib3RoIHRoZSBp bmRleCBBTSBhbmQgdGhlCisJICogcGxhbiwgaW5pdGlhbGl6ZSBiYXRjaGluZyBpbmZvLiBX ZSBvbmx5IHVzZSBzdHJlYW0gcmVhZCBBUEkgd2l0aAorCSAqIGJhdGNoaW5nIGVuYWJsZWQg KHNvIG5vdCB3aXRoIHN5c3RhYmxlIHNjYW5zKS4gQnV0IG1heWJlIHdlIHNob3VsZAorCSAq IGNoYW5nZSB0aGF0LCBhbmQganVzdCB1c2UgZGlmZmVyZW50IHJlYWRfbmV4dCBjYWxsYmFj a3MgKG9yIHNvbWV0aGluZworCSAqIGxpa2UgdGhhdCk/CisJICoKKwkgKiBYWFggTWF5YmUg d2Ugc2hvdWxkIGhhdmUgYSBzZXBhcmF0ZSAiYW1jYW5iYXRjaCIgY2FsbCwgdG8gbGV0IHRo ZSBBTQorCSAqIGRlY2lkZSBpZiBiYXRjaGluZyBpcyBzdXBwb3J0ZWQgZGVwZW5kaW5nIG9u IHRoZSBzY2FuIGRldGFpbHMuIFRoYXQKKwkgKiBtaWdodCBiZSBuZWVkZWQgZm9yIGNlcnRh aW4gaW5kZXggQU1zLCB0aGF0IGNhbiBkbyBiYXRjaGluZyBvbmx5IGZvcgorCSAqIHNvbWUg c2NhbnMgKEknbSB0aGlua2luZyBhYm91dCBHaVNUL1NQLUdpU1QgaW5kZXhlcywgd2l0aCBP UkRFUiBCWSkuCisJICoKKwkgKiBYWFggRG8gdGhpcyBiZWZvcmUgaW5pdGlhbGl6aW5nIHhz X2hlYXBmZXRjaCwgc28gdGhhdCB3ZSBjYW4gcGFzcyB0aGUKKwkgKiByZWFkIHN0cmVhbSB0 byBpdC4KKwkgKgorCSAqIFhYWCBQcmV0dHkgZHVwbGljYXRlIHdpdGggdGhlIGNvZGUgaW4g aW5kZXhfYmVnaW5zY2FuKCksIHNvIG1heWJlIG1vdmUKKwkgKiBpbnRvIGEgc2hhcmVkIGZ1 bmN0aW9uLgorCSAqLworCWlmICgoaW5kZXhyZWwtPnJkX2luZGFtLT5hbWdldGJhdGNoICE9 IE5VTEwpICYmCisJCWVuYWJsZV9iYXRjaGluZyAmJgorCQllbmFibGVfaW5kZXhzY2FuX2Jh dGNoaW5nKQorCXsKKwkJLyoKKwkJICogWFhYIFdlIGRvIHRoaXMgYWZ0ZXIgaW5kZXhfYmVn aW5zY2FuX2ludGVybmFsKCksIHdoaWNoIG1lYW5zIHdlCisJCSAqIGNhbid0IGluaXQgdGhl IGJhdGNoIHN0YXRlIGluIHRoZXJlIChpdCBkb2Vzbid0IGV2ZW4ga25vdyBpZgorCQkgKiBi YXRjaGluZyB3aWxsIGJlIHVzZWQgYXQgdGhhdCBwb2ludCkuIFdlIGNhbid0IGluaXQgdGhl IHJlYWRfc3RyZWFtCisJCSAqIHRoZXJlLCBiZWNhdXNlIGl0IG5lZWRzIHRoZSBoZWFwUmVs YXRpb24uCisJCSAqLworCQlpbmRleF9iYXRjaF9pbml0KHNjYW4pOworCisJCS8qIGluaXRp YWxpemUgc3RyZWFtICovCisJCXJzID0gcmVhZF9zdHJlYW1fYmVnaW5fcmVsYXRpb24oUkVB RF9TVFJFQU1fREVGQVVMVCwKKwkJCQkJCQkJCQlOVUxMLAorCQkJCQkJCQkJCWhlYXByZWws CisJCQkJCQkJCQkJTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCWluZGV4X3NjYW5fc3RyZWFt X3JlYWRfbmV4dCwKKwkJCQkJCQkJCQlzY2FuLAorCQkJCQkJCQkJCTApOworCX0KKwogCS8q IHByZXBhcmUgdG8gZmV0Y2ggaW5kZXggbWF0Y2hlcyBmcm9tIHRhYmxlICovCi0Jc2Nhbi0+ eHNfaGVhcGZldGNoID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4oaGVhcHJlbCk7CisJc2Nh bi0+eHNfaGVhcGZldGNoID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4oaGVhcHJlbCwgcnMp OwogCiAJcmV0dXJuIHNjYW47CiB9CkBAIC02MjgsNiArODcwLDI3IEBAIGluZGV4X2dldG5l eHRfdGlkKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pCiAJ LyogWFhYOiB3ZSBzaG91bGQgYXNzZXJ0IHRoYXQgYSBzbmFwc2hvdCBpcyBwdXNoZWQgb3Ig cmVnaXN0ZXJlZCAqLwogCUFzc2VydChUcmFuc2FjdGlvbklkSXNWYWxpZChSZWNlbnRYbWlu KSk7CiAKKwkvKgorCSAqIFdoZW4gdXNpbmcgYmF0Y2hpbmcgKHdoaWNoIG1heSBiZSBkaXNh YmxlZCBmb3IgdmFyaW91cyByZWFzb25zIC0gZS5nLgorCSAqIHRocm91Z2ggYSBHVUMsIHRo ZSBpbmRleCBBTSBub3Qgc3VwcG9ydGluZyBpdCksIHJlZGlyZWN0IHRoZSBjb2RlIHRvCisJ ICogdGhlICJiYXRjaCIgdmFyaWFudC4gSWYgbmVlZGVkIChlLmcuIGZvciB0aGUgZmlyc3Qg Y2FsbCkgdGhlIGNhbGwgbWF5CisJICogcmVhZCB0aGUgbmV4dCBiYXRjaCAobGVhZiBwYWdl KSBmcm9tIHRoZSBpbmRleCAoYnV0IHRoYXQncyBkcml2ZW4gYnkKKwkgKiB0aGUgcmVhZCBz dHJlYW0pLgorCSAqCisJICogWFhYIE1heWJlIHdlIHNob3VsZCBlbmFibGUgYmF0Y2hpbmcg YmFzZWQgb24gdGhlIHBsYW4gdG9vLCBzbyB0aGF0IHdlCisJICogZG9uJ3QgZG8gYmF0Y2hp bmcgd2hlbiBpdCdzIHByb2JhYmx5IHVzZWxlc3MgKGUuZy4gc2VtaWpvaW5zIG9yIHF1ZXJp ZXMKKwkgKiB3aXRoIExJTUlUIDEgZXRjLikuIFRoZSBhbWNhbmJhdGNoKCkgY2FsbGJhY2sg bWlnaHQgY29uc2lkZXIgdGhpbmdzCisJICogbGlrZSB0aGF0LCBvciBtYXliZSB0aGF0IHNo b3VsZCBiZSBjb25zaWRlcmVkIG91dHNpZGUgQU0uIEhvd2V2ZXIsIHRoZQorCSAqIHNsb3cg cmFtcC11cCAoc3RhcnRpbmcgd2l0aCBzbWFsbCBiYXRjaGVzKSBpbiByZWFkX3N0cmVhbSBz aG91bGQgaGFuZGxlCisJICogdGhpcyB3ZWxsIGVub3VnaC4KKwkgKgorCSAqIFhYWCBQZXJo YXBzIGl0J2QgYmUgcG9zc2libGUgdG8gZG8gYm90aCBpbiBpbmRleF9nZXRuZXh0X3Nsb3Qo KSwgaS5lLgorCSAqIGNhbGwgZWl0aGVyIHRoZSBvcmlnaW5hbCBjb2RlIHdpdGhvdXQgYmF0 Y2hpbmcsIG9yIHRoZSBuZXcgYmF0Y2hpbmcKKwkgKiBjb2RlIGlmIHN1cHBvcnRlZC9lbmFi bGVkLiBJdCdzIG5vdCBncmVhdCB0byBoYXZlIGR1cGxpY2F0ZWQgY29kZS4KKwkgKi8KKwlp ZiAoc2Nhbi0+eHNfYmF0Y2hlcyAhPSBOVUxMKQorCQlyZXR1cm4gaW5kZXhfYmF0Y2hfZ2V0 bmV4dF90aWQoc2NhbiwgZGlyZWN0aW9uKTsKKwogCS8qCiAJICogVGhlIEFNJ3MgYW1nZXR0 dXBsZSBwcm9jIGZpbmRzIHRoZSBuZXh0IGluZGV4IGVudHJ5IG1hdGNoaW5nIHRoZSBzY2Fu CiAJICoga2V5cywgYW5kIHB1dHMgdGhlIFRJRCBpbnRvIHNjYW4tPnhzX2hlYXB0aWQuICBJ dCBzaG91bGQgYWxzbyBzZXQKQEAgLTY5NCw5ICs5NTcsMjIgQEAgaW5kZXhfZmV0Y2hfaGVh cChJbmRleFNjYW5EZXNjIHNjYW4sIFR1cGxlVGFibGVTbG90ICpzbG90KQogCSAqIGFtZ2V0 dHVwbGUgY2FsbCwgaW4gaW5kZXhfZ2V0bmV4dF90aWQpLiAgV2UgZG8gbm90IGRvIHRoaXMg d2hlbiBpbgogCSAqIHJlY292ZXJ5IGJlY2F1c2UgaXQgbWF5IHZpb2xhdGUgTVZDQyB0byBk byBzby4gIFNlZSBjb21tZW50cyBpbgogCSAqIFJlbGF0aW9uR2V0SW5kZXhTY2FuKCkuCisJ ICoKKwkgKiBYWFggRm9yIHNjYW5zIHVzaW5nIGJhdGNoaW5nLCByZWNvcmQgdGhlIGZsYWcg aW4gdGhlIGJhdGNoICh3ZSB3aWxsCisJICogcGFzcyBpdCB0byB0aGUgQU0gbGF0ZXIsIHdo ZW4gZnJlZWluZyBpdCkuIE90aGVyd2lzZSBqdXN0IHBhc3MgaXQgdG8KKwkgKiB0aGUgQU0g dXNpbmcgdGhlIGtpbGxfcHJpb3JfdHVwbGUgZmllbGQuCiAJICovCiAJaWYgKCFzY2FuLT54 YWN0U3RhcnRlZEluUmVjb3ZlcnkpCi0JCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBhbGxf ZGVhZDsKKwl7CisJCWlmIChzY2FuLT54c19iYXRjaGVzID09IE5VTEwpCisJCXsKKwkJCXNj YW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBhbGxfZGVhZDsKKwkJfQorCQllbHNlIGlmIChhbGxf ZGVhZCkKKwkJeworCQkJaW5kZXhfYmF0Y2hfa2lsbF9pdGVtKHNjYW4pOworCQl9CisJfQog CiAJcmV0dXJuIGZvdW5kOwogfQpAQCAtMTA4NCwzICsxMzYwLDEwOTQgQEAgaW5kZXhfb3Bj bGFzc19vcHRpb25zKFJlbGF0aW9uIGluZHJlbCwgQXR0ck51bWJlciBhdHRudW0sIERhdHVt IGF0dG9wdGlvbnMsCiAKIAlyZXR1cm4gYnVpbGRfbG9jYWxfcmVsb3B0aW9ucygmcmVsb3B0 cywgYXR0b3B0aW9ucywgdmFsaWRhdGUpOwogfQorCisvKgorICogSU5ERVggQkFUQ0hJTkcg KEFORCBQUkVGRVRDSElORykKKyAqCisgKiBUaGUgdHJhZGl0aW9uYWwgQU0gaW50ZXJmYWNl IChhbWdldHR1cGxlKSBpcyBkZXNpZ25lZCB0byB3YWxrIHRoZSBpbmRleCBvbmUKKyAqIGxl YWYgcGFnZSBhdCBhIHRpbWUsIGFuZCB0aGUgc3RhdGUgKHJlcHJlc2VudGluZyB0aGUgbGVh ZiBwYWdlKSBpcyBtYW5hZ2VkCisgKiBieSB0aGUgQU0gaW1wbGVtZW50YXRpb24uIEJlZm9y ZSBhZHZhbmNpbmcgdG8gdGhlIG5leHQgbGVhZiBwYWdlLCB0aGUgaW5kZXgKKyAqIEFNIGZv cmdldHMgdGhlICJjdXJyZW50IiBsZWFmIHBhZ2UuIFRoaXMgbWFrZXMgaXQgaW1wb3NzaWJs ZSB0byBpbXBsZW1lbnQKKyAqIGZlYXR1cmVzIHRoYXQgb3BlcmF0ZSBvbiBtdWx0aXBsZSBs ZWFmIHBhZ2VzIC0gbGlrZSBmb3IgZXhhbXBsZSBwcmVmZXRjaC4KKyAqCisgKiBUaGUgYmF0 Y2hpbmcgcmVsYXhlcyB0aGlzIGJ5IGV4dGVuZGluZyB0aGUgQU0gQVBJIHdpdGggdHdvIG5l dyBtZXRob2RzLAorICogYW1nZXRiYXRjaCBhbmQgYW1mcmVlYmF0Y2gsIHRoYXQgc2VwYXJh dGUgdGhlICJhZHZhbmNlIiB0byB0aGUgbmV4dCBsZWFmCisgKiBwYWdlLCBhbmQgImZvcmdl dHRpbmciIHRoZSBwcmV2aW91cyBvbmUuIFRoaXMgbWVhbnMgdGhlcmUgbWF5IGJlIG11bHRp cGxlCisgKiBsZWFmIHBhZ2VzIGxvYWRlZCBhdCBvbmNlLCBpZiBuZWNlc3NhcnkuIEl0J3Mg YSBiaXQgbGlrZSBoYXZpbmcgbXVsdGlwbGUKKyAqICJwb3NpdGlvbnMiIHdpdGhpbiB0aGUg aW5kZXguCisgKgorICogVGhlIEFNIGlzIG5vIGxvbmdlciByZXNwb25zaWJsZSBmb3IgbWFu YWdlbWVudCBvZiB0aGVzZSAiYmF0Y2hlcyIgLSBvbmNlCisgKiBhIGJhdGNoIGlzIHJldHVy bmVkIGZyb20gYW1nZXRiYXRjaCgpLCBpdCdzIHVwIHRvIGluZGV4YW0uYyB0byBkZXRlcm1p bmUKKyAqIHdoZW4gaXQncyBubyBsb25nZXIgbmVjZXNzYXJ5LCBhbmQgY2FsbCBhbWZyZWVi YXRjaCgpLiBUaGF0IGlzLCB0aGUgQU0KKyAqIGNhbiBubyBsb25nZXIgZGlzY2FyZCBhIGxl YWYgcGFnZSB3aGVuIGFkdmFuY2luZyB0byB0aGUgbmV4dCBvbmUuCisgKgorICogVGhpcyBh bGxvd3Mgb3BlcmF0aW5nIG9uICJmdXR1cmUiIGluZGV4IGVudHJpZXMsIGUuZy4gdG8gcHJl ZmV0Y2ggdHVwbGVzCisgKiBmcm9tIHRoZSB0YWJsZS4gV2l0aG91dCB0aGUgYmF0Y2hpbmcs IHdlIGNvdWxkIGRvIHRoaXMgd2l0aGluIHRoZSBzaW5nbGUKKyAqIGxlYWYgcGFnZSwgd2hp Y2ggaGFzIGxpbWl0YXRpb25zLCBlLmcuIGluYWJpbGl0eSB0byBwcmVmZXRjaCBiZXlvbmQg dGhlCisgKiBvZiB0aGUgY3VycmVudCBsZWFmIHBhZ2UsIGFuZCB0aGUgcHJlZmV0Y2ggZGlz dGFuY2UgZHJvcCB0byAwLiAoTW9zdAorICogaW5kZXhlcyBoYXZlIG1hbnkgaW5kZXggaXRl bXMgcGVyIGxlYWYgcGFnZSwgc28gdGhlIHByZWZldGNoaW5nIHdvdWxkCisgKiBiZSBiZW5l ZmljaWFsIGV2ZW4gd2l0aCB0aGlzIGxpbWl0YXRpb24sIGJ1dCBpdCdzIG5vdCBncmVhdCBl aXRoZXIuKQorICoKKyAqIE1vdmluZyB0aGUgYmF0Y2ggbWFuYWdlbWVudCB0byB0aGUgaW5k ZXhhbS5jIGFsc28gbWVhbnMgZGVmaW5pbmcgYSBjb21tb24KKyAqIGJhdGNoIHN0YXRlLCBp bnN0ZWFkIG9mIGVhY2ggaW5kZXggQU0gZGVmaW5pbmcgaXQncyBvd24gb3BhcXVlIHN0YXRl LiBUaGUKKyAqIEFNIG1lcmVseSAiZmlsbHMiIHRoZSBiYXRjaCwgYW5kIGV2ZXJ5dGhpbmcg ZWxzZSBpcyBoYW5kbGVkIGJ5IGNvZGUgaW4KKyAqIGluZGV4YW0uYyAoc28gbm90IEFNLXNw ZWNpZmljKS4gSW5jbHVkaW5nIHByZWZldGNoaW5nLgorICoKKyAqIFdpdGhvdXQgdGhpcyAi Y29tbW9uIiBiYXRjaCBkZWZpbml0aW9uLCBlYWNoIEFNIHdvdWxkIG5lZWQgdG8gZG8gYSBm YWlyCisgKiBiaXQgb2YgdGhlIHByZWZldGNoaW5nIG9uIGl0J3Mgb3duLgorICoKKyAqCisg KiBub3RlOiBTdHJpY3RseSBzcGVha2luZywgdGhlIEFNIG1heSBrZWVwIGEgc2Vjb25kIGxl YWYgcGFnZSBiZWNhdXNlIG9mCisgKiBtYXJrL3Jlc3RvcmUgbWF5LCBidXQgdGhhdCdzIGEg bWlub3IgZGV0YWlsLgorICoKKyAqIG5vdGU6IFRoZXJlIGFyZSBkaWZmZXJlbnQgZGVmaW5p dGlvbnMgb2YgImJhdGNoIiAtIEkgdXNlIGl0IGFzIGEgc3lub255bQorICogZm9yIGEgbGVh ZiBwYWdlLCBvciB0aGUgaW5kZXggdHVwbGVzIHJlYWQgZnJvbSBvbmUgbGVhZiBwYWdlLiBP dGhlcnMgdXNlCisgKiAiYmF0Y2giIHdoZW4gdGFsa2luZyBhYm91dCBhbGwgdGhlIGxlYWYg cGFnZXMga2VwdCBpbiBtZW1vcnkgYXQgYSBnaXZlbgorICogbW9tZW50IGluIHRpbWUgKHNv IGluIGEgd2F5LCB0aGVyZSdzIGEgc2luZ2xlIGJhdGNoLCBjaGFuZ2luZyBvdmVyIHRpbWUp LgorICogSXQncyBub3QgbXkgYW1iaXRpb24gdG8gcHJlc2VudCBhIGJpbmRpbmcgZGVmaW5p dGlvbiBvZiBhIGJhdGNoLCBidXQgaXQncworICogZ29vZCB0byBjb25zaWRlciB0aGlzIHdo ZW4gcmVhZGluZyBjb21tZW50cyBieSBvdGhlciBwZW9wbGUuCisgKgorICogbm90ZTogSW4g dGhlb3J5LCBob3cgdGhlIGJhdGNoIG1hcHMgdG8gbGVhZiBwYWdlcyBpcyBtb3N0bHkgdXAg dG8gdGhlIGluZGV4CisgKiBBTSAtIGFzIGxvbmcgYXMgaXQgY2FuICJhZHZhbmNlIiBiZXR3 ZWVuIGJhdGNoZXMsIGV0Yy4gaXQgY291bGQgdXNlIGJhdGNoZXMKKyAqIHRoYXQgcmVwcmVz ZW50IGEgc3Vic2V0IG9mIGEgbGVhZiBwYWdlLCBvciBtdWx0aXBsZSBsZWFmIHBhZ2VzIGF0 IG9uY2UuCisgKgorICogbm90ZTogT3IgbWF5YmUgaXQgZG9lc24ndCBuZWVkIHRvIG1hcCB0 byBsZWFmIHBhZ2VzIGF0IGFsbCwgYXQgbGVhc3Qgbm90CisgKiBpbiBhIHNpbXBsZSB3YXku IENvbnNpZGVyIGZvciBleGFtcGxlIG9yZGVyZWQgc2NhbnMgb24gU1AtR2lTVCBpbmRleGVz LAorICogb3Igc2ltaWxhciBjYXNlcy4gSSB0aGluayB0aGF0IGNvdWxkIGJlIGhhbmRsZWQg YnkgaGF2aW5nICJhYnN0cmFjdCIKKyAqIGJhdGNoZXMgLSBzdWNoIGluZGV4ZXMgZG9uJ3Qg c3VwcG9ydCBtYXJrL3Jlc3RvcmUgb3IgY2hhbmdpbmcgZGlyZWN0aW9uLAorICogc28gdGhp cyBzaG91bGQgYmUgT0suCisgKgorICogbm90ZTogV2hlbiB0aGlua2luZyBhYm91dCBhbiBp bmRleCBBTSwgdGhpbmsgYWJvdXQgQlRSRUUsIHVubGVzcyBhbm90aGVyCisgKiBBTSBpcyBt ZW50aW9uZWQgZXhwbGljaXRseS4gTW9zdCBBTXMgYXJlIGJhc2VkIG9uIC8gZGVyaXZlZCBm cm9tIEJUUkVFLAorICogYW5kIGV2ZXJ5dGhpbmcgYWJvdXQgQlRSRUUgZGlyZWN0bHkgZXh0 ZW5kcyB0byB0aGVtLgorICoKKyAqIG5vdGU6IEluIHRoZSBmb2xsb3dpbmcgdGV4dCAiaW5k ZXggQU0iIHJlZmVycyB0byBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhCisgKiBwYXJ0aWN1bGFy IGluZGV4IEFNIChlLmcuIEJUUkVFKSwgaS5lLiBjb2RlIHNyYy9iYWNrZW5kL2FjY2Vzcy9u YnRyZWUpLAorICogd2hpbGUgImluZGV4YW0uYyIgaXMgdGhlIHNoYXJlZCBleGVjdXRvciBs ZXZlbCB1c2VkIHRvIGludGVyYWN0IHdpdGgKKyAqIGluZGV4ZXMuCisgKgorICoKKyAqIGlu ZGV4IHNjYW4gc3RhdGUKKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqIFdpdGggdGhlIHRyYWRp dGlvbmFsIEFQSSAoYW1nZXR0dXBsZSksIGluZGV4IHNjYW4gc3RhdGUgaXMgc3RvcmVkIGF0 IHRoZQorICogc2Nhbi1sZXZlbCBpbiBBTS1zcGVjaWZpYyBzdHJ1Y3RzIC0gZS5nLiBpbiBC VFNjYW5PcGFxdWUgZm9yIEJUUkVFKS4gU28KKyAqIHRoZXJlIGNhbiBiZSBvbmx5IGEgc2lu Z2xlIGxlYWYgcGFnZSAibG9hZGVkIiBmb3IgYSBzY2FuIGF0IGEgdGltZS4KKyAqCisgKiBX aXRoIHRoZSBuZXcgQVBJIChhbWdldGJhdGNoL2FtZnJlZWJhdGNoKSwgYW4gaW5kZXggc2Nh biBuZWVkcyB0byBzdG9yZQorICogbXVsdGlwbGUgYmF0Y2hlcyAtIGJ1dCBub3QgaW4gcHJp dmF0ZSAic2NhbiBvcGFxdWUiIHN0cnVjdC4gSW5zdGVhZCwKKyAqIHRoZSBxdWV1ZSBvZiBi YXRjaGVzIGFuZCBzb21lIG9mIHRoZSBvdGhlciBpbmZvcm1hdGlvbiB3YXMgbW92ZWQgdG8g dGhlCisgKiBJbmRleFNjYW5EZXNjLCBpbnRvIGEgY29tbW9uIHN0cnVjdC4gU28gdGhlIEFN LXNwZWNpZmljIHNjYW4tb3BhcXVlCisgKiBzdHJ1Y3RzIGdldCBzcGxpdCBhbmQgbW92ZWQg aW50byB0aHJlZSBwbGFjZXM6CisgKgorICogMSkgc2Nhbi1vcGFxdWUgLSBGaWVsZHMgdGhh dCBhcmUgdHJ1bHkgcmVsYXRlZCB0byB0aGUgc2NhbiBhcyBhIHdob2xlCisgKiAgICByZW1h aW4gaW4gdGhlIHN0cnVjdCAod2hpY2ggaXMgQU0tc3BlY2lmaWMsIGkuZS4gZWFjaCBBTSBt ZXRob2QgbWF5CisgKiAgICBrZWVwIHNvbWV0aGluZyBkaWZmZXJlbnQpLiBFeGFtcGxlOiBz Y2Fua2V5cy9hcnJheWtleXMgYXJlIHN0aWxsCisgKiAgICBrZXB0IGluIEJUU2Nhbk9wYXF1 ZS4KKyAqCisgKiAyKSBiYXRjaC1vcGFxdWUgLSBBTS1zcGVjaWZpYyBpbmZvcm1hdGlvbiBy ZWxhdGVkIHRvIGEgcGFydGljdWxhciBsZWFmCisgKiAgICBwYWdlIGFyZSBtb3ZlZCB0byBh IG5ldyBiYXRjaC1sZXZlbCBzdHJ1Y3QuIEEgZ29vZCBleGFtcGxlIGFyZSBmb3IKKyAqICAg IGV4YW1wbGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBsZWFmIHBhZ2UgLyBiYXRjaCBpbiB0aGUg aW5kZXggKGN1cnJlbnQKKyAqICAgIHBhZ2UsIGxlZnQvcmlnaCBwYWdlcywgZXRjLikuCisg KgorICogMykgYmF0Y2ggLSBBIHNpZ25pZmljYW50IHBhcnQgb2YgdGhlIHBhdGNoIGlzIGlu dHJvZHVjaW5nIGEgY29tbW9uCisgKiAgICByZXByZXNlbnRhdGlvbiBvZiBhIGJhdGNoLCBj b21tb24gdG8gYWxsIHRoZSBpbmRleCBBTXMuIFVudGlsIG5vdworICogICAgZWFjaCBBTSBo YWQgaXQncyBvd24gd2F5IG9mIHJlcHJlc2VudGluZyB0dXBsZXMgZnJvbSBhIGxlYWYgcGFn ZSwKKyAqICAgIGFuZCBhY2Nlc3NpbmcgaXQgcmVxdWlyZWQgZ29pbmcgdGhyb3VnaCB0aGUg QU0gYWdhaW4uIFRoZSBjb21tb24KKyAqICAgIHJlcHJlc2VudGF0aW9uIGFsbG93cyBhY2Nl c3NpbmcgdGhlIGJhdGNoZXMgdGhyb3VnaCB0aGUgaW5kZXhhbS5jCisgKiAgICBsYXllciwg d2l0aG91dCBoYXZpbmcgdG8gZ28gdGhyb3VnaCB0aGUgQU0uCisgKgorICoKKyAqIGFtZ2V0 YmF0Y2gvYW1mcmVlYmF0Y2gKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRvIHN1 cHBvcnQgYmF0Y2hpbmcsIHRoZSBpbmRleCBBTSBuZWVkcyB0byBpbXBsZW1lbnQgdHdvIG9w dGlvbmFsCisgKiBjYWxsYmFja3MgLSBhbWdldGJhdGNoKCkgYW5kIGFtZnJlZWJhdGNoKCks IHdoaWNoIGxvYWQgZGF0YSBmcm9tIHRoZQorICogIm5leHQiIGxlYWYgcGFnZSwgYW5kIHRo ZW4gZnJlZSBpdCB3aGVuIHRoZSBiYXRjaCBpcyBubyBsb25nZXIgbmVlZGVkLgorICoKKyAq IEZvciBub3cgdGhlIGFtZ2V0dHVwbGUoKSBjYWxsYmFjayBpcyBzdGlsbCByZXF1aXJlZCBl dmVuIGZvciBBTXMgdGhhdAorICogc3VwcG9ydCBiYXRjaGluZywgc28gdGhhdCB3ZSBjYW4g ZmFsbC1iYWNrIHRvIHRoZSBub24tYmF0Y2hlZCBzY2FuCisgKiBmb3IgY2FzZXMgd2hlbiBi YXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIChlLmcuIHNjYW5zIG9mIHN5c3RlbSB0YWJsZXMp CisgKiBvciB3aGVuIGJhdGNoaW5nIGlzIGRpc2FibGVkIHVzaW5nIHRoZSBlbmFibGVfaW5k ZXhzY2FuX2JhdGNoaW5nIEdVQy4KKyAqCisgKgorICogYmF0Y2gKKyAqIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAqIEEgZ29vZCB3YXkgdG8gdmlzdWFsaXplIGJhdGNoaW5nIGlzIGEg c2xpZGluZyB3aW5kb3cgb3ZlciB0aGUga2V5IHNwYWNlIG9mCisgKiBhbiBpbmRleC4gQXQg YW55IGdpdmVuIG1vbWVudCwgd2UgaGF2ZSBhICJ3aW5kb3ciIHJlcHJlc2VudGluZyBhIHJh bmdlIG9mCisgKiB0aGUga2V5cywgY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZSBiYXRjaGVz LCBlYWNoIHdpdGggaXRlbXMgZnJvbSBhIHNpbmdsZQorICogbGVhZiBwYWdlLgorICoKKyAq IEZvciBub3csIGVhY2ggYmF0Y2ggaXMgZXhhY3RseSBvbmUgd2hvbGUgbGVhZiBwYWdlLiBX ZSBtaWdodCBhbGxvdyBiYXRjaGVzCisgKiB0byBiZSBzbWFsbGVyIG9yIGxhcmdlciwgYnV0 IHRoYXQgZG9lc24ndCBzZWVtIHZlcnkgdXNlZnVsLiBJdCB3b3VsZCBtYWtlCisgKiB0aGlu Z3MgbW9yZSBjb21wbGV4LCB3aXRob3V0IHByb3ZpZGluZyBtdWNoIGJlbmVmaXQuIFVsdGlt YXRlbHkgaXQncyB1cCB0bworICogdGhlIGluZGV4IEFNIC0gaXQgY2FuIHByb2R1Y2UgYW55 IGJhdGNoZXMgaXQgd2FudHMsIGFzIGxvbmcgYXMgaXQga2VlcHMKKyAqIG5lY2Vzc2FyeSBp bmZvcm1hdGlvbiBpbiB0aGUgYmF0Y2gtb3BhcXVlIHN0cnVjdCwgYW5kIGhhbmRsZXMgdGhp cyBpbiB0aGUKKyAqIGFtZ2V0YmF0Y2gvYW1mcmVlYmF0Y2ggY2FsbGJhY2tzLgorICoKKyAq CisgKiBwcmVmZXRjaGluZzogbGVhZiBwYWdlcyB2cy4gaGVhcCBwYWdlcworICogLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgcGF0Y2ggaXMgb25s eSBhYm91dCBwcmVmZXRjaGluZyBwYWdlcyBmcm9tIHRoZSBpbmRleGVkIHJlbGF0aW9uIChl LmcuCisgKiBoZWFwKSwgbm90IGFib3V0IHByZWZldGNoaW5nIGluZGV4IGxlYWYgcGFnZXMg ZXRjLiBUaGUgcmVhZF9uZXh0IGNhbGxiYWNrCisgKiBkb2VzIHJlYWQgbGVhZiBwYWdlcyB3 aGVuIG5lZWRlZCAoYWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgY3VycmVudAorICog YmF0Y2gpLCBidXQgdGhpcyBpcyBzeW5jaHJvbm91cywgYW5kIHRoZSBjYWxsYmFjayB3aWxs IGJsb2NrIHVudGlsIHRoZSBsZWFmCisgKiBwYWdlIGlzIHJlYWQuCisgKgorICoKKyAqIGdy YWR1YWwgcmFtcCB1cAorICogLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgcHJlZmV0Y2hpbmcg aXMgZHJpdmVuIGJ5IHRoZSByZWFkX3N0cmVhbSBBUEkgLyBpbXBsZW1lbnRhdGlvbi4gVGhl cmUKKyAqIGFyZSBubyBleHBsaWNpdCBmYWR2aXNlIGNhbGxzIGluIHRoZSBpbmRleCBjb2Rl LCB0aGF0IGFsbCBoYXBwZW5zIGluIHRoZQorICogcmVhZCBzdHJlYW0uIFRoZSByZWFkIHN0 cmVhbSBkb2VzIHRoZSB1c3VhbCBncmFkdWFsIHJhbXAgdXAgdG8gbm90IHJlZ3Jlc3MKKyAq IExJTUlUIDEgcXVlcmllcyBldGMuCisgKgorICoKKyAqIGtpbGxfcHJpb3JfdHVwbGVzCisg KiAtLS0tLS0tLS0tLS0tLS0tLQorICogSWYgd2UgZGVjaWRlIGEgdHVwbGUgc2hvdWxkIGJl ICJraWxsZWQiIGluIHRoZSBpbmRleCwgdGhlIGEgZmxhZyBpcyB1c2VkIHRvCisgKiBwYXNz IHRoaXMgaW5mb3JtYXRpb24gdG8gaW5kZXhhbS5jIC0gdGhlIGl0ZW0gaXMgcmVjb3JkZWQg aW4gdGhlIGJhdGNoLCBhbmQKKyAqIHRoZSBhY3R1YWwga2lsbGluZyBpcyBwb3N0cG9uZWQg dW50aWwgdGhlIGJhdGNoIGlzIGZyZWVkIHVzaW5nIGFtZnJlZWJhdGNoKCkuCisgKiBUaGUg c2NhbiBmbGFnIGlzIHJlc2V0IHRvIGZhbHNlLCBzbyB0aGF0IHRoZSBpbmRleCBBTSBkb2Vz IG5vdCBnZXQgY29uZnVzZWQKKyAqIGFuZCBkb2VzIG5vdCBkbyBzb21ldGhpbmcgZm9yIGEg ZGlmZmVyZW50ICJjdXJyZW50IiBpdGVtLgorICoKKyAqIFRoYXQgaXMsIHRoaXMgaXMgdmVy eSBzaW1pbGFyIHRvIHdoYXQgaGFwcGVucyB3aXRob3V0IGJhdGNoaW5nLCBleGNlcHQgdGhh dAorICogdGhlIGtpbGxlZCBpdGVtcyBhcmUgYWNjdW11bGF0ZWQgaW4gaW5kZXhhbS5jLCBu b3QgaW4gdGhlIEFNLgorICovCisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBiYXRjaGVz IChsZWFmIHBhZ2VzKSB3ZSBjYW4ga2VlcCBpbiBtZW1vcnkuCisgKgorICogVGhlIHZhbHVl IDY0IHZhbHVlIGlzIGFyYml0cmFyeSwgaXQncyBhYm91dCAxTUIgb2YgZGF0YSB3aXRoIDhL QiBwYWdlcy4gV2UKKyAqIHNob3VsZCBub3QgcmVhbGx5IG5lZWQgdGhpcyBtYW55IGJhdGNo ZXMgLSB3ZSBuZWVkIGEgY2VydGFpbiBudW1iZXIgb2YgVElEcywKKyAqIHRvIHNhdGlzZnkg dGhlIHByZWZldGNoIGRpc3RhbmNlLCBhbmQgdGhlcmUgdXN1YWxseSBhcmUgbWFueSBpbmRl eCB0dXBsZXMKKyAqIHBlciBwYWdlLiBJbiB0aGUgd29yc3QgY2FzZSB3ZSBtaWdodCBoYXZl IG9uZSBpbmRleCB0dXBsZSBwZXIgbGVhZiBwYWdlLAorICogYnV0IGV2ZW4gdGhhdCBtYXkg bm90IHF1aXRlIHdvcmsgaW4gc29tZSBjYXNlcy4KKyAqCisgKiBCdXQgdGhlcmUgbWF5IGJl IGNhc2VzIHdoZW4gdGhpcyBkb2VzIG5vdCB3b3JrIC0gc29tZSBleGFtcGxlczoKKyAqCisg KiBhKSB0aGUgaW5kZXggbWF5IGJlIGJsb2F0ZWQsIHdpdGggbWFueSBwYWdlcyBvbmx5IGhh dmUgYSBzaW5nbGUgaW5kZXggaXRlbQorICoKKyAqIGIpIHRoZSBpbmRleCBpcyBjb3JyZWxh dGVkLCBhbmQgd2Ugc2tpcCBwcmVmZXRjaGVzIG9mIGR1cGxpY2F0ZSBibG9ja3MKKyAqCisg KiBjKSB3ZSBtYXkgYmUgZG9pbmcgaW5kZXgtb25seSBzY2FuLCBhbmQgd2UgZG9uJ3QgcHJl ZmV0Y2ggYWxsLXZpc2libGUgcGFnZXMKKyAqCisgKiBTbyB3ZSBtaWdodCBuZWVkIHRvIGxv YWQgaHVnZSBudW1iZXIgb2YgYmF0Y2hlcyBiZWZvcmUgd2UgZmluZCB0aGUgZmlyc3QKKyAq IGJsb2NrIHRvIGxvYWQgZnJvbSB0aGUgdGFibGUuIE9yIGVub3VnaCBwYWdlcyB0byBzYXRp c2Z5IHRoZSBwcmVmZXRjaAorICogZGlzdGFuY2UuCisgKgorICogWFhYIEN1cnJlbnRseSwg b25jZSB3ZSBoaXQgdGhpcyBudW1iZXIgb2YgYmF0Y2hlcywgd2UgZmFpbCBpbiB0aGUgc3Ry ZWFtCisgKiBjYWxsYmFjayAob3IgcmF0aGVyIGluIGluZGV4X2JhdGNoX2dldG5leHQpLCBi ZWNhdXNlIHRoYXQncyB3aGVyZSB3ZSBsb2FkCisgKiBiYXRjaGVzLiBJdCdkIGJlIG5pY2Ug dG8gInBhdXNlIiB0aGUgcmVhZCBzdHJlYW0gZm9yIGEgYml0IGluc3RlYWQsIGJ1dAorICog dGhlcmUncyBubyBidWlsdC1pbiB3YXkgdG8gZG8gdGhhdC4gU28gd2UgY2FuIG9ubHkgInN0 b3AiIHRoZSBzdHJlYW0gYnkKKyAqIHJldHVybmluZyBJbnZhbGlkQmxvY2tOdW1iZXIuIEJ1 dCB3ZSBjb3VsZCBhbHNvIHJlbWVtYmVyIHRoaXMsIGFuZCBkbworICogcmVhZF9zdHJlYW1f cmVzZXQoKSB0byBjb250aW51ZSwgYWZ0ZXIgY29uc3VtaW5nIGFsbCB0aGUgYWxyZWFkeSBz Y2hlZHVsZWQKKyAqIGJsb2Nrcy4KKyAqCisgKiBYWFggTWF5YmUgNjQgaXMgdG9vIGhpZ2gg LSBpdCBhbHNvIGRlZmluZXMgdGhlIG1heGltdW0gYW1vdW50IG9mIG92ZXJoZWFkCisgKiBh bGxvd2VkLiBJbiB0aGUgd29yc3QgY2FzZSwgcmVhZGluZyBhIHNpbmdsZSByb3cgbWlnaHQg dHJpZ2dlciByZWFkaW5nIHRoaXMKKyAqIG1hbnkgbGVhZiBwYWdlcyAoZS5nLiB3aXRoIElP UykuIFdoaWNoIG1pZ2h0IGJlIGFuIGlzc3VlIHdpdGggTElNSVQgcXVlcmllcywKKyAqIHdo ZW4gd2UgYWN0dWFsbHkgd29uJ3QgbmVlZCBtb3N0IG9mIHRoZSBsZWFmIHBhZ2VzLgorICoK KyAqIFhYWCBXZSBjb3VsZC9zaG91bGQgdXNlIGEgbG93ZXIgdmFsdWUgZm9yIHRlc3Rpbmcs IHRvIG1ha2UgaXQgbW9yZSBsaWtlbHkKKyAqIHdlIGhpdCB0aGlzIGlzc3VlLiBXaXRoIDY0 IHRoZSB3aG9sZSBjaGVjay13b3JsZCBwYXNzZXMgd2l0aG91dCBoaXR0aW5nCisgKiB0aGUg bGltaXQsIHdvIHdlIHdvdWxkbid0IHRlc3QgaXQncyBoYW5kbGVkIGNvcnJlY3RseS4KKyAq LworI2RlZmluZSBJTkRFWF9TQ0FOX01BWF9CQVRDSEVTCTY0CisKKyNkZWZpbmUgSU5ERVhf U0NBTl9CQVRDSF9DT1VOVChzY2FuKSBcCisJKChzY2FuKS0+eHNfYmF0Y2hlcy0+bmV4dEJh dGNoIC0gKHNjYW4pLT54c19iYXRjaGVzLT5maXJzdEJhdGNoKQorCisjZGVmaW5lIElOREVY X1NDQU5fQkFUQ0hfTE9BREVEKHNjYW4sIGlkeCkgXAorCSgoaWR4KSA8IChzY2FuKS0+eHNf YmF0Y2hlcy0+bmV4dEJhdGNoKQorCisjZGVmaW5lIElOREVYX1NDQU5fQkFUQ0hfRlVMTChz Y2FuKSBcCisJKElOREVYX1NDQU5fQkFUQ0hfQ09VTlQoc2NhbikgPT0gc2Nhbi0+eHNfYmF0 Y2hlcy0+bWF4QmF0Y2hlcykKKworLyoKKyAqIENoZWNrIHRoYXQgYSBwb3NpdGlvbiAoYmF0 Y2gsaXRlbSkgaXMgdmFsaWQgd2l0aCByZXNwZWN0IHRvIHRoZSBiYXRjaGVzIHdlCisgKiBo YXZlIGN1cnJlbnRseSBsb2FkZWQuCisgKgorICogWFhYIFRoZSAibWFya2VkIiBiYXRjaCBp cyBhbiBleGNlcHRpb24uIFRoZSBtYXJrZWQgYmF0Y2ggbWF5IGdldCBvdXRzaWRlCisgKiB0 aGUgcmFuZ2Ugb2YgY3VycmVudCBiYXRjaGVzLCBzbyBtYWtlIHN1cmUgdG8gbmV2ZXIgY2hl Y2sgdGhlIHBvc2l0aW9uCisgKiBmb3IgdGhhdC4KKyAqLworc3RhdGljIHZvaWQKK0Fzc2Vy dENoZWNrQmF0Y2hQb3NWYWxpZChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNo UG9zICpwb3MpCit7CisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCUluZGV4U2NhbkJh dGNoZXMgKmJhdGNoID0gc2Nhbi0+eHNfYmF0Y2hlczsKKworCS8qIG1ha2Ugc3VyZSB0aGUg cG9zaXRpb24gaXMgdmFsaWQgZm9yIGN1cnJlbnRseSBsb2FkZWQgYmF0Y2hlcyAqLworCUFz c2VydChwb3MtPmJhdGNoID49IGJhdGNoLT5maXJzdEJhdGNoKTsKKwlBc3NlcnQocG9zLT5i YXRjaCA8IGJhdGNoLT5uZXh0QmF0Y2gpOworI2VuZGlmCit9CisKKy8qCisgKiBDaGVjayBh IHNpbmdsZSBiYXRjaCBpcyB2YWxpZC4KKyAqLworc3RhdGljIHZvaWQKK0Fzc2VydENoZWNr QmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFNjYW5CYXRjaCBiYXRjaCkKK3sKKyNp ZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisJLyogdGhlcmUgbXVzdCBiZSB2YWxpZCByYW5n ZSBvZiBpdGVtcyAqLworCUFzc2VydChiYXRjaC0+Zmlyc3RJdGVtIDw9IGJhdGNoLT5sYXN0 SXRlbSk7CisJQXNzZXJ0KGJhdGNoLT5maXJzdEl0ZW0gPj0gMCk7CisJQXNzZXJ0KGJhdGNo LT5sYXN0SXRlbSA8PSBNYXhUSURzUGVyQlRyZWVQYWdlKTsgLyogWFhYIHRpZWQgdG8gQlRS RUUgKi8KKworCS8qIHdlIHNob3VsZCBoYXZlIGl0ZW1zIChidWZmZXIgYW5kIHBvaW50ZXJz KSAqLworCUFzc2VydChiYXRjaC0+aXRlbXMgIT0gTlVMTCk7CisJLy8gQXNzZXJ0KGJhdGNo LT5jdXJyVHVwbGVzICE9IE5VTEwpOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIGtpbGxl ZCBpdGVtcyBtdXN0IGJlIHZhbGlkLCBhbmQgdGhlcmUgbXVzdCBiZSBhbiBhcnJheSBvZgor CSAqIGluZGV4ZXMgaWYgdGhlcmUgYXJlIGl0ZW1zLgorCSAqLworCUFzc2VydChiYXRjaC0+ bnVtS2lsbGVkID49IDApOworCUFzc2VydChiYXRjaC0+bnVtS2lsbGVkIDw9IE1heFRJRHNQ ZXJCVHJlZVBhZ2UpOwkvKiBYWFggdGllZCB0byBCVFJFRSAqLworCUFzc2VydCghKChiYXRj aC0+bnVtS2lsbGVkID4gMCkgJiYgKGJhdGNoLT5raWxsZWRJdGVtcyA9PSBOVUxMKSkpOwor CisJLyogWFhYIGNhbiB3ZSBjaGVjayBzb21lIG9mIHRoZSBvdGhlciBiYXRjaCBmaWVsZHM/ ICovCisjZW5kaWYKK30KKworLyoKKyAqIENoZWNrIGludmFyaWFudHMgb24gY3VycmVudCBi YXRjaGVzCisgKgorICogTWFrZXMgc3VyZSB0aGUgaW5kZXhlcyBhcmUgc2V0IGFzIGV4cGVj dGVkLCB0aGUgYnVmZmVyIHNpemUgaXMgd2l0aGluCisgKiBsaW1pdHMsIGFuZCBzbyBvbi4K KyAqLworc3RhdGljIHZvaWQKK0Fzc2VydENoZWNrQmF0Y2hlcyhJbmRleFNjYW5EZXNjIHNj YW4pCit7CisjaWZkZWYgVVNFX0FTU0VSVF9DSEVDS0lORworCUluZGV4U2NhbkJhdGNoZXMg KmJhdGNoZXMgPSBzY2FuLT54c19iYXRjaGVzOworCisJLyogd2Ugc2hvdWxkIGhhdmUgYmF0 Y2hlcyBpbml0aWFsaXplZCAqLworCUFzc2VydChiYXRjaGVzICE9IE5VTEwpOworCisJLyog V2Ugc2hvdWxkIG5vdCBoYXZlIHRvbyBtYW55IGJhdGNoZXMuICovCisJQXNzZXJ0KChiYXRj aGVzLT5tYXhCYXRjaGVzID4gMCkgJiYKKwkJICAgKGJhdGNoZXMtPm1heEJhdGNoZXMgPD0g SU5ERVhfU0NBTl9NQVhfQkFUQ0hFUykpOworCisJLyoKKwkgKiBUaGUgZmlyc3QvbmV4dCBp bmRleGVzIHNob3VsZCBkZWZpbmUgYSB2YWxpZCByYW5nZSAoaW4gdGhlIGN5Y2xpYworCSAq IGJ1ZmZlciwgYW5kIHNob3VsZCBub3Qgb3ZlcmZsb3cgbWF4QmF0Y2hlcy4KKwkgKi8KKwlB c3NlcnQoKGJhdGNoZXMtPmZpcnN0QmF0Y2ggPj0gMCkgJiYKKwkJICAgKGJhdGNoZXMtPmZp cnN0QmF0Y2ggPD0gYmF0Y2hlcy0+bmV4dEJhdGNoKSk7CisJQXNzZXJ0KChiYXRjaGVzLT5u ZXh0QmF0Y2ggLSBiYXRjaGVzLT5maXJzdEJhdGNoKSA8PSBiYXRjaGVzLT5tYXhCYXRjaGVz KTsKKworCS8qIENoZWNrIGFsbCBjdXJyZW50IGJhdGNoZXMgKi8KKwlmb3IgKGludCBpID0g YmF0Y2hlcy0+Zmlyc3RCYXRjaDsgaSA8IGJhdGNoZXMtPm5leHRCYXRjaDsgaSsrKQorCXsK KwkJSW5kZXhTY2FuQmF0Y2ggYmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIGkpOwor CisJCUFzc2VydENoZWNrQmF0Y2goc2NhbiwgYmF0Y2gpOworCX0KKyNlbmRpZgorfQorCisv KiBkZWJ1ZzogcHJpbnQgaW5mbyBhYm91dCBjdXJyZW50IGJhdGNoZXMgKi8KK3N0YXRpYyB2 b2lkCitpbmRleF9iYXRjaF9wcmludChjb25zdCBjaGFyICpsYWJlbCwgSW5kZXhTY2FuRGVz YyBzY2FuKQoreworI2lmZGVmIElOREVYQU1fREVCVUcKKwlJbmRleFNjYW5CYXRjaGVzICpi YXRjaGVzID0gc2Nhbi0+eHNfYmF0Y2hlczsKKworCWlmICghc2Nhbi0+eHNfYmF0Y2hlcykK KwkJcmV0dXJuOworCisJREVCVUdfTE9HKCIlczogYmF0Y2hlcyBmaXJzdEJhdGNoICVkIG5l eHRCYXRjaCAlZCBtYXhCYXRjaGVzICVkIiwKKwkJCSAgbGFiZWwsCisJCQkgIGJhdGNoZXMt PmZpcnN0QmF0Y2gsIGJhdGNoZXMtPm5leHRCYXRjaCwgYmF0Y2hlcy0+bWF4QmF0Y2hlcyk7 CisKKwlmb3IgKGludCBpID0gYmF0Y2hlcy0+Zmlyc3RCYXRjaDsgaSA8IGJhdGNoZXMtPm5l eHRCYXRjaDsgaSsrKQorCXsKKwkJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaCA9IElOREVY X1NDQU5fQkFUQ0goc2NhbiwgaSk7CisKKwkJREVCVUdfTE9HKCIlczogYmF0Y2ggJWQgJXAg Zmlyc3QgJWQgbGFzdCAlZCBpdGVtICVkIGtpbGxlZCAlZCIsCisJCQkJICBsYWJlbCwgaSwg YmF0Y2gsIGJhdGNoLT5maXJzdEl0ZW0sIGJhdGNoLT5sYXN0SXRlbSwKKwkJCQkgIGJhdGNo LT5pdGVtSW5kZXgsIGJhdGNoLT5udW1LaWxsZWQpOworCX0KKyNlbmRpZgorfQorCisvKgor ICogaW5kZXhfYmF0Y2hfcG9zX2FkdmFuY2UKKyAqCQlBZHZhbmNlIHRoZSBwb3NpdGlvbiB0 byB0aGUgbmV4dCBpdGVtLCBkZXBlbmRpbmcgb24gc2NhbiBkaXJlY3Rpb24uCisgKgorICog QWR2YW5jZSB0aGUgcG9zaXRpb24gdG8gdGhlIG5leHQgaXRlbSwgZWl0aGVyIGluIHRoZSBz YW1lIGJhdGNoIG9yIHRoZQorICogZm9sbG93aW5nIG9uZSAoaWYgYWxyZWFkeSBhdmFpbGFi bGUpLgorICoKKyAqIFdlIGNhbiBhZHZhbmNlIG9ubHkgaWYgd2UgYWxyZWFkeSBoYXZlIHNv bWUgYmF0Y2hlcyBsb2FkZWQsIGFuZCB0aGVyZSdzCisgKiBlaXRoZXIgZW5vdWdoIGl0ZW1z IGluIHRoZSBjdXJyZW50IGJhdGNoLCBvciBzb21lIG1vcmUgaXRlbXMgaW4gdGhlCisgKiBz dWJzZXF1ZW50IGJhdGNoZXMuCisgKgorICogSWYgdGhpcyBpcyB0aGUgZmlyc3QgYWR2YW5j ZSwgcmlnaHQgYWZ0ZXIgbG9hZGluZyB0aGUgZmlyc3QgYmF0Y2gsIHRoZQorICogcG9zaXRp b24gaXMgc3RpbGwgYmUgdW5kZWZpbmVkLiBPdGhlcndpc2Ugd2UgZXhwZWN0IHRoZSBwb3Np dGlvbiB0byBiZQorICogdmFsaWQuCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBwb3Np dGlvbiB3YXMgYWR2YW5jZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKiBUaGUgcG9pc2l0 aW9uIGlzIGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgb25seSBhZnRlciBhbiBhZHZhbmNlLgor ICovCitzdGF0aWMgYm9vbAoraW5kZXhfYmF0Y2hfcG9zX2FkdmFuY2UoSW5kZXhTY2FuRGVz YyBzY2FuLCBJbmRleFNjYW5CYXRjaFBvcyAqcG9zKQoreworCUluZGV4U2NhbkJhdGNoRGF0 YSAqYmF0Y2g7CisJU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24gPSBzY2FuLT54c19iYXRjaGVz LT5kaXJlY3Rpb247CisKKwkvKiBtYWtlIHN1cmUgd2UgaGF2ZSBiYXRjaGluZyBpbml0aWFs aXplZCBhbmQgY29uc2lzdGVudCAqLworCUFzc2VydENoZWNrQmF0Y2hlcyhzY2FuKTsKKwor CS8qIHNob3VsZCBrbm93IGRpcmVjdGlvbiBieSBub3cgKi8KKwlBc3NlcnQoZGlyZWN0aW9u ICE9IE5vTW92ZW1lbnRTY2FuRGlyZWN0aW9uKTsKKworCS8qIFdlIGNhbid0IGFkdmFuY2Ug aWYgdGhlcmUgYXJlIG5vIGJhdGNoZXMgYXZhaWxhYmxlLiAqLworCWlmIChJTkRFWF9TQ0FO X0JBVENIX0NPVU5UKHNjYW4pID09IDApCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICog SWYgdGhlIHBvc2l0aW9uIGhhcyBub3QgYmVlbiBhZHZhbmNlZCB5ZXQsIGl0IGhhcyB0byBi ZSByaWdodCBhZnRlciB3ZQorCSAqIGxvYWRlZCB0aGUgZmlyc3QgYmF0Y2guIEluIHRoYXQg Y2FzZSBqdXN0IGluaXRpYWxpemUgaXQgdG8gdGhlIGZpcnN0CisJICogaXRlbSBpbiB0aGUg YmF0Y2ggKG9yIGxhc3QgaXRlbSwgaWYgaXQncyBiYWNrd2FyZHMgc2NhYSkuCisJICoKKwkg KiBYWFggTWF5YmUgd2Ugc2hvdWxkIGp1c3QgZXhwbGljaXRseSBpbml0aWFsaXplIHRoZSBw b3N0aXRpb24gYWZ0ZXIKKwkgKiBsb2FkaW5nIHRoZSBmaXJzdCBiYXRjaCwgd2l0aG91dCBo YXZpbmcgdG8gZ28gdGhyb3VnaCB0aGUgYWR2YW5jZS4KKwkgKgorCSAqIFhYWCBBZGQgYSBt YWNybyBJTkRFWF9TQ0FOX1BPU19ERUZJTkVEKCkgb3Igc29tZXRoaW5nIGxpa2UgdGhpcywg dG8KKwkgKiBtYWtlIHRoaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQuCisJICovCisJaWYgKChw b3MtPmJhdGNoID09IC0xKSAmJiAocG9zLT5pbmRleCA9PSAtMSkpCisJeworCQkvKiB3ZSBz aG91bGQgaGF2ZSBsb2FkZWQgdGhlIHZlcnkgZmlyc3QgYmF0Y2ggKi8KKwkJQXNzZXJ0KHNj YW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2ggPT0gMCk7CisKKwkJYmF0Y2ggPSBJTkRFWF9T Q0FOX0JBVENIKHNjYW4sIHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2gpOworCQlBc3Nl cnQoYmF0Y2ggIT0gTlVMTCk7CisKKwkJcG9zLT5iYXRjaCA9IDA7CisKKwkJaWYgKFNjYW5E aXJlY3Rpb25Jc0ZvcndhcmQoZGlyZWN0aW9uKSkKKwkJCXBvcy0+aW5kZXggPSBiYXRjaC0+ Zmlyc3RJdGVtOworCQllbHNlCisJCQlwb3MtPmluZGV4ID0gYmF0Y2gtPmxhc3RJdGVtOwor CisJCS8qIHRoZSBwb3NpdGlvbiB3ZSBqdXN0IHNldCBoYXMgdG8gYmUgdmFsaWQgKi8KKwkJ QXNzZXJ0Q2hlY2tCYXRjaFBvc1ZhbGlkKHNjYW4sIHBvcyk7CisKKwkJcmV0dXJuIHRydWU7 CisJfQorCisJLyoKKwkgKiBUaGUgcG9zaXRpb24gaXMgYWxyZWFkeSBkZWZpbmVkLCBzbyB3 ZSBzaG91bGQgaGF2ZSBzb21lIGJhdGNoZXMgbG9hZGVkCisJICogYW5kIHRoZSBwb3NpdGlv biBoYXMgdG8gYmUgdmFsaWQgd2l0aCByZXNwZWN0IHRvIHRob3NlLgorCSAqLworCUFzc2Vy dENoZWNrQmF0Y2hQb3NWYWxpZChzY2FuLCBwb3MpOworCisJLyoKKwkgKiBBZHZhbmNlIHRv IHRoZSBuZXh0IGl0ZW0gaW4gdGhlIHNhbWUgYmF0Y2guIElmIHRoZSBwb3NpdGlvbiBpcyBm b3IgdGhlCisJICogbGFzdCBpdGVtIGluIHRoZSBiYXRjaCwgdHJ5IGFkdmFuY2luZyB0byB0 aGUgbmV4dCBiYXRjaCAoaWYgbG9hZGVkKS4KKwkgKi8KKwliYXRjaCA9IElOREVYX1NDQU5f QkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisKKwlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2Fy ZChkaXJlY3Rpb24pKQorCXsKKwkJaWYgKHBvcy0+aW5kZXggPCBiYXRjaC0+bGFzdEl0ZW0p CisJCXsKKwkJCXBvcy0+aW5kZXgrKzsKKworCQkJLyogdGhlIHBvc2l0aW9uIGhhcyB0byBi ZSB2YWxpZCAqLworCQkJQXNzZXJ0Q2hlY2tCYXRjaFBvc1ZhbGlkKHNjYW4sIHBvcyk7CisK KwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCWVsc2UJCQkJCQkvKiBTY2FuRGlyZWN0aW9u SXNCYWNrd2FyZCAqLworCXsKKwkJaWYgKHBvcy0+aW5kZXggPiBiYXRjaC0+Zmlyc3RJdGVt KQorCQl7CisJCQlwb3MtPmluZGV4LS07CisKKwkJCS8qIHRoZSBwb3NpdGlvbiBoYXMgdG8g YmUgdmFsaWQgKi8KKwkJCUFzc2VydENoZWNrQmF0Y2hQb3NWYWxpZChzY2FuLCBwb3MpOwor CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCS8qCisJICogV2UgY291bGRuJ3QgYWR2 YW5jZSB3aXRoaW4gdGhlIHNhbWUgYmF0Y2gsIHRyeSBhZHZhbmNpbmcgdG8gdGhlIG5leHQK KwkgKiBiYXRjaCwgaWYgaXQncyBhbHJlYWR5IGxvYWRlZC4KKwkgKi8KKwlpZiAoSU5ERVhf U0NBTl9CQVRDSF9MT0FERUQoc2NhbiwgcG9zLT5iYXRjaCArIDEpKQorCXsKKwkJLyogYWR2 YW5jZSB0byB0aGUgbmV4dCBiYXRjaCAqLworCQlwb3MtPmJhdGNoKys7CisKKwkJYmF0Y2gg PSBJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIHBvcy0+YmF0Y2gpOworCQlBc3NlcnQoYmF0Y2gg IT0gTlVMTCk7CisKKwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyZWN0aW9uKSkK KwkJCXBvcy0+aW5kZXggPSBiYXRjaC0+Zmlyc3RJdGVtOworCQllbHNlCisJCQlwb3MtPmlu ZGV4ID0gYmF0Y2gtPmxhc3RJdGVtOworCisJCS8qIHRoZSBwb3NpdGlvbiBoYXMgdG8gYmUg dmFsaWQgKi8KKwkJQXNzZXJ0Q2hlY2tCYXRjaFBvc1ZhbGlkKHNjYW4sIHBvcyk7CisKKwkJ cmV0dXJuIHRydWU7CisJfQorCisJLyogY2FuJ3QgYWR2YW5jZSAqLworCXJldHVybiBmYWxz ZTsKK30KKworLyoKKyAqIGluZGV4X2JhdGNoX3Bvc19yZXNldAorICoJCVJlc2V0IHRoZSBw b3NpdGlvbiwgc28gdGhhdCBpdCBsb29rcyBhcyBpZiBuZXZlciBhZHZhbmNlZC4KKyAqLwor c3RhdGljIHZvaWQKK2luZGV4X2JhdGNoX3Bvc19yZXNldChJbmRleFNjYW5EZXNjIHNjYW4s IEluZGV4U2NhbkJhdGNoUG9zICpwb3MpCit7CisJcG9zLT5iYXRjaCA9IC0xOworCXBvcy0+ aW5kZXggPSAtMTsKK30KKworLyoKKyAqIGluZGV4X3NjYW5fc3RyZWFtX3JlYWRfbmV4dAor ICoJCXJldHVybiB0aGUgbmV4dCBibG9jayB0byBwYXNzIHRvIHRoZSByZWFkIHN0cmVhbQor ICoKKyAqIFRoaXMgYXNzdW1lcyB0aGUgImN1cnJlbnQiIHNjYW4gZGlyZWN0aW9uLCByZXF1 ZXN0ZWQgYnkgdGhlIGNhbGxlci4gSWYKKyAqIHRoYXQgY2hhbmdlcyBiZWZvcmUgY29uc3Vt aW5nIGFsbCBidWZmZXJzLCB3ZSdsbCByZXNldCB0aGUgc3RyZWFtIGFuZAorICogc3RhcnQg ZnJvbSBzY3JhdGNoLiBXaGljaCBtYXkgc2VlbSBpbmVmZmljaWVudCwgYnV0IGl0J3Mgbm8g d29yc2UgdGhhbgorICogd2hhdCB3ZSBkbyBub3csIGFuZCBpdCdzIG5vdCBhIHZlcnkgY29t bW9uIGNhc2UuCisgKgorICogVGhlIHBvc2l0aW9uIG9mIHRoZSByZWFkX3N0cmVhbSBpcyBz dG9yZWQgaW4gc3RyZWFtUG9zLCB3aGljaCBtYXkgYmUKKyAqIGFoZWFkIG9mIHRoZSBjdXJy ZW50IHJlYWRQb3MgKHdoaWNoIGlzIHdoYXQgZ290IGNvbnN1bWVkIGJ5IHRoZSBzY2FuKS4K KyAqCisgKiBUaGUgc2NhbiBkaXJlY3Rpb24gY2hhbmdlIGlzIGNoZWNrZWQgLyBoYW5kbGVk IGVsc2V3aGVyZS4gSGVyZSB3ZSByZWx5CisgKiBvbiBoYXZpbmcgdGhlIGNvcnJlY3QgdmFs dWUgaW4geHNfYmF0Y2hlcy0+ZGlyZWN0aW9uLgorICovCitzdGF0aWMgQmxvY2tOdW1iZXIK K2luZGV4X3NjYW5fc3RyZWFtX3JlYWRfbmV4dChSZWFkU3RyZWFtICpzdHJlYW0sCisJCQkJ CQkJdm9pZCAqY2FsbGJhY2tfcHJpdmF0ZV9kYXRhLAorCQkJCQkJCXZvaWQgKnBlcl9idWZm ZXJfZGF0YSkKK3sKKwlJbmRleFNjYW5EZXNjIHNjYW4gPSAoSW5kZXhTY2FuRGVzYykgY2Fs bGJhY2tfcHJpdmF0ZV9kYXRhOworCUluZGV4U2NhbkJhdGNoUG9zICpwb3MgPSAmc2Nhbi0+ eHNfYmF0Y2hlcy0+c3RyZWFtUG9zOworCisJLyogd2Ugc2hvdWxkIGhhdmUgc2V0IHRoZSBk aXJlY3Rpb24gYWxyZWFkeSAqLworCUFzc2VydChzY2FuLT54c19iYXRjaGVzLT5kaXJlY3Rp b24gIT0gTm9Nb3ZlbWVudFNjYW5EaXJlY3Rpb24pOworCisJLyoKKwkgKiBUaGUgcmVhZCBw b3NpdGlvbiBoYXMgdG8gYmUgdmFsaWQsIGJlY2F1c2Ugd2UgaW5pdGlhbGl6ZS9hZHZhbmNl IGl0CisJICogYmVmb3JlIG1heWJlIGV2ZW4gYXR0ZW1wdGluZyB0byByZWFkIHRoZSBoZWFw IHR1cGxlLiBBbmQgaXQgbGFncyBiZWhpbmQKKwkgKiB0aGUgc3RyZWFtIHBvc2l0aW9uLCBz byBpdCBjYW4ndCBiZSBpbnZhbGlkIHlldC4gSWYgdGhpcyBpcyB0aGUgZmlyc3QKKwkgKiB0 aW1lIGZvciB0aGlzIGNhbGxiYWNrLCB3ZSB3aWxsIHVzZSB0aGUgcmVhZFBvcyB0byBpbml0 IHN0cmVhbVBvcywgc28KKwkgKiBiZXR0ZXIgY2hlY2sgaXQncyB2YWxpZC4KKwkgKi8KKwlB c3NlcnRDaGVja0JhdGNoUG9zVmFsaWQoc2NhbiwgJnNjYW4tPnhzX2JhdGNoZXMtPnJlYWRQ b3MpOworCisJLyoKKwkgKiBUcnkgdG8gYWR2YW5jZSB0byB0aGUgbmV4dCBpdGVtLCBhbmQg aWYgdGhlcmUncyBub25lIGluIHRoZSBjdXJyZW50CisJICogYmF0Y2gsIHRyeSBsb2FkaW5n IHRoZSBuZXh0IGJhdGNoLgorCSAqCisJICogWFhYIFRoaXMgbG9vcCBzaG91bGRuJ3QgaGFw cGVuIG1vcmUgdGhhbiB0d2ljZSwgYmVjYXVzZSBpZiB3ZSBmYWlsIHRvCisJICogYWR2YW5j ZSB0aGUgcG9zaXRpb24sIHdlJ2xsIHRyeSB0byBsb2FkIHRoZSBuZXh0IGJhdGNoIGFuZCB0 aGVuIGluIHRoZQorCSAqIG5leHQgbG9vcCB0aGUgYWR2YW5jZSBoYXMgdG8gc3VjY2VlZC4K KwkgKi8KKwl3aGlsZSAodHJ1ZSkKKwl7CisJCWJvb2wJCWFkdmFuY2VkID0gZmFsc2U7CisK KwkJLyoKKwkJICogSWYgdGhlIHN0cmVhbSBwb3NpdGlvbiBpcyB1bmRlZmluZWQsIGp1c3Qg dXNlIHRoZSByZWFkIHBvc2l0aW9uLgorCQkgKgorCQkgKiBJdCdzIHBvc3NpYmxlIHdlIGdv dCBoZXJlIG9ubHkgZmFpcmx5IGxhdGUgaW4gdGhlIHNjYW4sIGUuZy4gaWYKKwkJICogbWFu eSB0dXBsZXMgZ290IHNraXBwZWQgaW4gdGhlIGluZGV4LW9ubHkgc2NhbiwgZXRjLiBJbiB0 aGlzIGNhc2UKKwkJICoganVzdCB1c2UgdGhlIHJlYWQgcG9zaXRpb24gYXMgYSBzdGFydGlu ZyBwb2ludC4KKwkJICoKKwkJICogVGhlIGZpcnN0IGJhdGNoIGlzIGxvYWRlZCBmcm9tIGlu ZGV4X2JhdGNoX2dldG5leHRfdGlkKCksIGJlY2F1c2UKKwkJICogd2UgZG9uJ3QgZ2V0IGhl cmUgdW50aWwgdGhlIGZpcnN0IGluZGV4X2ZldGNoX2hlYXAoKSBjYWxsIC0gb25seQorCQkg KiB0aGVuIGNhbiByZWFkX3N0cmVhbSBzdGFydCBsb2FkaW5nIG1vcmUgYmF0Y2hlcy4gSXQn cyBhbHNvIHBvc3NpYmxlCisJCSAqIHRvIGRpc2FibGUgcHJlZmV0Y2hpbmcgKGVmZmVjdGl2 ZV9pb19jb25jdXJyZW5jeT0wKSwgaW4gd2hpY2ggY2FzZQorCQkgKiBhbGwgYmF0Y2hlcyBn ZXQgbG9hZGVkIGluIGluZGV4X2JhdGNoX2dldG5leHRfdGlkLgorCQkgKi8KKwkJaWYgKChw b3MtPmJhdGNoID09IC0xKSAmJiAocG9zLT5pbmRleCA9PSAtMSkpCisJCXsKKwkJCSpwb3Mg PSBzY2FuLT54c19iYXRjaGVzLT5yZWFkUG9zOworCQkJYWR2YW5jZWQgPSB0cnVlOworCQl9 CisJCWVsc2UgaWYgKGluZGV4X2JhdGNoX3Bvc19hZHZhbmNlKHNjYW4sIHBvcykpCisJCXsK KwkJCWFkdmFuY2VkID0gdHJ1ZTsKKwkJfQorCisJCS8qIEZJWE1FIG1heWJlIGNoZWNrIHRo ZSBzdHJlYW1Qb3MgaXMgbm90IGJlaGluZCByZWFkUG9zPyAqLworCisJCS8qIElmIHdlIGFk dmFuY2VkIHRoZSBwb3NpdGlvbiwgcmV0dXJuIHRoZSBibG9jayBmb3IgdGhlIFRJRC4gKi8K KwkJaWYgKGFkdmFuY2VkKQorCQl7CisJCQlJbmRleFNjYW5CYXRjaCBiYXRjaCA9IElOREVY X1NDQU5fQkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisJCQlJdGVtUG9pbnRlciB0aWQgPSAm YmF0Y2gtPml0ZW1zW3Bvcy0+aW5kZXhdLmhlYXBUaWQ7CisKKwkJCURFQlVHX0xPRygiaW5k ZXhfc2Nhbl9zdHJlYW1fcmVhZF9uZXh0OiBpbmRleCAlZCBUSUQgKCV1LCV1KSIsCisJCQkJ CSAgcG9zLT5pbmRleCwKKwkJCQkJICBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCks CisJCQkJCSAgSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIodGlkKSk7CisKKwkJCS8qCisJ CQkgKiBpZiB0aGVyZSdzIGEgcHJlZmV0Y2ggY2FsbGJhY2ssIHVzZSBpdCB0byBkZWNpZGUg aWYgd2Ugd2lsbAorCQkJICogbmVlZCB0byByZWFkIHRoZSBibG9jaworCQkJICovCisJCQlp ZiAoc2Nhbi0+eHNfYmF0Y2hlcy0+cHJlZmV0Y2hDYWxsYmFjayAmJgorCQkJCSFzY2FuLT54 c19iYXRjaGVzLT5wcmVmZXRjaENhbGxiYWNrKHNjYW4sIHNjYW4tPnhzX2JhdGNoZXMtPnBy ZWZldGNoQXJndW1lbnQsIHBvcykpCisJCQl7CisJCQkJREVCVUdfTE9HKCJpbmRleF9zY2Fu X3N0cmVhbV9yZWFkX25leHQ6IHNraXAgYmxvY2sgKGNhbGxiYWNrKSIpOworCQkJCWNvbnRp bnVlOworCQkJfQorCisJCQlyZXR1cm4gSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQp OworCQl9CisKKwkJLyoKKwkJICogQ291bGRuJ3QgYWR2YW5jZSB0aGUgcG9zaXRpb24sIHNv IGVpdGhlciB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyBpbgorCQkgKiB0aGUgY3VycmVudCBi YXRjaCwgb3IgbWF5YmUgd2UgZG9uJ3QgaGF2ZSBhbnkgYmF0Y2hlcyB5ZXQgKGlmIGlzCisJ CSAqIHRoZSBmaXJzdCB0aW1lIHRocm91Z2gpLiBUcnkgbG9hZGluZyB0aGUgbmV4dCBiYXRj aCAtIGlmIHRoYXQKKwkJICogc3VjY2VlZHMsIHRyeSB0aGUgYWR2YW5jZSBhZ2FpbiAoYW5k IHRoaXMgdGltZSB0aGUgYWR2YW5jZSBzaG91bGQKKwkJICogd29yaykuCisJCSAqCisJCSAq IElmIHdlIGZhaWwgdG8gbG9hZCB0aGUgbmV4dCBiYXRjaCwgd2UncmUgZG9uZS4KKwkJICov CisJCWlmICghaW5kZXhfYmF0Y2hfZ2V0bmV4dChzY2FuKSkKKwkJCWJyZWFrOworCX0KKwor CS8qIG5vIG1vcmUgaXRlbXMgaW4gdGhpcyBzY2FuICovCisJcmV0dXJuIEludmFsaWRCbG9j a051bWJlcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLQorICoJCWluZGV4X2JhdGNoX2dl dG5leHQgLSBnZXQgdGhlIG5leHQgYmF0Y2ggb2YgVElEcyBmcm9tIGEgc2NhbgorICoKKyAq IFJldHVybnMgdHJ1ZSBpZiB3ZSBtYW5hZ2VkIHRvIHJlYWQgYXQgbGVhc3Qgc29tZSBUSURz IGludG8gdGhlIGJhdGNoLCBvcgorICogZmFsc2UgaWYgdGhlcmUgYXJlIG5vIG1vcmUgVElE cyBpbiB0aGUgc2Nhbi4gVGhlIGJhdGNoIGxvYWQgbWF5IGZhaWwgZm9yCisgKiBtdWx0aXBs ZSByZWFzb25zIC0gdGhlcmUgcmVhbGx5IG1heSBub3QgYmUgbW9yZSBiYXRjaGVzIGluIHRo ZSBzY2FuLCBvcgorICogbWF5YmUgd2UgcmVhY2hlZCBJTkRFWF9TQ0FOX01BWF9CQVRDSEVT LgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmF0Y2ggd2FzIGxvYWRlZCBzdWNjZXNz ZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAqCisgKiBYWFggVGhpcyBvbmx5IGxvYWRzIHRo ZSBUSURzIGFuZCByZXNldHMgdGhlIHZhcmlvdXMgYmF0Y2ggZmllbGRzIHRvCisgKiBmcmVz aCBzdGF0ZS4gSXQgZG9lcyBub3Qgc2V0IHhzX2hlYXB0aWQveHNfaXR1cC94c19oaXR1cCwg dGhhdCdzIHRoZQorICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGZvbGxvd2luZyBpbmRleF9i YXRjaF9nZXRuZXh0X3RpZCgpIGNhbGxzLgorICogLS0tLS0tLS0tLS0tLS0tLQorICovCitz dGF0aWMgYm9vbAoraW5kZXhfYmF0Y2hfZ2V0bmV4dChJbmRleFNjYW5EZXNjIHNjYW4pCit7 CisJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaDsKKwlJdGVtUG9pbnRlckRhdGEgdGlkOwor CVNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uID0gc2Nhbi0+eHNfYmF0Y2hlcy0+ZGlyZWN0aW9u OworCUluZGV4VHVwbGUJaXR1cDsKKworCVNDQU5fQ0hFQ0tTOworCUNIRUNLX1NDQU5fUFJP Q0VEVVJFKGFtZ2V0YmF0Y2gpOworCisJLyogWFhYOiB3ZSBzaG91bGQgYXNzZXJ0IHRoYXQg YSBzbmFwc2hvdCBpcyBwdXNoZWQgb3IgcmVnaXN0ZXJlZCAqLworCUFzc2VydChUcmFuc2Fj dGlvbklkSXNWYWxpZChSZWNlbnRYbWluKSk7CisKKwkvKgorCSAqIElmIHdlIGFscmVhZHkg dXNlZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYmF0Y2ggc2xvdHMgYXZhaWxhYmxlLCBpdCdz CisJICogcG9pbnRsZXNzIHRvIHRyeSBsb2FkaW5nIGFub3RoZXIgb25lLiBUaGlzIGNhbiBo YXBwZW4gZm9yIHZhcmlvdXMKKwkgKiByZWFzb25zLCBlLmcuIGZvciBpbmRleC1vbmx5IHNj YW5zIG9uIGFsbC12aXNpYmxlIHRhYmxlLCBvciBza2lwcGluZworCSAqIGR1cGxpY2F0ZSBi bG9ja3Mgb24gcGVyZmVjdGx5IGNvcnJlbGF0ZWQgaW5kZXhlcywgZXRjLgorCSAqCisJICog V2UgY291bGQgZW5sYXJnZSB0aGUgYXJyYXkgdG8gYWxsb3cgbW9yZSBiYXRjaGVzLCBidXQg dGhhdCdzIGZ1dGlsZSwgd2UKKwkgKiBjYW4gYWx3YXlzIGNvbnN0cnVjdCBhIGNhc2UgdXNp bmcgbW9yZSBtZW1vcnkuIE5vdCBvbmx5IGl0IHdvdWxkIHJpc2sKKwkgKiBPT00sIGl0J2Qg YWxzbyBiZSBpbmVmZmljaWVudCBiZWNhdXNlIHRoaXMgaGFwcGVucyBlYXJseSBpbiB0aGUg c2NhbgorCSAqIChzbyBpdCdkIGludGVyZmVyZSB3aXRoIExJTUlUIHF1ZXJpZXMpLgorCSAq CisJICogWFhYIEZvciBub3cgd2UganVzdCBlcnJvciBvdXQsIGJ1dCB0aGUgY29ycmVjdCBz b2x1dGlvbiBpcyB0byBwYXVzZSB0aGUKKwkgKiBzdHJlYW0gYnkgcmV0dXJuaW5nIEludmFs aWRCbG9ja051bWJlciBhbmQgdGhlbiB1bnBhdXNlIGl0IGJ5IGRvaW5nCisJICogcmVhZF9z dHJlYW1fcmVzZXQuCisJICovCisJaWYgKElOREVYX1NDQU5fQkFUQ0hfRlVMTChzY2FuKSkK Kwl7CisJCURFQlVHX0xPRygiaW5kZXhfYmF0Y2hfZ2V0bmV4dDogcmFuIG91dCBvZiBzcGFj ZSBmb3IgYmF0Y2hlcyIpOworCQlzY2FuLT54c19iYXRjaGVzLT5yZXNldCA9IHRydWU7CisJ fQorCisJLyoKKwkgKiBEaWQgd2UgZmlsbCB0aGUgYmF0Y2ggcXVldWUsIGVpdGhlciBpbiB0 aGlzIG9yIHNvbWUgZWFybGllciBjYWxsPworCSAqIElmIHllcywgd2UgaGF2ZSB0byBjb25z dW1lIGV2ZXJ5dGhpbmcgZnJvbSBjdXJyZW50bHkgbG9hZGVkIGJhdGNoCisJICogYmVmb3Jl IHdlIHJlc2V0IHRoZSBzdHJlYW0gYW5kIGNvbnRpbnVlLiBJdCdzIGEgYml0IGxpa2UgJ2Zp bmlzaGVkJworCSAqIGJ1dCBpdCdzIG9ubHkgYSB0ZW1wb3JhcnkgcGF1c2UsIG5vdCB0aGUg ZW5kIG9mIHRoZSBzdHJlYW0uCisJICovCisJaWYgKHNjYW4tPnhzX2JhdGNoZXMtPnJlc2V0 KQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogRGlkIHdlIGFscmVhZHkgcmVhZCB0aGUg bGFzdCBiYXRjaCBmb3IgdGhpcyBzY2FuPworCSAqCisJICogV2UgbWF5IHJlYWQgdGhlIGJh dGNoZXMgaW4gdHdvIHBsYWNlcywgc28gd2UgbmVlZCB0byByZW1lbWJlciB0aGF0LAorCSAq IG90aGVyd2lzZSB0aGUgcmV0cnkgcmVzdGFydHMgdGhlIHNjYW4uCisJICoKKwkgKiBYWFgg VGhpcyBjb21tZW50IG1pZ2h0IGJlIG9ic29sZXRlLCBmcm9tIGJlZm9yZSB1c2luZyB0aGUg cmVhZF9zdHJlYW0uCisJICoKKwkgKiBYWFggQWxzbywgbWF5YmUgd2Ugc2hvdWxkIGRvIHRo aXMgYmVmb3JlIGNhbGxpbmcgSU5ERVhfU0NBTl9CQVRDSF9GVUxMPworCSAqLworCWlmIChz Y2FuLT54c19iYXRjaGVzLT5maW5pc2hlZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpbmRleF9i YXRjaF9wcmludCgiaW5kZXhfYmF0Y2hfZ2V0bmV4dCAvIHN0YXJ0Iiwgc2Nhbik7CisKKwkv KgorCSAqIEZJWE1FIGJ0Z2V0YmF0Y2ggY2FsbHMgX2J0X3JldHVybml0ZW0sIHdoaWNoIGhv d2V2ZXIgc2V0cyB4c19oZWFwdGlkLAorCSAqIGFuZCBzbyB3b3VsZCBpbnRlcmZlcmUgd2l0 aCBpbmRleCBzY2FucyAoYmVjYXVzZSB0aGlzIG1heSBnZXQgZXhlY3V0ZWQKKwkgKiBmcm9t IHRoZSByZWFkX3N0cmVhbV9uZXh0X2J1ZmZlciBjYWxsYmFjayBkdXJpbmcgdGhlIHNjYW4g KGZldGNoaW5nCisJICogaGVhcCB0dXBsZXMgaW4gaGVhcGFtX2luZGV4X2ZldGNoX3R1cGxl KS4gVWx0aW1hdGVseSB3ZSBzaG91bGQgbm90IGRvCisJICogX2J0X3JldHVybml0ZW0gYXQg YWxsLCBqdXN0IGZ1bmN0aW9ucyBsaWtlIF9idF9zdGVwcGFnZSBldGMuIHdoaWxlCisJICog bG9hZGluZyB0aGUgbmV4dCBiYXRjaC4KKwkgKgorCSAqIFhYWCBJIHRoaW5rIHRoaXMgaXMg bm8gbG9uZ2VyIHRydWUsIHRoZSBhbWdldGJhdGNoIGRvZXMgbm90IGRvIHRoYXQgSQorCSAq IGJlbGlldmUgKF9idF9yZXR1cm5pdGVtX2JhdGNoIHNob3VsZCBub3Qgc2V0IHRoZXNlIGZp ZWxkcykuCisJICovCisJdGlkID0gc2Nhbi0+eHNfaGVhcHRpZDsKKwlpdHVwID0gc2Nhbi0+ eHNfaXR1cDsKKworCWJhdGNoID0gc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFt Z2V0YmF0Y2goc2NhbiwgZGlyZWN0aW9uKTsKKwlpZiAoYmF0Y2ggIT0gTlVMTCkKKwl7CisJ CS8qCisJCSAqIFdlIGdvdCB0aGUgYmF0Y2ggZnJvbSB0aGUgQU0sIGJ1dCB3ZSBuZWVkIHRv IGFkZCBpdCB0byB0aGUgcXVldWUuCisJCSAqIE1heWJlIHRoYXQgc2hvdWxkIGJlIHBhcnQg b2YgdGhlICJiYXRjaCBhbGxvY2F0aW9uIiB0aGF0IGhhcHBlbnMgaW4KKwkJICogdGhlIEFN PworCQkgKi8KKwkJaW50CQkJYmF0Y2hJbmRleCA9IHNjYW4tPnhzX2JhdGNoZXMtPm5leHRC YXRjaDsKKworCQlJTkRFWF9TQ0FOX0JBVENIKHNjYW4sIGJhdGNoSW5kZXgpID0gYmF0Y2g7 CisKKwkJc2Nhbi0+eHNfYmF0Y2hlcy0+bmV4dEJhdGNoKys7CisKKwkJLyoKKwkJICogWFhY IFdoeSBkbyB3ZSBuZWVkIGN1cnJlbnRCYXRjaCwgYWN0dWFsbHk/IEl0IGRvZXNuJ3Qgc2Vl bSB0byBiZQorCQkgKiB1c2VkIGFueXdoZXJlLCBqdXN0IHNldCAuLi4KKwkJICovCisJCS8v IHNjYW4tPnhzX2JhdGNoZXMtPmN1cnJlbnRCYXRjaCA9IGJhdGNoOworCisJCURFQlVHX0xP RygiaW5kZXhfYmF0Y2hfZ2V0bmV4dCBmaXJzdEJhdGNoICVkIG5leHRCYXRjaCAlZCBiYXRj aCAlcCIsCisJCQkJICBzY2FuLT54c19iYXRjaGVzLT5maXJzdEJhdGNoLCBzY2FuLT54c19i YXRjaGVzLT5uZXh0QmF0Y2gsIGJhdGNoKTsKKwl9CisJZWxzZQorCQlzY2FuLT54c19iYXRj aGVzLT5maW5pc2hlZCA9IHRydWU7CisKKwkvKiBYWFggc2VlIEZJWE1FIGFib3ZlICovCisJ c2Nhbi0+eHNfaGVhcHRpZCA9IHRpZDsKKwlzY2FuLT54c19pdHVwID0gaXR1cDsKKworCUFz c2VydENoZWNrQmF0Y2hlcyhzY2FuKTsKKworCWluZGV4X2JhdGNoX3ByaW50KCJpbmRleF9i YXRjaF9nZXRuZXh0IC8gZW5kIiwgc2Nhbik7CisKKwlyZXR1cm4gKGJhdGNoICE9IE5VTEwp OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tCisgKgkJaW5kZXhfZ2V0bmV4dF9iYXRjaF90 aWQgLSBnZXQgdGhlIG5leHQgVElEIGZyb20gdGhlIGN1cnJlbnQgYmF0Y2gKKyAqCisgKiBU aGUgY2FsbGluZyBjb252ZW50aW9uIGlzIHNpbWlsYXIgdG8gaW5kZXhfZ2V0bmV4dF90aWQo KSAtIE5VTEwgbWVhbnMgbm8KKyAqIG1vcmUgaXRlbXMgaW4gdGhlIGN1cnJlbnQgYmF0Y2gs IGFuZCBubyBtb3JlIGJhdGNoZXMuCisgKgorICogSWYgd2UgYWR2YW5jZSB0byB0aGUgbmV4 dCBiYXRjaCwgd2UgcmVsZWFzZSB0aGUgcHJldmlvdXMgb25lICh1bmxlc3MgaXQncworICog dHJhY2tlZCBmb3IgbWFyay9yZXN0b3JlKS4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IFRJ RCwgb3IgTlVMTCBpZiBubyBtb3JlIGl0ZW1zIChvciBiYXRjaGVzKS4KKyAqCisgKiBGSVhN RSBUaGlzIG9ubHkgc2V0cyB4c19oZWFwdGlkIGFuZCB4c19pdHVwIChpZiByZXF1ZXN0ZWQp LiBOb3Qgc3VyZSBpZgorICogd2UgbmVlZCB0byBkbyBzb21ldGhpbmcgd2l0aCB4c19oaXR1 cC4gU2hvdWxkIHRoaXMgc2V0IHhzX2hpdHVwPworICoKKyAqIFhYWCBNYXliZSBpZiB3ZSBh ZHZhbmNlIHRoZSBwb3NpdGlvbiB0byB0aGUgbmV4dCBiYXRjaCwgd2UgY291bGQga2VlcCB0 aGUKKyAqIGJhdGNoIGZvciBhIGJpdCBtb3JlLCBpbiBjYXNlIHRoZSBzY2FuIGRpcmVjdGlv biBjaGFuZ2VzIChhcyBsb25nIGFzIGl0CisgKiBmaXRzIGludG8gbWF4QmF0Y2hlcyk/IEJ1 dCBtYXliZSB0aGF0J3MgdW5uZWNlc3NhcnkgY29tcGxleGl0eSBmb3IgdG9vCisgKiBsaXR0 bGUgZ2Fpbiwgd2UnZCBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQgcmVsZWFzaW5nIHRoZSBi YXRjaGVzIGxhemlseS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqLworc3RhdGljIEl0ZW1Q b2ludGVyCitpbmRleF9iYXRjaF9nZXRuZXh0X3RpZChJbmRleFNjYW5EZXNjIHNjYW4sIFNj YW5EaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCUluZGV4U2NhbkJhdGNoUG9zICpwb3M7CisK KwkvKiBzaG91bGRuJ3QgZ2V0IGhlcmUgd2l0aG91dCBiYXRjaGluZyAqLworCUFzc2VydENo ZWNrQmF0Y2hlcyhzY2FuKTsKKworCS8qIHJlYWQgdGhlIG5leHQgVElEIGZyb20gdGhlIGlu ZGV4ICovCisJcG9zID0gJnNjYW4tPnhzX2JhdGNoZXMtPnJlYWRQb3M7CisKKwkvKiBGSVhN RSBoYW5kbGUgY2hhbmdlIG9mIHNjYW4gZGlyZWN0aW9uIChyZXNldCBzdHJlYW0sIC4uLikg Ki8KKwlzY2FuLT54c19iYXRjaGVzLT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisKKwlERUJV R19MT0coImluZGV4X2JhdGNoX2dldG5leHRfdGlkIHBvcyAlZCAlZCBkaXJlY3Rpb24gJWQi LAorCQkJICBwb3MtPmJhdGNoLCBwb3MtPmluZGV4LCBkaXJlY3Rpb24pOworCisJLyoKKwkg KiBUcnkgYWR2YW5jaW5nIHRoZSBiYXRjaCBwb3NpdGlvbi4gSWYgdGhhdCBkb2Vzbid0IHN1 Y2NlZWQsIGl0IG1lYW5zIHdlCisJICogZG9uJ3QgaGF2ZSBtb3JlIGl0ZW1zIGluIHRoZSBj dXJyZW50IGJhdGNoLCBhbmQgdGhlcmUncyBubyBmdXR1cmUgYmF0Y2gKKwkgKiBsb2FkZWQu IFNvIHRyeSBsb2FkaW5nIGFub3RoZXIgYmF0Y2gsIGFuZCBtYXliZSByZXRyeS4KKwkgKgor CSAqIEZJWE1FIFRoaXMgbG9vcCBzaG91bGRuJ3QgaGFwcGVuIG1vcmUgdGhhbiB0d2ljZS4g TWF5YmUgd2Ugc2hvdWxkIGhhdmUKKwkgKiBzb21lIHByb3RlY3Rpb24gYWdhaW5zdCBpbmZp bml0ZSBsb29wcz8gSWYgdGhlIGFkdmFuY2UvZ2V0bmV4dAorCSAqIGZ1bmN0aW9ucyBnZXQg dG8gZGlzYWdyZWU/CisJICovCisJd2hpbGUgKHRydWUpCisJeworCQkvKgorCQkgKiBJZiB3 ZSBtYW5hZ2UgdG8gYWR2YW5jZSB0byB0aGUgbmV4dCBpdGVtcywgcmV0dXJuIGl0IGFuZCB3 ZSdyZQorCQkgKiBkb25lLiBPdGhlcndpc2UgdHJ5IGxvYWRpbmcgYW5vdGhlciBiYXRjaC4K KwkJICovCisJCWlmIChpbmRleF9iYXRjaF9wb3NfYWR2YW5jZShzY2FuLCBwb3MpKQorCQl7 CisJCQlJbmRleFNjYW5CYXRjaERhdGEgKmJhdGNoID0gSU5ERVhfU0NBTl9CQVRDSChzY2Fu LCBwb3MtPmJhdGNoKTsKKworCQkJQXNzZXJ0KGJhdGNoICE9IE5VTEwpOworCisJCQkvKiBz ZXQgdGhlIFRJRCAvIGl0dXAgZm9yIHRoZSBzY2FuICovCisJCQlzY2FuLT54c19oZWFwdGlk ID0gYmF0Y2gtPml0ZW1zW3Bvcy0+aW5kZXhdLmhlYXBUaWQ7CisJCQlzY2FuLT54c19pdHVw ID0gKEluZGV4VHVwbGUpIChiYXRjaC0+Y3VyclR1cGxlcyArIGJhdGNoLT5pdGVtc1twb3Mt PmluZGV4XS50dXBsZU9mZnNldCk7CisKKwkJCURFQlVHX0xPRygicG9zIGJhdGNoICVwIGZp cnN0ICVkIGxhc3QgJWQgcG9zICVkLyVkIFRJRCAoJXUsJXUpIiwKKwkJCQkJICBiYXRjaCwg YmF0Y2gtPmZpcnN0SXRlbSwgYmF0Y2gtPmxhc3RJdGVtLAorCQkJCQkgIHBvcy0+YmF0Y2gs IHBvcy0+aW5kZXgsCisJCQkJCSAgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcigmc2Nhbi0+ eHNfaGVhcHRpZCksCisJCQkJCSAgSXRlbVBvaW50ZXJHZXRPZmZzZXROdW1iZXIoJnNjYW4t PnhzX2hlYXB0aWQpKTsKKworCQkJLyoKKwkJCSAqIElmIHdlIGFkdmFuY2VkIHRvIHRoZSBu ZXh0IGJhdGNoLCByZWxlYXNlIHRoZSBiYXRjaCB3ZSBubworCQkJICogbG9uZ2VyIG5lZWQu IFRoZSBwb3NpdGlvbnMgaXMgdGhlICJyZWFkIiBwb3NpdGlvbiwgYW5kIHdlIGNhbgorCQkJ ICogY29tcGFyZSBpdCB0byBmaXJzdEJhdGNoLgorCQkJICovCisJCQlpZiAocG9zLT5iYXRj aCAhPSBzY2FuLT54c19iYXRjaGVzLT5maXJzdEJhdGNoKQorCQkJeworCQkJCWJhdGNoID0g SU5ERVhfU0NBTl9CQVRDSChzY2FuLCBzY2FuLT54c19iYXRjaGVzLT5maXJzdEJhdGNoKTsK KwkJCQlBc3NlcnQoYmF0Y2ggIT0gTlVMTCk7CisKKwkJCQkvKgorCQkJCSAqIFhYWCBXaGVu IGFkdmFuY2luZyByZWFkUG9zLCB0aGUgc3RyZWFtUG9zIG1heSBnZXQgYmVoaW5kIGFzCisJ CQkJICogd2UncmUgb25seSBhZHZhbmNpbmcgaXQgd2hlbiBhY3R1YWxseSByZXF1ZXN0aW5n IGhlYXAgYmxvY2tzLgorCQkJCSAqIEJ1dCB3ZSBtYXkgbm90IGRvIHRoYXQgb2Z0ZW4gZW5v dWdoIC0gZS5nLiBJT1MgbWF5IG5vdCBuZWVkCisJCQkJICogdG8gYWNjZXNzIGFsbC12aXNp YmxlIGhlYXAgYmxvY2tzLCBzbyB0aGUgcmVhZF9uZXh0IGNhbGxiYWNrCisJCQkJICogZG9l cyBub3QgZ2V0IGludm9rZWQgZm9yIGEgbG9uZyB0aW1lLiBJdCdzIHBvc3NpYmxlIHRoZQor CQkJCSAqIHN0cmVhbSBnZXRzIHNvIG11Y3UgYmVoaW5kIHRoZSBwb3NpdGlvbiBnZXRzIGlu dmFsaWQsIGFzIHdlCisJCQkJICogYWxyZWFkeSByZW1vdmVkIHRoZSBiYXRjaC4gQnV0IHRo YXQgbWVhbnMgd2UgZG9uJ3QgbmVlZCBhbnkKKwkJCQkgKiBoZWFwIGJsb2NrcyB1bnRpbCB0 aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIC0gaWYgd2UgZGlkLCB3ZQorCQkJCSAqIHdvdWxk IG5vdCBiZSBpbiB0aGlzIHNpdHVhdGlvbiAob3IgaXQncyBhIHNpZ24gb2YgYSBidWcsIGFz CisJCQkJICogdGhvc2UgdHdvIHBsYWNlcyBhcmUgZXhwZWN0ZWQgdG8gYmUgaW4gc3luYyku IFNvIGlmIHRoZQorCQkJCSAqIHN0cmVhbVBvcyBzdGlsbCBwb2ludHMgYXQgdGhlIGJhdGNo IHdlJ3JlIGFib3V0IHRvIGZyZWUsCisJCQkJICoganVzdCByZXNldCB0aGUgcG9zaXRpb24g LSB3ZSdsbCBzZXQgaXQgdG8gcmVhZFBvcyBpbiB0aGUKKwkJCQkgKiByZWFkX25leHQgY2Fs bGJhY2sgbGF0ZXIuCisJCQkJICoKKwkJCQkgKiBYWFggVGhpcyBjYW4gaGFwcGVuIGFmdGVy IHRoZSBxdWV1ZSBnZXRzIGZ1bGwsIHdlICJwYXVzZSIKKwkJCQkgKiB0aGUgc3RyZWFtLCBh bmQgdGhlbiByZXNldCBpdCB0byBjb250aW51ZS4gQnV0IEkgdGhpbmsgdGhhdAorCQkJCSAq IGp1c3QgaW5jcmVhc2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBoaXR0aW5nIHRoZSBpc3N1ZSwg aXQncworCQkJCSAqIGp1c3QgbW9yZSBjaGFuY2UgdG8gdG8gbm90IGFkdmFuY2UgdGhlIHN0 cmVhbVBvcywgd2hpY2gKKwkJCQkgKiBkZXBlbmRzIG9uIHdoZW4gd2UgdHJ5IHRvIGZldGNo IHRoZSBmaXJzdCBoZWFwIGJsb2NrIGFmdGVyCisJCQkJICogY2FsbGluZyByZWFkX3N0cmVh bV9yZXNldCgpLgorCQkJCSAqLworCQkJCWlmIChzY2FuLT54c19iYXRjaGVzLT5zdHJlYW1Q b3MuYmF0Y2ggPT0gc2Nhbi0+eHNfYmF0Y2hlcy0+Zmlyc3RCYXRjaCkKKwkJCQl7CisJCQkJ CWluZGV4X2JhdGNoX3Bvc19yZXNldChzY2FuLCAmc2Nhbi0+eHNfYmF0Y2hlcy0+c3RyZWFt UG9zKTsKKwkJCQl9CisKKwkJCQlERUJVR19MT0coImluZGV4X2JhdGNoX2dldG5leHRfdGlk IGZyZWUgYmF0Y2ggJXAgZmlyc3RCYXRjaCAlZCBuZXh0QmF0Y2ggJWQiLAorCQkJCQkJICBi YXRjaCwKKwkJCQkJCSAgc2Nhbi0+eHNfYmF0Y2hlcy0+Zmlyc3RCYXRjaCwKKwkJCQkJCSAg c2Nhbi0+eHNfYmF0Y2hlcy0+bmV4dEJhdGNoKTsKKworCQkJCS8qIEZyZWUgdGhlIGJhdGNo IChleGNlcHQgd2hlbiBpdCdzIG5lZWRlZCBmb3IgbWFyay9yZXN0b3JlKS4gKi8KKwkJCQlp bmRleF9iYXRjaF9mcmVlKHNjYW4sIGJhdGNoKTsKKworCQkJCS8qCisJCQkJICogSW4gYW55 IGNhc2UsIHJlbW92ZSB0aGUgYmF0Y2ggZnJvbSB0aGUgcmVndWxhciBxdWV1ZSwgZXZlbgor CQkJCSAqIGlmIHdlIGtlcHQgaXQgZm9yIG1hci9yZXN0b3JlLgorCQkJCSAqLworCQkJCXNj YW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2grKzsKKworCQkJCURFQlVHX0xPRygiaW5kZXhf YmF0Y2hfZ2V0bmV4dF90aWQgYmF0Y2ggZnJlZWQgZmlyc3RCYXRjaCAlZCBuZXh0QmF0Y2gg JWQiLAorCQkJCQkJICBzY2FuLT54c19iYXRjaGVzLT5maXJzdEJhdGNoLAorCQkJCQkJICBz Y2FuLT54c19iYXRjaGVzLT5uZXh0QmF0Y2gpOworCisJCQkJaW5kZXhfYmF0Y2hfcHJpbnQo ImluZGV4X2JhdGNoX2dldG5leHRfdGlkIC8gZnJlZSBvbGQgYmF0Y2giLCBzY2FuKTsKKwor CQkJCS8qIHdlIGNhbid0IHNraXAgYW55IGJhdGNoZXMgKi8KKwkJCQlBc3NlcnQoc2Nhbi0+ eHNfYmF0Y2hlcy0+Zmlyc3RCYXRjaCA9PSBwb3MtPmJhdGNoKTsKKwkJCX0KKworCQkJcmV0 dXJuICZzY2FuLT54c19oZWFwdGlkOworCQl9CisKKwkJLyoKKwkJICogV2UgZmFpbGVkIHRv IGFkdmFuY2UsIGkuZS4gd2UgcmFuIG91dCBvZiBjdXJyZW50bHkgbG9hZGVkIGJhdGNoZXMu CisJCSAqIFNvIGlmIHdlIGZpbGxlZCB0aGUgcXVldWUsIHRoaXMgaXMgYSBnb29kIHRpbWUg dG8gcmVzZXQgdGhlIHN0cmVhbQorCQkgKiAoYmVmb3JlIHdlIHRyeSBsb2FkaW5nIHRoZSBu ZXh0IGJhdGNoKS4KKwkJICovCisJCWlmIChzY2FuLT54c19iYXRjaGVzLT5yZXNldCkKKwkJ eworCQkJREVCVUdfTE9HKCJyZXNldHRpbmcgcmVhZCBzdHJlYW0gcG9zICVkLCVkIiwKKwkJ CQkJICBzY2FuLT54c19iYXRjaGVzLT5yZWFkUG9zLmJhdGNoLCBzY2FuLT54c19iYXRjaGVz LT5yZWFkUG9zLmluZGV4KTsKKworCQkJc2Nhbi0+eHNfYmF0Y2hlcy0+cmVzZXQgPSBmYWxz ZTsKKworCQkJLyoKKwkJCSAqIE5lZWQgdG8gcmVzZXQgdGhlIHN0cmVhbSBwb3NpdGlvbiwg aXQgbWlnaHQgYmUgdG9vIGZhciBiZWhpbmQuCisJCQkgKiBVbHRpbWF0ZWx5IHdlIHdhbnQg dG8gc2V0IGl0IHRvIHJlYWRQb3MsIGJ1dCB3ZSBjYW4ndCBkbyB0aGF0CisJCQkgKiB5ZXQg LSByZWFkUG9zIHN0aWxsIHBvaW50IHNhdCB0aGUgb2xkIGJhdGNoLCBzbyBqdXN0IHJlc2V0 IGl0CisJCQkgKiBhbmQgd2UnbGwgaW5pdCBpdCB0byByZWFkUG9zIGxhdGVyIGluIHRoZSBj YWxsYmFjay4KKwkJCSAqLworCQkJaW5kZXhfYmF0Y2hfcG9zX3Jlc2V0KHNjYW4sICZzY2Fu LT54c19iYXRjaGVzLT5zdHJlYW1Qb3MpOworCisJCQlyZWFkX3N0cmVhbV9yZXNldChzY2Fu LT54c19oZWFwZmV0Y2gtPnJzKTsKKwkJfQorCisJCS8qCisJCSAqIEZhaWxlZCB0byBhZHZh bmNlIHRoZSByZWFkIHBvc2l0aW9uLCBzbyB0cnkgcmVhZGluZyB0aGUgbmV4dCBiYXRjaC4K KwkJICogSWYgdGhpcyBmYWlscywgd2UncmUgZG9uZSAtIHRoZXJlJ3Mgbm90aGluZyBtb3Jl IHRvIGxvYWQuCisJCSAqCisJCSAqIE1vc3Qgb2YgdGhlIGJhdGNoZXMgc2hvdWxkIGJlIGxv YWRlZCBmcm9tIHJlYWRfc3RyZWFtX25leHRfYnVmZmVyLAorCQkgKiBidXQgd2UgbmVlZCB0 byBjYWxsIGluZGV4X2JhdGNoX2dldG5leHQgaGVyZSB0b28sIGZvciB0d28gcmVhc29ucy4K KwkJICogRmlyc3QsIHRoZSByZWFkX3N0cmVhbSBvbmx5IGdldHMgd29ya2luZyBhZnRlciB3 ZSB0cnkgZmV0Y2hpbmcgdGhlCisJCSAqIGZpcnN0IGhlYXAgdHVwbGUsIHNvIHdlIG5lZWQg dG8gbG9hZCB0aGUgZmlyc3QgYmF0Y2ggZnJvbSBoZXJlLgorCQkgKiBTZWNvbmQsIHdoaWxl IG1vc3QgYmF0Y2hlcyB3aWxsIGJlIHByZWxvYWRlZCBieSB0aGUgc3RyZWFtIHRoYW5rJ3MK KwkJICogdG8gcHJlZmV0Y2hpbmcsIGl0J3MgcG9zc2libGUgdG8gc2V0IGVmZmVjdGl2ZV9p b19jb25jdXJyZW5jeT0wLCBpbgorCQkgKiB3aGljaCBjYXNlIGFsbCB0aGUgYmF0Y2ggbG9h ZHMgaGFwcGVuIGZyb20gaGVyZS4KKwkJICovCisJCWlmICghaW5kZXhfYmF0Y2hfZ2V0bmV4 dChzY2FuKSkKKwkJCWJyZWFrOworCisJCURFQlVHX0xPRygibG9hZGVkIG5leHQgYmF0Y2gs IHJldHJ5IHRvIGFkdmFuY2UgcG9zaXRpb24iKTsKKwl9CisKKwkvKgorCSAqIElmIHdlIGdl dCBoZXJlLCB3ZSBmYWlsZWQgdG8gYWR2YW5jZSB0aGUgcG9zaXRpb24gYW5kIHRoZXJlIGFy ZSBubyBtb3JlCisJICogYmF0Y2hlcywgc28gd2UncmUgZG9uZS4KKwkgKi8KKwlERUJVR19M T0coIm5vIG1vcmUgYmF0Y2hlcyB0byBwcm9jZXNzIik7CisKKwlyZXR1cm4gTlVMTDsKK30K KworLyoKKyAqIGluZGV4X2JhdGNoX2luaXQKKyAqCQlJbml0aWFsaXplIHZhcmlvdXMgZmll bGRzIC8gYXJyYXlzIG5lZWRlZCBieSBiYXRjaGluZy4KKyAqCisgKiBGSVhNRSBUaGlzIGlz IGEgYml0IGFkLWhvYyBob2RnZSBwb2RnZSwgZHVlIHRvIGhvdyBJIHdhcyBhZGRpbmcgbW9y ZSBhbmQKKyAqIG1vcmUgcGllY2VzLiBTb21lIG9mIHRoZSBmaWVsZHMgbWF5IGJlIG5vdCBx dWl0ZSBuZWNlc3NhcnksIG5lZWRzIGNsZWFudXAuCisgKi8KK3N0YXRpYyB2b2lkCitpbmRl eF9iYXRjaF9pbml0KEluZGV4U2NhbkRlc2Mgc2NhbikKK3sKKwkvKiBpbml0IGJhdGNoaW5n IGluZm8sIGFzc3VtZSBiYXRjaGluZyBpcyBzdXBwb3J0ZWQgYnkgdGhlIEFNICovCisJQXNz ZXJ0KHNjYW4tPmluZGV4UmVsYXRpb24tPnJkX2luZGFtLT5hbWdldGJhdGNoICE9IE5VTEwp OworCUFzc2VydChzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1mcmVlYmF0Y2gg IT0gTlVMTCk7CisKKwlzY2FuLT54c19iYXRjaGVzID0gcGFsbG9jMChzaXplb2YoSW5kZXhT Y2FuQmF0Y2hlcykpOworCisJLyogV2UgZG9uJ3Qga25vdyBkaXJlY3Rpb24gb2YgdGhlIHNj YW4geWV0LiAqLworCXNjYW4tPnhzX2JhdGNoZXMtPmRpcmVjdGlvbiA9IE5vTW92ZW1lbnRT Y2FuRGlyZWN0aW9uOworCisJLyogSW5pdGlhbGl6ZSB0aGUgYmF0Y2ggKi8KKwlzY2FuLT54 c19iYXRjaGVzLT5tYXhCYXRjaGVzID0gSU5ERVhfU0NBTl9NQVhfQkFUQ0hFUzsKKwlzY2Fu LT54c19iYXRjaGVzLT5maXJzdEJhdGNoID0gMDsJLyogZmlyc3QgYmF0Y2ggKi8KKwlzY2Fu LT54c19iYXRjaGVzLT5uZXh0QmF0Y2ggPSAwOwkvKiBmaXJzdCBiYXRjaCBpcyBlbXB0eSAq LworCisJc2Nhbi0+eHNfYmF0Y2hlcy0+YmF0Y2hlcworCQk9IHBhbGxvYyhzaXplb2YoSW5k ZXhTY2FuQmF0Y2hEYXRhICopICogc2Nhbi0+eHNfYmF0Y2hlcy0+bWF4QmF0Y2hlcyk7CisK KwkvKiBwb3NpdGlvbnMgaW4gdGhlIHF1ZXVlIG9mIGJhdGNoZXMgKi8KKwlpbmRleF9iYXRj aF9wb3NfcmVzZXQoc2NhbiwgJnNjYW4tPnhzX2JhdGNoZXMtPnJlYWRQb3MpOworCWluZGV4 X2JhdGNoX3Bvc19yZXNldChzY2FuLCAmc2Nhbi0+eHNfYmF0Y2hlcy0+c3RyZWFtUG9zKTsK KwlpbmRleF9iYXRjaF9wb3NfcmVzZXQoc2NhbiwgJnNjYW4tPnhzX2JhdGNoZXMtPm1hcmtQ b3MpOworCisJLy8gc2Nhbi0+eHNfYmF0Y2hlcy0+Y3VycmVudEJhdGNoID0gTlVMTDsKK30K KworLyoKKyAqIGluZGV4X2JhdGNoX3Jlc2V0CisgKgkJUmVzZXQgdGhlIGJhdGNoIGJlZm9y ZSByZWFkaW5nIHRoZSBuZXh0IGNodW5rIG9mIGRhdGEuCisgKgorICogY29tcGxldGUgLSB0 cnVlIG1lYW5zIHdlIHJlc2V0IGV2ZW4gbWFya2VkIGJhdGNoCisgKgorICAqIFhYWCBTaG91 bGQgdGhpcyByZXNldCB0aGUgYmF0Y2ggbWVtb3J5IGNvbnRleHQsIHhzX2l0dXAsIHhzX2hp dHVwLCBldGM/CisgKi8KK3N0YXRpYyB2b2lkCitpbmRleF9iYXRjaF9yZXNldChJbmRleFNj YW5EZXNjIHNjYW4sIGJvb2wgY29tcGxldGUpCit7CisJSW5kZXhTY2FuQmF0Y2hlcyAqYmF0 Y2hlcyA9IHNjYW4tPnhzX2JhdGNoZXM7CisKKwkvKiBiYWlsIG91dCBpZiBiYXRjaGluZyBu b3QgZW5hYmxlZCAqLworCWlmICghYmF0Y2hlcykKKwkJcmV0dXJuOworCisJQXNzZXJ0Q2hl Y2tCYXRjaGVzKHNjYW4pOworCisJaW5kZXhfYmF0Y2hfcHJpbnQoImluZGV4X2JhdGNoX3Jl c2V0Iiwgc2Nhbik7CisKKwkvKiBXaXRoIGJhdGNoaW5nIGVuYWJsZWQsIHdlIHNob3VsZCBo YXZlIGEgcmVhZCBzdHJlYW0uIFJlc2V0IGl0LiAqLworCUFzc2VydChzY2FuLT54c19oZWFw ZmV0Y2gpOworCXJlYWRfc3RyZWFtX3Jlc2V0KHNjYW4tPnhzX2hlYXBmZXRjaC0+cnMpOwor CisJLyogcmVzZXQgdGhlIHBvc2l0aW9ucyAqLworCWluZGV4X2JhdGNoX3Bvc19yZXNldChz Y2FuLCAmYmF0Y2hlcy0+cmVhZFBvcyk7CisJaW5kZXhfYmF0Y2hfcG9zX3Jlc2V0KHNjYW4s ICZiYXRjaGVzLT5zdHJlYW1Qb3MpOworCisJLyoKKwkgKiBXaXRoICJjb21wbGV0ZSIgcmVz ZXQsIG1ha2Ugc3VyZSB0byBhbHNvIGZyZWUgdGhlIG1hcmtlZCBiYXRjaCwgZWl0aGVyCisJ ICogYnkganVzdCBmb3JnZXR0aW5nIGl0IChpZiBpdCdzIHN0aWxsIGluIHRoZSBxdWV1ZSks IG9yIGJ5IGV4cGxpY2l0bHkKKwkgKiBmcmVlaW5nIGl0LgorCSAqCisJICogWFhYIERvIHRo aXMgYmVmb3JlIHRoZSBsb29wLCBzbyB0aGF0IGl0IGNhbGxzIHRoZSBhbWZyZWViYXRjaCgp LgorCSAqLworCWlmIChjb21wbGV0ZSAmJiAoYmF0Y2hlcy0+bWFya0JhdGNoICE9IE5VTEwp KQorCXsKKwkJSW5kZXhTY2FuQmF0Y2hQb3MgKnBvcyA9ICZiYXRjaGVzLT5tYXJrUG9zOwor CQlJbmRleFNjYW5CYXRjaCBiYXRjaCA9IGJhdGNoZXMtPm1hcmtCYXRjaDsKKworCQkvKiBh bHdheXMgcmVzZXQgdGhlIHBvc2l0aW9uLCBmb3JnZXQgdGhlIG1hcmtlZCBiYXRjaCAqLwor CQliYXRjaGVzLT5tYXJrQmF0Y2ggPSBOVUxMOworCisJCS8qCisJCSAqIElmIHdlJ3ZlIGFs cmVhZHkgbW92ZWQgcGFzdCB0aGUgbWFya2VkIGJhdGNoIChpdCdzIG5vdCBpbiB0aGUKKwkJ ICogY3VycmVudCBxdWV1ZSksIGZyZWUgaXQgZXhwbGljaXRseS4gT3RoZXJ3aXNlIGl0J2xs IGJlIGluIHRoZSBmcmVlZAorCQkgKiBsYXRlci4KKwkJICovCisJCWlmICgocG9zLT5iYXRj aCA8IGJhdGNoZXMtPmZpcnN0QmF0Y2gpIHx8CisJCQkocG9zLT5iYXRjaCA+PSBiYXRjaGVz LT5uZXh0QmF0Y2gpKQorCQl7CisJCQlpbmRleF9iYXRjaF9mcmVlKHNjYW4sIGJhdGNoKTsK KwkJfQorCisJCS8qIHJlc2V0IHBvc2l0aW9uIG9ubHkgYWZ0ZXIgdGhlIHF1ZXVlIHJhbmdl IGNoZWNrICovCisJCWluZGV4X2JhdGNoX3Bvc19yZXNldChzY2FuLCAmYmF0Y2hlcy0+bWFy a1Bvcyk7CisJfQorCisJLyogcmVsZWFzZSBhbGwgY3VycmVudGx5IGxvYWRlZCBiYXRjaGVz ICovCisJd2hpbGUgKGJhdGNoZXMtPmZpcnN0QmF0Y2ggPCBiYXRjaGVzLT5uZXh0QmF0Y2gp CisJeworCQlJbmRleFNjYW5CYXRjaCBiYXRjaCA9IElOREVYX1NDQU5fQkFUQ0goc2Nhbiwg YmF0Y2hlcy0+Zmlyc3RCYXRjaCk7CisKKwkJREVCVUdfTE9HKCJmcmVlaW5nIGJhdGNoICVk ICVwIiwgYmF0Y2hlcy0+Zmlyc3RCYXRjaCwgYmF0Y2gpOworCisJCWluZGV4X2JhdGNoX2Zy ZWUoc2NhbiwgYmF0Y2gpOworCisJCS8qIHVwZGF0ZSB0aGUgdmFsaWQgcmFuZ2UsIHNvIHRo YXQgYXNzZXJ0cyAvIGRlYnVnZ2luZyB3b3JrcyAqLworCQliYXRjaGVzLT5maXJzdEJhdGNo Kys7CisJfQorCisJLyogcmVzZXQgcmVsZXZhbnQgSW5kZXhTY2FuQmF0Y2hlcyBmaWVsZHMg Ki8KKwliYXRjaGVzLT5tYXhCYXRjaGVzID0gSU5ERVhfU0NBTl9NQVhfQkFUQ0hFUzsKKwli YXRjaGVzLT5maXJzdEJhdGNoID0gMDsJLyogZmlyc3QgYmF0Y2ggKi8KKwliYXRjaGVzLT5u ZXh0QmF0Y2ggPSAwOwkJLyogZmlyc3QgYmF0Y2ggaXMgZW1wdHkgKi8KKworCWJhdGNoZXMt PmZpbmlzaGVkID0gZmFsc2U7CisJYmF0Y2hlcy0+cmVzZXQgPSBmYWxzZTsKKwkvLyBiYXRj aGVzLT5jdXJyZW50QmF0Y2ggPSBOVUxMOworCisJQXNzZXJ0Q2hlY2tCYXRjaGVzKHNjYW4p OworfQorCitzdGF0aWMgdm9pZAoraW5kZXhfYmF0Y2hfa2lsbF9pdGVtKEluZGV4U2NhbkRl c2Mgc2NhbikKK3sKKwlJbmRleFNjYW5CYXRjaFBvcyAqcG9zID0gJnNjYW4tPnhzX2JhdGNo ZXMtPnJlYWRQb3M7CisJSW5kZXhTY2FuQmF0Y2hEYXRhICpiYXRjaCA9IElOREVYX1NDQU5f QkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisKKwkvKiBGSVhNRSBtYXJrIGl0ZW0gYXQgY3Vy cmVudCByZWFkUG9zIGFzIGRlbGV0ZWQgKi8KKwlBc3NlcnRDaGVja0JhdGNoUG9zVmFsaWQo c2NhbiwgcG9zKTsKKworCS8qCisJICogWFhYIFRvbyB0aWVkIHRvIGJ0cmVlICh0aHJvdWdo IE1heFRJRHNQZXJCVHJlZVBhZ2UpLCB3ZSBzaG91bGQgbWFrZQorCSAqIHRoaXMgQU0gYWdu b3N0aWMuIFdlIGNvdWxkIG1heWJlIGV2ZW4gcmVwbGFjZSB0aGlzIHdpdGggQml0bWFwc2V0 LiBJdAorCSAqIG1pZ2h0IGJlIG1vcmUgZXhwZW5zaXZlIGlmIHdlIG9ubHkga2lsbCBpdGVt cyBhdCB0aGUgZW5kIG9mIHRoZSBwYWdlCisJICogKGluIHdoaWNoIGNhc2Ugd2Ugc3RpbGwg aGF2ZSB0byB3YWxrIHRoZSBmaXJzdCBwYXJ0IHRvIGZpbmQgdGhlIGJpdHMgYXQKKwkgKiB0 aGUgZW5kKS4gQnV0IGdpdmVuIHRoZSBsb3dlciBtZW1vcnkgdXNhZ2UgaXQgc3RpbGwgc2Vl cyBsaWtlIGEgZ29vZAorCSAqIHRyYWRlb2ZmIG92ZXJhbGwuCisJICovCisJaWYgKGJhdGNo LT5raWxsZWRJdGVtcyA9PSBOVUxMKQorCQliYXRjaC0+a2lsbGVkSXRlbXMgPSAoaW50ICop CisJCQlwYWxsb2MoTWF4VElEc1BlckJUcmVlUGFnZSAqIHNpemVvZihpbnQpKTsKKwlpZiAo YmF0Y2gtPm51bUtpbGxlZCA8IE1heFRJRHNQZXJCVHJlZVBhZ2UpCisJCWJhdGNoLT5raWxs ZWRJdGVtc1tiYXRjaC0+bnVtS2lsbGVkKytdID0gcG9zLT5pbmRleDsKKworCS8qIGVsb2co V0FSTklORywgImluZGV4X2JhdGNoX2tpbGxfaXRlbSAoJWQsJWQpIiwgcG9zLT5iYXRjaCwg cG9zLT5pbmRleCk7ICovCisJLyogRklYTUUgaW5kZXhfYmF0Y2hfa2lsbF9pdGVtIG5vdCBp bXBsZW1lbnRlZCAqLworfQorCitzdGF0aWMgdm9pZAoraW5kZXhfYmF0Y2hfZnJlZShJbmRl eFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoIGJhdGNoKQoreworCVNDQU5fQ0hFQ0tT OworCUNIRUNLX1NDQU5fUFJPQ0VEVVJFKGFtZnJlZWJhdGNoKTsKKworCUFzc2VydENoZWNr QmF0Y2goc2NhbiwgYmF0Y2gpOworCisJLyogZG9uJ3QgZnJlZSB0aGUgYmF0Y2ggdGhhdCBp cyBtYXJrZWQgKi8KKwlpZiAoYmF0Y2ggPT0gc2Nhbi0+eHNfYmF0Y2hlcy0+bWFya0JhdGNo KQorCQlyZXR1cm47CisKKwlzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1mcmVl YmF0Y2goc2NhbiwgYmF0Y2gpOworfQorCisvKiAqLworc3RhdGljIHZvaWQKK2luZGV4X2Jh dGNoX2VuZChJbmRleFNjYW5EZXNjIHNjYW4pCit7CisJaW5kZXhfYmF0Y2hfcmVzZXQoc2Nh biwgdHJ1ZSk7Cit9CisKK0luZGV4U2NhbkJhdGNoCitpbmRleF9iYXRjaF9hbGxvYyhpbnQg bWF4aXRlbXMsIGJvb2wgd2FudF9pdHVwKQoreworCUluZGV4U2NhbkJhdGNoIGJhdGNoID0g cGFsbG9jKHNpemVvZihJbmRleFNjYW5CYXRjaERhdGEpKTsKKworCWJhdGNoLT5maXJzdEl0 ZW0gPSAtMTsKKwliYXRjaC0+bGFzdEl0ZW0gPSAtMTsKKwliYXRjaC0+aXRlbUluZGV4ID0g LTE7CisKKwliYXRjaC0+a2lsbGVkSXRlbXMgPSBOVUxMOwkvKiBGSVhNRSBhbGxvY2F0ZSBh biBhcnJheSwgYWN0dWFsbHkgKi8KKwliYXRjaC0+bnVtS2lsbGVkID0gMDsJCS8qIG5vdGhp bmcga2lsbGVkIHlldCAqLworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgYW4gaW5kZXgt b25seSBzY2FuLCB0aGVzZSBhcmUgdGhlIHR1cGxlIHN0b3JhZ2UKKwkgKiB3b3Jrc3BhY2Vz IGZvciB0aGUgY3VyclBvcyBhbmQgbWFya1BvcyByZXNwZWN0aXZlbHkuICBFYWNoIGlzIG9m IHNpemUKKwkgKiBCTENLU1osIHNvIGl0IGNhbiBob2xkIGFzIG11Y2ggYXMgYSBmdWxsIHBh Z2UncyB3b3J0aCBvZiB0dXBsZXMuCisJICoKKwkgKiBYWFggYWxsb2NhdGUKKwkgKi8KKwli YXRjaC0+Y3VyclR1cGxlcyA9IE5VTEw7CS8qIHR1cGxlIHN0b3JhZ2UgZm9yIGN1cnJQb3Mg Ki8KKwlpZiAod2FudF9pdHVwKQorCQliYXRjaC0+Y3VyclR1cGxlcyA9IHBhbGxvYyhCTENL U1opOworCisJLyoKKwkgKiBYWFggTWF5YmUgZG9uJ3Qgc2l6ZSB0byBNYXhUSURzUGVyQlRy ZWVQYWdlPyBXZSBkb24ndCByZXVzZSBiYXRjaGVzCisJICogKHVubGlrZSBjdXJyUG9zKSwg c28gd2UgY2FuIHNpemUgaXQgZm9yIGp1c3Qgd2hhdCB3ZSBuZWVkLgorCSAqLworCWJhdGNo LT5pdGVtcyA9IHBhbGxvYzAoc2l6ZW9mKEluZGV4U2NhbkJhdGNoUG9zSXRlbSkgKiBtYXhp dGVtcyk7CisKKwkvKgorCSAqIGJhdGNoIGNvbnRlbnRzIChUSURzLCBpbmRleCB0dXBsZXMs IGtpbGwgYml0bWFwLCAuLi4pCisJICoKKwkgKiBYWFggYWxsb2NhdGUgYXMgbmVlZGVkPwor CSAqLworCWJhdGNoLT5pdHVwcyA9IE5VTEw7CQkvKiBJbmRleFR1cGxlcywgaWYgcmVxdWVz dGVkICovCisJYmF0Y2gtPmh0dXBzID0gTlVMTDsJCS8qIEhlYXBUdXBsZXMsIGlmIHJlcXVl c3RlZCAqLworCWJhdGNoLT5yZWNoZWNrID0gTlVMTDsJCS8qIHJlY2hlY2sgZmxhZ3MgKi8K KwliYXRjaC0+cHJpdmF0ZURhdGEgPSBOVUxMOwkvKiBwcml2YXRlIGRhdGEgZm9yIGJhdGNo ICovCisKKwkvKiB4c19vcmRlcmJ5dmFscyAvIHhzX29yZGVyYnludWxscyAqLworCWJhdGNo LT5vcmRlcmJ5dmFscyA9IE5VTEw7CisJYmF0Y2gtPm9yZGVyYnludWxscyA9IE5VTEw7CisK KwkvKiBBTS1zcGVjaWZpYyBwZXItYmF0Y2ggc3RhdGUgKi8KKwliYXRjaC0+b3BhcXVlID0g TlVMTDsKKworCXJldHVybiBiYXRjaDsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy90YWJsZS90YWJsZWFtLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvdGFibGUvdGFibGVh bS5jCmluZGV4IGE1NmM1ZWNlYjE0Li5iZThlMDJhOWM0NSAxMDA2NDQKLS0tIGEvc3JjL2Jh Y2tlbmQvYWNjZXNzL3RhYmxlL3RhYmxlYW0uYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3Mv dGFibGUvdGFibGVhbS5jCkBAIC0yMTcsNyArMjE3LDcgQEAgdGFibGVfaW5kZXhfZmV0Y2hf dHVwbGVfY2hlY2soUmVsYXRpb24gcmVsLAogCWJvb2wJCWZvdW5kOwogCiAJc2xvdCA9IHRh YmxlX3Nsb3RfY3JlYXRlKHJlbCwgTlVMTCk7Ci0Jc2NhbiA9IHRhYmxlX2luZGV4X2ZldGNo X2JlZ2luKHJlbCk7CisJc2NhbiA9IHRhYmxlX2luZGV4X2ZldGNoX2JlZ2luKHJlbCwgTlVM TCk7CiAJZm91bmQgPSB0YWJsZV9pbmRleF9mZXRjaF90dXBsZShzY2FuLCB0aWQsIHNuYXBz aG90LCBzbG90LCAmY2FsbF9hZ2FpbiwKIAkJCQkJCQkJCWFsbF9kZWFkKTsKIAl0YWJsZV9p bmRleF9mZXRjaF9lbmQoc2Nhbik7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5k cy9jb25zdHJhaW50LmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb25zdHJhaW50LmMKaW5k ZXggMzQ5N2E4MjIxZjIuLjhhNWQ3OWEyN2E2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9j b21tYW5kcy9jb25zdHJhaW50LmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29uc3Ry YWludC5jCkBAIC0xMDYsNyArMTA2LDggQEAgdW5pcXVlX2tleV9yZWNoZWNrKFBHX0ZVTkNU SU9OX0FSR1MpCiAJICovCiAJdG1wdGlkID0gY2hlY2t0aWQ7CiAJewotCQlJbmRleEZldGNo VGFibGVEYXRhICpzY2FuID0gdGFibGVfaW5kZXhfZmV0Y2hfYmVnaW4odHJpZ2RhdGEtPnRn X3JlbGF0aW9uKTsKKwkJSW5kZXhGZXRjaFRhYmxlRGF0YSAqc2NhbiA9IHRhYmxlX2luZGV4 X2ZldGNoX2JlZ2luKHRyaWdkYXRhLT50Z19yZWxhdGlvbiwKKwkJCQkJCQkJCQkJCQkJCU5V TEwpOwogCQlib29sCQljYWxsX2FnYWluID0gZmFsc2U7CiAKIAkJaWYgKCF0YWJsZV9pbmRl eF9mZXRjaF90dXBsZShzY2FuLCAmdG1wdGlkLCBTbmFwc2hvdFNlbGYsIHNsb3QsCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9leGVjdXRvci9leGVjSW5kZXhpbmcuYyBiL3NyYy9iYWNr ZW5kL2V4ZWN1dG9yL2V4ZWNJbmRleGluZy5jCmluZGV4IGJkZjg2MmIyNDA2Li4xZWMwNDZh ZGVmZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMK KysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY0luZGV4aW5nLmMKQEAgLTgxNSw3ICs4 MTUsMTcgQEAgY2hlY2tfZXhjbHVzaW9uX29yX3VuaXF1ZV9jb25zdHJhaW50KFJlbGF0aW9u IGhlYXAsIFJlbGF0aW9uIGluZGV4LAogcmV0cnk6CiAJY29uZmxpY3QgPSBmYWxzZTsKIAlm b3VuZF9zZWxmID0gZmFsc2U7Ci0JaW5kZXhfc2NhbiA9IGluZGV4X2JlZ2luc2NhbihoZWFw LCBpbmRleCwgJkRpcnR5U25hcHNob3QsIE5VTEwsIGluZG5rZXlhdHRzLCAwKTsKKworCS8q CisJICogSXQgZG9lc24ndCBzZWVtIHZlcnkgdXNlZnVsIHRvIGFsbG93IGJhdGNoaW5nL3By ZWZldGNoaW5nIHdoZW4gY2hlY2tpbmcKKwkgKiBleGNsdXNpb24vdW5pcXVlbmVzcyBjb25z dHJhaW50cy4gV2Ugc2hvdWxkIG9ubHkgZmluZCBlaXRoZXIgbm8gb3IganVzdAorCSAqIG9u ZSByb3csIEkgdGhpbmsuCisJICoKKwkgKiBYWFggTWF5YmUgdGhlcmUgYXJlIGNhc2VzIHdo ZXJlIHdlIGNvdWxkIGZpbmQgbXVsdGlwbGUgImNhbmRpZGF0ZSIKKwkgKiByb3dzLCBlLmcu IHdpdGggZXhjbHVzaW9uIGNvbnN0cmFpbnRzPyBOb3Qgc3VyZS4KKwkgKi8KKwlpbmRleF9z Y2FuID0gaW5kZXhfYmVnaW5zY2FuKGhlYXAsIGluZGV4LCAmRGlydHlTbmFwc2hvdCwgTlVM TCwgaW5kbmtleWF0dHMsIDAsCisJCQkJCQkJCSBmYWxzZSk7CiAJaW5kZXhfcmVzY2FuKGlu ZGV4X3NjYW4sIHNjYW5rZXlzLCBpbmRua2V5YXR0cywgTlVMTCwgMCk7CiAKIAl3aGlsZSAo aW5kZXhfZ2V0bmV4dF9zbG90KGluZGV4X3NjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBl eGlzdGluZ19zbG90KSkKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL2V4ZWNS ZXBsaWNhdGlvbi5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3IvZXhlY1JlcGxpY2F0aW9uLmMK aW5kZXggNTNkZGQyNWM0MmQuLjljN2RmOWI5Y2NiIDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9leGVjdXRvci9leGVjUmVwbGljYXRpb24uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRv ci9leGVjUmVwbGljYXRpb24uYwpAQCAtMjAxLDggKzIwMSwxMyBAQCBSZWxhdGlvbkZpbmRS ZXBsVHVwbGVCeUluZGV4KFJlbGF0aW9uIHJlbCwgT2lkIGlkeG9pZCwKIAkvKiBCdWlsZCBz Y2FuIGtleS4gKi8KIAlza2V5X2F0dG9mZiA9IGJ1aWxkX3JlcGxpbmRleF9zY2FuX2tleShz a2V5LCByZWwsIGlkeHJlbCwgc2VhcmNoc2xvdCk7CiAKLQkvKiBTdGFydCBhbiBpbmRleCBz Y2FuLiAqLwotCXNjYW4gPSBpbmRleF9iZWdpbnNjYW4ocmVsLCBpZHhyZWwsICZzbmFwLCBO VUxMLCBza2V5X2F0dG9mZiwgMCk7CisJLyoKKwkgKiBTdGFydCBhbiBpbmRleCBzY2FuLgor CSAqCisJICogWFhYIE5vIHByZWZldGNoaW5nIGZvciByZXBsaWNhdGlvbiBpZGVudGl0eS4g V2UgZXhwZWN0IHRvIGZpbmQganVzdCBvbmUKKwkgKiByb3csIHNvIHByZWZldGNoaW5nIHdv dWxkIGJlIHBvaW50bGVzcy4KKwkgKi8KKwlzY2FuID0gaW5kZXhfYmVnaW5zY2FuKHJlbCwg aWR4cmVsLCAmc25hcCwgTlVMTCwgc2tleV9hdHRvZmYsIDAsIGZhbHNlKTsKIAogcmV0cnk6 CiAJZm91bmQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25v ZGVJbmRleG9ubHlzY2FuLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhvbmx5 c2Nhbi5jCmluZGV4IGY0NjRjY2E5NTA3Li4xYTE0ZjVmYWE2OCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4b25seXNjYW4uYworKysgYi9zcmMvYmFja2Vu ZC9leGVjdXRvci9ub2RlSW5kZXhvbmx5c2Nhbi5jCkBAIC00OSw3ICs0OSwxMyBAQAogc3Rh dGljIFR1cGxlVGFibGVTbG90ICpJbmRleE9ubHlOZXh0KEluZGV4T25seVNjYW5TdGF0ZSAq bm9kZSk7CiBzdGF0aWMgdm9pZCBTdG9yZUluZGV4VHVwbGUoSW5kZXhPbmx5U2NhblN0YXRl ICpub2RlLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCwKIAkJCQkJCQlJbmRleFR1cGxlIGl0dXAs IFR1cGxlRGVzYyBpdHVwZGVzYyk7CitzdGF0aWMgYm9vbCBpb3NfcHJlZmV0Y2hfYmxvY2so SW5kZXhTY2FuRGVzYyBzY2FuLCB2b2lkICpkYXRhLAorCQkJCQkJCSAgIEluZGV4U2NhbkJh dGNoUG9zICpwb3MpOwogCisvKiB2YWx1ZXMgc3RvcmVkIGluIGlvc19wcmVmZXRjaF9ibG9j ayBpbiB0aGUgYmF0Y2ggY2FjaGUgKi8KKyNkZWZpbmUJCUlPU19VTktOT1dOX1ZJU0lCSUxJ VFkJCTAJLyogZGVmYXVsdCB2YWx1ZSAqLworI2RlZmluZQkJSU9TX0FMTF9WSVNJQkxFCQkJ CTEKKyNkZWZpbmUJCUlPU19OT1RfQUxMX1ZJU0lCTEUJCQkyCiAKIC8qIC0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K ICAqCQlJbmRleE9ubHlOZXh0CkBAIC05NCwxNSArMTAwLDI2IEBAIEluZGV4T25seU5leHQo SW5kZXhPbmx5U2NhblN0YXRlICpub2RlKQogCQkJCQkJCQkgICBlc3RhdGUtPmVzX3NuYXBz aG90LAogCQkJCQkJCQkgICAmbm9kZS0+aW9zc19JbnN0cnVtZW50LAogCQkJCQkJCQkgICBu b2RlLT5pb3NzX051bVNjYW5LZXlzLAotCQkJCQkJCQkgICBub2RlLT5pb3NzX051bU9yZGVy QnlLZXlzKTsKKwkJCQkJCQkJICAgbm9kZS0+aW9zc19OdW1PcmRlckJ5S2V5cywKKwkJCQkJ CQkJICAgbm9kZS0+aW9zc19DYW5CYXRjaCk7CiAKIAkJbm9kZS0+aW9zc19TY2FuRGVzYyA9 IHNjYW5kZXNjOwogCi0KIAkJLyogU2V0IGl0IHVwIGZvciBpbmRleC1vbmx5IHNjYW4gKi8K IAkJbm9kZS0+aW9zc19TY2FuRGVzYy0+eHNfd2FudF9pdHVwID0gdHJ1ZTsKIAkJbm9kZS0+ aW9zc19WTUJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CiAKKwkJLyoKKwkJICogU2V0IHRoZSBw cmVmZXRjaCBjYWxsYmFjayBpbmZvLCBpZiB0aGUgc2NhbiBoYXMgYmF0Y2hpbmcgZW5hYmxl ZAorCQkgKiAod2Ugb25seSBrbm93IHdoYXQgYWZ0ZXIgaW5kZXhfYmVnaW5zY2FuLCB3aGlj aCBhbHNvIGNoZWNrcyB3aGljaAorCQkgKiBjYWxsYmFja3MgYXJlIGRlZmluZWQgZm9yIHRo ZSBBTS4KKwkJICovCisJCWlmIChzY2FuZGVzYy0+eHNfYmF0Y2hlcyAhPSBOVUxMKQorCQl7 CisJCQlzY2FuZGVzYy0+eHNfYmF0Y2hlcy0+cHJlZmV0Y2hDYWxsYmFjayA9IGlvc19wcmVm ZXRjaF9ibG9jazsKKwkJCXNjYW5kZXNjLT54c19iYXRjaGVzLT5wcmVmZXRjaEFyZ3VtZW50 ID0gKHZvaWQgKikgbm9kZTsKKwkJfQorCiAJCS8qCiAJCSAqIElmIG5vIHJ1bi10aW1lIGtl eXMgdG8gY2FsY3VsYXRlIG9yIHRoZXkgYXJlIHJlYWR5LCBnbyBhaGVhZCBhbmQKIAkJICog cGFzcyB0aGUgc2NhbmtleXMgdG8gdGhlIGluZGV4IEFNLgpAQCAtMTIwLDEwICsxMzcsNDIg QEAgSW5kZXhPbmx5TmV4dChJbmRleE9ubHlTY2FuU3RhdGUgKm5vZGUpCiAJICovCiAJd2hp bGUgKCh0aWQgPSBpbmRleF9nZXRuZXh0X3RpZChzY2FuZGVzYywgZGlyZWN0aW9uKSkgIT0g TlVMTCkKIAl7CisJCWJvb2wJCWFsbF92aXNpYmxlOwogCQlib29sCQl0dXBsZV9mcm9tX2hl YXAgPSBmYWxzZTsKIAogCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwogCisJCS8qCisJCSAq IFdpdGhvdXQgYmF0Y2hpbmcsIGluc3BlY3QgdGhlIFZNIGRpcmVjdGx5LiBXaXRoIGJhdGNo aW5nLCB3ZSBuZWVkCisJCSAqIHRvIHJldHJpZXZlIHRoZSB2aXNpYmlsaXR5IGluZm9ybWF0 aW9uIHNlZW4gYnkgdGhlIHJlYWRfc3RyZWFtCisJCSAqIGNhbGxiYWNrIChvciByYXRoZXIg YnkgaW9zX3ByZWZldGNoX2Jsb2NrKSwgb3RoZXJ3aXNlIHRoZQorCQkgKiByZWFkX3N0cmVh bSBtaWdodCBnZXQgb3V0IG9mIHN5bmMgKGlmIHRoZSBWTSBnb3QgdXBkYXRlZCBzaW5jZQor CQkgKiB0aGVuKS4KKwkJICovCisJCWlmIChzY2FuZGVzYy0+eHNfYmF0Y2hlcyA9PSBOVUxM KQorCQl7CisJCQlhbGxfdmlzaWJsZSA9IFZNX0FMTF9WSVNJQkxFKHNjYW5kZXNjLT5oZWFw UmVsYXRpb24sCisJCQkJCQkJCQkJIEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSwK KwkJCQkJCQkJCQkgJm5vZGUtPmlvc3NfVk1CdWZmZXIpOworCQl9CisJCWVsc2UKKwkJewor CQkJLyoKKwkJCSAqIFJldXNlIHRoZSBwcmV2aW91c2x5IGRldGVybWluZWQgcGFnZSB2aXNp YmlsaXR5IGluZm8sIG9yCisJCQkgKiBjYWxjdWxhdGUgaXQgbm93LiBJZiB3ZSBkZWNpZGVk IG5vdCB0byBwcmVmZXRjaCB0aGUgYmxvY2ssIHRoZQorCQkJICogcGFnZSBoYWQgdG8gYmUg YWxsLXZpc2libGUgYXQgdGhhdCBwb2ludC4gVGhlIFZNIGJpdCBtaWdodCBoYXZlCisJCQkg KiBjaGFuZ2VkIHNpbmNlIHRoZW4sIGJ1dCB0aGUgdHVwbGUgdmlzaWJpbGl0eSBjb3VsZCBu b3QgaGF2ZS4KKwkJCSAqCisJCQkgKiBYWFggSXQncyBhIGJpdCB3ZWlyZCB3ZSB1c2UgdGhl IHZpc2liaWxpdHkgdG8gZGVjaWRlIGlmIHdlCisJCQkgKiBzaG91bGQgc2tpcCBwcmVmZXRj aGluZyB0aGUgYmxvY2ssIGFuZCB0aGVuIGRlZHVjZSB0aGUKKwkJCSAqIHZpc2liaWxpdHkg ZnJvbSB0aGF0IChldmVuIGlmIGl0IG1hdGNoZXMgcHJldHR5IGNsZWFybHkpLiBCdXQKKwkJ CSAqIG1heWJlIHdlIGNvdWxkL3Nob3VsZCBoYXZlIGEgbW9yZSBkaXJlY3Qgd2F5IHRvIHJl YWQgdGhlCisJCQkgKiBwcml2YXRlIHN0YXRlPworCQkJICovCisJCQlhbGxfdmlzaWJsZSA9 ICFpb3NfcHJlZmV0Y2hfYmxvY2soc2NhbmRlc2MsIG5vZGUsCisJCQkJCQkJCQkJCSAgJnNj YW5kZXNjLT54c19iYXRjaGVzLT5yZWFkUG9zKTsKKwkJfQorCiAJCS8qCiAJCSAqIFdlIGNh biBza2lwIHRoZSBoZWFwIGZldGNoIGlmIHRoZSBUSUQgcmVmZXJlbmNlcyBhIGhlYXAgcGFn ZSBvbgogCQkgKiB3aGljaCBhbGwgdHVwbGVzIGFyZSBrbm93biB2aXNpYmxlIHRvIGV2ZXJ5 Ym9keS4gIEluIGFueSBjYXNlLApAQCAtMTU4LDkgKzIwNyw3IEBAIEluZGV4T25seU5leHQo SW5kZXhPbmx5U2NhblN0YXRlICpub2RlKQogCQkgKiBJdCdzIHdvcnRoIGdvaW5nIHRocm91 Z2ggdGhpcyBjb21wbGV4aXR5IHRvIGF2b2lkIG5lZWRpbmcgdG8gbG9jawogCQkgKiB0aGUg Vk0gYnVmZmVyLCB3aGljaCBjb3VsZCBjYXVzZSBzaWduaWZpY2FudCBjb250ZW50aW9uLgog CQkgKi8KLQkJaWYgKCFWTV9BTExfVklTSUJMRShzY2FuZGVzYy0+aGVhcFJlbGF0aW9uLAot CQkJCQkJCUl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSwKLQkJCQkJCQkmbm9kZS0+ aW9zc19WTUJ1ZmZlcikpCisJCWlmICghYWxsX3Zpc2libGUpCiAJCXsKIAkJCS8qCiAJCQkg KiBSYXRzLCB3ZSBoYXZlIHRvIHZpc2l0IHRoZSBoZWFwIHRvIGNoZWNrIHZpc2liaWxpdHku CkBAIC01OTYsNiArNjQzLDIwIEBAIEV4ZWNJbml0SW5kZXhPbmx5U2NhbihJbmRleE9ubHlT Y2FuICpub2RlLCBFU3RhdGUgKmVzdGF0ZSwgaW50IGVmbGFncykKIAlpbmRleHN0YXRlLT5y ZWNoZWNrcXVhbCA9CiAJCUV4ZWNJbml0UXVhbChub2RlLT5yZWNoZWNrcXVhbCwgKFBsYW5T dGF0ZSAqKSBpbmRleHN0YXRlKTsKIAorCS8qCisJICogQWxsIGluZGV4IHNjYW5zIGNhbiBk byBiYXRjaGluZy4KKwkgKgorCSAqIFhYWCBNYXliZSB0aGlzIHNob3VsZCBjaGVjayBpZiB0 aGUgaW5kZXggQU0gc3VwcG9ydHMgYmF0Y2hpbmcsIG9yIGV2ZW4KKwkgKiBjYWxsIHNvbWV0 aGluZyBsaWtlICJhbWNhbmJhdGNoIiAoZG9lcyBub3QgZXhpc3QgeWV0KS4gT3IgY2hlY2sg dGhlCisJICogZW5hYmxlX2luZGV4c2Nhbl9iYXRjaGluZyBHVUM/CisJICoKKwkgKiBYWFgg Rm9yIG5vdyB3ZSBvbmx5IGtub3cgaWYgdGhlIHNjYW4gZ2V0cyB0byB1c2UgYmF0Y2hpbmcg YWZ0ZXIgdGhlCisJICogaW5kZXhfYmVnaW5zY2FuKCkgcmV0dXJucywgc28gbWF5YmUgdGhp cyBuYW1lIGlzIGEgYml0IG1pc2xlYWRpbmcuIEl0J3MKKwkgKiBtb3JlIGFib3V0ICJhbGxv dyBiYXRjaGluZyIuIEJ1dCBtYXliZSB0aGlzIGZpZWxkIGlzIHVubmVjZXNzYXJ5IC0gd2UK KwkgKiBjaGVjayBhbGwgdGhlIGludGVyZXN0aW5nIHN0dWZmIGluIGluZGV4X2JlZ2luc2Nh bigpIGFueXdheS4KKwkgKi8KKwlpbmRleHN0YXRlLT5pb3NzX0NhbkJhdGNoID0gdHJ1ZTsK KwogCS8qCiAJICogSWYgd2UgYXJlIGp1c3QgZG9pbmcgRVhQTEFJTiAoaWUsIGFyZW4ndCBn b2luZyB0byBydW4gdGhlIHBsYW4pLCBzdG9wCiAJICogaGVyZS4gIFRoaXMgYWxsb3dzIGFu IGluZGV4LWFkdmlzb3IgcGx1Z2luIHRvIEVYUExBSU4gYSBwbGFuIGNvbnRhaW5pbmcKQEAg LTc4MywxMyArODQ0LDIxIEBAIEV4ZWNJbmRleE9ubHlTY2FuSW5pdGlhbGl6ZURTTShJbmRl eE9ubHlTY2FuU3RhdGUgKm5vZGUsCiAJCXJldHVybjsKIAl9CiAKKwkvKgorCSAqIFhYWCBE byB3ZSBhY3R1YWxseSB3YW50IHByZWZldGNoaW5nIGZvciBwYXJhbGxlbCBpbmRleCBzY2Fu cz8gTWF5YmUKKwkgKiBub3QsIGJ1dCB0aGVuIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBub3Qg dG8gY2FsbCBpbmRleF9iYXRjaF9nZXRuZXh0X3RpZAorCSAqICh3aGljaCBub3cgY2FuIGhh cHBlbiwgYmVjYXVzZSB3ZSdsbCBjYWxsIEluZGV4T25seU5leHQgZXZlbiBmb3IKKwkgKiBw YXJhbGxlbCBwbGFucykuIEFsdGhvdWdoLCB0aGF0IHNob3VsZCBub3QgaGFwcGVuLCBiZWNh dXNlIHdlIG9ubHkgY2FsbAorCSAqIHRoYXQgd2l0aCAoeHNfYmF0Y2hlcyAhPSBOVUxMKS4K KwkgKi8KIAlub2RlLT5pb3NzX1NjYW5EZXNjID0KIAkJaW5kZXhfYmVnaW5zY2FuX3BhcmFs bGVsKG5vZGUtPnNzLnNzX2N1cnJlbnRSZWxhdGlvbiwKIAkJCQkJCQkJIG5vZGUtPmlvc3Nf UmVsYXRpb25EZXNjLAogCQkJCQkJCQkgJm5vZGUtPmlvc3NfSW5zdHJ1bWVudCwKIAkJCQkJ CQkJIG5vZGUtPmlvc3NfTnVtU2NhbktleXMsCiAJCQkJCQkJCSBub2RlLT5pb3NzX051bU9y ZGVyQnlLZXlzLAotCQkJCQkJCQkgcGlzY2FuKTsKKwkJCQkJCQkJIHBpc2NhbiwKKwkJCQkJ CQkJIG5vZGUtPmlvc3NfQ2FuQmF0Y2gpOwogCW5vZGUtPmlvc3NfU2NhbkRlc2MtPnhzX3dh bnRfaXR1cCA9IHRydWU7CiAJbm9kZS0+aW9zc19WTUJ1ZmZlciA9IEludmFsaWRCdWZmZXI7 CiAKQEAgLTg0OSwxMyArOTE4LDE1IEBAIEV4ZWNJbmRleE9ubHlTY2FuSW5pdGlhbGl6ZVdv cmtlcihJbmRleE9ubHlTY2FuU3RhdGUgKm5vZGUsCiAJCXJldHVybjsKIAl9CiAKKwkvKiBY WFggRG8gd2UgYWN0dWFsbHkgd2FudCBwcmVmZXRjaGluZyBmb3IgcGFyYWxsZWwgaW5kZXgg c2NhbnM/ICovCiAJbm9kZS0+aW9zc19TY2FuRGVzYyA9CiAJCWluZGV4X2JlZ2luc2Nhbl9w YXJhbGxlbChub2RlLT5zcy5zc19jdXJyZW50UmVsYXRpb24sCiAJCQkJCQkJCSBub2RlLT5p b3NzX1JlbGF0aW9uRGVzYywKIAkJCQkJCQkJICZub2RlLT5pb3NzX0luc3RydW1lbnQsCiAJ CQkJCQkJCSBub2RlLT5pb3NzX051bVNjYW5LZXlzLAogCQkJCQkJCQkgbm9kZS0+aW9zc19O dW1PcmRlckJ5S2V5cywKLQkJCQkJCQkJIHBpc2Nhbik7CisJCQkJCQkJCSBwaXNjYW4sCisJ CQkJCQkJCSBub2RlLT5pb3NzX0NhbkJhdGNoKTsKIAlub2RlLT5pb3NzX1NjYW5EZXNjLT54 c193YW50X2l0dXAgPSB0cnVlOwogCiAJLyoKQEAgLTg4OSwzICs5NjAsNTEgQEAgRXhlY0lu ZGV4T25seVNjYW5SZXRyaWV2ZUluc3RydW1lbnRhdGlvbihJbmRleE9ubHlTY2FuU3RhdGUg Km5vZGUpCiAJbm9kZS0+aW9zc19TaGFyZWRJbmZvID0gcGFsbG9jKHNpemUpOwogCW1lbWNw eShub2RlLT5pb3NzX1NoYXJlZEluZm8sIFNoYXJlZEluZm8sIHNpemUpOwogfQorCisvKiBG SVhNRSBkdXBsaWNhdGUgZnJvbSBpbmRleGFtLmMgKi8KKyNkZWZpbmUgSU5ERVhfU0NBTl9C QVRDSChzY2FuLCBpZHgpCVwKKwkJKChzY2FuKS0+eHNfYmF0Y2hlcy0+YmF0Y2hlc1soaWR4 KSAlIChzY2FuKS0+eHNfYmF0Y2hlcy0+bWF4QmF0Y2hlc10pCisKKy8qCisgKiBpb3NfcHJl ZmV0Y2hfYmxvY2sKKyAqCQlDYWxsYmFjayB0byBvbmx5IHByZWZldGNoIGJsb2NrcyB0aGF0 IGFyZSBub3QgYWxsLXZpc2libGUuCisgKgorICogV2UgZG9uJ3Qgd2FudCB0byBpbnNwZWN0 IHRoZSB2aXNpYmlsaXR5IG1hcCByZXBlYXRlZGx5LCBzbyB0aGUgcmVzdWx0IG9mCisgKiBW TV9BTExfVklTSUJMRSBpcyBzdG9yZWQgaW4gdGhlIGJhdGNoIHByaXZhdGUgZGF0YS4gVGhl IHZhbHVlcyBhcmUgc2V0CisgKiB0byAwIGJ5IGRlZmF1bHQsIHNvIHdlIHVzZSB0d28gY29u c3RhbnRzIHRvIHJlbWVtYmVyIGlmIGFsbC12aXNpYmxlIG9yCisgKiBub3QgYWxsLXZpc2li bGUuCisgKgorICogSG93ZXZlciwgdGhpcyBpcyBub3QgbWVyZWx5IGEgcXVlc3Rpb24gb2Yg cGVyZm9ybWFuY2UuIFRoZSBWTSBtYXkgZ2V0CisgKiBtb2RpZmllZCBkdXJpbmcgdGhlIHNj YW4sIGFuZCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdHdvIHBsYWNlcyAodGhlCisgKiBy ZWFkX25leHQgY2FsbGJhY2sgYW5kIHRoZSBpbmRleF9mZXRjaF9oZWFwIGhlcmUpIG1ha2Ug dGhlIHNhbWUgZGVjaXNpb24sCisgKiBvdGhlcndpc2Ugd2UgbWlnaHQgZ2V0IG91dCBvZiBz eW5jIHdpdGggdGhlIHN0cmVhbS4gRm9yIGV4YW1wbGUsIHRoZQorICogY2FsbGJhY2sgbWln aHQgZmluZCBhIHBhZ2UgaXMgYWxsLXZpc2libGUgKGFuZCBza2lwcyByZWFkaW5nIHRoZSBi bG9jayksCisgKiBhbmQgdGhlbiBzb21lb25lIG1pZ2h0IHVwZGF0ZSB0aGUgcGFnZSwgcmVz ZXR0aW5nIHRoZSBWTSBiaXQuIElmIHRoaXMKKyAqIHBsYWNlIGF0dGVtcHRzIHRvIHJlYWQg dGhlIHBhZ2UgZnJvbSB0aGUgc3RyZWFtLCBpdCdsbCBmYWlsIGJlY2F1c2UgaXQKKyAqIHdp bGwgcHJvYmFibHkgcmVjZWl2ZSBhbiBlbnRpcmVseSBkaWZmZXJlbnQgcGFnZS4KKyAqLwor c3RhdGljIGJvb2wKK2lvc19wcmVmZXRjaF9ibG9jayhJbmRleFNjYW5EZXNjIHNjYW4sIHZv aWQgKmFyZywgSW5kZXhTY2FuQmF0Y2hQb3MgKnBvcykKK3sKKwlJbmRleE9ubHlTY2FuU3Rh dGUgKm5vZGUgPSAoSW5kZXhPbmx5U2NhblN0YXRlICopIGFyZzsKKwlJbmRleFNjYW5CYXRj aCBiYXRjaCA9IElOREVYX1NDQU5fQkFUQ0goc2NhbiwgcG9zLT5iYXRjaCk7CisKKwlpZiAo YmF0Y2gtPnByaXZhdGVEYXRhID09IE5VTEwpCisJCWJhdGNoLT5wcml2YXRlRGF0YSA9IHBh bGxvYzAoc2l6ZW9mKERhdHVtKSAqIChiYXRjaC0+bGFzdEl0ZW0gKyAxKSk7CisKKwlpZiAo YmF0Y2gtPnByaXZhdGVEYXRhW3Bvcy0+aW5kZXhdID09IElPU19VTktOT1dOX1ZJU0lCSUxJ VFkpCisJeworCQlib29sCQlhbGxfdmlzaWJsZTsKKwkJSXRlbVBvaW50ZXIgdGlkID0gJmJh dGNoLT5pdGVtc1twb3MtPmluZGV4XS5oZWFwVGlkOworCisJCWFsbF92aXNpYmxlID0gVk1f QUxMX1ZJU0lCTEUoc2Nhbi0+aGVhcFJlbGF0aW9uLAorCQkJCQkJCQkJIEl0ZW1Qb2ludGVy R2V0QmxvY2tOdW1iZXIodGlkKSwKKwkJCQkJCQkJCSAmbm9kZS0+aW9zc19WTUJ1ZmZlcik7 CisKKwkJYmF0Y2gtPnByaXZhdGVEYXRhW3Bvcy0+aW5kZXhdCisJCQk9IGFsbF92aXNpYmxl ID8gSU9TX0FMTF9WSVNJQkxFIDogSU9TX05PVF9BTExfVklTSUJMRTsKKwl9CisKKwkvKiBw cmVmZXRjaCBvbmx5IGJsb2NrcyB0aGF0IGFyZSBub3QgYWxsLXZpc2libGUgKi8KKwlyZXR1 cm4gKGJhdGNoLT5wcml2YXRlRGF0YVtwb3MtPmluZGV4XSA9PSBJT1NfTk9UX0FMTF9WSVNJ QkxFKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNj YW4uYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYwppbmRleCA3ZmNh YTM3ZmU2Mi4uMTc3ZDc0YzJjMjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9y L25vZGVJbmRleHNjYW4uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhz Y2FuLmMKQEAgLTExMSw3ICsxMTEsOCBAQCBJbmRleE5leHQoSW5kZXhTY2FuU3RhdGUgKm5v ZGUpCiAJCQkJCQkJCSAgIGVzdGF0ZS0+ZXNfc25hcHNob3QsCiAJCQkJCQkJCSAgICZub2Rl LT5pc3NfSW5zdHJ1bWVudCwKIAkJCQkJCQkJICAgbm9kZS0+aXNzX051bVNjYW5LZXlzLAot CQkJCQkJCQkgICBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMpOworCQkJCQkJCQkgICBub2Rl LT5pc3NfTnVtT3JkZXJCeUtleXMsCisJCQkJCQkJCSAgIG5vZGUtPmlzc19DYW5CYXRjaCk7 CiAKIAkJbm9kZS0+aXNzX1NjYW5EZXNjID0gc2NhbmRlc2M7CiAKQEAgLTIwMSwxMyArMjAy LDE2IEBAIEluZGV4TmV4dFdpdGhSZW9yZGVyKEluZGV4U2NhblN0YXRlICpub2RlKQogCQkv KgogCQkgKiBXZSByZWFjaCBoZXJlIGlmIHRoZSBpbmRleCBzY2FuIGlzIG5vdCBwYXJhbGxl bCwgb3IgaWYgd2UncmUKIAkJICogc2VyaWFsbHkgZXhlY3V0aW5nIGFuIGluZGV4IHNjYW4g dGhhdCB3YXMgcGxhbm5lZCB0byBiZSBwYXJhbGxlbC4KKwkJICoKKwkJICogWFhYIFNob3Vs ZCB3ZSB1c2UgYmF0Y2hpbmcgaGVyZT8gRG9lcyBpdCBldmVuIHdvcmsgZm9yIHJlb3JkZXJp bmc/CiAJCSAqLwogCQlzY2FuZGVzYyA9IGluZGV4X2JlZ2luc2Nhbihub2RlLT5zcy5zc19j dXJyZW50UmVsYXRpb24sCiAJCQkJCQkJCSAgIG5vZGUtPmlzc19SZWxhdGlvbkRlc2MsCiAJ CQkJCQkJCSAgIGVzdGF0ZS0+ZXNfc25hcHNob3QsCiAJCQkJCQkJCSAgICZub2RlLT5pc3Nf SW5zdHJ1bWVudCwKIAkJCQkJCQkJICAgbm9kZS0+aXNzX051bVNjYW5LZXlzLAotCQkJCQkJ CQkgICBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMpOworCQkJCQkJCQkgICBub2RlLT5pc3Nf TnVtT3JkZXJCeUtleXMsCisJCQkJCQkJCSAgIGZhbHNlKTsKIAogCQlub2RlLT5pc3NfU2Nh bkRlc2MgPSBzY2FuZGVzYzsKIApAQCAtOTY1LDYgKzk2OSwxOCBAQCBFeGVjSW5pdEluZGV4 U2NhbihJbmRleFNjYW4gKm5vZGUsIEVTdGF0ZSAqZXN0YXRlLCBpbnQgZWZsYWdzKQogCWlu ZGV4c3RhdGUtPmluZGV4b3JkZXJieW9yaWcgPQogCQlFeGVjSW5pdEV4cHJMaXN0KG5vZGUt PmluZGV4b3JkZXJieW9yaWcsIChQbGFuU3RhdGUgKikgaW5kZXhzdGF0ZSk7CiAKKwkvKgor CSAqIEFsbCBpbmRleCBzY2FucyBjYW4gZG8gYmF0Y2hpbmcuCisJICoKKwkgKiBYWFggTWF5 YmUgdGhpcyBzaG91bGQgY2hlY2sgaWYgdGhlIGluZGV4IEFNIHN1cHBvcnRzIGJhdGNoaW5n LCBvciBldmVuCisJICogY2FsbCBzb21ldGhpbmcgbGlrZSAiYW1jYW5iYXRjaCIgKGRvZXMg bm90IGV4aXN0IHlldCkuIE9yIGNoZWNrIHRoZQorCSAqIGVuYWJsZV9pbmRleHNjYW5fYmF0 Y2hpbmcgR1VDPworCSAqCisJICogWFhYIFdlbGwsIHdlIGRpc2FibGUgYmF0Y2hpbmcgZm9y IHJlb3JkZXJpbmcsIHNvIG1heWJlIHdlIHNob3VsZCBjaGVjaworCSAqIHRoYXQgaGVyZSBp bnN0ZWFkPyBCdXQgbWF5YmUgaXQncyB1bm5lY2Vzc2FyeSBsaW1pdGF0aW9uPworCSAqLwor CWluZGV4c3RhdGUtPmlzc19DYW5CYXRjaCA9IHRydWU7CisKIAkvKgogCSAqIElmIHdlIGFy ZSBqdXN0IGRvaW5nIEVYUExBSU4gKGllLCBhcmVuJ3QgZ29pbmcgdG8gcnVuIHRoZSBwbGFu KSwgc3RvcAogCSAqIGhlcmUuICBUaGlzIGFsbG93cyBhbiBpbmRleC1hZHZpc29yIHBsdWdp biB0byBFWFBMQUlOIGEgcGxhbiBjb250YWluaW5nCkBAIC0xNzE5LDEzICsxNzM1LDE3IEBA IEV4ZWNJbmRleFNjYW5Jbml0aWFsaXplRFNNKEluZGV4U2NhblN0YXRlICpub2RlLAogCQly ZXR1cm47CiAJfQogCisJLyoKKwkgKiBYWFggRG8gd2UgYWN0dWFsbHkgd2FudCBwcmVmZXRj aGluZyBmb3IgcGFyYWxsZWwgaW5kZXggc2NhbnM/CisJICovCiAJbm9kZS0+aXNzX1NjYW5E ZXNjID0KIAkJaW5kZXhfYmVnaW5zY2FuX3BhcmFsbGVsKG5vZGUtPnNzLnNzX2N1cnJlbnRS ZWxhdGlvbiwKIAkJCQkJCQkJIG5vZGUtPmlzc19SZWxhdGlvbkRlc2MsCiAJCQkJCQkJCSAm bm9kZS0+aXNzX0luc3RydW1lbnQsCiAJCQkJCQkJCSBub2RlLT5pc3NfTnVtU2NhbktleXMs CiAJCQkJCQkJCSBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMsCi0JCQkJCQkJCSBwaXNjYW4p OworCQkJCQkJCQkgcGlzY2FuLAorCQkJCQkJCQkgbm9kZS0+aXNzX0NhbkJhdGNoKTsKIAog CS8qCiAJICogSWYgbm8gcnVuLXRpbWUga2V5cyB0byBjYWxjdWxhdGUgb3IgdGhleSBhcmUg cmVhZHksIGdvIGFoZWFkIGFuZCBwYXNzCkBAIC0xNzgzLDEzICsxODAzLDE3IEBAIEV4ZWNJ bmRleFNjYW5Jbml0aWFsaXplV29ya2VyKEluZGV4U2NhblN0YXRlICpub2RlLAogCQlyZXR1 cm47CiAJfQogCisJLyoKKwkgKiBYWFggRG8gd2UgYWN0dWFsbHkgd2FudCBwcmVmZXRjaGlu ZyBmb3IgcGFyYWxsZWwgaW5kZXggc2NhbnM/CisJICovCiAJbm9kZS0+aXNzX1NjYW5EZXNj ID0KIAkJaW5kZXhfYmVnaW5zY2FuX3BhcmFsbGVsKG5vZGUtPnNzLnNzX2N1cnJlbnRSZWxh dGlvbiwKIAkJCQkJCQkJIG5vZGUtPmlzc19SZWxhdGlvbkRlc2MsCiAJCQkJCQkJCSAmbm9k ZS0+aXNzX0luc3RydW1lbnQsCiAJCQkJCQkJCSBub2RlLT5pc3NfTnVtU2NhbktleXMsCiAJ CQkJCQkJCSBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMsCi0JCQkJCQkJCSBwaXNjYW4pOwor CQkJCQkJCQkgcGlzY2FuLAorCQkJCQkJCQkgbm9kZS0+aXNzX0NhbkJhdGNoKTsKIAogCS8q CiAJICogSWYgbm8gcnVuLXRpbWUga2V5cyB0byBjYWxjdWxhdGUgb3IgdGhleSBhcmUgcmVh ZHksIGdvIGFoZWFkIGFuZCBwYXNzCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvc2VsZnVuY3MuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jCmluZGV4 IDk4N2YyMTU0NDU5Li4zMDk0NzY0OWJjNyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNz LmMKQEAgLTY2NjUsOSArNjY2NSwxNCBAQCBnZXRfYWN0dWFsX3ZhcmlhYmxlX2VuZHBvaW50 KFJlbGF0aW9uIGhlYXBSZWwsCiAJSW5pdE5vblZhY3V1bWFibGVTbmFwc2hvdChTbmFwc2hv dE5vblZhY3V1bWFibGUsCiAJCQkJCQkJICBHbG9iYWxWaXNUZXN0Rm9yKGhlYXBSZWwpKTsK IAorCS8qCisJICogWFhYIEknbSBub3Qgc3VyZSBhYm91dCBiYXRjaGluZy9wcmVmZXRjaGlu ZyBoZXJlLiBJbiBtb3N0IGNhc2VzIHdlCisJICogZXhwZWN0IHRvIGZpbmQgdGhlIGVuZHBv aW50cyBpbW1lZGlhdGVseSwgYnV0IHNvbWV0aW1lcyB3ZSBoYXZlIGEgbG90CisJICogb2Yg ZGVhZCB0dXBsZXMgLSBhbmQgdGhlbiBwcmVmZXRjaGluZyBtaWdodCBoZWxwLgorCSAqLwog CWluZGV4X3NjYW4gPSBpbmRleF9iZWdpbnNjYW4oaGVhcFJlbCwgaW5kZXhSZWwsCiAJCQkJ CQkJCSAmU25hcHNob3ROb25WYWN1dW1hYmxlLCBOVUxMLAotCQkJCQkJCQkgMSwgMCk7CisJ CQkJCQkJCSAxLCAwLCBmYWxzZSk7CiAJLyogU2V0IGl0IHVwIGZvciBpbmRleC1vbmx5IHNj YW4gKi8KIAlpbmRleF9zY2FuLT54c193YW50X2l0dXAgPSB0cnVlOwogCWluZGV4X3Jlc2Nh bihpbmRleF9zY2FuLCBzY2Fua2V5cywgMSwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21p c2MvZ3VjX3RhYmxlcy5jCmluZGV4IDYwYjEyNDQ2YTFjLi4yZDY0MzhmMzI1OSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKQEAgLTgwOSw2ICs4MDksMTYgQEAgc3Ry dWN0IGNvbmZpZ19ib29sIENvbmZpZ3VyZU5hbWVzQm9vbFtdID0KIAkJdHJ1ZSwKIAkJTlVM TCwgTlVMTCwgTlVMTAogCX0sCisJeworCQl7ImVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmci LCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01FVEhPRCwKKwkJCWdldHRleHRfbm9vcCgi RW5hYmxlcyB0aGUgcGxhbm5lcidzIHVzZSBvZiBpbmRleC1zY2FuIGJhdGNoaW5nLiIpLAor CQkJTlVMTCwKKwkJCUdVQ19FWFBMQUlOCisJCX0sCisJCSZlbmFibGVfaW5kZXhzY2FuX2Jh dGNoaW5nLAorCQl0cnVlLAorCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKIAl7CiAJCXsiZW5h YmxlX2luZGV4b25seXNjYW4iLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01FVEhPRCwK IAkJCWdldHRleHRfbm9vcCgiRW5hYmxlcyB0aGUgcGxhbm5lcidzIHVzZSBvZiBpbmRleC1v bmx5LXNjYW4gcGxhbnMuIiksCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNj L3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3Rn cmVzcWwuY29uZi5zYW1wbGUKaW5kZXggMzQ4MjZkMDEzODAuLjY0OWRmMmIwNmEwIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUK KysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCkBA IC00MTUsNiArNDE1LDcgQEAKICNlbmFibGVfaGFzaGpvaW4gPSBvbgogI2VuYWJsZV9pbmNy ZW1lbnRhbF9zb3J0ID0gb24KICNlbmFibGVfaW5kZXhzY2FuID0gb24KKyNlbmFibGVfaW5k ZXhzY2FuX2JhdGNoaW5nID0gb24KICNlbmFibGVfaW5kZXhvbmx5c2NhbiA9IG9uCiAjZW5h YmxlX21hdGVyaWFsID0gb24KICNlbmFibGVfbWVtb2l6ZSA9IG9uCmRpZmYgLS1naXQgYS9z cmMvaW5jbHVkZS9hY2Nlc3MvYW1hcGkuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9hbWFwaS5o CmluZGV4IDUyOTE2YmFiN2EzLi4wMDI4YmI1NTg0MyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvYWNjZXNzL2FtYXBpLmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2FtYXBpLmgKQEAg LTE5Niw2ICsxOTYsMTQgQEAgdHlwZWRlZiB2b2lkICgqYW1yZXNjYW5fZnVuY3Rpb24pIChJ bmRleFNjYW5EZXNjIHNjYW4sCiB0eXBlZGVmIGJvb2wgKCphbWdldHR1cGxlX2Z1bmN0aW9u KSAoSW5kZXhTY2FuRGVzYyBzY2FuLAogCQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gZGlyZWN0 aW9uKTsKIAorLyogbmV4dCBiYXRjaCBvZiB2YWxpZCB0dXBsZXMgKi8KK3R5cGVkZWYgSW5k ZXhTY2FuQmF0Y2goKmFtZ2V0YmF0Y2hfZnVuY3Rpb24pIChJbmRleFNjYW5EZXNjIHNjYW4s CisJCQkJCQkJCQkJCSAgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pOworCisvKiByZWxlYXNl IGJhdGNoIG9mIHZhbGlkIHR1cGxlcyAqLwordHlwZWRlZiB2b2lkICgqYW1mcmVlYmF0Y2hf ZnVuY3Rpb24pIChJbmRleFNjYW5EZXNjIHNjYW4sCisJCQkJCQkJCQkgIEluZGV4U2NhbkJh dGNoIGJhdGNoKTsKKwogLyogZmV0Y2ggYWxsIHZhbGlkIHR1cGxlcyAqLwogdHlwZWRlZiBp bnQ2NCAoKmFtZ2V0Yml0bWFwX2Z1bmN0aW9uKSAoSW5kZXhTY2FuRGVzYyBzY2FuLAogCQkJ CQkJCQkJICAgVElEQml0bWFwICp0Ym0pOwpAQCAtMzA3LDYgKzMxNSw4IEBAIHR5cGVkZWYg c3RydWN0IEluZGV4QW1Sb3V0aW5lCiAJYW1iZWdpbnNjYW5fZnVuY3Rpb24gYW1iZWdpbnNj YW47CiAJYW1yZXNjYW5fZnVuY3Rpb24gYW1yZXNjYW47CiAJYW1nZXR0dXBsZV9mdW5jdGlv biBhbWdldHR1cGxlOyAvKiBjYW4gYmUgTlVMTCAqLworCWFtZ2V0YmF0Y2hfZnVuY3Rpb24g YW1nZXRiYXRjaDsgLyogY2FuIGJlIE5VTEwgKi8KKwlhbWZyZWViYXRjaF9mdW5jdGlvbiBh bWZyZWViYXRjaDsJLyogY2FuIGJlIE5VTEwgKi8KIAlhbWdldGJpdG1hcF9mdW5jdGlvbiBh bWdldGJpdG1hcDsJLyogY2FuIGJlIE5VTEwgKi8KIAlhbWVuZHNjYW5fZnVuY3Rpb24gYW1l bmRzY2FuOwogCWFtbWFya3Bvc19mdW5jdGlvbiBhbW1hcmtwb3M7CS8qIGNhbiBiZSBOVUxM ICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2VuYW0uaCBiL3NyYy9pbmNs dWRlL2FjY2Vzcy9nZW5hbS5oCmluZGV4IDViMmFiMTgxYjVmLi44YmVmOTQyYjExZCAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL2dlbmFtLmgKKysrIGIvc3JjL2luY2x1ZGUv YWNjZXNzL2dlbmFtLmgKQEAgLTE1LDYgKzE1LDcgQEAKICNkZWZpbmUgR0VOQU1fSAogCiAj aW5jbHVkZSAiYWNjZXNzL2h0dXAuaCIKKyNpbmNsdWRlICJhY2Nlc3MvaXR1cC5oIgogI2lu Y2x1ZGUgImFjY2Vzcy9zZGlyLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3NrZXkuaCIKICNpbmNs dWRlICJub2Rlcy90aWRiaXRtYXAuaCIKQEAgLTExMSw2ICsxMTIsNyBAQCB0eXBlZGVmIGJv b2wgKCpJbmRleEJ1bGtEZWxldGVDYWxsYmFjaykgKEl0ZW1Qb2ludGVyIGl0ZW1wdHIsIHZv aWQgKnN0YXRlKTsKIAogLyogc3RydWN0IGRlZmluaXRpb25zIGFwcGVhciBpbiByZWxzY2Fu LmggKi8KIHR5cGVkZWYgc3RydWN0IEluZGV4U2NhbkRlc2NEYXRhICpJbmRleFNjYW5EZXNj OwordHlwZWRlZiBzdHJ1Y3QgSW5kZXhTY2FuQmF0Y2hEYXRhICpJbmRleFNjYW5CYXRjaDsK IHR5cGVkZWYgc3RydWN0IFN5c1NjYW5EZXNjRGF0YSAqU3lzU2NhbkRlc2M7CiAKIHR5cGVk ZWYgc3RydWN0IFBhcmFsbGVsSW5kZXhTY2FuRGVzY0RhdGEgKlBhcmFsbGVsSW5kZXhTY2Fu RGVzYzsKQEAgLTE1NSw2ICsxNTcsOCBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleE9yZGVyQnlE aXN0YW5jZQogICogZ2VuZXJhbGl6ZWQgaW5kZXhfIGludGVyZmFjZSByb3V0aW5lcyAoaW4g aW5kZXhhbS5jKQogICovCiAKK2V4dGVybiBQR0RMTElNUE9SVCBib29sIGVuYWJsZV9pbmRl eHNjYW5fYmF0Y2hpbmc7CisKIC8qCiAgKiBJbmRleFNjYW5Jc1ZhbGlkCiAgKgkJVHJ1ZSBp ZmYgdGhlIGluZGV4IHNjYW4gaXMgdmFsaWQuCkBAIC0xNzksNyArMTgzLDggQEAgZXh0ZXJu IEluZGV4U2NhbkRlc2MgaW5kZXhfYmVnaW5zY2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwK IAkJCQkJCQkJCSBSZWxhdGlvbiBpbmRleFJlbGF0aW9uLAogCQkJCQkJCQkJIFNuYXBzaG90 IHNuYXBzaG90LAogCQkJCQkJCQkJIEluZGV4U2Nhbkluc3RydW1lbnRhdGlvbiAqaW5zdHJ1 bWVudCwKLQkJCQkJCQkJCSBpbnQgbmtleXMsIGludCBub3JkZXJieXMpOworCQkJCQkJCQkJ IGludCBua2V5cywgaW50IG5vcmRlcmJ5cywKKwkJCQkJCQkJCSBib29sIGVuYWJsZV9iYXRj aGluZyk7CiBleHRlcm4gSW5kZXhTY2FuRGVzYyBpbmRleF9iZWdpbnNjYW5fYml0bWFwKFJl bGF0aW9uIGluZGV4UmVsYXRpb24sCiAJCQkJCQkJCQkJCVNuYXBzaG90IHNuYXBzaG90LAog CQkJCQkJCQkJCQlJbmRleFNjYW5JbnN0cnVtZW50YXRpb24gKmluc3RydW1lbnQsCkBAIC0y MDUsNyArMjEwLDggQEAgZXh0ZXJuIEluZGV4U2NhbkRlc2MgaW5kZXhfYmVnaW5zY2FuX3Bh cmFsbGVsKFJlbGF0aW9uIGhlYXByZWwsCiAJCQkJCQkJCQkJCSAgUmVsYXRpb24gaW5kZXhy ZWwsCiAJCQkJCQkJCQkJCSAgSW5kZXhTY2FuSW5zdHJ1bWVudGF0aW9uICppbnN0cnVtZW50 LAogCQkJCQkJCQkJCQkgIGludCBua2V5cywgaW50IG5vcmRlcmJ5cywKLQkJCQkJCQkJCQkJ ICBQYXJhbGxlbEluZGV4U2NhbkRlc2MgcHNjYW4pOworCQkJCQkJCQkJCQkgIFBhcmFsbGVs SW5kZXhTY2FuRGVzYyBwc2NhbiwKKwkJCQkJCQkJCQkJICBib29sIGVuYWJsZV9iYXRjaGlu Zyk7CiBleHRlcm4gSXRlbVBvaW50ZXIgaW5kZXhfZ2V0bmV4dF90aWQoSW5kZXhTY2FuRGVz YyBzY2FuLAogCQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKIHN0cnVjdCBU dXBsZVRhYmxlU2xvdDsKQEAgLTIxMyw3ICsyMTksNiBAQCBleHRlcm4gYm9vbCBpbmRleF9m ZXRjaF9oZWFwKEluZGV4U2NhbkRlc2Mgc2Nhbiwgc3RydWN0IFR1cGxlVGFibGVTbG90ICpz bG90KTsKIGV4dGVybiBib29sIGluZGV4X2dldG5leHRfc2xvdChJbmRleFNjYW5EZXNjIHNj YW4sIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uLAogCQkJCQkJCSAgIHN0cnVjdCBUdXBsZVRh YmxlU2xvdCAqc2xvdCk7CiBleHRlcm4gaW50NjQgaW5kZXhfZ2V0Yml0bWFwKEluZGV4U2Nh bkRlc2Mgc2NhbiwgVElEQml0bWFwICpiaXRtYXApOwotCiBleHRlcm4gSW5kZXhCdWxrRGVs ZXRlUmVzdWx0ICppbmRleF9idWxrX2RlbGV0ZShJbmRleFZhY3V1bUluZm8gKmluZm8sCiAJ CQkJCQkJCQkJCQlJbmRleEJ1bGtEZWxldGVSZXN1bHQgKmlzdGF0LAogCQkJCQkJCQkJCQkJ SW5kZXhCdWxrRGVsZXRlQ2FsbGJhY2sgY2FsbGJhY2ssCkBAIC0yMzEsNyArMjM2LDcgQEAg ZXh0ZXJuIHZvaWQgaW5kZXhfc3RvcmVfZmxvYXQ4X29yZGVyYnlfZGlzdGFuY2VzKEluZGV4 U2NhbkRlc2Mgc2NhbiwKIAkJCQkJCQkJCQkJCSBib29sIHJlY2hlY2tPcmRlckJ5KTsKIGV4 dGVybiBieXRlYSAqaW5kZXhfb3BjbGFzc19vcHRpb25zKFJlbGF0aW9uIGluZHJlbCwgQXR0 ck51bWJlciBhdHRudW0sCiAJCQkJCQkJCQlEYXR1bSBhdHRvcHRpb25zLCBib29sIHZhbGlk YXRlKTsKLQorZXh0ZXJuIEluZGV4U2NhbkJhdGNoIGluZGV4X2JhdGNoX2FsbG9jKGludCBt YXhpdGVtcywgYm9vbCB3YW50X2l0dXApOwogCiAvKgogICogaW5kZXggYWNjZXNzIG1ldGhv ZCBzdXBwb3J0IHJvdXRpbmVzIChpbiBnZW5hbS5jKQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvYWNjZXNzL3JlbHNjYW4uaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9yZWxzY2FuLmgKaW5k ZXggYjVlMGZiMzg2YzAuLmI2M2FmODQ1Y2E2IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9h Y2Nlc3MvcmVsc2Nhbi5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9yZWxzY2FuLmgKQEAg LTE2LDkgKzE2LDExIEBACiAKICNpbmNsdWRlICJhY2Nlc3MvaHR1cF9kZXRhaWxzLmgiCiAj aW5jbHVkZSAiYWNjZXNzL2l0dXAuaCIKKyNpbmNsdWRlICJhY2Nlc3Mvc2Rpci5oIgogI2lu Y2x1ZGUgIm5vZGVzL3RpZGJpdG1hcC5oIgogI2luY2x1ZGUgInBvcnQvYXRvbWljcy5oIgog I2luY2x1ZGUgInN0b3JhZ2UvYnVmLmgiCisjaW5jbHVkZSAic3RvcmFnZS9yZWFkX3N0cmVh bS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvcmVsZmlsZWxvY2F0b3IuaCIKICNpbmNsdWRlICJz dG9yYWdlL3NwaW4uaCIKICNpbmNsdWRlICJ1dGlscy9yZWxjYWNoZS5oIgpAQCAtMTIxLDEw ICsxMjMsMTYyIEBAIHR5cGVkZWYgc3RydWN0IFBhcmFsbGVsQmxvY2tUYWJsZVNjYW5Xb3Jr ZXJEYXRhICpQYXJhbGxlbEJsb2NrVGFibGVTY2FuV29ya2VyOwogdHlwZWRlZiBzdHJ1Y3Qg SW5kZXhGZXRjaFRhYmxlRGF0YQogewogCVJlbGF0aW9uCXJlbDsKKwlSZWFkU3RyZWFtICpy czsKIH0gSW5kZXhGZXRjaFRhYmxlRGF0YTsKIAogc3RydWN0IEluZGV4U2Nhbkluc3RydW1l bnRhdGlvbjsKIAorLyogRm9yd2FyZCBkZWNsYXJhdGlvbiwgdGhlIHByZWZldGNoIGNhbGxi YWNrIG5lZWRzIEluZGV4U2NhbkRlc2NEYXRhLiAqLwordHlwZWRlZiBzdHJ1Y3QgSW5kZXhT Y2FuQmF0Y2hEYXRhIEluZGV4U2NhbkJhdGNoRGF0YTsKKworLyoKKyAqIFhYWCBwYXJ0cyBv ZiBCVFNjYW5PcGFxdWVEYXRhLCBCVFNjYW5Qb3NJdGVtIGFuZCBCVFNjYW5Qb3NEYXRhIHJl bGV2YW50CisgKiBmb3Igb25lIGJhdGNoLgorICovCit0eXBlZGVmIHN0cnVjdCBJbmRleFNj YW5CYXRjaFBvc0l0ZW0JLyogd2hhdCB3ZSByZW1lbWJlciBhYm91dCBlYWNoIG1hdGNoICov Cit7CisJSXRlbVBvaW50ZXJEYXRhIGhlYXBUaWQ7CS8qIFRJRCBvZiByZWZlcmVuY2VkIGhl YXAgaXRlbSAqLworCU9mZnNldE51bWJlciBpbmRleE9mZnNldDsJLyogaW5kZXggaXRlbSdz IGxvY2F0aW9uIHdpdGhpbiBwYWdlICovCisJTG9jYXRpb25JbmRleCB0dXBsZU9mZnNldDsJ LyogSW5kZXhUdXBsZSdzIG9mZnNldCBpbiB3b3Jrc3BhY2UsIGlmIGFueSAqLworfSBJbmRl eFNjYW5CYXRjaFBvc0l0ZW07CisKKy8qCisgKiBEYXRhIGFib3V0IG9uZSBiYXRjaCBvZiBp dGVtcyByZXR1cm5lZCBieSB0aGUgaW5kZXggQU0uIFRoaXMgaXMgc2ltaWxhcgorICogdG8g dGhlIEFNLXNwZWNpZmljICJvcGFxdWUiIHN0cnVjdHMsIHVzZWQgYnkgZWFjaCBBTSB0byB0 cmFjayBpdGVtcworICogbG9hZGVkIGZyb20gb25lIGxlYWYgcGFnZSwgYnV0IGdlbmVyYWxp emVkIGZvciBhbGwgQU1zLgorICoKKyAqIFhYWCBOb3Qgc3VyZSB3aGljaCBvZiB0aGVyZSBm aWVsZHMgYXJlIDEwMCUgbmVlZGVkIGZvciBhbGwgaW5kZXggQU1zLAorICogbW9zdCBvZiB0 aGlzIGNvbWVzIGZyb20gbmJ0cmVlLgorICoKKyAqIFhYWCBNb3N0bHkgYSBjb3B5IG9mIEJU U2NhblBvc0RhdGEsIGJ1dCBvdGhlciBBTXMgbWF5IG5lZWQgZGlmZmVyZW50IChvcgorICog b25seSBzb21lIG9mIHRob3NlKSBmaWVsZHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IEluZGV4 U2NhbkJhdGNoRGF0YQoreworCS8qCisJICogQU0tc3BlY2lmaWMgY29uY2VwdCBvZiBwb3Np dGlvbiB3aXRoaW4gdGhlIGluZGV4LCBhbmQgb3RoZXIgc3R1ZmYgdGhlCisJICogQU0gbWln aHQgbmVlZCB0byBzdG9yZSBmb3IgZWFjaCBiYXRjaC4KKwkgKgorCSAqIFhYWCBtYXliZSAi cG9zaXRpb24iIGlzIG5vdCB0aGUgYmVzdCBuYW1lLCBpdCBjYW4gaGF2ZSBvdGhlciBzdHVm ZiB0aGUKKwkgKiBBTSBuZWVkcyB0byBrZWVwIHBlci1iYXRjaCAoZXZlbiBvbmx5IGZvciBy ZWFkaW5nIHRoZSBsZWFmIGl0ZW1zLCBsaWtlCisJICogbmV4dFR1cGxlT2Zmc2V0KS4KKwkg Ki8KKwl2b2lkCSAgICpvcGFxdWU7CisKKwkvKgorCSAqIFRoZSBpdGVtcyBhcnJheSBpcyBh bHdheXMgb3JkZXJlZCBpbiBpbmRleCBvcmRlciAoaWUsIGluY3JlYXNpbmcKKwkgKiBpbmRl eG9mZnNldCkuICBXaGVuIHNjYW5uaW5nIGJhY2t3YXJkcyBpdCBpcyBjb252ZW5pZW50IHRv IGZpbGwgdGhlCisJICogYXJyYXkgYmFjay10by1mcm9udCwgc28gd2Ugc3RhcnQgYXQgdGhl IGxhc3Qgc2xvdCBhbmQgZmlsbCBkb3dud2FyZHMuCisJICogSGVuY2Ugd2UgbmVlZCBib3Ro IGEgZmlyc3QtdmFsaWQtZW50cnkgYW5kIGEgbGFzdC12YWxpZC1lbnRyeSBjb3VudGVyLgor CSAqIGl0ZW1JbmRleCBpcyBhIGN1cnNvciBzaG93aW5nIHdoaWNoIGVudHJ5IHdhcyBsYXN0 IHJldHVybmVkIHRvIGNhbGxlci4KKwkgKgorCSAqIFhYWCBEbyB3ZSBuZWVkIGFsbCB0aGVz ZSBpbmRleGVzLCBvciB3b3VsZCBpdCBiZSBlbm91Z2ggdG8gaGF2ZSBqdXN0CisJICogMC1p bmRleGVkIGFycmF5IHdpdGggb25seSBpdGVtSW5kZXg/CisJICovCisJaW50CQkJZmlyc3RJ dGVtOwkJLyogZmlyc3QgdmFsaWQgaW5kZXggaW4gaXRlbXNbXSAqLworCWludAkJCWxhc3RJ dGVtOwkJLyogbGFzdCB2YWxpZCBpbmRleCBpbiBpdGVtc1tdICovCisJaW50CQkJaXRlbUlu ZGV4OwkJLyogY3VycmVudCBpbmRleCBpbiBpdGVtc1tdICovCisKKwkvKiBpbmZvIGFib3V0 IGtpbGxlZCBpdGVtcyBpZiBhbnkgKGtpbGxlZEl0ZW1zIGlzIE5VTEwgaWYgbmV2ZXIgdXNl ZCkgKi8KKwlpbnQJCSAgICpraWxsZWRJdGVtczsJLyogaW5kZXhlcyBvZiBraWxsZWQgaXRl bXMgKi8KKwlpbnQJCQludW1LaWxsZWQ7CQkvKiBudW1iZXIgb2YgY3VycmVudGx5IHN0b3Jl ZCBpdGVtcyAqLworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgYW4gaW5kZXgtb25seSBz Y2FuLCB0aGVzZSBhcmUgdGhlIHR1cGxlIHN0b3JhZ2UKKwkgKiB3b3Jrc3BhY2VzIGZvciB0 aGUgY3VyclBvcyBhbmQgbWFya1BvcyByZXNwZWN0aXZlbHkuICBFYWNoIGlzIG9mIHNpemUK KwkgKiBCTENLU1osIHNvIGl0IGNhbiBob2xkIGFzIG11Y2ggYXMgYSBmdWxsIHBhZ2UncyB3 b3J0aCBvZiB0dXBsZXMuCisJICoKKwkgKiBYWFggbWF5YmUgY3VyclR1cGxlcyBzaG91bGQg YmUgcGFydCBvZiB0aGUgYW0tc3BlY2lmaWMgcGVyLWJhdGNoIHN0YXRlCisJICogc3RvcmVk IGluICJwb3NpdGlvbiIgZmllbGQ/CisJICovCisJY2hhcgkgICAqY3VyclR1cGxlczsJCS8q IHR1cGxlIHN0b3JhZ2UgZm9yIGN1cnJQb3MgKi8KKwlJbmRleFNjYW5CYXRjaFBvc0l0ZW0g Kml0ZW1zOwkvKiBYWFggZG9uJ3Qgc2l6ZSB0byBNYXhUSURzUGVyQlRyZWVQYWdlICovCisK KwkvKgorCSAqIGJhdGNoIGNvbnRlbnRzIChUSURzLCBpbmRleCB0dXBsZXMsIGtpbGwgYml0 bWFwLCAuLi4pCisJICoKKwkgKiBYWFggU2hvdWxkbid0IHRoaXMgYmUgcGFydCBvZiB0aGUg IkluZGV4U2NhbkJhdGNoUG9zSXRlbSIgc3RydWN0PyBUbworCSAqIGtlZXAgZXZlcnl0aGlu ZyBpbiBvbmUgcGxhY2U/IE9yIHdoeSBzaG91bGQgd2UgaGF2ZSBzZXBhcmF0ZSBhcnJheXM/ CisJICogT25lIGFkdmFudGFnZSBpcyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gYWxsb2NhdGUg bWVtb3J5IGZvciBhcnJheXMgdGhhdAorCSAqIHdlIGRvbid0IG5lZWQgLi4uIGUuZy4gaWYg d2UgZG9uJ3QgbmVlZCBoZWFwIHR1cGxlcywgd2UgZG9uJ3QgYWxsb2NhdGUKKwkgKiB0aGF0 LiBXZSBjb3VsZG4ndCBkbyB0aGF0IHdpdGggZXZlcnl0aGluZyBpbiBvbmUgc3RydWN0Lgor CSAqLworCUluZGV4VHVwbGUgKml0dXBzOwkJCS8qIEluZGV4VHVwbGVzLCBpZiByZXF1ZXN0 ZWQgKi8KKwlIZWFwVHVwbGUgICpodHVwczsJCQkvKiBIZWFwVHVwbGVzLCBpZiByZXF1ZXN0 ZWQgKi8KKwlib29sCSAgICpyZWNoZWNrOwkJLyogcmVjaGVjayBmbGFncyAqLworCisJLyog WFhYIHdoeSBkbyB3ZSBuZWVkIHRoaXMgb24gdG9wIG9mICJvcGFxdWUiIHBvaW50ZXI/ICov CisJRGF0dW0JICAgKnByaXZhdGVEYXRhOwkvKiBwcml2YXRlIGRhdGEgZm9yIGJhdGNoICov CisKKwkvKiB4c19vcmRlcmJ5dmFscyAvIHhzX29yZGVyYnludWxscyAqLworCURhdHVtCSAg ICpvcmRlcmJ5dmFsczsKKwlib29sCSAgICpvcmRlcmJ5bnVsbHM7CisKK30gSW5kZXhTY2Fu QmF0Y2hEYXRhOworCisvKgorICogUG9zaXRpb24gaW4gdGhlIHF1ZXVlIG9mIGJhdGNoZXMg LSBpbmRleCBvZiBhIGJhdGNoLCBpbmRleCBvZiBpdGVtIGluIGEgYmF0Y2guCisgKi8KK3R5 cGVkZWYgc3RydWN0IEluZGV4U2NhbkJhdGNoUG9zCit7CisJaW50CQkJYmF0Y2g7CisJaW50 CQkJaW5kZXg7Cit9IEluZGV4U2NhbkJhdGNoUG9zOworCit0eXBlZGVmIHN0cnVjdCBJbmRl eFNjYW5EZXNjRGF0YSBJbmRleFNjYW5EZXNjRGF0YTsKK3R5cGVkZWYgYm9vbCAoKkluZGV4 UHJlZmV0Y2hDYWxsYmFjaykgKEluZGV4U2NhbkRlc2NEYXRhICogc2Nhbiwgdm9pZCAqYXJn LCBJbmRleFNjYW5CYXRjaFBvcyAqcG9zKTsKKworLyoKKyAqIFF1ZXVlCisgKi8KK3R5cGVk ZWYgc3RydWN0IEluZGV4U2NhbkJhdGNoZXMKK3sKKwkvKgorCSAqIERpZCB3ZSByZWFkIHRo ZSBsYXN0IGJhdGNoPyBUaGUgYmF0Y2hlcyBtYXkgYmUgbG9hZGVkIGZyb20gbXVsdGlwbGUK KwkgKiBwbGFjZXMsIGFuZCB3ZSBuZWVkIHRvIHJlbWVtYmVyIHdoZW4gd2UgZmFpbCB0byBs b2FkIHRoZSBuZXh0IGJhdGNoIGluCisJICogYSBnaXZlbiBzY2FuICh3aGljaCBtZWFucyAi bm8gbW9yZSBiYXRjaGVzIikuIGFtZ2V0YmF0Y2ggbWF5IHJlc3RhcnQKKwkgKiB0aGUgc2Nh biBvbiB0aGUgZ2V0IGNhbGwsIHNvIHdlIG5lZWQgdG8gcmVtZW1iZXIgaXQncyBvdmVyLgor CSAqLworCWJvb2wJCWZpbmlzaGVkOworCWJvb2wJCXJlc2V0OworCisJLyoKKwkgKiBDdXJy ZW50IHNjYW4gZGlyZWN0aW9uLCBmb3IgdGhlIGN1cnJlbnRseSBsb2FkZWQgYmF0Y2hlcy4g VGhpcyBpcyB1c2VkCisJICogdG8gbG9hZCBkYXRhIGluIHRoZSByZWFkIHN0cmVhbSBBUEkg Y2FsbGJhY2ssIGV0Yy4KKwkgKgorCSAqIFhYWCBNYXkgbmVlZCBzb21lIHdvcmsgdG8gdXNl IGFscmVhZHkgbG9hZGVkIGJhdGNoZXMgYWZ0ZXIgY2hhbmdlIG9mCisJICogZGlyZWN0aW9u LCBpbnN0ZWFkIG9mIGp1c3QgdGhyb3dpbmcgZXZlcnl0aGluZyBhd2F5LiBNYXkgbmVlZCB0 byByZXNldAorCSAqIHRoZSBzdHJlYW0gYnV0IGtlZXAgdGhlIGJhdGNoZXM/CisJICovCisJ U2NhbkRpcmVjdGlvbiBkaXJlY3Rpb247CisKKwkvKiBwb3NpdGlvbnMgaW4gdGhlIHF1ZXVl IG9mIGJhdGNoZXMgKGJhdGNoICsgaXRlbSkgKi8KKwlJbmRleFNjYW5CYXRjaFBvcyByZWFk UG9zOwkvKiByZWFkIHBvc2l0aW9uICovCisJSW5kZXhTY2FuQmF0Y2hQb3Mgc3RyZWFtUG9z OwkvKiBwcmVmZXRjaCBwb3NpdGlvbiAoZm9yIHJlYWQgc3RyZWFtIEFQSSkgKi8KKwlJbmRl eFNjYW5CYXRjaFBvcyBtYXJrUG9zOwkvKiBtYXJrL3Jlc3RvcmUgcG9zaXRpb24gKi8KKwor CUluZGV4U2NhbkJhdGNoRGF0YSAqbWFya0JhdGNoOworCS8vIEluZGV4U2NhbkJhdGNoRGF0 YSAqY3VycmVudEJhdGNoOworCisJLyoKKwkgKiBBcnJheSBvZiBiYXRjaGVzIHJldHVybmVk IGJ5IHRoZSBBTS4gVGhlIGFycmF5IGhhcyBhIGNhcGFjaXR5IChidXQgY2FuCisJICogYmUg cmVzaXplZCBpZiBuZWVkZWQpLiBUaGUgZmlyc3RCYXRjaCBpcyBhbiBpbmRleCBvZiB0aGUg Zmlyc3QgYmF0Y2gsCisJICogYnV0IG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgYnkgKG1vZHVs byBtYXhCYXRjaGVzKSBpbnRvIGluZGV4IGluIHRoZQorCSAqIGJhdGNoZXMgYXJyYXkuCisJ ICoKKwkgKiBGSVhNRSBNYXliZSB0aGVzZSBmaWVsZHMgc2hvdWxkIGJlIHVpbnQzMiwgb3Ig c29tZXRoaW5nIGxpa2UgdGhhdD8KKwkgKi8KKwlpbnQJCQltYXhCYXRjaGVzOwkJLyogc2l6 ZSBvZiB0aGUgYmF0Y2hlcyBhcnJheSAqLworCWludAkJCWZpcnN0QmF0Y2g7CQkvKiBmaXJz dCB1c2VkIGJhdGNoIHNsb3QgKi8KKwlpbnQJCQluZXh0QmF0Y2g7CQkvKiBuZXh0IGVtcHR5 IGJhdGNoIHNsb3QgKi8KKworCUluZGV4U2NhbkJhdGNoRGF0YSAqKmJhdGNoZXM7CisKKwkv KiBjYWxsYmFjayB0byBza2lwIHByZWZldGNoaW5nIGluIElPUyBldGMuICovCisJSW5kZXhQ cmVmZXRjaENhbGxiYWNrIHByZWZldGNoQ2FsbGJhY2s7CisJdm9pZAkgICAqcHJlZmV0Y2hB cmd1bWVudDsKK30gSW5kZXhTY2FuQmF0Y2hlczsKKwogLyoKICAqIFdlIHVzZSB0aGUgc2Ft ZSBJbmRleFNjYW5EZXNjRGF0YSBzdHJ1Y3R1cmUgZm9yIGJvdGggYW1nZXR0dXBsZS1iYXNl ZAogICogYW5kIGFtZ2V0Yml0bWFwLWJhc2VkIGluZGV4IHNjYW5zLiAgU29tZSBmaWVsZHMg YXJlIG9ubHkgcmVsZXZhbnQgaW4KQEAgLTE3Niw2ICszMzAsMTIgQEAgdHlwZWRlZiBzdHJ1 Y3QgSW5kZXhTY2FuRGVzY0RhdGEKIAogCWJvb2wJCXhzX3JlY2hlY2s7CQkvKiBUIG1lYW5z IHNjYW4ga2V5cyBtdXN0IGJlIHJlY2hlY2tlZCAqLwogCisJLyoKKwkgKiBCYXRjaGVzIGlu ZGV4IHNjYW4ga2VlcCBhIGxpc3Qgb2YgYmF0Y2hlcyBsb2FkZWQgZnJvbSB0aGUgaW5kZXgg aW4gYQorCSAqIGNpcmN1bGFyIGJ1ZmZlci4KKwkgKi8KKwlJbmRleFNjYW5CYXRjaGVzICp4 c19iYXRjaGVzOworCiAJLyoKIAkgKiBXaGVuIGZldGNoaW5nIHdpdGggYW4gb3JkZXJpbmcg b3BlcmF0b3IsIHRoZSB2YWx1ZXMgb2YgdGhlIE9SREVSIEJZCiAJICogZXhwcmVzc2lvbnMg b2YgdGhlIGxhc3QgcmV0dXJuZWQgdHVwbGUsIGFjY29yZGluZyB0byB0aGUgaW5kZXguICBJ ZgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3RhYmxlYW0uaCBiL3NyYy9pbmNs dWRlL2FjY2Vzcy90YWJsZWFtLmgKaW5kZXggODcxM2UxMmNiZmIuLjViZWQzNTljZjEzIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvdGFibGVhbS5oCisrKyBiL3NyYy9pbmNs dWRlL2FjY2Vzcy90YWJsZWFtLmgKQEAgLTQxMyw4ICs0MTMsMTQgQEAgdHlwZWRlZiBzdHJ1 Y3QgVGFibGVBbVJvdXRpbmUKIAkgKiBzdHJ1Y3R1cmUgd2l0aCBhZGRpdGlvbmFsIGluZm9y bWF0aW9uLgogCSAqCiAJICogVHVwbGVzIGZvciBhbiBpbmRleCBzY2FuIGNhbiB0aGVuIGJl IGZldGNoZWQgdmlhIGluZGV4X2ZldGNoX3R1cGxlLgorCSAqCisJICogVGhlIFJlYWRTdHJl YW0gcG9pbnRlciBpcyBvcHRpb25hbCAtIE5VTEwgbWVhbnMgdGhlIHJlZ3VsYXIgYnVmZmVy CisJICogcmVhZHMgYXJlIHVzZWQuIElmIGEgdmFsaWQgUmVhZFN0cmVhbSBpcyBwcm92aWRl ZCwgdGhlIGNhbGxiYWNrCisJICogKGdlbmVyYXRpbmcgdGhlIGJsb2NrcyB0byByZWFkKSBh bmQgaW5kZXhfZmV0Y2hfdHVwbGUgKGNvbnN1bWluZyB0aGUKKwkgKiBidWZmZXJzKSBuZWVk IHRvIGFncmVlIG9uIHRoZSBleGFjdCBvcmRlci4KIAkgKi8KLQlzdHJ1Y3QgSW5kZXhGZXRj aFRhYmxlRGF0YSAqKCppbmRleF9mZXRjaF9iZWdpbikgKFJlbGF0aW9uIHJlbCk7CisJc3Ry dWN0IEluZGV4RmV0Y2hUYWJsZURhdGEgKigqaW5kZXhfZmV0Y2hfYmVnaW4pIChSZWxhdGlv biByZWwsCisJCQkJCQkJCQkJCQkJICBSZWFkU3RyZWFtICpycyk7CiAKIAkvKgogCSAqIFJl c2V0IGluZGV4IGZldGNoLiBUeXBpY2FsbHkgdGhpcyB3aWxsIHJlbGVhc2UgY3Jvc3MgaW5k ZXggZmV0Y2gKQEAgLTExNDksOSArMTE1NSw5IEBAIHRhYmxlX3BhcmFsbGVsc2Nhbl9yZWlu aXRpYWxpemUoUmVsYXRpb24gcmVsLCBQYXJhbGxlbFRhYmxlU2NhbkRlc2MgcHNjYW4pCiAg KiBUdXBsZXMgZm9yIGFuIGluZGV4IHNjYW4gY2FuIHRoZW4gYmUgZmV0Y2hlZCB2aWEgdGFi bGVfaW5kZXhfZmV0Y2hfdHVwbGUoKS4KICAqLwogc3RhdGljIGlubGluZSBJbmRleEZldGNo VGFibGVEYXRhICoKLXRhYmxlX2luZGV4X2ZldGNoX2JlZ2luKFJlbGF0aW9uIHJlbCkKK3Rh YmxlX2luZGV4X2ZldGNoX2JlZ2luKFJlbGF0aW9uIHJlbCwgUmVhZFN0cmVhbSAqcnMpCiB7 Ci0JcmV0dXJuIHJlbC0+cmRfdGFibGVhbS0+aW5kZXhfZmV0Y2hfYmVnaW4ocmVsKTsKKwly ZXR1cm4gcmVsLT5yZF90YWJsZWFtLT5pbmRleF9mZXRjaF9iZWdpbihyZWwsIHJzKTsKIH0K IAogLyoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oIGIvc3Jj L2luY2x1ZGUvbm9kZXMvZXhlY25vZGVzLmgKaW5kZXggNWI2Y2FkYjVhNmMuLmVmNjcyZTIw M2QwIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAorKysgYi9z cmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaApAQCAtMTY5Nyw2ICsxNjk3LDcgQEAgdHlw ZWRlZiBzdHJ1Y3QKICAqCQlPcmRlckJ5VHlwQnlWYWxzICAgaXMgdGhlIGRhdGF0eXBlIG9m IG9yZGVyIGJ5IGV4cHJlc3Npb24gcGFzcy1ieS12YWx1ZT8KICAqCQlPcmRlckJ5VHlwTGVu cwkgICB0eXBsZW5zIG9mIHRoZSBkYXRhdHlwZXMgb2Ygb3JkZXIgYnkgZXhwcmVzc2lvbnMK ICAqCQlQc2NhbkxlbgkJICAgc2l6ZSBvZiBwYXJhbGxlbCBpbmRleCBzY2FuIGRlc2NyaXB0 b3IKKyAqCQlDYW5CYXRjaAkJICAgYmF0Y2hpbmcgKGFuZCBwcmVmZXRjaGluZykgZW5hYmxl ZAogICogLS0tLS0tLS0tLS0tLS0tLQogICovCiB0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5T dGF0ZQpAQCAtMTcyNiw2ICsxNzI3LDEwIEBAIHR5cGVkZWYgc3RydWN0IEluZGV4U2NhblN0 YXRlCiAJYm9vbAkgICAqaXNzX09yZGVyQnlUeXBCeVZhbHM7CiAJaW50MTYJICAgKmlzc19P cmRlckJ5VHlwTGVuczsKIAlTaXplCQlpc3NfUHNjYW5MZW47CisKKwkvKiBiYXRjaGluZy9w cmVmZXRjaGluZyBlbmFibGVkPyAqLworCWJvb2wJCWlzc19DYW5CYXRjaDsKKwogfSBJbmRl eFNjYW5TdGF0ZTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTc0OSw2ICsxNzU0LDcg QEAgdHlwZWRlZiBzdHJ1Y3QgSW5kZXhTY2FuU3RhdGUKICAqCQlQc2NhbkxlbgkJICAgc2l6 ZSBvZiBwYXJhbGxlbCBpbmRleC1vbmx5IHNjYW4gZGVzY3JpcHRvcgogICoJCU5hbWVDU3Ry aW5nQXR0TnVtcyBhdHRudW1zIG9mIG5hbWUgdHlwZWQgY29sdW1ucyB0byBwYWQgdG8gTkFN RURBVEFMRU4KICAqCQlOYW1lQ1N0cmluZ0NvdW50ICAgbnVtYmVyIG9mIGVsZW1lbnRzIGlu IHRoZSBOYW1lQ1N0cmluZ0F0dE51bXMgYXJyYXkKKyAqCQlDYW5CYXRjaAkJICAgYmF0Y2hp bmcgKGFuZCBwcmVmZXRjaGluZykgZW5hYmxlZAogICogLS0tLS0tLS0tLS0tLS0tLQogICov CiB0eXBlZGVmIHN0cnVjdCBJbmRleE9ubHlTY2FuU3RhdGUKQEAgLTE3NzIsNiArMTc3OCw3 IEBAIHR5cGVkZWYgc3RydWN0IEluZGV4T25seVNjYW5TdGF0ZQogCVNpemUJCWlvc3NfUHNj YW5MZW47CiAJQXR0ck51bWJlciAqaW9zc19OYW1lQ1N0cmluZ0F0dE51bXM7CiAJaW50CQkJ aW9zc19OYW1lQ1N0cmluZ0NvdW50OworCWJvb2wJCWlvc3NfQ2FuQmF0Y2g7CiB9IEluZGV4 T25seVNjYW5TdGF0ZTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3N5c3ZpZXdzLm91dAppbmRleCBhZTE3ZDAyOGVkMy4uMjIwYjYxZmFkMmQg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0Cisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0CkBAIC0xNTgsNiAr MTU4LDcgQEAgc2VsZWN0IG5hbWUsIHNldHRpbmcgZnJvbSBwZ19zZXR0aW5ncyB3aGVyZSBu YW1lIGxpa2UgJ2VuYWJsZSUnOwogIGVuYWJsZV9pbmNyZW1lbnRhbF9zb3J0ICAgICAgICB8 IG9uCiAgZW5hYmxlX2luZGV4b25seXNjYW4gICAgICAgICAgIHwgb24KICBlbmFibGVfaW5k ZXhzY2FuICAgICAgICAgICAgICAgfCBvbgorIGVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmcg ICAgICB8IG9uCiAgZW5hYmxlX21hdGVyaWFsICAgICAgICAgICAgICAgIHwgb24KICBlbmFi bGVfbWVtb2l6ZSAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9tZXJnZWpvaW4gICAg ICAgICAgICAgICB8IG9uCkBAIC0xNzIsNyArMTczLDcgQEAgc2VsZWN0IG5hbWUsIHNldHRp bmcgZnJvbSBwZ19zZXR0aW5ncyB3aGVyZSBuYW1lIGxpa2UgJ2VuYWJsZSUnOwogIGVuYWJs ZV9zZXFzY2FuICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX3NvcnQgICAgICAgICAg ICAgICAgICAgIHwgb24KICBlbmFibGVfdGlkc2NhbiAgICAgICAgICAgICAgICAgfCBvbgot KDI0IHJvd3MpCisoMjUgcm93cykKIAogLS0gVGhlcmUgYXJlIGFsd2F5cyB3YWl0IGV2ZW50 IGRlc2NyaXB0aW9ucyBmb3IgdmFyaW91cyB0eXBlcy4gIEluamVjdGlvblBvaW50CiAtLSBt YXkgYmUgcHJlc2VudCBvciBhYnNlbnQsIGRlcGVuZGluZyBvbiBoaXN0b3J5IHNpbmNlIGxh c3QgcG9zdG1hc3RlciBzdGFydC4KZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ2luZGVudC90 eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKaW5kZXgg ZTU4NzllMDBkZmYuLjA2MGQ5NjRlMzk5IDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdAorKysgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlz dApAQCAtMTI2MCw2ICsxMjYwLDEwIEBAIEluZGV4T3JkZXJCeURpc3RhbmNlCiBJbmRleFBh dGgKIEluZGV4UnVudGltZUtleUluZm8KIEluZGV4U2NhbgorSW5kZXhTY2FuQmF0Y2hEYXRh CitJbmRleFNjYW5CYXRjaFBvcworSW5kZXhTY2FuQmF0Y2hQb3NJdGVtCitJbmRleFNjYW5C YXRjaGVzCiBJbmRleFNjYW5EZXNjCiBJbmRleFNjYW5JbnN0cnVtZW50YXRpb24KIEluZGV4 U2NhblN0YXRlCkBAIC0zMzk2LDYgKzM0MDAsNyBAQCBhbWVuZHNjYW5fZnVuY3Rpb24KIGFt ZXN0aW1hdGVwYXJhbGxlbHNjYW5fZnVuY3Rpb24KIGFtZ2V0Yml0bWFwX2Z1bmN0aW9uCiBh bWdldHR1cGxlX2Z1bmN0aW9uCithbWdldGJhdGNoX2Z1bmN0aW9uCiBhbWluaXRwYXJhbGxl bHNjYW5fZnVuY3Rpb24KIGFtaW5zZXJ0X2Z1bmN0aW9uCiBhbWluc2VydGNsZWFudXBfZnVu Y3Rpb24KLS0gCjIuNDkuMAoK --------------TIm4EPVLTEyhZ61bk9DD3aiF Content-Type: text/x-patch; charset=UTF-8; name="v20250422-0002-WIP-batching-for-nbtree-indexes.patch" Content-Disposition: attachment; filename="v20250422-0002-WIP-batching-for-nbtree-indexes.patch" Content-Transfer-Encoding: base64 RnJvbSA2NDJmNDQyOTQ2ZDc5M2EwZDk1OTEwZTM0YjJhMGY2NjVmZWM5YzM3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogTW9uLCAzMCBTZXAgMjAyNCAyMjo0ODozOSArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djIwMjUwNDIyIDIvNV0gV0lQOiBiYXRjaGluZyBmb3IgbmJ0cmVlIGluZGV4ZXMKCkFkZHMg YmF0Y2hpbmcvcHJlZmV0Y2hpbmcgZm9yIGJ0cmVlIGluZGV4ZXMuIFJldHVybnMgb25seSBi YXRjaGVzIGZyb20gYQpzaW5nbGUgbGVhZiBwYWdlLiBEb2VzIG5vdCBzdXBwb3J0IG1hcmsv cmVzdG9yZSB5ZXQuCi0tLQogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYyAg ICB8ICAzMTkgKysrKwogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYyB8 IDE5OTggKysrKysrKysrKysrKysrKysrKysrKystLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnR1dGlscy5jICB8ICAxNzkgKysrCiBzcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVl LmggICAgICAgICAgIHwgICA3MiArLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgICAgICB8ICAgIDIgKwogNSBmaWxlcyBjaGFuZ2VkLCAyNDE3IGluc2VydGlvbnMoKyks IDE1MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0 cmVlL25idHJlZS5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYwppbmRl eCBhY2NjN2ZlOGJiZS4uM2UzMDc2YjdlMTIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0cmVlLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9u YnRyZWUuYwpAQCAtMTU5LDYgKzE1OSw4IEBAIGJ0aGFuZGxlcihQR19GVU5DVElPTl9BUkdT KQogCWFtcm91dGluZS0+YW1iZWdpbnNjYW4gPSBidGJlZ2luc2NhbjsKIAlhbXJvdXRpbmUt PmFtcmVzY2FuID0gYnRyZXNjYW47CiAJYW1yb3V0aW5lLT5hbWdldHR1cGxlID0gYnRnZXR0 dXBsZTsKKwlhbXJvdXRpbmUtPmFtZ2V0YmF0Y2ggPSBidGdldGJhdGNoOworCWFtcm91dGlu ZS0+YW1mcmVlYmF0Y2ggPSBidGZyZWViYXRjaDsKIAlhbXJvdXRpbmUtPmFtZ2V0Yml0bWFw ID0gYnRnZXRiaXRtYXA7CiAJYW1yb3V0aW5lLT5hbWVuZHNjYW4gPSBidGVuZHNjYW47CiAJ YW1yb3V0aW5lLT5hbW1hcmtwb3MgPSBidG1hcmtwb3M7CkBAIC0yNzksNiArMjgxLDE1OCBA QCBidGdldHR1cGxlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJ cmV0dXJuIHJlczsKIH0KIAorLyogRklYTUUgZHVwbGljYXRlIGZyb20gaW5kZXhhbS5jICov CisjZGVmaW5lIElOREVYX1NDQU5fQkFUQ0goc2NhbiwgaWR4KQlcCisJCSgoc2NhbiktPnhz X2JhdGNoZXMtPmJhdGNoZXNbKGlkeCkgJSAoc2NhbiktPnhzX2JhdGNoZXMtPm1heEJhdGNo ZXNdKQorCisvKgorICoJYnRnZXRiYXRjaCgpIC0tIEdldCB0aGUgbmV4dCBiYXRjaCBvZiB0 dXBsZXMgaW4gdGhlIHNjYW4uCisgKgorICogWFhYIFNpbXBsaWZpZWQgdmVyc2lvbiBvZiBi dGdldHR1cGxlKCksIGJ1dCBmb3IgYmF0Y2hlcyBvZiB0dXBsZXMuCisgKi8KK0luZGV4U2Nh bkJhdGNoCitidGdldGJhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVl OworCUluZGV4U2NhbkJhdGNoIHJlczsKKwlCVEJhdGNoU2NhblBvcyBwb3MgPSBOVUxMOwor CisJLyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRoIHJlZ3VsYXIgc2Nhbi1sZXZlbCBw b3NpdGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKTsK KwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1hcmtQb3MpKTsKKworCS8qIGJ0cmVl IGluZGV4ZXMgYXJlIG5ldmVyIGxvc3N5ICovCisJc2Nhbi0+eHNfcmVjaGVjayA9IGZhbHNl OworCisJaWYgKHNjYW4tPnhzX2JhdGNoZXMtPmZpcnN0QmF0Y2ggPCBzY2FuLT54c19iYXRj aGVzLT5uZXh0QmF0Y2gpCisJeworCQlJbmRleFNjYW5CYXRjaCBiYXRjaCA9IElOREVYX1ND QU5fQkFUQ0goc2Nhbiwgc2Nhbi0+eHNfYmF0Y2hlcy0+bmV4dEJhdGNoLTEpOworCQlwb3Mg PSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNoLT5vcGFxdWU7CisJfQorCisJLyogRWFjaCBsb29w IGl0ZXJhdGlvbiBwZXJmb3JtcyBhbm90aGVyIHByaW1pdGl2ZSBpbmRleCBzY2FuICovCisJ ZG8KKwl7CisJCS8qCisJCSAqIElmIHdlJ3ZlIGFscmVhZHkgaW5pdGlhbGl6ZWQgdGhpcyBz Y2FuLCB3ZSBjYW4ganVzdCBhZHZhbmNlIGl0IGluCisJCSAqIHRoZSBhcHByb3ByaWF0ZSBk aXJlY3Rpb24uICBJZiB3ZSBoYXZlbid0IGRvbmUgc28geWV0LCB3ZSBjYWxsCisJCSAqIF9i dF9maXJzdCgpIHRvIGdldCB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgc2Nhbi4KKwkJICovCisJ CWlmIChwb3MgPT0gTlVMTCkKKwkJCXJlcyA9IF9idF9maXJzdF9iYXRjaChzY2FuLCBkaXIp OworCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBOb3cgY29udGludWUgdGhlIHNjYW4uCisJ CQkgKi8KKwkJCXJlcyA9IF9idF9uZXh0X2JhdGNoKHNjYW4sIHBvcywgZGlyKTsKKwkJfQor CisJCS8qIElmIHdlIGhhdmUgYSBiYXRjaCwgcmV0dXJuIGl0IC4uLiAqLworCQlpZiAocmVz KQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogWFhYIHdlIG5lZWQgdG8gaW52b2tlIF9idF9m aXJzdF9iYXRjaCBvbiB0aGUgbmV4dCBpdGVyYXRpb24sIHRvCisJCSAqIGFkdmFuY2UgU0FP UCBrZXlzIGV0Yy4gQnV0IGluZGV4YW0uYyBhbHJlYWR5IGRvZXMgdGhpcywgYnV0IHRoYXQn cworCQkgKiBvbmx5IGFmdGVyIHRoaXMgcmV0dXJucywgc28gbWF5YmUgdGhpcyBzaG91bGQg ZG8gdGhpcyBpbiBzb21lIG90aGVyCisJCSAqIHdheSwgbm90IHN1cmUgd2hvIHNob3VsZCBi ZSByZXNwb25zaWJsZSBmb3Igc2V0dGluZyBjdXJyZW50QmF0Y2guCisJCSAqCisJCSAqIFhY WCBNYXliZSB3ZSBkb24ndCBldmVuIG5lZWQgdGhhdCBmaWVsZD8gV2hhdCBpcyBhIGN1cnJl bnQgYmF0Y2gKKwkJICogYW55d2F5PyBUaGVyZSBzZWVtIHRvIGJlIGF0IGxlYXN0IG11bHRp cGxlIGNvbmNlcHRzIG9mICJjdXJyZW50IgorCQkgKiBiYXRjaCwgb25lIGZvciB0aGUgcmVh ZCBzdHJlYW0sIGFub3RoZXIgZm9yIGV4ZWN1dG9yIC4uLgorCQkgKi8KKwkJLy8gc2Nhbi0+ eHNfYmF0Y2hlcy0+Y3VycmVudEJhdGNoID0gcmVzOworCisJCS8qCisJCSAqIFdlIG1heSBk byBhIG5ldyBzY2FuLCBkZXBlbmRpbmcgb24gd2hhdCBfYnRfc3RhcnRfcHJpbV9zY2FuIHNh eXMuCisJCSAqIEluIHRoYXQgY2FzZSB3ZSBuZWVkIHRvIHN0YXJ0IGZyb20gc2NyYXRjaCwg bm90IGZyb20gdGhlIHBvc2l0aW9uCisJCSAqIG9mIHRoZSBsYXN0IGJhdGNoLiBJbiByZWd1 bGFyIG5vbi1iYXRjaGVkIHNjYW5zIHdlIGhhdmUgY3VyclBvcywKKwkJICogYmVjYXVzZSB3 ZSBoYXZlIGp1c3Qgb25lIGxlYWYgcGFnZSBmb3IgdGhlIHdob2xlIHNjYW4sIGFuZCB3ZQor CQkgKiBpbnZhbGlkYXRlIGl0IGJlZm9yZSBsb2FkaW5nIHRoZSBuZXh0IG9uZS4gQnV0IHdp dGggYmF0Y2hpbmcgdGhhdAorCQkgKiBkb2Vzbid0IHdvcmsgLSB3ZSBoYXZlIG1hbnkgbGVh ZnMsIGl0J3Mgbm90IGNsZWFyIHdoaWNoIG9uZSBpcworCQkgKiAnY3VycmVudCcgKHdlbGws IGl0J3MgdGhlIGxhc3QpLCBhbmQgd2UgY2FuJ3QgaW52YWxpZGF0ZSBpdCwKKwkJICogdGhh dCdzIHVwIHRvIGFtZnJlZWJhdGNoKCkuIEZvciBub3cgd2UgZGVkdWNlIHRoZSBwb3NpdGlv biBhbmQKKwkJICogcmVzZXQgaXQgdG8gTlVMTCwgdG8gaW5kaWNhdGUgdGhlIHNhbWUgdGhp bmcuCisJCSAqCisJCSAqIFhYWCBNYXliZSB3ZSBzaG91bGQgaGF2ZSBzb21ldGhpbmcgbGlr ZSAnY3VycmVudEJhdGNoJz8gQnV0IHRoZW4KKwkJICogdGhhdCBwcm9iYWJseSBzaG91bGQg YmUgaW4gQlRTY2FuT3BhcXVlLCBub3QgaW4gdGhlIGdlbmVyaWMKKwkJICogaW5kZXhhbS5j IHBhcnQ/IE9yIGl0IGl0IGEgc3VmZmljaWVudGx5IGdlbmVyaWMgdGhpbmc/IEhvdyB3b3Vs ZAorCQkgKiB3ZSBrZWVwIGl0IGluIHN5bmMgd2l0aCB0aGUgYmF0Y2ggcXVldWU/IElmIGZy ZWVpbmcgYmF0Y2hlcyBpcworCQkgKiB1cCB0byBpbmRleGFtLCBob3cgZG8gd2UgZW5zdXJl IHRoZSBjdXJyZW50QmF0Y2ggZG9lcyBub3QgcG9pbnQKKwkJICogdG8gYWxyZWFkeSByZW1v dmVkIGJhdGNoPworCQkgKi8KKwkJcG9zID0gTlVMTDsKKworCQkvKiAuLi4gb3RoZXJ3aXNl IHNlZSBpZiB3ZSBuZWVkIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KKwl9IHdo aWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9zdGFydF9wcmltX3NjYW4oc2NhbiwgZGly KSk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKgorICoJYnRnZXRiYXRjaCgpIC0tIEdldCB0 aGUgbmV4dCBiYXRjaCBvZiB0dXBsZXMgaW4gdGhlIHNjYW4uCisgKgorICogWFhYIFByZXR0 eSBtdWNoIGxpa2UgYnRnZXR0dXBsZSgpLCBidXQgZm9yIGJhdGNoZXMgb2YgdHVwbGVzLgor ICovCit2b2lkCitidGZyZWViYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJh dGNoIGJhdGNoKQoreworCUJUU2Nhbk9wYXF1ZSBzbyBQR19VU0VEX0ZPUl9BU1NFUlRTX09O TFkgPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwkvKiBiYXRjaGluZyBkb2Vz IG5vdCB3b3JrIHdpdGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2Vy dCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9z SXNWYWxpZChzby0+bWFya1BvcykpOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgd2Ug c2hvdWxkIGtpbGwgdHVwbGVzIGZyb20gdGhlIHByZXZpb3VzIGJhdGNoLgorCSAqLworCV9i dF9raWxsX2JhdGNoKHNjYW4sIGJhdGNoKTsKKworCS8qIGZyZWUgYWxsIHRoZSBzdHVmZiB0 aGF0IG1pZ2h0IGJlIGFsbG9jYXRlZCAqLworCisJaWYgKGJhdGNoLT5pdGVtcykKKwkJcGZy ZWUoYmF0Y2gtPml0ZW1zKTsKKworCWlmIChiYXRjaC0+aXR1cHMpCisJCXBmcmVlKGJhdGNo LT5pdHVwcyk7CisKKwlpZiAoYmF0Y2gtPmh0dXBzKQorCQlwZnJlZShiYXRjaC0+aHR1cHMp OworCisJaWYgKGJhdGNoLT5yZWNoZWNrKQorCQlwZnJlZShiYXRjaC0+cmVjaGVjayk7CisK KwlpZiAoYmF0Y2gtPnByaXZhdGVEYXRhKQorCQlwZnJlZShiYXRjaC0+cHJpdmF0ZURhdGEp OworCisJaWYgKGJhdGNoLT5vcmRlcmJ5dmFscykKKwkJcGZyZWUoYmF0Y2gtPm9yZGVyYnl2 YWxzKTsKKworCWlmIChiYXRjaC0+b3JkZXJieW51bGxzKQorCQlwZnJlZShiYXRjaC0+b3Jk ZXJieW51bGxzKTsKKworCWlmIChiYXRjaC0+Y3VyclR1cGxlcykKKwkJcGZyZWUoYmF0Y2gt PmN1cnJUdXBsZXMpOworCisJaWYgKGJhdGNoLT5vcGFxdWUpCisJeworCQlCVEJhdGNoU2Nh blBvcyBwb3MgPSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNoLT5vcGFxdWU7CisKKwkJQlRCYXRj aFNjYW5Qb3NJc1ZhbGlkKCpwb3MpOworCQlCVEJhdGNoU2NhblBvc0lzUGlubmVkKCpwb3Mp OworCisJCUJUQmF0Y2hTY2FuUG9zVW5waW5JZlBpbm5lZCgqcG9zKTsKKworCQlwZnJlZShi YXRjaC0+b3BhcXVlKTsKKwl9CisKKwkvKiBhbmQgZmluYWxseSBmcmVlIHRoZSBiYXRjaCBp dHNlbGYgKi8KKwlwZnJlZShiYXRjaCk7CisKKwlyZXR1cm47Cit9CisKIC8qCiAgKiBidGdl dGJpdG1hcCgpIC0tIGdldHMgYWxsIG1hdGNoaW5nIHR1cGxlcywgYW5kIGFkZHMgdGhlbSB0 byBhIGJpdG1hcAogICovCkBAIC0zNzYsNiArNTMwLDEwIEBAIGJ0YmVnaW5zY2FuKFJlbGF0 aW9uIHJlbCwgaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlzKQogCiAvKgogICoJYnRyZXNjYW4o KSAtLSByZXNjYW4gYW4gaW5kZXggcmVsYXRpb24KKyAqCisgKiBCYXRjaGVzIHNob3VsZCBo YXZlIGJlZW4gZnJlZWQgZnJvbSBpbmRleGFtIHVzaW5nIGJ0ZnJlZWJhdGNoKCkgYmVmb3Jl IHdlCisgKiBnZXQgaGVyZSwgYnV0IHRoZW4gc29tZSBvZiB0aGUgZ2VuZXJpYyBzY2FuIHN0 dWZmIG5lZWRzIHRvIGJlIHJlc2V0IGhlcmUuCisgKiBCdXQgd2Ugc2hvdWxkbid0IG5lZWQg dG8gZG8gYW55dGhpbmcgcGFydGljdWxhciBoZXJlLCBJIHRoaW5rLgogICovCiB2b2lkCiBi dHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2NhbmtleSwgaW50IG5zY2Fu a2V5cywKQEAgLTQwMCw2ICs1NTgsMTAgQEAgYnRyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMsCiAJQlRTY2FuUG9zVW5waW5JZlBp bm5lZChzby0+bWFya1Bvcyk7CiAJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+bWFya1Bvcyk7 CiAKKwkvKiBGSVhNRSBzaG91bGQgYmUgaW4gaW5kZXhhbS5jIEkgdGhpbmsgKi8KKwkvLyBp ZiAoc2Nhbi0+eHNfYmF0Y2hlcykKKwkvLwlzY2FuLT54c19iYXRjaGVzLT5jdXJyZW50QmF0 Y2ggPSBOVUxMOworCiAJLyoKIAkgKiBBbGxvY2F0ZSB0dXBsZSB3b3Jrc3BhY2UgYXJyYXlz LCBpZiBuZWVkZWQgZm9yIGFuIGluZGV4LW9ubHkgc2NhbiBhbmQKIAkgKiBub3QgYWxyZWFk eSBkb25lIGluIGEgcHJldmlvdXMgcmVzY2FuIGNhbGwuICBUbyBzYXZlIG9uIHBhbGxvYwpA QCAtNDMzLDYgKzU5NSwxMCBAQCBidHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5L ZXkgc2NhbmtleSwgaW50IG5zY2Fua2V5cywKIAogLyoKICAqCWJ0ZW5kc2NhbigpIC0tIGNs b3NlIGRvd24gYSBzY2FuCisgKgorICogQmF0Y2hlcyBzaG91bGQgaGF2ZSBiZWVuIGZyZWVk IGZyb20gaW5kZXhhbSB1c2luZyBidGZyZWViYXRjaCgpIGJlZm9yZSB3ZQorICogZ2V0IGhl cmUsIGJ1dCB0aGVuIHNvbWUgb2YgdGhlIGdlbmVyaWMgc2NhbiBzdHVmZiBuZWVkcyB0byBi ZSByZXNldCBoZXJlLgorICogQnV0IHdlIHNob3VsZG4ndCBuZWVkIHRvIGRvIGFueXRoaW5n IHBhcnRpY3VsYXIgaGVyZSwgSSB0aGluay4KICAqLwogdm9pZAogYnRlbmRzY2FuKEluZGV4 U2NhbkRlc2Mgc2NhbikKQEAgLTQ2OSwxMiArNjM1LDE4IEBAIGJ0ZW5kc2NhbihJbmRleFNj YW5EZXNjIHNjYW4pCiAKIC8qCiAgKglidG1hcmtwb3MoKSAtLSBzYXZlIGN1cnJlbnQgc2Nh biBwb3NpdGlvbgorICoKKyAqIFdpdGggYmF0Y2hpbmcsIGFsbCB0aGUgaW50ZXJlc3Rpbmcg bWFya3BvcygpIHN0dWZmIGhhcHBlbnMgaW4gaW5kZXhhbS5jLiBXZQorICogc2hvdWxkIG5v dCBldmVuIGdldCBoZXJlLgogICovCiB2b2lkCiBidG1hcmtwb3MoSW5kZXhTY2FuRGVzYyBz Y2FuKQogewogCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1 ZTsKIAorCS8qIHdpdGggYmF0Y2hpbmcsIG1hcmsvcmVzdG9yZSBpcyBoYW5kbGVkIGluIGlu ZGV4YW0gKi8KKwlBc3NlcnQoc2Nhbi0+eHNfYmF0Y2hlcyA9PSBOVUxMKTsKKwogCS8qIFRo ZXJlIG1heSBiZSBhbiBvbGQgbWFyayB3aXRoIGEgcGluIChidXQgbm8gbG9jaykuICovCiAJ QlRTY2FuUG9zVW5waW5JZlBpbm5lZChzby0+bWFya1Bvcyk7CiAKQEAgLTQ5NSwxMiArNjY3 LDE4IEBAIGJ0bWFya3BvcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAKIC8qCiAgKglidHJlc3Ry cG9zKCkgLS0gcmVzdG9yZSBzY2FuIHRvIGxhc3Qgc2F2ZWQgcG9zaXRpb24KKyAqCisgKiBX aXRoIGJhdGNoaW5nLCBhbGwgdGhlIGludGVyZXN0aW5nIHJlc3RycG9zKCkgc3R1ZmYgaGFw cGVucyBpbiBpbmRleGFtLmMuIFdlCisgKiBzaG91bGQgbm90IGV2ZW4gZ2V0IGhlcmUuCiAg Ki8KIHZvaWQKIGJ0cmVzdHJwb3MoSW5kZXhTY2FuRGVzYyBzY2FuKQogewogCUJUU2Nhbk9w YXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAorCS8qIHdpdGggYmF0 Y2hpbmcsIG1hcmsvcmVzdG9yZSBpcyBoYW5kbGVkIGluIGluZGV4YW0gKi8KKwlBc3NlcnQo c2Nhbi0+eHNfYmF0Y2hlcyA9PSBOVUxMKTsKKwogCWlmIChzby0+bWFya0l0ZW1JbmRleCA+ PSAwKQogCXsKIAkJLyoKQEAgLTkwMCw2ICsxMDc4LDE0NyBAQCBfYnRfcGFyYWxsZWxfc2Vp emUoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciAqbmV4dF9zY2FuX3BhZ2UsCiAJ cmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIF9idF9wYXJhbGxlbF9zZWl6ZSgpIC0tIEJl Z2luIHRoZSBwcm9jZXNzIG9mIGFkdmFuY2luZyB0aGUgc2NhbiB0byBhIG5ldworICoJCXBh Z2UuICBPdGhlciBzY2FucyBtdXN0IHdhaXQgdW50aWwgd2UgY2FsbCBfYnRfcGFyYWxsZWxf cmVsZWFzZSgpCisgKgkJb3IgX2J0X3BhcmFsbGVsX2RvbmUoKS4KKyAqCisgKiBUaGUgcmV0 dXJuIHZhbHVlIGlzIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5IHNlaXplZCB0aGUgc2NhbiBh bmQgZmFsc2UKKyAqIGlmIHdlIGRpZCBub3QuICBUaGUgbGF0dGVyIGNhc2Ugb2NjdXJzIHdo ZW4gbm8gcGFnZXMgcmVtYWluLCBvciB3aGVuCisgKiBhbm90aGVyIHByaW1pdGl2ZSBpbmRl eCBzY2FuIGlzIHNjaGVkdWxlZCB0aGF0IGNhbGxlcidzIGJhY2tlbmQgY2Fubm90CisgKiBz dGFydCBqdXN0IHlldCAob25seSBiYWNrZW5kcyB0aGF0IGNhbGwgZnJvbSBfYnRfZmlyc3Qg YXJlIGNhcGFibGUgb2YKKyAqIHN0YXJ0aW5nIHByaW1pdGl2ZSBpbmRleCBzY2Fucywgd2hp Y2ggdGhleSBpbmRpY2F0ZSBieSBwYXNzaW5nIGZpcnN0PXRydWUpLgorICoKKyAqIElmIHRo ZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSwgKm5leHRfc2Nhbl9wYWdlIHJldHVybnMgdGhlIG5l eHQgcGFnZSBvZiB0aGUKKyAqIHNjYW4sIGFuZCAqbGFzdF9jdXJyX3BhZ2UgcmV0dXJucyB0 aGUgcGFnZSB0aGF0ICpuZXh0X3NjYW5fcGFnZSBjYW1lIGZyb20uCisgKiBBbiBpbnZhbGlk ICpuZXh0X3NjYW5fcGFnZSBtZWFucyB0aGUgc2NhbiBoYXNuJ3QgeWV0IHN0YXJ0ZWQsIG9y IHRoYXQKKyAqIGNhbGxlciBuZWVkcyB0byBzdGFydCB0aGUgbmV4dCBwcmltaXRpdmUgaW5k ZXggc2NhbiAoaWYgaXQncyB0aGUgbGF0dGVyCisgKiBjYXNlIHdlJ2xsIHNldCBzby5uZWVk UHJpbVNjYW4pLgorICoKKyAqIENhbGxlcnMgc2hvdWxkIGlnbm9yZSB0aGUgdmFsdWUgb2Yg Km5leHRfc2Nhbl9wYWdlIGFuZCAqbGFzdF9jdXJyX3BhZ2UgaWYKKyAqIHRoZSByZXR1cm4g dmFsdWUgaXMgZmFsc2UuCisgKi8KK2Jvb2wKK19idF9wYXJhbGxlbF9zZWl6ZV9iYXRjaChJ bmRleFNjYW5EZXNjIHNjYW4sIEJUQmF0Y2hTY2FuUG9zIHBvcywKKwkJCQkJCSBCbG9ja051 bWJlciAqbmV4dF9zY2FuX3BhZ2UsCisJCQkJCQkgQmxvY2tOdW1iZXIgKmxhc3RfY3Vycl9w YWdlLCBib29sIGZpcnN0KQoreworCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRp b247CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwor CWJvb2wJCWV4aXRfbG9vcCA9IGZhbHNlLAorCQkJCXN0YXR1cyA9IHRydWUsCisJCQkJZW5k c2NhbiA9IGZhbHNlOworCVBhcmFsbGVsSW5kZXhTY2FuRGVzYyBwYXJhbGxlbF9zY2FuID0g c2Nhbi0+cGFyYWxsZWxfc2NhbjsKKwlCVFBhcmFsbGVsU2NhbkRlc2MgYnRzY2FuOworCisJ Km5leHRfc2Nhbl9wYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOworCSpsYXN0X2N1cnJfcGFn ZSA9IEludmFsaWRCbG9ja051bWJlcjsKKworCS8qCisJICogUmVzZXQgc28tPmN1cnJQb3Ms IGFuZCBpbml0aWFsaXplIG1vcmVMZWZ0L21vcmVSaWdodCBzdWNoIHRoYXQgdGhlIG5leHQK KwkgKiBjYWxsIHRvIF9idF9yZWFkbmV4dHBhZ2UgdHJlYXRzIHRoaXMgYmFja2VuZCBzaW1p bGFybHkgdG8gYSBzZXJpYWwKKwkgKiBiYWNrZW5kIHRoYXQgc3RlcHMgZnJvbSAqbGFzdF9j dXJyX3BhZ2UgdG8gKm5leHRfc2Nhbl9wYWdlICh1bmxlc3MgdGhpcworCSAqIGJhY2tlbmQn cyBzby0+Y3VyclBvcyBpcyBpbml0aWFsaXplZCBieSBfYnRfcmVhZGZpcnN0cGFnZSBiZWZv cmUgdGhlbikuCisJICovCisJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+Y3VyclBvcyk7CisJ cG9zLT5tb3JlTGVmdCA9IHBvcy0+bW9yZVJpZ2h0ID0gdHJ1ZTsKKworCWlmIChmaXJzdCkK Kwl7CisJCS8qCisJCSAqIEluaXRpYWxpemUgYXJyYXkgcmVsYXRlZCBzdGF0ZSB3aGVuIGNh bGxlZCBmcm9tIF9idF9maXJzdCwgYXNzdW1pbmcKKwkJICogdGhhdCB0aGlzIHdpbGwgYmUg dGhlIGZpcnN0IHByaW1pdGl2ZSBpbmRleCBzY2FuIGZvciB0aGUgc2NhbgorCQkgKi8KKwkJ c28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCQlzby0+c2NhbkJlaGluZCA9IGZhbHNlOwor CQlzby0+b3Bwb3NpdGVEaXJDaGVjayA9IGZhbHNlOworCX0KKwllbHNlCisJeworCQkvKgor CQkgKiBEb24ndCBhdHRlbXB0IHRvIHNlaXplIHRoZSBzY2FuIHdoZW4gaXQgcmVxdWlyZXMg YW5vdGhlciBwcmltaXRpdmUKKwkJICogaW5kZXggc2Nhbiwgc2luY2UgY2FsbGVyJ3MgYmFj a2VuZCBjYW5ub3Qgc3RhcnQgaXQgcmlnaHQgbm93CisJCSAqLworCQlpZiAoc28tPm5lZWRQ cmltU2NhbikKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlidHNjYW4gPSAoQlRQYXJhbGxl bFNjYW5EZXNjKSBPZmZzZXRUb1BvaW50ZXIocGFyYWxsZWxfc2NhbiwKKwkJCQkJCQkJCQkJ CSAgcGFyYWxsZWxfc2Nhbi0+cHNfb2Zmc2V0X2FtKTsKKworCXdoaWxlICgxKQorCXsKKwkJ TFdMb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX2xvY2ssIExXX0VYQ0xVU0lWRSk7CisKKwkJ aWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID09IEJUUEFSQUxMRUxfRE9ORSkKKwkJewor CQkJLyogV2UncmUgZG9uZSB3aXRoIHRoaXMgcGFyYWxsZWwgaW5kZXggc2NhbiAqLworCQkJ c3RhdHVzID0gZmFsc2U7CisJCX0KKwkJZWxzZSBpZiAoYnRzY2FuLT5idHBzX3BhZ2VTdGF0 dXMgPT0gQlRQQVJBTExFTF9JRExFICYmCisJCQkJIGJ0c2Nhbi0+YnRwc19uZXh0U2NhblBh Z2UgPT0gUF9OT05FKQorCQl7CisJCQkvKiBFbmQgdGhpcyBwYXJhbGxlbCBpbmRleCBzY2Fu ICovCisJCQlzdGF0dXMgPSBmYWxzZTsKKwkJCWVuZHNjYW4gPSB0cnVlOworCQl9CisJCWVs c2UgaWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID09IEJUUEFSQUxMRUxfTkVFRF9QUklN U0NBTikKKwkJeworCQkJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCisJCQlpZiAoZmly c3QpCisJCQl7CisJCQkJLyogQ2FuIHN0YXJ0IHNjaGVkdWxlZCBwcmltaXRpdmUgc2NhbiBy aWdodCBhd2F5LCBzbyBkbyBzbyAqLworCQkJCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzID0g QlRQQVJBTExFTF9BRFZBTkNJTkc7CisKKwkJCQkvKiBSZXN0b3JlIHNjYW4ncyBhcnJheSBr ZXlzIGZyb20gc2VyaWFsaXplZCB2YWx1ZXMgKi8KKwkJCQlfYnRfcGFyYWxsZWxfcmVzdG9y ZV9hcnJheXMocmVsLCBidHNjYW4sIHNvKTsKKwkJCQlleGl0X2xvb3AgPSB0cnVlOworCQkJ fQorCQkJZWxzZQorCQkJeworCQkJCS8qCisJCQkJICogRG9uJ3QgYXR0ZW1wdCB0byBzZWl6 ZSB0aGUgc2NhbiB3aGVuIGl0IHJlcXVpcmVzIGFub3RoZXIKKwkJCQkgKiBwcmltaXRpdmUg aW5kZXggc2Nhbiwgc2luY2UgY2FsbGVyJ3MgYmFja2VuZCBjYW5ub3Qgc3RhcnQKKwkJCQkg KiBpdCByaWdodCBub3cKKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBmYWxzZTsKKwkJCX0KKwor CQkJLyoKKwkJCSAqIEVpdGhlciB3YXksIHVwZGF0ZSBiYWNrZW5kIGxvY2FsIHN0YXRlIHRv IGluZGljYXRlIHRoYXQgYQorCQkJICogcGVuZGluZyBwcmltaXRpdmUgc2NhbiBpcyByZXF1 aXJlZAorCQkJICovCisJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKwkJCXNvLT5zY2Fu QmVoaW5kID0gZmFsc2U7CisJCQlzby0+b3Bwb3NpdGVEaXJDaGVjayA9IGZhbHNlOworCQl9 CisJCWVsc2UgaWYgKGJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVzICE9IEJUUEFSQUxMRUxfQURW QU5DSU5HKQorCQl7CisJCQkvKgorCQkJICogV2UgaGF2ZSBzdWNjZXNzZnVsbHkgc2VpemVk IGNvbnRyb2wgb2YgdGhlIHNjYW4gZm9yIHRoZSBwdXJwb3NlCisJCQkgKiBvZiBhZHZhbmNp bmcgaXQgdG8gYSBuZXcgcGFnZSEKKwkJCSAqLworCQkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0 dXMgPSBCVFBBUkFMTEVMX0FEVkFOQ0lORzsKKwkJCUFzc2VydChidHNjYW4tPmJ0cHNfbmV4 dFNjYW5QYWdlICE9IFBfTk9ORSk7CisJCQkqbmV4dF9zY2FuX3BhZ2UgPSBidHNjYW4tPmJ0 cHNfbmV4dFNjYW5QYWdlOworCQkJKmxhc3RfY3Vycl9wYWdlID0gYnRzY2FuLT5idHBzX2xh c3RDdXJyUGFnZTsKKwkJCWV4aXRfbG9vcCA9IHRydWU7CisJCX0KKwkJTFdMb2NrUmVsZWFz ZSgmYnRzY2FuLT5idHBzX2xvY2spOworCQlpZiAoZXhpdF9sb29wIHx8ICFzdGF0dXMpCisJ CQlicmVhazsKKwkJQ29uZGl0aW9uVmFyaWFibGVTbGVlcCgmYnRzY2FuLT5idHBzX2N2LCBX QUlUX0VWRU5UX0JUUkVFX1BBR0UpOworCX0KKwlDb25kaXRpb25WYXJpYWJsZUNhbmNlbFNs ZWVwKCk7CisKKwkvKiBXaGVuIHRoZSBzY2FuIGhhcyByZWFjaGVkIHRoZSByaWdodG1vc3Qg KG9yIGxlZnRtb3N0KSBwYWdlLCBlbmQgaXQgKi8KKwlpZiAoZW5kc2NhbikKKwkJX2J0X3Bh cmFsbGVsX2RvbmUoc2Nhbik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiAvKgogICogX2J0 X3BhcmFsbGVsX3JlbGVhc2UoKSAtLSBDb21wbGV0ZSB0aGUgcHJvY2VzcyBvZiBhZHZhbmNp bmcgdGhlIHNjYW4gdG8gYQogICoJCW5ldyBwYWdlLiAgV2Ugbm93IGhhdmUgdGhlIG5ldyB2 YWx1ZSBidHBzX25leHRTY2FuUGFnZTsgYW5vdGhlciBiYWNrZW5kCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRzZWFyY2guYwppbmRleCA3NzI2NGRkZWVjYi4uMTBiMjhhNzZjMGYg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKKysr IGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwpAQCAtMjQsOCArMjQs MjAgQEAKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9y ZWwuaCIKIAorLyoKKyAqIFhYWCBBIGxvdCBvZiB0aGUgbmV3IGZ1bmN0aW9ucyBhcmUgY29w aWVzIG9mIHRoZSBub24tYmF0Y2hpbmcgdmVyc2lvbiwgd2l0aAorICogY2hhbmdlcyB0byBt YWtlIGl0IHdvcmsgd2l0aCBiYXRjaGluZyAod2hpY2ggbWVhbnMgd2l0aCBwb3NpdGlvbiBw cm92aWRlZAorICogYnkgdGhlIGNhbGxlciwgbm90IGZyb20gdGhlIEJUU2Nhbk9wYXF1ZSku IFRoZSBkdXBsaWNhdGlvbiBpcyBub3QgZ3JlYXQsCisgKiBidXQgaXQncyBhIGJpdCB1bmNs ZWFyIHdoYXQgdG8gZG8gYWJvdXQgaXQuIE9uZSBvcHRpb24gd291bGQgYmUgdG8gcmVtb3Zl CisgKiB0aGUgYW1nZXR0dXBsZSgpIGludGVyZmFjZSBhbHRvZ2V0aGVyLCBvbmNlIHRoZSBi YXRjaGluZyBBUEkgd29ya3MsIGJ1dCB3ZQorICogbWF5IGFsc28gY2hvb3NlIHRvIGtlZXAg Ym90aCAoZS5nLiBmb3IgY2FzZXMgdGhhdCBkb24ndCBzdXBwb3J0IGJhdGNoaW5nLAorICog bGlrZSBzY2FucyBvZiBjYXRhbG9ncykuIEluIHRoYXQgY2FzZSB3ZSdkIG5lZWQgdG8gZG8g c29tZSByZWZhY3RvcmluZyB0bworICogc2hhcmUgYXMgbXVjaCBjb2RlIGFzIHBvc3NpYmxl LgorICovCiAKIHN0YXRpYyB2b2lkIF9idF9kcm9wX2xvY2tfYW5kX21heWJlX3BpbihJbmRl eFNjYW5EZXNjIHNjYW4sIEJUU2NhblBvcyBzcCk7CisKKy8qIHN0YXRpYyB2b2lkIF9idF9k cm9wX2xvY2tfYW5kX21heWJlX3Bpbl9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEJUQmF0 Y2hTY2FuUG9zIHNwKTsgKi8KIHN0YXRpYyBCdWZmZXIgX2J0X21vdmVyaWdodChSZWxhdGlv biByZWwsIFJlbGF0aW9uIGhlYXByZWwsIEJUU2Nhbkluc2VydCBrZXksCiAJCQkJCQkJQnVm ZmVyIGJ1ZiwgYm9vbCBmb3J1cGRhdGUsIEJUU3RhY2sgc3RhY2ssCiAJCQkJCQkJaW50IGFj Y2Vzcyk7CkBAIC0zNCwyNCArNDYsNDQgQEAgc3RhdGljIGludAlfYnRfYmluc3JjaF9wb3N0 aW5nKEJUU2Nhbkluc2VydCBrZXksIFBhZ2UgcGFnZSwKIAkJCQkJCQkJT2Zmc2V0TnVtYmVy IG9mZm51bSk7CiBzdGF0aWMgYm9vbCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuRGlyZWN0aW9uIGRpciwKIAkJCQkJCSBPZmZzZXROdW1iZXIgb2ZmbnVtLCBib29s IGZpcnN0cGFnZSk7CitzdGF0aWMgSW5kZXhTY2FuQmF0Y2ggX2J0X3JlYWRwYWdlX2JhdGNo KEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3MgcG9zLAorCQkJCQkJCQkJCSBT Y2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKKwkJCQkJCQkJCQkgYm9v bCBmaXJzdFBhZ2UpOwogc3RhdGljIHZvaWQgX2J0X3NhdmVpdGVtKEJUU2Nhbk9wYXF1ZSBz bywgaW50IGl0ZW1JbmRleCwKIAkJCQkJCSBPZmZzZXROdW1iZXIgb2ZmbnVtLCBJbmRleFR1 cGxlIGl0dXApOworc3RhdGljIHZvaWQgX2J0X3NhdmVpdGVtX2JhdGNoKEluZGV4U2NhbkJh dGNoIGJhdGNoLCBpbnQgaXRlbUluZGV4LAorCQkJCQkJCSAgIE9mZnNldE51bWJlciBvZmZu dW0sIEluZGV4VHVwbGUgaXR1cCk7CiBzdGF0aWMgaW50CV9idF9zZXR1cHBvc3RpbmdpdGVt cyhCVFNjYW5PcGFxdWUgc28sIGludCBpdGVtSW5kZXgsCiAJCQkJCQkJCSAgT2Zmc2V0TnVt YmVyIG9mZm51bSwgSXRlbVBvaW50ZXIgaGVhcFRpZCwKIAkJCQkJCQkJICBJbmRleFR1cGxl IGl0dXApOworc3RhdGljIGludAlfYnRfc2V0dXBwb3N0aW5naXRlbXNfYmF0Y2goSW5kZXhT Y2FuQmF0Y2ggYmF0Y2gsIGludCBpdGVtSW5kZXgsCisJCQkJCQkJCQkJT2Zmc2V0TnVtYmVy IG9mZm51bSwgSXRlbVBvaW50ZXIgaGVhcFRpZCwKKwkJCQkJCQkJCQlJbmRleFR1cGxlIGl0 dXApOwogc3RhdGljIGlubGluZSB2b2lkIF9idF9zYXZlcG9zdGluZ2l0ZW0oQlRTY2FuT3Bh cXVlIHNvLCBpbnQgaXRlbUluZGV4LAogCQkJCQkJCQkJICAgT2Zmc2V0TnVtYmVyIG9mZm51 bSwKIAkJCQkJCQkJCSAgIEl0ZW1Qb2ludGVyIGhlYXBUaWQsIGludCB0dXBsZU9mZnNldCk7 CitzdGF0aWMgaW5saW5lIHZvaWQgX2J0X3NhdmVwb3N0aW5naXRlbV9iYXRjaChJbmRleFNj YW5CYXRjaCBiYXRjaCwgaW50IGl0ZW1JbmRleCwKKwkJCQkJCQkJCQkJIE9mZnNldE51bWJl ciBvZmZudW0sCisJCQkJCQkJCQkJCSBJdGVtUG9pbnRlciBoZWFwVGlkLCBpbnQgdHVwbGVP ZmZzZXQpOwogc3RhdGljIGlubGluZSB2b2lkIF9idF9yZXR1cm5pdGVtKEluZGV4U2NhbkRl c2Mgc2NhbiwgQlRTY2FuT3BhcXVlIHNvKTsKIHN0YXRpYyBib29sIF9idF9zdGVwcGFnZShJ bmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK3N0YXRpYyBJbmRleFNj YW5CYXRjaCBfYnRfc3RlcHBhZ2VfYmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNo U2NhblBvcyBwb3MsCisJCQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gZGlyKTsKIHN0YXRpYyBi b29sIF9idF9yZWFkZmlyc3RwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgT2Zmc2V0TnVtYmVy IG9mZm51bSwKIAkJCQkJCQkgIFNjYW5EaXJlY3Rpb24gZGlyKTsKK3N0YXRpYyBJbmRleFNj YW5CYXRjaCBfYnRfcmVhZGZpcnN0cGFnZV9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEJU QmF0Y2hTY2FuUG9zIHBvcywKKwkJCQkJCQkJCQkJICBPZmZzZXROdW1iZXIgb2ZmbnVtLAor CQkJCQkJCQkJCQkgIFNjYW5EaXJlY3Rpb24gZGlyKTsKIHN0YXRpYyBib29sIF9idF9yZWFk bmV4dHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051bWJlciBibGtubywKIAkJCQkJ CQkgQmxvY2tOdW1iZXIgbGFzdGN1cnJibGtubywgU2NhbkRpcmVjdGlvbiBkaXIsCiAJCQkJ CQkJIGJvb2wgc2VpemVkKTsKK3N0YXRpYyBJbmRleFNjYW5CYXRjaCBfYnRfcmVhZG5leHRw YWdlX2JhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3MgcG9zLAorCQkJ CQkJCQkJCQkgQmxvY2tOdW1iZXIgYmxrbm8sIEJsb2NrTnVtYmVyIGxhc3RjdXJyYmxrbm8s CisJCQkJCQkJCQkJCSBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCBzZWl6ZWQpOwogc3RhdGlj IEJ1ZmZlciBfYnRfbG9ja19hbmRfdmFsaWRhdGVfbGVmdChSZWxhdGlvbiByZWwsIEJsb2Nr TnVtYmVyICpibGtubywKIAkJCQkJCQkJCQkgQmxvY2tOdW1iZXIgbGFzdGN1cnJibGtubyk7 CiBzdGF0aWMgYm9vbCBfYnRfZW5kcG9pbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGly ZWN0aW9uIGRpcik7CitzdGF0aWMgSW5kZXhTY2FuQmF0Y2ggX2J0X2VuZHBvaW50X2JhdGNo KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpOwogCiAKIC8qCkBAIC03 Nyw2ICsxMDksMjAgQEAgX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVfcGluKEluZGV4U2NhbkRl c2Mgc2NhbiwgQlRTY2FuUG9zIHNwKQogCX0KIH0KIAorLyogc3RhdGljIHZvaWQgKi8KKy8q IF9idF9kcm9wX2xvY2tfYW5kX21heWJlX3Bpbl9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4s IEJUQmF0Y2hTY2FuUG9zIHNwKSAqLworLyogeyAqLworLyogCV9idF91bmxvY2tidWYoc2Nh bi0+aW5kZXhSZWxhdGlvbiwgc3AtPmJ1Zik7ICovCisvKiAgKi8KKy8qIC8JaWYgKElzTVZD Q1NuYXBzaG90KHNjYW4tPnhzX3NuYXBzaG90KSAmJiAqLworLyogCQlSZWxhdGlvbk5lZWRz V0FMKHNjYW4tPmluZGV4UmVsYXRpb24pICYmICovCisvKiAJCSFzY2FuLT54c193YW50X2l0 dXApICovCisvKiAJeyAqLworLyogCQlSZWxlYXNlQnVmZmVyKHNwLT5idWYpOyAqLworLyog CQlzcC0+YnVmID0gSW52YWxpZEJ1ZmZlcjsgKi8KKy8qIAl9ICovCisvKiB9ICovCisKIC8q CiAgKglfYnRfc2VhcmNoKCkgLS0gU2VhcmNoIHRoZSB0cmVlIGZvciBhIHBhcnRpY3VsYXIg c2NhbmtleSwKICAqCQlvciBtb3JlIHByZWNpc2VseSBmb3IgdGhlIGZpcnN0IGxlYWYgcGFn ZSBpdCBjb3VsZCBiZSBvbi4KQEAgLTE1NzAsMTM2ICsxNjE2LDEzNDQgQEAgX2J0X25leHQo SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIH0KIAogLyoKLSAqCV9i dF9yZWFkcGFnZSgpIC0tIExvYWQgZGF0YSBmcm9tIGN1cnJlbnQgaW5kZXggcGFnZSBpbnRv IHNvLT5jdXJyUG9zCisgKglfYnRfZmlyc3RfYmF0Y2goKSAtLSBMb2FkIHRoZSBmaXJzdCBi YXRjaCBpbiBhIHNjYW4uCiAgKgotICogQ2FsbGVyIG11c3QgaGF2ZSBwaW5uZWQgYW5kIHJl YWQtbG9ja2VkIHNvLT5jdXJyUG9zLmJ1ZjsgdGhlIGJ1ZmZlcidzIHN0YXRlCi0gKiBpcyBu b3QgY2hhbmdlZCBoZXJlLiAgQWxzbywgY3VyclBvcy5tb3JlTGVmdCBhbmQgbW9yZVJpZ2h0 IG11c3QgYmUgdmFsaWQ7Ci0gKiB0aGV5IGFyZSB1cGRhdGVkIGFzIGFwcHJvcHJpYXRlLiAg QWxsIG90aGVyIGZpZWxkcyBvZiBzby0+Y3VyclBvcyBhcmUKLSAqIGluaXRpYWxpemVkIGZy b20gc2NyYXRjaCBoZXJlLgorICogQSBiYXRjaCB2YXJpYW50IG9mIF9idF9maXJzdCgpLiBN b3N0IG9mIHRoZSBjb21tZW50cyBmb3IgdGhhdCBmdW5jdGlvbgorICogYXBwbHkgaGVyZSB0 b28uCiAgKgotICogV2Ugc2NhbiB0aGUgY3VycmVudCBwYWdlIHN0YXJ0aW5nIGF0IG9mZm51 bSBhbmQgbW92aW5nIGluIHRoZSBpbmRpY2F0ZWQKLSAqIGRpcmVjdGlvbi4gIEFsbCBpdGVt cyBtYXRjaGluZyB0aGUgc2NhbiBrZXlzIGFyZSBsb2FkZWQgaW50byBjdXJyUG9zLml0ZW1z LgotICogbW9yZUxlZnQgb3IgbW9yZVJpZ2h0IChhcyBhcHByb3ByaWF0ZSkgaXMgY2xlYXJl ZCBpZiBfYnRfY2hlY2trZXlzIHJlcG9ydHMKLSAqIHRoYXQgdGhlcmUgY2FuIGJlIG5vIG1v cmUgbWF0Y2hpbmcgdHVwbGVzIGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uCi0gKiAo Y291bGQganVzdCBiZSBmb3IgdGhlIGN1cnJlbnQgcHJpbWl0aXZlIGluZGV4IHNjYW4gd2hl biBzY2FuIGhhcyBhcnJheXMpLgorICogWFhYIFRoaXMgb25seSBwb3B1bGF0ZXMgdGhlIGJh dGNoLCBpdCBkb2VzIG5vdCBzZXQgYW55IG90aGVyIGZpZWxkcyBsaWtlCisgKiBzY2FuLT54 c19oZWFwdGlkIG9yIHNjYW4tPnhzX2l0dXAuIFRoYXQgaGFwcGVucyBpbiBnZXRuZXh0X3Rp ZCgpIGNhbGxzLgogICoKLSAqIEluIHRoZSBjYXNlIG9mIGEgcGFyYWxsZWwgc2NhbiwgY2Fs bGVyIG11c3QgaGF2ZSBjYWxsZWQgX2J0X3BhcmFsbGVsX3NlaXplCi0gKiBwcmlvciB0byBj YWxsaW5nIHRoaXMgZnVuY3Rpb247IHRoaXMgZnVuY3Rpb24gd2lsbCBpbnZva2UKLSAqIF9i dF9wYXJhbGxlbF9yZWxlYXNlIGJlZm9yZSByZXR1cm5pbmcuCisgKiBYWFggSSdtIG5vdCBz dXJlIGl0IHdvcmtzIHRvIG1peCBiYXRjaGVkIGFuZCBub24tYmF0Y2hlcyBjYWxscywgZS5n LiBnZXQKKyAqIGEgVElEIGFuZCB0aGVuIGEgYmF0Y2ggb2YgVElEcy4gSXQgcHJvYmFibHkg c2hvdWxkIHdvcmsgYXMgbG9uZyBhcyB3ZQorICogdXBkYXRlIGl0ZW1JbmRleCBjb3JyZWN0 bHksIGJ1dCB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQga2lsbGVkIGl0ZW1zCisgKiAo cmlnaHQgbm93IHRoZSB0d28gcGxhY2VzIHVzZSBkaWZmZXJlbnQgd2F5cyB0byBjb21tdW5p Y2F0ZSB3aGljaCBpdGVtcworICogc2hvdWxkIGJlIGtpbGxlZCkuCiAgKgotICogUmV0dXJu cyB0cnVlIGlmIGFueSBtYXRjaGluZyBpdGVtcyBmb3VuZCBvbiB0aGUgcGFnZSwgZmFsc2Ug aWYgbm9uZS4KKyAqIFhYWCBXZSBwcm9iYWJseSBzaG91bGQgbm90IHJlbHkgb24gX2J0X2Zp cnN0L19idF9zdGVwcGFnZSwgYmVjYXVzZSB0aGF0CisgKiB2ZXJ5IG11Y2ggcmVsaWVzIG9u IGN1cnJQb3MsIGFuZCBpdCdzIGp1c3QgbGF6aW5lc3MgdG8gcmVseSBvbiB0aGF0LiBGb3IK KyAqIGJhdGNoaW5nIHdlIHByb2JhYmx5IG5lZWQgc29tZXRoaW5nIGVsc2UgYW55d2F5Lgog ICovCi1zdGF0aWMgYm9vbAotX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0sCi0JCQkgYm9vbCBmaXJzdHBh Z2UpCitJbmRleFNjYW5CYXRjaAorX2J0X2ZpcnN0X2JhdGNoKEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIpCiB7CiAJUmVsYXRpb24JcmVsID0gc2Nhbi0+aW5kZXhS ZWxhdGlvbjsKIAlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFx dWU7Ci0JUGFnZQkJcGFnZTsKLQlCVFBhZ2VPcGFxdWUgb3BhcXVlOwotCU9mZnNldE51bWJl ciBtaW5vZmY7Ci0JT2Zmc2V0TnVtYmVyIG1heG9mZjsKLQlCVFJlYWRQYWdlU3RhdGUgcHN0 YXRlOwotCWJvb2wJCWFycmF5S2V5czsKLQlpbnQJCQlpdGVtSW5kZXgsCi0JCQkJaW5kbmF0 dHM7CisJQlRTdGFjawkJc3RhY2s7CisJT2Zmc2V0TnVtYmVyIG9mZm51bTsKKwlCVFNjYW5J bnNlcnREYXRhIGluc2tleTsKKwlTY2FuS2V5CQlzdGFydEtleXNbSU5ERVhfTUFYX0tFWVNd OworCVNjYW5LZXlEYXRhIG5vdG51bGxrZXlzW0lOREVYX01BWF9LRVlTXTsKKwlpbnQJCQlr ZXlzeiA9IDA7CisJU3RyYXRlZ3lOdW1iZXIgc3RyYXRfdG90YWw7CisJQmxvY2tOdW1iZXIg Ymxrbm8gPSBJbnZhbGlkQmxvY2tOdW1iZXIsCisJCQkJbGFzdGN1cnJibGtubzsKKwlCVEJh dGNoU2NhblBvc0RhdGEgcG9zOwogCi0JLyogc2F2ZSB0aGUgcGFnZS9idWZmZXIgYmxvY2sg bnVtYmVyLCBhbG9uZyB3aXRoIGl0cyBzaWJsaW5nIGxpbmtzICovCi0JcGFnZSA9IEJ1ZmZl ckdldFBhZ2Uoc28tPmN1cnJQb3MuYnVmKTsKLQlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUo cGFnZSk7Ci0Jc28tPmN1cnJQb3MuY3VyclBhZ2UgPSBCdWZmZXJHZXRCbG9ja051bWJlcihz by0+Y3VyclBvcy5idWYpOwotCXNvLT5jdXJyUG9zLnByZXZQYWdlID0gb3BhcXVlLT5idHBv X3ByZXY7Ci0Jc28tPmN1cnJQb3MubmV4dFBhZ2UgPSBvcGFxdWUtPmJ0cG9fbmV4dDsKKwlC VEJhdGNoU2NhblBvc0ludmFsaWRhdGUocG9zKTsKIAotCUFzc2VydCghUF9JR05PUkUob3Bh cXVlKSk7Ci0JQXNzZXJ0KEJUU2NhblBvc0lzUGlubmVkKHNvLT5jdXJyUG9zKSk7Ci0JQXNz ZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwkvKiBiYXRjaGluZyBkb2VzIG5vdCB3b3JrIHdp dGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2VydCghQlRTY2FuUG9z SXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+ bWFya1BvcykpOwogCi0JaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4pCi0JewotCQkvKiBhbGxv dyBuZXh0L3ByZXYgcGFnZSB0byBiZSByZWFkIGJ5IG90aGVyIHdvcmtlciB3aXRob3V0IGRl bGF5ICovCi0JCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCi0JCQlfYnRfcGFy YWxsZWxfcmVsZWFzZShzY2FuLCBzby0+Y3VyclBvcy5uZXh0UGFnZSwKLQkJCQkJCQkJIHNv LT5jdXJyUG9zLmN1cnJQYWdlKTsKLQkJZWxzZQotCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uo c2Nhbiwgc28tPmN1cnJQb3MucHJldlBhZ2UsCi0JCQkJCQkJCSBzby0+Y3VyclBvcy5jdXJy UGFnZSk7Ci0JfQorCS8qIEZJWE1FIG1heWJlIGNoZWNrIHRoZXJlJ3Mgbm8gYWN0aXZlIGJh dGNoIHlldCAqLworCS8qIEFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykp OyAqLwogCi0JLyogaW5pdGlhbGl6ZSByZW1haW5pbmcgY3VyclBvcyBmaWVsZHMgcmVsYXRl ZCB0byBjdXJyZW50IHBhZ2UgKi8KLQlzby0+Y3VyclBvcy5sc24gPSBCdWZmZXJHZXRMU05B dG9taWMoc28tPmN1cnJQb3MuYnVmKTsKLQlzby0+Y3VyclBvcy5kaXIgPSBkaXI7Ci0Jc28t PmN1cnJQb3MubmV4dFR1cGxlT2Zmc2V0ID0gMDsKLQkvKiBlaXRoZXIgbW9yZUxlZnQgb3Ig bW9yZVJpZ2h0IHNob3VsZCBiZSBzZXQgbm93IChtYXkgYmUgdW5zZXQgbGF0ZXIpICovCi0J QXNzZXJ0KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSA/IHNvLT5jdXJyUG9zLm1vcmVS aWdodCA6Ci0JCSAgIHNvLT5jdXJyUG9zLm1vcmVMZWZ0KTsKKwkvKgorCSAqIEV4YW1pbmUg dGhlIHNjYW4ga2V5cyBhbmQgZWxpbWluYXRlIGFueSByZWR1bmRhbnQga2V5czsgYWxzbyBt YXJrIHRoZQorCSAqIGtleXMgdGhhdCBtdXN0IGJlIG1hdGNoZWQgdG8gY29udGludWUgdGhl IHNjYW4uCisJICovCisJX2J0X3ByZXByb2Nlc3Nfa2V5cyhzY2FuKTsKIAotCVByZWRpY2F0 ZUxvY2tQYWdlKHJlbCwgc28tPmN1cnJQb3MuY3VyclBhZ2UsIHNjYW4tPnhzX3NuYXBzaG90 KTsKKwkvKgorCSAqIFF1aXQgbm93IGlmIF9idF9wcmVwcm9jZXNzX2tleXMoKSBkaXNjb3Zl cmVkIHRoYXQgdGhlIHNjYW4ga2V5cyBjYW4KKwkgKiBuZXZlciBiZSBzYXRpc2ZpZWQgKGVn LCB4ID09IDEgQU5EIHggPiAyKS4KKwkgKi8KKwlpZiAoIXNvLT5xdWFsX29rKQorCXsKKwkJ QXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKwkJX2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7 CisJCXJldHVybiBmYWxzZTsKKwl9CiAKLQkvKiBpbml0aWFsaXplIGxvY2FsIHZhcmlhYmxl cyAqLwotCWluZG5hdHRzID0gSW5kZXhSZWxhdGlvbkdldE51bWJlck9mQXR0cmlidXRlcyhy ZWwpOwotCWFycmF5S2V5cyA9IHNvLT5udW1BcnJheUtleXMgIT0gMDsKLQltaW5vZmYgPSBQ X0ZJUlNUREFUQUtFWShvcGFxdWUpOwotCW1heG9mZiA9IFBhZ2VHZXRNYXhPZmZzZXROdW1i ZXIocGFnZSk7CisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgcGFyYWxsZWwgc2Nhbiwgd2UgbXVz dCBzZWl6ZSB0aGUgc2Nhbi4gIF9idF9yZWFkZmlyc3RwYWdlCisJICogd2lsbCBsaWtlbHkg cmVsZWFzZSB0aGUgcGFyYWxsZWwgc2NhbiBsYXRlciBvbi4KKwkgKi8KKwlpZiAoc2Nhbi0+ cGFyYWxsZWxfc2NhbiAhPSBOVUxMICYmCisJCSFfYnRfcGFyYWxsZWxfc2VpemVfYmF0Y2go c2NhbiwgJnBvcywgJmJsa25vLCAmbGFzdGN1cnJibGtubywgdHJ1ZSkpCisJCXJldHVybiBm YWxzZTsKIAotCS8qIGluaXRpYWxpemUgcGFnZS1sZXZlbCBzdGF0ZSB0aGF0IHdlJ2xsIHBh c3MgdG8gX2J0X2NoZWNra2V5cyAqLwotCXBzdGF0ZS5taW5vZmYgPSBtaW5vZmY7Ci0JcHN0 YXRlLm1heG9mZiA9IG1heG9mZjsKLQlwc3RhdGUuZmluYWx0dXAgPSBOVUxMOwotCXBzdGF0 ZS5wYWdlID0gcGFnZTsKLQlwc3RhdGUuZmlyc3RwYWdlID0gZmlyc3RwYWdlOwotCXBzdGF0 ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7Ci0JcHN0YXRlLnN0YXJ0aWtleSA9IDA7Ci0J cHN0YXRlLm9mZm51bSA9IEludmFsaWRPZmZzZXROdW1iZXI7Ci0JcHN0YXRlLnNraXAgPSBJ bnZhbGlkT2Zmc2V0TnVtYmVyOwotCXBzdGF0ZS5jb250aW51ZXNjYW4gPSB0cnVlOyAvKiBk ZWZhdWx0IGFzc3VtcHRpb24gKi8KLQlwc3RhdGUucmVjaGVja3MgPSAwOwotCXBzdGF0ZS50 YXJnZXRkaXN0YW5jZSA9IDA7Ci0JcHN0YXRlLm5za2lwYWR2YW5jZXMgPSAwOworCS8qCisJ ICogSW5pdGlhbGl6ZSB0aGUgc2NhbidzIGFycmF5cyAoaWYgYW55KSBmb3IgdGhlIGN1cnJl bnQgc2NhbiBkaXJlY3Rpb24KKwkgKiAoZXhjZXB0IHdoZW4gdGhleSB3ZXJlIGFscmVhZHkg c2V0IHRvIGxhdGVyIHZhbHVlcyBhcyBwYXJ0IG9mCisJICogc2NoZWR1bGluZyB0aGUgcHJp bWl0aXZlIGluZGV4IHNjYW4gdGhhdCBpcyBub3cgdW5kZXJ3YXkpCisJICovCisJaWYgKHNv LT5udW1BcnJheUtleXMgJiYgIXNvLT5uZWVkUHJpbVNjYW4pCisJCV9idF9zdGFydF9hcnJh eV9rZXlzKHNjYW4sIGRpcik7CiAKLQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIp KQorCWlmIChibGtubyAhPSBJbnZhbGlkQmxvY2tOdW1iZXIpCiAJewotCQkvKiBTS19TRUFS Q0hBUlJBWSBmb3J3YXJkIHNjYW5zIG11c3QgcHJvdmlkZSBoaWdoIGtleSB1cCBmcm9udCAq LwotCQlpZiAoYXJyYXlLZXlzKQotCQl7Ci0JCQlpZiAoIVBfUklHSFRNT1NUKG9wYXF1ZSkp Ci0JCQl7Ci0JCQkJSXRlbUlkCQlpaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkp OworCQkvKgorCQkgKiBXZSBhbnRpY2lwYXRlZCBjYWxsaW5nIF9idF9zZWFyY2gsIGJ1dCBh bm90aGVyIHdvcmtlciBiZXQgdXMgdG8gaXQuCisJCSAqIF9idF9yZWFkbmV4dHBhZ2UgcmVs ZWFzZXMgdGhlIHNjYW4gZm9yIHVzIChub3QgX2J0X3JlYWRmaXJzdHBhZ2UpLgorCQkgKi8K KwkJQXNzZXJ0KHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCk7CisJCUFzc2VydCghc28t Pm5lZWRQcmltU2Nhbik7CisJCUFzc2VydChibGtubyAhPSBQX05PTkUpOwogCi0JCQkJcHN0 YXRlLmZpbmFsdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7CisJ CXJldHVybiBfYnRfcmVhZG5leHRwYWdlX2JhdGNoKHNjYW4sICZwb3MsIGJsa25vLCBsYXN0 Y3VycmJsa25vLCBkaXIsIHRydWUpOworCX0KIAotCQkJCWlmIChzby0+c2NhbkJlaGluZCAm JgotCQkJCQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRpciwgcHN0YXRlLmZp bmFsdHVwKSkKLQkJCQl7Ci0JCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGlu ZGV4IHNjYW4gYWZ0ZXIgYWxsICovCi0JCQkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZh bHNlOwotCQkJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKLQkJCQkJaWYgKHNjYW4tPnBh cmFsbGVsX3NjYW4pCi0JCQkJCQlfYnRfcGFyYWxsZWxfcHJpbXNjYW5fc2NoZWR1bGUoc2Nh biwKLQkJCQkJCQkJCQkJCQkgICBzby0+Y3VyclBvcy5jdXJyUGFnZSk7Ci0JCQkJCXJldHVy biBmYWxzZTsKLQkJCQl9Ci0JCQl9CisJLyoKKwkgKiBDb3VudCBhbiBpbmRleHNjYW4gZm9y IHN0YXRzLCBub3cgdGhhdCB3ZSBrbm93IHRoYXQgd2UnbGwgY2FsbAorCSAqIF9idF9zZWFy Y2gvX2J0X2VuZHBvaW50IGJlbG93CisJICovCisJcGdzdGF0X2NvdW50X2luZGV4X3NjYW4o cmVsKTsKKwlpZiAoc2Nhbi0+aW5zdHJ1bWVudCkKKwkJc2Nhbi0+aW5zdHJ1bWVudC0+bnNl YXJjaGVzKys7CiAKLQkJCXNvLT5zY2FuQmVoaW5kID0gc28tPm9wcG9zaXRlRGlyQ2hlY2sg PSBmYWxzZTsJLyogcmVzZXQgKi8KLQkJfQorCS8qLS0tLS0tLS0tLQorCSAqIEV4YW1pbmUg dGhlIHNjYW4ga2V5cyB0byBkaXNjb3ZlciB3aGVyZSB3ZSBuZWVkIHRvIHN0YXJ0IHRoZSBz Y2FuLgorCSAqCisJICogV2Ugd2FudCB0byBpZGVudGlmeSB0aGUga2V5cyB0aGF0IGNhbiBi ZSB1c2VkIGFzIHN0YXJ0aW5nIGJvdW5kYXJpZXM7CisJICogdGhlc2UgYXJlID0sID4sIG9y ID49IGtleXMgZm9yIGEgZm9yd2FyZCBzY2FuIG9yID0sIDwsIDw9IGtleXMgZm9yCisJICog YSBiYWNrd2FyZHMgc2Nhbi4gIFdlIGNhbiB1c2Uga2V5cyBmb3IgbXVsdGlwbGUgYXR0cmli dXRlcyBzbyBsb25nIGFzCisJICogdGhlIHByaW9yIGF0dHJpYnV0ZXMgaGFkIG9ubHkgPSwg Pj0gKHJlc3AuID0sIDw9KSBrZXlzLiAgT25jZSB3ZSBhY2NlcHQKKwkgKiBhID4gb3IgPCBi b3VuZGFyeSBvciBmaW5kIGFuIGF0dHJpYnV0ZSB3aXRoIG5vIGJvdW5kYXJ5ICh3aGljaCBj YW4gYmUKKwkgKiB0aG91Z2h0IG9mIGFzIHRoZSBzYW1lIGFzICI+IC1pbmZpbml0eSIpLCB3 ZSBjYW4ndCB1c2Uga2V5cyBmb3IgYW55CisJICogYXR0cmlidXRlcyB0byBpdHMgcmlnaHQs IGJlY2F1c2UgaXQgd291bGQgYnJlYWsgb3VyIHNpbXBsaXN0aWMgbm90aW9uCisJICogb2Yg d2hhdCBpbml0aWFsIHBvc2l0aW9uaW5nIHN0cmF0ZWd5IHRvIHVzZS4KKwkgKgorCSAqIFdo ZW4gdGhlIHNjYW4ga2V5cyBpbmNsdWRlIGNyb3NzLXR5cGUgb3BlcmF0b3JzLCBfYnRfcHJl cHJvY2Vzc19rZXlzCisJICogbWF5IG5vdCBiZSBhYmxlIHRvIGVsaW1pbmF0ZSByZWR1bmRh bnQga2V5czsgaW4gc3VjaCBjYXNlcyB3ZSB3aWxsCisJICogYXJiaXRyYXJpbHkgcGljayBh IHVzYWJsZSBvbmUgZm9yIGVhY2ggYXR0cmlidXRlLiAgVGhpcyBpcyBjb3JyZWN0CisJICog YnV0IHBvc3NpYmx5IG5vdCBvcHRpbWFsIGJlaGF2aW9yLiAgKEZvciBleGFtcGxlLCB3aXRo IGtleXMgbGlrZQorCSAqICJ4ID49IDQgQU5EIHggPj0gNSIgd2Ugd291bGQgZWxlY3QgdG8g c2NhbiBzdGFydGluZyBhdCB4PTQgd2hlbgorCSAqIHg9NSB3b3VsZCBiZSBtb3JlIGVmZmlj aWVudC4pICBTaW5jZSB0aGUgc2l0dWF0aW9uIG9ubHkgYXJpc2VzIGdpdmVuCisJICogYSBw b29ybHktd29yZGVkIHF1ZXJ5IHBsdXMgYW4gaW5jb21wbGV0ZSBvcGZhbWlseSwgbGl2ZSB3 aXRoIGl0LgorCSAqCisJICogV2hlbiBib3RoIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IGtl eXMgYXBwZWFyIGZvciBhIHNpbmdsZSBhdHRyaWJ1dGUKKwkgKiAoYWdhaW4sIG9ubHkgcG9z c2libGUgd2hlbiBjcm9zcy10eXBlIG9wZXJhdG9ycyBhcHBlYXIpLCB3ZSAqbXVzdCoKKwkg KiBzZWxlY3Qgb25lIG9mIHRoZSBlcXVhbGl0eSBrZXlzIGZvciB0aGUgc3RhcnRpbmcgcG9p bnQsIGJlY2F1c2UKKwkgKiBfYnRfY2hlY2trZXlzKCkgd2lsbCBzdG9wIHRoZSBzY2FuIGFz IHNvb24gYXMgYW4gZXF1YWxpdHkgcXVhbCBmYWlscy4KKwkgKiBGb3IgZXhhbXBsZSwgaWYg d2UgaGF2ZSBrZXlzIGxpa2UgInggPj0gNCBBTkQgeCA9IDEwIiBhbmQgd2UgZWxlY3QgdG8K KwkgKiBzdGFydCBhdCB4PTQsIHdlIHdpbGwgZmFpbCBhbmQgc3RvcCBiZWZvcmUgcmVhY2hp bmcgeD0xMC4gIElmIG11bHRpcGxlCisJICogZXF1YWxpdHkgcXVhbHMgc3Vydml2ZSBwcmVw cm9jZXNzaW5nLCBob3dldmVyLCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaAorCSAqIG9uZSB3 ZSB1c2UgLS0tIGJ5IGRlZmluaXRpb24sIHRoZXkgYXJlIGVpdGhlciByZWR1bmRhbnQgb3IK KwkgKiBjb250cmFkaWN0b3J5LgorCSAqCisJICogSW4gcHJhY3RpY2Ugd2UgcmFyZWx5IHNl ZSBhbnkgImF0dHJpYnV0ZSBib3VuZGFyeSBrZXkgZ2FwcyIgaGVyZS4KKwkgKiBQcmVwcm9j ZXNzaW5nIGNhbiB1c3VhbGx5IGJhY2tmaWxsIHNraXAgYXJyYXkga2V5cyBmb3IgYW55IGF0 dHJpYnV0ZXMKKwkgKiB0aGF0IHdlcmUgb21pdHRlZCBmcm9tIHRoZSBvcmlnaW5hbCBzY2Fu LT5rZXlEYXRhW10gaW5wdXQga2V5cy4gIEFsbAorCSAqIGFycmF5IGtleXMgYXJlIGFsd2F5 cyBjb25zaWRlcmVkID0ga2V5cywgYnV0IHdlJ2xsIHNvbWV0aW1lcyBuZWVkIHRvCisJICog dHJlYXQgdGhlIGN1cnJlbnQga2V5IHZhbHVlIGFzIGlmIHdlIHdlcmUgdXNpbmcgYW4gaW5l cXVhbGl0eSBzdHJhdGVneS4KKwkgKiBUaGlzIGhhcHBlbnMgd2l0aCByYW5nZSBza2lwIGFy cmF5cywgd2hpY2ggc3RvcmUgaW5lcXVhbGl0eSBrZXlzIGluIHRoZQorCSAqIGFycmF5J3Mg bG93X2NvbXBhcmUvaGlnaF9jb21wYXJlIGZpZWxkcyAodXNlZCB0byBmaW5kIHRoZSBmaXJz dC9sYXN0CisJICogc2V0IG9mIG1hdGNoZXMsIHdoZW4gPSBrZXkgd2lsbCBsYWNrIGEgdXNh YmxlIHNrX2FyZ3VtZW50IHZhbHVlKS4KKwkgKiBUaGVzZSBhcmUgYWx3YXlzIHByZWZlcnJl ZCBvdmVyIGFueSByZWR1bmRhbnQgInN0YW5kYXJkIiBpbmVxdWFsaXR5CisJICoga2V5cyBv biB0aGUgc2FtZSBjb2x1bW4gKHBlciB0aGUgdXN1YWwgcnVsZSBhYm91dCBwcmVmZXJyaW5n ID0ga2V5cykuCisJICogTm90ZSBhbHNvIHRoYXQgYW55IGNvbHVtbiB3aXRoIGFuID0gc2tp cCBhcnJheSBrZXkgY2FuIG5ldmVyIGhhdmUgYW4KKwkgKiBhZGRpdGlvbmFsLCBjb250cmFk aWN0b3J5ID0ga2V5LgorCSAqCisJICogQWxsIGtleXMgKHdpdGggdGhlIGV4Y2VwdGlvbiBv ZiBTS19TRUFSQ0hOVUxMIGtleXMgYW5kIFNLX0JUX1NLSVAKKwkgKiBhcnJheSBrZXlzIHdo b3NlIGFycmF5IGlzICJudWxsX2VsZW09dHJ1ZSIpIGltcGx5IGEgTk9UIE5VTEwgcXVhbGlm aWVyLgorCSAqIElmIHRoZSBpbmRleCBzdG9yZXMgbnVsbHMgYXQgdGhlIGVuZCBvZiB0aGUg aW5kZXggd2UnbGwgYmUgc3RhcnRpbmcKKwkgKiBmcm9tLCBhbmQgd2UgaGF2ZSBubyBib3Vu ZGFyeSBrZXkgZm9yIHRoZSBjb2x1bW4gKHdoaWNoIG1lYW5zIHRoZSBrZXkKKwkgKiB3ZSBk ZWR1Y2VkIE5PVCBOVUxMIGZyb20gaXMgYW4gaW5lcXVhbGl0eSBrZXkgdGhhdCBjb25zdHJh aW5zIHRoZSBvdGhlcgorCSAqIGVuZCBvZiB0aGUgaW5kZXgpLCB0aGVuIHdlIGNvbnMgdXAg YW4gZXhwbGljaXQgU0tfU0VBUkNITk9UTlVMTCBrZXkgdG8KKwkgKiB1c2UgYXMgYSBib3Vu ZGFyeSBrZXkuICBJZiB3ZSBkaWRuJ3QgZG8gdGhpcywgd2UgbWlnaHQgZmluZCBvdXJzZWx2 ZXMKKwkgKiB0cmF2ZXJzaW5nIGEgbG90IG9mIG51bGwgZW50cmllcyBhdCB0aGUgc3RhcnQg b2YgdGhlIHNjYW4uCisJICoKKwkgKiBJbiB0aGlzIGxvb3AsIHJvdy1jb21wYXJpc29uIGtl eXMgYXJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMga2V5cyBvbiB0aGVpcgorCSAqIGZpcnN0IChs ZWZ0bW9zdCkgY29sdW1ucy4gIFdlJ2xsIGFkZCBvbiBsb3dlci1vcmRlciBjb2x1bW5zIG9m IHRoZSByb3cKKwkgKiBjb21wYXJpc29uIGJlbG93LCBpZiBwb3NzaWJsZS4KKwkgKgorCSAq IFRoZSBzZWxlY3RlZCBzY2FuIGtleXMgKGF0IG1vc3Qgb25lIHBlciBpbmRleCBjb2x1bW4p IGFyZSByZW1lbWJlcmVkIGJ5CisJICogc3RvcmluZyB0aGVpciBhZGRyZXNzZXMgaW50byB0 aGUgbG9jYWwgc3RhcnRLZXlzW10gYXJyYXkuCisJICoKKwkgKiBfYnRfY2hlY2trZXlzL19i dF9hZHZhbmNlX2FycmF5X2tleXMgZGVjaWRlIHdoZXRoZXIgYW5kIHdoZW4gdG8gc3RhcnQK KwkgKiB0aGUgbmV4dCBwcmltaXRpdmUgaW5kZXggc2NhbiAoZm9yIHNjYW5zIHdpdGggYXJy YXkga2V5cykgYmFzZWQgaW4gcGFydAorCSAqIG9uIGFuIHVuZGVyc3RhbmRpbmcgb2YgaG93 IGl0J2xsIGVuYWJsZSB1cyB0byByZXBvc2l0aW9uIHRoZSBzY2FuLgorCSAqIFRoZXkncmUg ZGlyZWN0bHkgYXdhcmUgb2YgaG93IHdlJ2xsIHNvbWV0aW1lcyBjb25zIHVwIGFuIGV4cGxp Y2l0CisJICogU0tfU0VBUkNITk9UTlVMTCBrZXkuICBUaGV5J2xsIGV2ZW4gZW5kIHByaW1p dGl2ZSBzY2FucyBieSBhcHBseWluZyBhCisJICogc3ltbWV0cmljICJkZWR1Y2UgTk9UIE5V TEwiIHJ1bGUgb2YgdGhlaXIgb3duLiAgVGhpcyBhbGxvd3MgdG9wLWxldmVsCisJICogc2Nh bnMgdG8gc2tpcCBsYXJnZSBncm91cHMgb2YgTlVMTHMgdGhyb3VnaCByZXBlYXRlZCBkZWR1 Y3Rpb25zIGFib3V0CisJICoga2V5IHN0cmljdG5lc3MgKGZvciBhIHJlcXVpcmVkIGluZXF1 YWxpdHkga2V5KSBhbmQgd2hldGhlciBOVUxMcyBpbiB0aGUKKwkgKiBrZXkncyBpbmRleCBj b2x1bW4gYXJlIHN0b3JlZCBsYXN0IG9yIGZpcnN0IChyZWxhdGl2ZSB0byBub24tTlVMTHMp LgorCSAqIElmIHlvdSB1cGRhdGUgYW55dGhpbmcgaGVyZSwgX2J0X2NoZWNra2V5cy9fYnRf YWR2YW5jZV9hcnJheV9rZXlzIG1pZ2h0CisJICogbmVlZCB0byBiZSBrZXB0IGluIHN5bmMu CisJICotLS0tLS0tLS0tCisJICovCisJc3RyYXRfdG90YWwgPSBCVEVxdWFsU3RyYXRlZ3lO dW1iZXI7CisJaWYgKHNvLT5udW1iZXJPZktleXMgPiAwKQorCXsKKwkJQXR0ck51bWJlcglj dXJhdHRyOworCQlTY2FuS2V5CQljaG9zZW47CisJCVNjYW5LZXkJCWltcGxpZXNOTjsKKwkJ U2NhbktleQkJY3VyOwogCiAJCS8qCi0JCSAqIENvbnNpZGVyIHBzdGF0ZS5zdGFydGlrZXkg b3B0aW1pemF0aW9uIG9uY2UgdGhlIG9uZ29pbmcgcHJpbWl0aXZlCi0JCSAqIGluZGV4IHNj YW4gaGFzIGFscmVhZHkgcmVhZCBhdCBsZWFzdCBvbmUgcGFnZQorCQkgKiBjaG9zZW4gaXMg dGhlIHNvLWZhci1jaG9zZW4ga2V5IGZvciB0aGUgY3VycmVudCBhdHRyaWJ1dGUsIGlmIGFu eS4KKwkJICogV2UgZG9uJ3QgY2FzdCB0aGUgZGVjaXNpb24gaW4gc3RvbmUgdW50aWwgd2Ug cmVhY2gga2V5cyBmb3IgdGhlCisJCSAqIG5leHQgYXR0cmlidXRlLgogCQkgKi8KLQkJaWYg KCFwc3RhdGUuZmlyc3RwYWdlICYmIG1pbm9mZiA8IG1heG9mZikKLQkJCV9idF9zZXRfc3Rh cnRpa2V5KHNjYW4sICZwc3RhdGUpOwotCi0JCS8qIGxvYWQgaXRlbXNbXSBpbiBhc2NlbmRp bmcgb3JkZXIgKi8KLQkJaXRlbUluZGV4ID0gMDsKLQotCQlvZmZudW0gPSBNYXgob2ZmbnVt LCBtaW5vZmYpOworCQljdXIgPSBzby0+a2V5RGF0YTsKKwkJY3VyYXR0ciA9IDE7CisJCWNo b3NlbiA9IE5VTEw7CisJCS8qIEFsc28gcmVtZW1iZXIgYW55IHNjYW5rZXkgdGhhdCBpbXBs aWVzIGEgTk9UIE5VTEwgY29uc3RyYWludCAqLworCQlpbXBsaWVzTk4gPSBOVUxMOwogCi0J CXdoaWxlIChvZmZudW0gPD0gbWF4b2ZmKQorCQkvKgorCQkgKiBMb29wIGl0ZXJhdGVzIGZy b20gMCB0byBudW1iZXJPZktleXMgaW5jbHVzaXZlOyB3ZSB1c2UgdGhlIGxhc3QKKwkJICog cGFzcyB0byBoYW5kbGUgYWZ0ZXItbGFzdC1rZXkgcHJvY2Vzc2luZy4gIEFjdHVhbCBleGl0 IGZyb20gdGhlCisJCSAqIGxvb3AgaXMgYXQgb25lIG9mIHRoZSAiYnJlYWsiIHN0YXRlbWVu dHMgYmVsb3cuCisJCSAqLworCQlmb3IgKGludCBpID0gMDs7IGN1cisrLCBpKyspCiAJCXsK LQkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBvZmZudW0pOwotCQkJSW5k ZXhUdXBsZQlpdHVwOworCQkJaWYgKGkgPj0gc28tPm51bWJlck9mS2V5cyB8fCBjdXItPnNr X2F0dG5vICE9IGN1cmF0dHIpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBEb25lIGxvb2tpbmcg YXQga2V5cyBmb3IgY3VyYXR0ci4KKwkJCQkgKgorCQkJCSAqIElmIHRoaXMgaXMgYSBzY2Fu IGtleSBmb3IgYSBza2lwIGFycmF5IHdob3NlIGN1cnJlbnQKKwkJCQkgKiBlbGVtZW50IGlz IE1JTlZBTCwgY2hvb3NlIGxvd19jb21wYXJlICh3aGVuIHNjYW5uaW5nCisJCQkJICogYmFj a3dhcmRzIGl0J2xsIGJlIE1BWFZBTCwgYW5kIHdlJ2xsIGNob29zZSBoaWdoX2NvbXBhcmUp LgorCQkJCSAqCisJCQkJICogTm90ZTogaWYgdGhlIGFycmF5J3MgbG93X2NvbXBhcmUga2V5 IG1ha2VzICdjaG9zZW4nIE5VTEwsCisJCQkJICogdGhlbiB3ZSBiZWhhdmUgYXMgaWYgdGhl IGFycmF5J3MgZmlyc3QgZWxlbWVudCBpcyAtaW5mLAorCQkJCSAqIGV4Y2VwdCB3aGVuICFh cnJheS0+bnVsbF9lbGVtIGltcGxpZXMgYSB1c2FibGUgTk9UIE5VTEwKKwkJCQkgKiBjb25z dHJhaW50LgorCQkJCSAqLworCQkJCWlmIChjaG9zZW4gIT0gTlVMTCAmJgorCQkJCQkoY2hv c2VuLT5za19mbGFncyAmIChTS19CVF9NSU5WQUwgfCBTS19CVF9NQVhWQUwpKSkKKwkJCQl7 CisJCQkJCWludAkJCWlrZXkgPSBjaG9zZW4gLSBzby0+a2V5RGF0YTsKKwkJCQkJU2Nhbktl eQkJc2tpcGVxdWFsaXR5a2V5ID0gY2hvc2VuOworCQkJCQlCVEFycmF5S2V5SW5mbyAqYXJy YXkgPSBOVUxMOworCisJCQkJCWZvciAoaW50IGFycmlkeCA9IDA7IGFycmlkeCA8IHNvLT5u dW1BcnJheUtleXM7IGFycmlkeCsrKQorCQkJCQl7CisJCQkJCQlhcnJheSA9ICZzby0+YXJy YXlLZXlzW2FycmlkeF07CisJCQkJCQlpZiAoYXJyYXktPnNjYW5fa2V5ID09IGlrZXkpCisJ CQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2Fy ZChkaXIpKQorCQkJCQl7CisJCQkJCQlBc3NlcnQoIShza2lwZXF1YWxpdHlrZXktPnNrX2Zs YWdzICYgU0tfQlRfTUFYVkFMKSk7CisJCQkJCQljaG9zZW4gPSBhcnJheS0+bG93X2NvbXBh cmU7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQlBc3NlcnQoIShza2lwZXF1 YWxpdHlrZXktPnNrX2ZsYWdzICYgU0tfQlRfTUlOVkFMKSk7CisJCQkJCQljaG9zZW4gPSBh cnJheS0+aGlnaF9jb21wYXJlOworCQkJCQl9CisKKwkJCQkJQXNzZXJ0KGNob3NlbiA9PSBO VUxMIHx8CisJCQkJCQkgICBjaG9zZW4tPnNrX2F0dG5vID09IHNraXBlcXVhbGl0eWtleS0+ c2tfYXR0bm8pOworCisJCQkJCWlmICghYXJyYXktPm51bGxfZWxlbSkKKwkJCQkJCWltcGxp ZXNOTiA9IHNraXBlcXVhbGl0eWtleTsKKwkJCQkJZWxzZQorCQkJCQkJQXNzZXJ0KGNob3Nl biA9PSBOVUxMICYmIGltcGxpZXNOTiA9PSBOVUxMKTsKKwkJCQl9CisKKwkJCQkvKgorCQkJ CSAqIElmIHdlIGRpZG4ndCBmaW5kIGEgdXNhYmxlIGJvdW5kYXJ5IGtleSwgc2VlIGlmIHdl IGNhbgorCQkJCSAqIGRlZHVjZSBhIE5PVCBOVUxMIGtleQorCQkJCSAqLworCQkJCWlmIChj aG9zZW4gPT0gTlVMTCAmJiBpbXBsaWVzTk4gIT0gTlVMTCAmJgorCQkJCQkoKGltcGxpZXNO Ti0+c2tfZmxhZ3MgJiBTS19CVF9OVUxMU19GSVJTVCkgPworCQkJCQkgU2NhbkRpcmVjdGlv bklzRm9yd2FyZChkaXIpIDoKKwkJCQkJIFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikp KQorCQkJCXsKKwkJCQkJLyogWWVzLCBzbyBidWlsZCB0aGUga2V5IGluIG5vdG51bGxrZXlz W2tleXN6XSAqLworCQkJCQljaG9zZW4gPSAmbm90bnVsbGtleXNba2V5c3pdOworCQkJCQlT Y2FuS2V5RW50cnlJbml0aWFsaXplKGNob3NlbiwKKwkJCQkJCQkJCQkgICAoU0tfU0VBUkNI Tk9UTlVMTCB8IFNLX0lTTlVMTCB8CisJCQkJCQkJCQkJCShpbXBsaWVzTk4tPnNrX2ZsYWdz ICYKKwkJCQkJCQkJCQkJIChTS19CVF9ERVNDIHwgU0tfQlRfTlVMTFNfRklSU1QpKSksCisJ CQkJCQkJCQkJICAgY3VyYXR0ciwKKwkJCQkJCQkJCQkgICAoKGltcGxpZXNOTi0+c2tfZmxh Z3MgJiBTS19CVF9OVUxMU19GSVJTVCkgPworCQkJCQkJCQkJCQlCVEdyZWF0ZXJTdHJhdGVn eU51bWJlciA6CisJCQkJCQkJCQkJCUJUTGVzc1N0cmF0ZWd5TnVtYmVyKSwKKwkJCQkJCQkJ CQkgICBJbnZhbGlkT2lkLAorCQkJCQkJCQkJCSAgIEludmFsaWRPaWQsCisJCQkJCQkJCQkJ ICAgSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkgICAoRGF0dW0pIDApOworCQkJCX0KKworCQkJ CS8qCisJCQkJICogSWYgd2Ugc3RpbGwgZGlkbid0IGZpbmQgYSB1c2FibGUgYm91bmRhcnkg a2V5LCBxdWl0OyBlbHNlCisJCQkJICogc2F2ZSB0aGUgYm91bmRhcnkga2V5IHBvaW50ZXIg aW4gc3RhcnRLZXlzLgorCQkJCSAqLworCQkJCWlmIChjaG9zZW4gPT0gTlVMTCkKKwkJCQkJ YnJlYWs7CisJCQkJc3RhcnRLZXlzW2tleXN6KytdID0gY2hvc2VuOworCisJCQkJLyoKKwkJ CQkgKiBXZSBjYW4gb25seSBjb25zaWRlciBhZGRpbmcgbW9yZSBib3VuZGFyeSBrZXlzIHdo ZW4gdGhlIG9uZQorCQkJCSAqIHRoYXQgd2UganVzdCBjaG9zZSB0byBhZGQgdXNlcyBlaXRo ZXIgdGhlID0gb3IgPj0gc3RyYXRlZ3kKKwkJCQkgKiAoZHVyaW5nIGJhY2t3YXJkcyBzY2Fu cyB3ZSBjYW4gb25seSBkbyBzbyB3aGVuIHRoZSBrZXkgdGhhdAorCQkJCSAqIHdlIGp1c3Qg YWRkZWQgdG8gc3RhcnRLZXlzW10gdXNlcyB0aGUgPSBvciA8PSBzdHJhdGVneSkKKwkJCQkg Ki8KKwkJCQlzdHJhdF90b3RhbCA9IGNob3Nlbi0+c2tfc3RyYXRlZ3k7CisJCQkJaWYgKHN0 cmF0X3RvdGFsID09IEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyIHx8CisJCQkJCXN0cmF0X3Rv dGFsID09IEJUTGVzc1N0cmF0ZWd5TnVtYmVyKQorCQkJCQlicmVhazsKKworCQkJCS8qCisJ CQkJICogSWYgdGhlIGtleSB0aGF0IHdlIGp1c3QgYWRkZWQgdG8gc3RhcnRLZXlzW10gaXMg YSBza2lwCisJCQkJICogYXJyYXkgPSBrZXkgd2hvc2UgY3VycmVudCBlbGVtZW50IGlzIG1h cmtlZCBORVhUIG9yIFBSSU9SLAorCQkJCSAqIG1ha2Ugc3RyYXRfdG90YWwgPiBvciA8IChh bmQgc3RvcCBhZGRpbmcgYm91bmRhcnkga2V5cykuCisJCQkJICogVGhpcyBjYW4gb25seSBo YXBwZW4gd2l0aCBvcGNsYXNzZXMgdGhhdCBsYWNrIHNraXAgc3VwcG9ydC4KKwkJCQkgKi8K KwkJCQlpZiAoY2hvc2VuLT5za19mbGFncyAmIChTS19CVF9ORVhUIHwgU0tfQlRfUFJJT1Ip KQorCQkJCXsKKwkJCQkJQXNzZXJ0KGNob3Nlbi0+c2tfZmxhZ3MgJiBTS19CVF9TS0lQKTsK KwkJCQkJQXNzZXJ0KHN0cmF0X3RvdGFsID09IEJURXF1YWxTdHJhdGVneU51bWJlcik7CisK KwkJCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCQkJeworCQkJCQkJ QXNzZXJ0KCEoY2hvc2VuLT5za19mbGFncyAmIFNLX0JUX1BSSU9SKSk7CisJCQkJCQlzdHJh dF90b3RhbCA9IEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyOworCQkJCQl9CisJCQkJCWVsc2UK KwkJCQkJeworCQkJCQkJQXNzZXJ0KCEoY2hvc2VuLT5za19mbGFncyAmIFNLX0JUX05FWFQp KTsKKwkJCQkJCXN0cmF0X3RvdGFsID0gQlRMZXNzU3RyYXRlZ3lOdW1iZXI7CisJCQkJCX0K KworCQkJCQkvKgorCQkJCQkgKiBXZSdyZSBkb25lLiAgV2UnbGwgbmV2ZXIgZmluZCBhbiBl eGFjdCA9IG1hdGNoIGZvciBhCisJCQkJCSAqIE5FWFQgb3IgUFJJT1Igc2VudGluZWwgc2tf YXJndW1lbnQgdmFsdWUuICBUaGVyZSdzIG5vCisJCQkJCSAqIHNlbnNlIGluIHRyeWluZyB0 byBhZGQgbW9yZSBrZXlzIHRvIHN0YXJ0S2V5c1tdLgorCQkJCQkgKi8KKwkJCQkJYnJlYWs7 CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBEb25lIGlmIHRoYXQgd2FzIHRoZSBsYXN0IHNj YW4ga2V5IG91dHB1dCBieSBwcmVwcm9jZXNzaW5nLgorCQkJCSAqIEFsc28gZG9uZSBpZiB0 aGVyZSBpcyBhIGdhcCBpbmRleCBhdHRyaWJ1dGUgdGhhdCBsYWNrcyBhCisJCQkJICogdXNh YmxlIGtleSAob25seSBwb3NzaWJsZSB3aGVuIHByZXByb2Nlc3Npbmcgd2FzIHVuYWJsZSB0 bworCQkJCSAqIGdlbmVyYXRlIGEgc2tpcCBhcnJheSBrZXkgdG8gImZpbGwgaW4gdGhlIGdh cCIpLgorCQkJCSAqLworCQkJCWlmIChpID49IHNvLT5udW1iZXJPZktleXMgfHwKKwkJCQkJ Y3VyLT5za19hdHRubyAhPSBjdXJhdHRyICsgMSkKKwkJCQkJYnJlYWs7CisKKwkJCQkvKgor CQkJCSAqIFJlc2V0IGZvciBuZXh0IGF0dHIuCisJCQkJICovCisJCQkJY3VyYXR0ciA9IGN1 ci0+c2tfYXR0bm87CisJCQkJY2hvc2VuID0gTlVMTDsKKwkJCQlpbXBsaWVzTk4gPSBOVUxM OworCQkJfQorCisJCQkvKgorCQkJICogQ2FuIHdlIHVzZSB0aGlzIGtleSBhcyBhIHN0YXJ0 aW5nIGJvdW5kYXJ5IGZvciB0aGlzIGF0dHI/CisJCQkgKgorCQkJICogSWYgbm90LCBkb2Vz IGl0IGltcGx5IGEgTk9UIE5VTEwgY29uc3RyYWludD8gIChCZWNhdXNlCisJCQkgKiBTS19T RUFSQ0hOVUxMIGtleXMgYXJlIGFsd2F5cyBhc3NpZ25lZCBCVEVxdWFsU3RyYXRlZ3lOdW1i ZXIsCisJCQkgKiAqYW55KiBpbmVxdWFsaXR5IGtleSB3b3JrcyBmb3IgdGhhdDsgd2UgbmVl ZCBub3QgdGVzdC4pCisJCQkgKi8KKwkJCXN3aXRjaCAoY3VyLT5za19zdHJhdGVneSkKKwkJ CXsKKwkJCQljYXNlIEJUTGVzc1N0cmF0ZWd5TnVtYmVyOgorCQkJCWNhc2UgQlRMZXNzRXF1 YWxTdHJhdGVneU51bWJlcjoKKwkJCQkJaWYgKGNob3NlbiA9PSBOVUxMKQorCQkJCQl7CisJ CQkJCQlpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkKKwkJCQkJCQljaG9zZW4g PSBjdXI7CisJCQkJCQllbHNlCisJCQkJCQkJaW1wbGllc05OID0gY3VyOworCQkJCQl9CisJ CQkJCWJyZWFrOworCQkJCWNhc2UgQlRFcXVhbFN0cmF0ZWd5TnVtYmVyOgorCQkJCQkvKiBv dmVycmlkZSBhbnkgbm9uLWVxdWFsaXR5IGNob2ljZSAqLworCQkJCQljaG9zZW4gPSBjdXI7 CisJCQkJCWJyZWFrOworCQkJCWNhc2UgQlRHcmVhdGVyRXF1YWxTdHJhdGVneU51bWJlcjoK KwkJCQljYXNlIEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyOgorCQkJCQlpZiAoY2hvc2VuID09 IE5VTEwpCisJCQkJCXsKKwkJCQkJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikp CisJCQkJCQkJY2hvc2VuID0gY3VyOworCQkJCQkJZWxzZQorCQkJCQkJCWltcGxpZXNOTiA9 IGN1cjsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qCisJICog SWYgd2UgZm91bmQgbm8gdXNhYmxlIGJvdW5kYXJ5IGtleXMsIHdlIGhhdmUgdG8gc3RhcnQg ZnJvbSBvbmUgZW5kIG9mCisJICogdGhlIHRyZWUuICBXYWxrIGRvd24gdGhhdCBlZGdlIHRv IHRoZSBmaXJzdCBvciBsYXN0IGtleSwgYW5kIHNjYW4gZnJvbQorCSAqIHRoZXJlLgorCSAq CisJICogTm90ZTogY2FsbHMgX2J0X3JlYWRmaXJzdHBhZ2UgZm9yIHVzLCB3aGljaCByZWxl YXNlcyB0aGUgcGFyYWxsZWwgc2Nhbi4KKwkgKi8KKwlpZiAoa2V5c3ogPT0gMCkKKwkJcmV0 dXJuIF9idF9lbmRwb2ludF9iYXRjaChzY2FuLCBkaXIpOworCisJLyoKKwkgKiBXZSB3YW50 IHRvIHN0YXJ0IHRoZSBzY2FuIHNvbWV3aGVyZSB3aXRoaW4gdGhlIGluZGV4LiAgU2V0IHVw IGFuCisJICogaW5zZXJ0aW9uIHNjYW5rZXkgd2UgY2FuIHVzZSB0byBzZWFyY2ggZm9yIHRo ZSBib3VuZGFyeSBwb2ludCB3ZQorCSAqIGlkZW50aWZpZWQgYWJvdmUuICBUaGUgaW5zZXJ0 aW9uIHNjYW5rZXkgaXMgYnVpbHQgdXNpbmcgdGhlIGtleXMKKwkgKiBpZGVudGlmaWVkIGJ5 IHN0YXJ0S2V5c1tdLiAgKFJlbWFpbmluZyBpbnNlcnRpb24gc2NhbmtleSBmaWVsZHMgYXJl CisJICogaW5pdGlhbGl6ZWQgYWZ0ZXIgaW5pdGlhbC1wb3NpdGlvbmluZyBzY2FuIGtleXMg YXJlIGZpbmFsaXplZC4pCisJICovCisJQXNzZXJ0KGtleXN6IDw9IElOREVYX01BWF9LRVlT KTsKKwlmb3IgKGludCBpID0gMDsgaSA8IGtleXN6OyBpKyspCisJeworCQlTY2FuS2V5CQlj dXIgPSBzdGFydEtleXNbaV07CisKKwkJQXNzZXJ0KGN1ci0+c2tfYXR0bm8gPT0gaSArIDEp OworCisJCWlmIChjdXItPnNrX2ZsYWdzICYgU0tfUk9XX0hFQURFUikKKwkJeworCQkJLyoK KwkJCSAqIFJvdyBjb21wYXJpc29uIGhlYWRlcjogbG9vayB0byB0aGUgZmlyc3Qgcm93IG1l bWJlciBpbnN0ZWFkCisJCQkgKi8KKwkJCVNjYW5LZXkJCXN1YmtleSA9IChTY2FuS2V5KSBE YXR1bUdldFBvaW50ZXIoY3VyLT5za19hcmd1bWVudCk7CisKKwkJCS8qCisJCQkgKiBDYW5u b3QgYmUgYSBOVUxMIGluIHRoZSBmaXJzdCByb3cgbWVtYmVyOiBfYnRfcHJlcHJvY2Vzc19r ZXlzCisJCQkgKiB3b3VsZCd2ZSBtYXJrZWQgdGhlIHF1YWwgYXMgdW5zYXRpc2ZpYWJsZSwg cHJldmVudGluZyB1cyBmcm9tCisJCQkgKiBldmVyIGdldHRpbmcgdGhpcyBmYXIKKwkJCSAq LworCQkJQXNzZXJ0KHN1YmtleS0+c2tfZmxhZ3MgJiBTS19ST1dfTUVNQkVSKTsKKwkJCUFz c2VydChzdWJrZXktPnNrX2F0dG5vID09IGN1ci0+c2tfYXR0bm8pOworCQkJQXNzZXJ0KCEo c3Via2V5LT5za19mbGFncyAmIFNLX0lTTlVMTCkpOworCisJCQkvKgorCQkJICogVGhlIG1l bWJlciBzY2Fua2V5cyBhcmUgYWxyZWFkeSBpbiBpbnNlcnRpb24gZm9ybWF0IChpZSwgdGhl eQorCQkJICogaGF2ZSBza19mdW5jID0gMy13YXktY29tcGFyaXNvbiBmdW5jdGlvbikKKwkJ CSAqLworCQkJbWVtY3B5KGluc2tleS5zY2Fua2V5cyArIGksIHN1YmtleSwgc2l6ZW9mKFNj YW5LZXlEYXRhKSk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgcm93IGNvbXBhcmlzb24gaXMg dGhlIGxhc3QgcG9zaXRpb25pbmcga2V5IHdlIGFjY2VwdGVkLAorCQkJICogdHJ5IHRvIGFk ZCBhZGRpdGlvbmFsIGtleXMgZnJvbSB0aGUgbG93ZXItb3JkZXIgcm93IG1lbWJlcnMuCisJ CQkgKiAoSWYgd2UgYWNjZXB0ZWQgaW5kZXBlbmRlbnQgY29uZGl0aW9ucyBvbiBhZGRpdGlv bmFsIGluZGV4CisJCQkgKiBjb2x1bW5zLCB3ZSB1c2UgdGhvc2UgaW5zdGVhZCAtLS0gZG9l c24ndCBzZWVtIHdvcnRoIHRyeWluZyB0bworCQkJICogZGV0ZXJtaW5lIHdoaWNoIGlzIG1v cmUgcmVzdHJpY3RpdmUuKSAgTm90ZSB0aGF0IHRoaXMgaXMgT0sKKwkJCSAqIGV2ZW4gaWYg dGhlIHJvdyBjb21wYXJpc29uIGlzIG9mICI+IiBvciAiPCIgdHlwZSwgYmVjYXVzZSB0aGUK KwkJCSAqIGNvbmRpdGlvbiBhcHBsaWVkIHRvIGFsbCBidXQgdGhlIGxhc3Qgcm93IG1lbWJl ciBpcyBlZmZlY3RpdmVseQorCQkJICogIj49IiBvciAiPD0iLCBhbmQgc28gdGhlIGV4dHJh IGtleXMgZG9uJ3QgYnJlYWsgdGhlIHBvc2l0aW9uaW5nCisJCQkgKiBzY2hlbWUuICBCdXQs IGJ5IHRoZSBzYW1lIHRva2VuLCBpZiB3ZSBhcmVuJ3QgYWJsZSB0byB1c2UgYWxsCisJCQkg KiB0aGUgcm93IG1lbWJlcnMsIHRoZW4gdGhlIHBhcnQgb2YgdGhlIHJvdyBjb21wYXJpc29u IHRoYXQgd2UKKwkJCSAqIGRpZCB1c2UgaGFzIHRvIGJlIHRyZWF0ZWQgYXMganVzdCBhICI+ PSIgb3IgIjw9IiBjb25kaXRpb24sIGFuZAorCQkJICogc28gd2UnZCBiZXR0ZXIgYWRqdXN0 IHN0cmF0X3RvdGFsIGFjY29yZGluZ2x5LgorCQkJICovCisJCQlpZiAoaSA9PSBrZXlzeiAt IDEpCisJCQl7CisJCQkJYm9vbAkJdXNlZF9hbGxfc3Via2V5cyA9IGZhbHNlOworCisJCQkJ QXNzZXJ0KCEoc3Via2V5LT5za19mbGFncyAmIFNLX1JPV19FTkQpKTsKKwkJCQlmb3IgKDs7 KQorCQkJCXsKKwkJCQkJc3Via2V5Kys7CisJCQkJCUFzc2VydChzdWJrZXktPnNrX2ZsYWdz ICYgU0tfUk9XX01FTUJFUik7CisJCQkJCWlmIChzdWJrZXktPnNrX2F0dG5vICE9IGtleXN6 ICsgMSkKKwkJCQkJCWJyZWFrOwkvKiBvdXQtb2Ytc2VxdWVuY2UsIGNhbid0IHVzZSBpdCAq LworCQkJCQlpZiAoc3Via2V5LT5za19zdHJhdGVneSAhPSBjdXItPnNrX3N0cmF0ZWd5KQor CQkJCQkJYnJlYWs7CS8qIHdyb25nIGRpcmVjdGlvbiwgY2FuJ3QgdXNlIGl0ICovCisJCQkJ CWlmIChzdWJrZXktPnNrX2ZsYWdzICYgU0tfSVNOVUxMKQorCQkJCQkJYnJlYWs7CS8qIGNh bid0IHVzZSBudWxsIGtleXMgKi8KKwkJCQkJQXNzZXJ0KGtleXN6IDwgSU5ERVhfTUFYX0tF WVMpOworCQkJCQltZW1jcHkoaW5za2V5LnNjYW5rZXlzICsga2V5c3osIHN1YmtleSwKKwkJ CQkJCSAgIHNpemVvZihTY2FuS2V5RGF0YSkpOworCQkJCQlrZXlzeisrOworCQkJCQlpZiAo c3Via2V5LT5za19mbGFncyAmIFNLX1JPV19FTkQpCisJCQkJCXsKKwkJCQkJCXVzZWRfYWxs X3N1YmtleXMgPSB0cnVlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYg KCF1c2VkX2FsbF9zdWJrZXlzKQorCQkJCXsKKwkJCQkJc3dpdGNoIChzdHJhdF90b3RhbCkK KwkJCQkJeworCQkJCQkJY2FzZSBCVExlc3NTdHJhdGVneU51bWJlcjoKKwkJCQkJCQlzdHJh dF90b3RhbCA9IEJUTGVzc0VxdWFsU3RyYXRlZ3lOdW1iZXI7CisJCQkJCQkJYnJlYWs7CisJ CQkJCQljYXNlIEJUR3JlYXRlclN0cmF0ZWd5TnVtYmVyOgorCQkJCQkJCXN0cmF0X3RvdGFs ID0gQlRHcmVhdGVyRXF1YWxTdHJhdGVneU51bWJlcjsKKwkJCQkJCQlicmVhazsKKwkJCQkJ fQorCQkJCX0KKwkJCQlicmVhazsJCQkvKiBkb25lIHdpdGggb3V0ZXIgbG9vcCAqLworCQkJ fQorCQl9CisJCWVsc2UKKwkJeworCQkJLyoKKwkJCSAqIE9yZGluYXJ5IGNvbXBhcmlzb24g a2V5LiAgVHJhbnNmb3JtIHRoZSBzZWFyY2gtc3R5bGUgc2NhbiBrZXkKKwkJCSAqIHRvIGFu IGluc2VydGlvbiBzY2FuIGtleSBieSByZXBsYWNpbmcgdGhlIHNrX2Z1bmMgd2l0aCB0aGUK KwkJCSAqIGFwcHJvcHJpYXRlIGJ0cmVlIGNvbXBhcmlzb24gZnVuY3Rpb24uCisJCQkgKgor CQkJICogSWYgc2NhbmtleSBvcGVyYXRvciBpcyBub3QgYSBjcm9zcy10eXBlIGNvbXBhcmlz b24sIHdlIGNhbiB1c2UKKwkJCSAqIHRoZSBjYWNoZWQgY29tcGFyaXNvbiBmdW5jdGlvbjsg b3RoZXJ3aXNlIGdvdHRhIGxvb2sgaXQgdXAgaW4KKwkJCSAqIHRoZSBjYXRhbG9ncy4gIChU aGF0IGNhbid0IGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLCBzaW5jZSBubworCQkJICog aW5kZXhzY2FuIGluaXRpYXRlZCBieSBzeXNjYWNoZSBsb29rdXAgd2lsbCB1c2UgY3Jvc3Mt ZGF0YS10eXBlCisJCQkgKiBvcGVyYXRvcnMuKQorCQkJICoKKwkJCSAqIFdlIHN1cHBvcnQg dGhlIGNvbnZlbnRpb24gdGhhdCBza19zdWJ0eXBlID09IEludmFsaWRPaWQgbWVhbnMKKwkJ CSAqIHRoZSBvcGNsYXNzIGlucHV0IHR5cGU7IHRoaXMgaXMgYSBoYWNrIHRvIHNpbXBsaWZ5 IGxpZmUgZm9yCisJCQkgKiBTY2FuS2V5SW5pdCgpLgorCQkJICovCisJCQlpZiAoY3VyLT5z a19zdWJ0eXBlID09IHJlbC0+cmRfb3BjaW50eXBlW2ldIHx8CisJCQkJY3VyLT5za19zdWJ0 eXBlID09IEludmFsaWRPaWQpCisJCQl7CisJCQkJRm1nckluZm8gICAqcHJvY2luZm87CisK KwkJCQlwcm9jaW5mbyA9IGluZGV4X2dldHByb2NpbmZvKHJlbCwgY3VyLT5za19hdHRubywg QlRPUkRFUl9QUk9DKTsKKwkJCQlTY2FuS2V5RW50cnlJbml0aWFsaXplV2l0aEluZm8oaW5z a2V5LnNjYW5rZXlzICsgaSwKKwkJCQkJCQkJCQkJICAgY3VyLT5za19mbGFncywKKwkJCQkJ CQkJCQkJICAgY3VyLT5za19hdHRubywKKwkJCQkJCQkJCQkJICAgSW52YWxpZFN0cmF0ZWd5 LAorCQkJCQkJCQkJCQkgICBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkJCQkJCSAgIGN1ci0+ c2tfY29sbGF0aW9uLAorCQkJCQkJCQkJCQkgICBwcm9jaW5mbywKKwkJCQkJCQkJCQkJICAg Y3VyLT5za19hcmd1bWVudCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJUmVnUHJvY2Vk dXJlIGNtcF9wcm9jOworCisJCQkJY21wX3Byb2MgPSBnZXRfb3BmYW1pbHlfcHJvYyhyZWwt PnJkX29wZmFtaWx5W2ldLAorCQkJCQkJCQkJCQkgcmVsLT5yZF9vcGNpbnR5cGVbaV0sCisJ CQkJCQkJCQkJCSBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkJCQkJCSBCVE9SREVSX1BST0Mp OworCQkJCWlmICghUmVnUHJvY2VkdXJlSXNWYWxpZChjbXBfcHJvYykpCisJCQkJCWVsb2co RVJST1IsICJtaXNzaW5nIHN1cHBvcnQgZnVuY3Rpb24gJWQoJXUsJXUpIGZvciBhdHRyaWJ1 dGUgJWQgb2YgaW5kZXggXCIlc1wiIiwKKwkJCQkJCSBCVE9SREVSX1BST0MsIHJlbC0+cmRf b3BjaW50eXBlW2ldLCBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkgY3VyLT5za19hdHRubywg UmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisJCQkJU2NhbktleUVudHJ5SW5pdGlh bGl6ZShpbnNrZXkuc2NhbmtleXMgKyBpLAorCQkJCQkJCQkJICAgY3VyLT5za19mbGFncywK KwkJCQkJCQkJCSAgIGN1ci0+c2tfYXR0bm8sCisJCQkJCQkJCQkgICBJbnZhbGlkU3RyYXRl Z3ksCisJCQkJCQkJCQkgICBjdXItPnNrX3N1YnR5cGUsCisJCQkJCQkJCQkgICBjdXItPnNr X2NvbGxhdGlvbiwKKwkJCQkJCQkJCSAgIGNtcF9wcm9jLAorCQkJCQkJCQkJICAgY3VyLT5z a19hcmd1bWVudCk7CisJCQl9CisJCX0KKwl9CisKKwkvKi0tLS0tLS0tLS0KKwkgKiBFeGFt aW5lIHRoZSBzZWxlY3RlZCBpbml0aWFsLXBvc2l0aW9uaW5nIHN0cmF0ZWd5IHRvIGRldGVy bWluZSBleGFjdGx5CisJICogd2hlcmUgd2UgbmVlZCB0byBzdGFydCB0aGUgc2NhbiwgYW5k IHNldCBmbGFnIHZhcmlhYmxlcyB0byBjb250cm9sIHRoZQorCSAqIGluaXRpYWwgZGVzY2Vu dCBieSBfYnRfc2VhcmNoIChhbmQgb3VyIF9idF9iaW5zcmNoIGNhbGwgZm9yIHRoZSBsZWFm CisJICogcGFnZSBfYnRfc2VhcmNoIHJldHVybnMpLgorCSAqLS0tLS0tLS0tLQorCSAqLwor CV9idF9tZXRhdmVyc2lvbihyZWwsICZpbnNrZXkuaGVhcGtleXNwYWNlLCAmaW5za2V5LmFs bGVxdWFsaW1hZ2UpOworCWluc2tleS5hbnludWxsa2V5cyA9IGZhbHNlOyAvKiB1bnVzZWQg Ki8KKwlpbnNrZXkuc2NhbnRpZCA9IE5VTEw7CisJaW5za2V5LmtleXN6ID0ga2V5c3o7CisJ c3dpdGNoIChzdHJhdF90b3RhbCkKKwl7CisJCWNhc2UgQlRMZXNzU3RyYXRlZ3lOdW1iZXI6 CisKKwkJCWluc2tleS5uZXh0a2V5ID0gZmFsc2U7CisJCQlpbnNrZXkuYmFja3dhcmQgPSB0 cnVlOworCQkJYnJlYWs7CisKKwkJY2FzZSBCVExlc3NFcXVhbFN0cmF0ZWd5TnVtYmVyOgor CisJCQlpbnNrZXkubmV4dGtleSA9IHRydWU7CisJCQlpbnNrZXkuYmFja3dhcmQgPSB0cnVl OworCQkJYnJlYWs7CisKKwkJY2FzZSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXI6CisKKwkJCS8q CisJCQkgKiBJZiBhIGJhY2t3YXJkIHNjYW4gd2FzIHNwZWNpZmllZCwgbmVlZCB0byBzdGFy dCB3aXRoIGxhc3QgZXF1YWwKKwkJCSAqIGl0ZW0gbm90IGZpcnN0IG9uZS4KKwkJCSAqLwor CQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikpCisJCQl7CisJCQkJLyoKKwkJ CQkgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSA8PSBzdHJhdGVneQorCQkJCSAqLworCQkJ CWluc2tleS5uZXh0a2V5ID0gdHJ1ZTsKKwkJCQlpbnNrZXkuYmFja3dhcmQgPSB0cnVlOwor CQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0aGUgc2FtZSBh cyB0aGUgPj0gc3RyYXRlZ3kKKwkJCQkgKi8KKwkJCQlpbnNrZXkubmV4dGtleSA9IGZhbHNl OworCQkJCWluc2tleS5iYWNrd2FyZCA9IGZhbHNlOworCQkJfQorCQkJYnJlYWs7CisKKwkJ Y2FzZSBCVEdyZWF0ZXJFcXVhbFN0cmF0ZWd5TnVtYmVyOgorCisJCQkvKgorCQkJICogRmlu ZCBmaXJzdCBpdGVtID49IHNjYW5rZXkKKwkJCSAqLworCQkJaW5za2V5Lm5leHRrZXkgPSBm YWxzZTsKKwkJCWluc2tleS5iYWNrd2FyZCA9IGZhbHNlOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBCVEdyZWF0ZXJTdHJhdGVneU51bWJlcjoKKworCQkJLyoKKwkJCSAqIEZpbmQgZmlyc3Qg aXRlbSA+IHNjYW5rZXkKKwkJCSAqLworCQkJaW5za2V5Lm5leHRrZXkgPSB0cnVlOworCQkJ aW5za2V5LmJhY2t3YXJkID0gZmFsc2U7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJ LyogY2FuJ3QgZ2V0IGhlcmUsIGJ1dCBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCisJCQllbG9n KEVSUk9SLCAidW5yZWNvZ25pemVkIHN0cmF0X3RvdGFsOiAlZCIsIChpbnQpIHN0cmF0X3Rv dGFsKTsKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIFVzZSB0aGUgbWFudWZh Y3R1cmVkIGluc2VydGlvbiBzY2FuIGtleSB0byBkZXNjZW5kIHRoZSB0cmVlIGFuZAorCSAq IHBvc2l0aW9uIG91cnNlbHZlcyBvbiB0aGUgdGFyZ2V0IGxlYWYgcGFnZS4KKwkgKi8KKwlB c3NlcnQoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSA9PSBpbnNrZXkuYmFja3dhcmQp OworCXN0YWNrID0gX2J0X3NlYXJjaChyZWwsIE5VTEwsICZpbnNrZXksICZwb3MuYnVmLCBC VF9SRUFEKTsKKworCS8qIGRvbid0IG5lZWQgdG8ga2VlcCB0aGUgc3RhY2sgYXJvdW5kLi4u ICovCisJX2J0X2ZyZWVzdGFjayhzdGFjayk7CisKKwlpZiAoIUJ1ZmZlcklzVmFsaWQocG9z LmJ1ZikpCisJeworCQkvKgorCQkgKiBXZSBvbmx5IGdldCBoZXJlIGlmIHRoZSBpbmRleCBp cyBjb21wbGV0ZWx5IGVtcHR5LiBMb2NrIHJlbGF0aW9uCisJCSAqIGJlY2F1c2Ugbm90aGlu ZyBmaW5lciB0byBsb2NrIGV4aXN0cy4gIFdpdGhvdXQgYSBidWZmZXIgbG9jaywgaXQncwor CQkgKiBwb3NzaWJsZSBmb3IgYW5vdGhlciB0cmFuc2FjdGlvbiB0byBpbnNlcnQgZGF0YSBi ZXR3ZWVuCisJCSAqIF9idF9zZWFyY2goKSBhbmQgUHJlZGljYXRlTG9ja1JlbGF0aW9uKCku ICBXZSBoYXZlIHRvIHRyeSBhZ2FpbgorCQkgKiBhZnRlciB0YWtpbmcgdGhlIHJlbGF0aW9u LWxldmVsIHByZWRpY2F0ZSBsb2NrLCB0byBjbG9zZSBhIG5hcnJvdworCQkgKiB3aW5kb3cg d2hlcmUgd2Ugd291bGRuJ3Qgc2NhbiBjb25jdXJyZW50bHkgaW5zZXJ0ZWQgdHVwbGVzLCBi dXQgdGhlCisJCSAqIHdyaXRlciB3b3VsZG4ndCBzZWUgb3VyIHByZWRpY2F0ZSBsb2NrLgor CQkgKi8KKwkJaWYgKElzb2xhdGlvbklzU2VyaWFsaXphYmxlKCkpCisJCXsKKwkJCVByZWRp Y2F0ZUxvY2tSZWxhdGlvbihyZWwsIHNjYW4tPnhzX3NuYXBzaG90KTsKKwkJCXN0YWNrID0g X2J0X3NlYXJjaChyZWwsIE5VTEwsICZpbnNrZXksICZwb3MuYnVmLCBCVF9SRUFEKTsKKwkJ CV9idF9mcmVlc3RhY2soc3RhY2spOworCQl9CisKKwkJaWYgKCFCdWZmZXJJc1ZhbGlkKHBv cy5idWYpKQorCQl7CisJCQlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCQkJX2J0X3Bh cmFsbGVsX2RvbmUoc2Nhbik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKiBw b3NpdGlvbiB0byB0aGUgcHJlY2lzZSBpdGVtIG9uIHRoZSBwYWdlICovCisJb2ZmbnVtID0g X2J0X2JpbnNyY2gocmVsLCAmaW5za2V5LCBwb3MuYnVmKTsKKworCS8qCisJICogTm93IGxv YWQgZGF0YSBmcm9tIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBzY2FuICh1c3VhbGx5IHRoZSBw YWdlCisJICogY3VycmVudGx5IGluIHNvLT5jdXJyUG9zLmJ1ZikuCisJICoKKwkgKiBJZiBp bnNrZXkubmV4dGtleSA9IGZhbHNlIGFuZCBpbnNrZXkuYmFja3dhcmQgPSBmYWxzZSwgb2Zm bnVtIGlzCisJICogcG9zaXRpb25lZCBhdCB0aGUgZmlyc3Qgbm9uLXBpdm90IHR1cGxlID49 IGluc2tleS5zY2Fua2V5cy4KKwkgKgorCSAqIElmIGluc2tleS5uZXh0a2V5ID0gZmFsc2Ug YW5kIGluc2tleS5iYWNrd2FyZCA9IHRydWUsIG9mZm51bSBpcworCSAqIHBvc2l0aW9uZWQg YXQgdGhlIGxhc3Qgbm9uLXBpdm90IHR1cGxlIDwgaW5za2V5LnNjYW5rZXlzLgorCSAqCisJ ICogSWYgaW5za2V5Lm5leHRrZXkgPSB0cnVlIGFuZCBpbnNrZXkuYmFja3dhcmQgPSBmYWxz ZSwgb2ZmbnVtIGlzCisJICogcG9zaXRpb25lZCBhdCB0aGUgZmlyc3Qgbm9uLXBpdm90IHR1 cGxlID4gaW5za2V5LnNjYW5rZXlzLgorCSAqCisJICogSWYgaW5za2V5Lm5leHRrZXkgPSB0 cnVlIGFuZCBpbnNrZXkuYmFja3dhcmQgPSB0cnVlLCBvZmZudW0gaXMKKwkgKiBwb3NpdGlv bmVkIGF0IHRoZSBsYXN0IG5vbi1waXZvdCB0dXBsZSA8PSBpbnNrZXkuc2NhbmtleXMuCisJ ICoKKwkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgX2J0X2JpbnNyY2ggcmV0dXJuZWQgYW4gb2Zm bnVtIHRoYXQgaXMgb3V0IG9mIGJvdW5kcworCSAqIGZvciB0aGUgcGFnZS4gIEZvciBleGFt cGxlLCB3aGVuIGluc2tleSBpcyBib3RoIDwgdGhlIGxlYWYgcGFnZSdzIGhpZ2gKKwkgKiBr ZXkgYW5kID4gYWxsIG9mIGl0cyBub24tcGl2b3QgdHVwbGVzLCBvZmZudW0gd2lsbCBiZSAi bWF4b2ZmICsgMSIuCisJICovCisJcmV0dXJuIF9idF9yZWFkZmlyc3RwYWdlX2JhdGNoKHNj YW4sICZwb3MsIG9mZm51bSwgZGlyKTsKK30KKworLyoKKyAqCV9idF9uZXh0X2JhdGNoKCkg LS0gR2V0IHRoZSBuZXh0IGJhdGNoIG9mIGl0ZW1zIGluIGEgc2Nhbi4KKyAqCisgKiBBIGJh dGNoIHZhcmlhbnQgb2YgX2J0X25leHQoKS4gTW9zdCBvZiB0aGUgY29tbWVudHMgZm9yIHRo YXQgZnVuY3Rpb24KKyAqIGFwcGx5IGhlcmUgdG9vLgorICoKKyAqIFdlIHNob3VsZCBvbmx5 IGdldCBoZXJlIG9ubHkgd2hlbiB0aGUgY3VycmVudCBiYXRjaCBoYXMgbm8gbW9yZSBpdGVt cworICogaW4gdGhlIGdpdmVuIGRpcmVjdGlvbi4gV2UgZG9uJ3QgZ2V0IGhlcmUgd2l0aCBl bXB0eSBiYXRjaGVzLCB0aGF0J3MKKyAqIGhhbmRsZWQgYnkgX2J0X2Zpc3RfYmF0Y2goKS4K KyAqCisgKiBYWFggU2VlIGFsc28gdGhlIGNvbW1lbnRzIGF0IF9idF9maXJzdF9iYXRjaCgp IGFib3V0IHJldHVybmluZyBhIHNpbmdsZQorICogYmF0Y2ggZm9yIHRoZSBwYWdlLCBldGMu CisgKi8KK0luZGV4U2NhbkJhdGNoCitfYnRfbmV4dF9iYXRjaChJbmRleFNjYW5EZXNjIHNj YW4sIEJUQmF0Y2hTY2FuUG9zIHBvcywgU2NhbkRpcmVjdGlvbiBkaXIpCit7CisJQlRTY2Fu T3BhcXVlIHNvIFBHX1VTRURfRk9SX0FTU0VSVFNfT05MWSA9IChCVFNjYW5PcGFxdWUpIHNj YW4tPm9wYXF1ZTsKKwkvLyBCVEJhdGNoU2NhblBvcyBwb3M7CisJQlRCYXRjaFNjYW5Qb3NE YXRhIHRtcDsKKwkvLyBJbmRleFNjYW5CYXRjaAliYXRjaDsKKwkvLyBpbnQgCQkJaWR4Owor CisJLyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRoIHJlZ3VsYXIgc2Nhbi1sZXZlbCBw b3NpdGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKTsK KwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1hcmtQb3MpKTsKKworCS8qCisJICog cmVzdG9yZSB0aGUgQlRTY2FuT3BhcXVlIGZyb20gdGhlIGN1cnJlbnQgYmF0Y2gKKwkgKgor CSAqIFhYWCBUaGlzIGlzIHByZXR0eSB1Z2x5L2V4cGVuc2l2ZS4gSWRlYWxseSB3ZSdkIGhh dmUgYWxsIHRoZSBmaWVsZHMKKwkgKiBuZWVkZWQgdG8gZGV0ZXJtaW5lICJsb2NhdGlvbiIg aW4gdGhlIGluZGV4IChlc3NlbnRpYWxseSBCVFNjYW5Qb3NEYXRhKQorCSAqIGluIHRoZSBi YXRjaCwgd2l0aG91dCBjbG9uaW5nIGFsbCB0aGUgb3RoZXIgc3R1ZmYuCisJICovCisJLy8g QXNzZXJ0KHNjYW4tPnhzX2JhdGNoZXMtPmN1cnJlbnRCYXRjaCAhPSBOVUxMKTsKKworCS8q CisJICogVXNlIHRoZSBsYXN0IGJhdGNoIGFzIHRoZSAiY3VycmVudCIgYmF0Y2guIFdlIHVz ZSB0aGUgc3RyZWFtUG9zIGlmCisJICogaW5pdGlhbGl6ZWQsIG9yIHRoZSByZWFkUG9zIGFz IGEgZmFsbGJhY2suIEFsdGVybmF0aXZlbHksIHdlIGNvdWxkCisJICogc2ltcGx5IHVzZSB0 aGUgbGFzdCBiYXRjaCBpbiB0aGUgcXVldWUsIGkuZS4gKG5leHRCYXRjaCAtIDEpLgorCSAq CisJICogRXZlbiBiZXR0ZXIsIHdlIGNvdWxkIHBhc3MgdGhlICJjb3JyZWN0IiBiYXRjaCBm cm9tIGluZGV4YW0uYywgYW5kCisJICogbGV0IHRoYXQgZmlndXJlIG91dCB3aGljaCBwb3Np dGlvbiB0byBtb3ZlIGZyb20uCisJICovCisvKgorCWlkeCA9IHNjYW4tPnhzX2JhdGNoZXMt PnN0cmVhbVBvcy5iYXRjaDsKKwlpZiAoaWR4ID09IC0xKQorCQlpZHggPSBzY2FuLT54c19i YXRjaGVzLT5yZWFkUG9zLmJhdGNoOworCisJYmF0Y2ggPSBJTkRFWF9TQ0FOX0JBVENIKHNj YW4sIGlkeCk7CisJQXNzZXJ0KGJhdGNoICE9IE5VTEwpOworCXBvcyA9IChCVEJhdGNoU2Nh blBvcykgYmF0Y2gtPm9wYXF1ZTsKKyovCisKKwlBc3NlcnQoQlRCYXRjaFNjYW5Qb3NJc1Bp bm5lZCgqcG9zKSk7CisKKwltZW1jcHkoJnRtcCwgcG9zLCBzaXplb2YodG1wKSk7CisKKwkv KgorCSAqIEFkdmFuY2UgdG8gbmV4dCBwYWdlLCBsb2FkIHRoZSBkYXRhIGludG8gdGhlIGlu ZGV4IGJhdGNoLgorCSAqCisJICogRklYTUUgSXQgbWF5IG5vdCBiZSBxdWl0ZSBjb3JyZWN0 IHRvIGp1c3QgcGFzcyB0aGUgcG9zaXRpb24gZnJvbQorCSAqIGN1cnJlbnQgYmF0Y2gsIHNv bWUgb2YgdGhlIGZ1bmN0aW9ucyBzY3JpYmJsZSBvdmVyIGl0IChlLmcuCisJICogX2J0X3Jl YWRwYWdlX2JhdGNoKS4gTWF5YmUgd2Ugc2hvdWxkIGNyZWF0ZSBhIGNvcHksIG9yIHNvbWV0 aGluZz8KKwkgKgorCSAqIFhYWCBGb3Igbm93IHdlIHBhc3MgYSBsb2NhbCBjb3B5ICJ0bXAi LgorCSAqLworCXJldHVybiBfYnRfc3RlcHBhZ2VfYmF0Y2goc2NhbiwgJnRtcCwgZGlyKTsK K30KKworLyoKKyAqCV9idF9raWxsX2JhdGNoKCkgLS0gcmVtZW1iZXIgdGhlIGl0ZW1zLXRv LWJlLWtpbGxlZCBmcm9tIHRoZSBjdXJyZW50IGJhdGNoCisgKgorICogV2Ugc2ltcGx5IHRy YW5zbGF0ZSB0aGUgYml0bWFwIGludG8gdGhlICJyZWd1bGFyIiBraWxsZWRJdGVtcyBhcnJh eSwgYW5kIGxldAorICogdGhhdCB0byBkcml2ZSB3aGljaCBpdGVtcyBhcmUga2lsbGVkLgor ICovCit2b2lkCitfYnRfa2lsbF9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2Nh bkJhdGNoIGJhdGNoKQoreworCUJUU2Nhbk9wYXF1ZSBzbyBQR19VU0VEX0ZPUl9BU1NFUlRT X09OTFkgPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwkvKiBiYXRjaGluZyBk b2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFz c2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2VydCghQlRTY2Fu UG9zSXNWYWxpZChzby0+bWFya1BvcykpOworCisJLyogd2Ugc2hvdWxkIG9ubHkgZ2V0IGhl cmUgZm9yIHNjYW5zIHdpdGggYmF0Y2hpbmcgKi8KKwlBc3NlcnQoc2Nhbi0+eHNfYmF0Y2hl cyk7CisKKwkvKiBiYWlsIG91dCBpZiB0aGUgYmF0Y2ggaGFzIG5vIGtpbGxlZCBpdGVtcyAq LworCWlmIChiYXRjaC0+bnVtS2lsbGVkID09IDApCisJCXJldHVybjsKKworCS8qCisJICog WFhYIE5vdyB3aGF0PyB3ZSBkb24ndCBoYXZlIHRoZSBjdXJyUG9zIGFyb3VuZCBhbnltb3Jl LCBzbyB3ZSBzaG91bGQKKwkgKiBsb2FkIHRoYXQsIGFuZCBhcHBseSB0aGUga2lsbGVkIGl0 ZW1zIHRvIHRoYXQsIHNvbWVob3c/CisJICovCisJLyogRklYTUU6IF9idF9raWxsX2JhdGNo IG5vdCBpbXBsZW1lbnRlZCAqLworCisJLyoKKwkgKiBYWFggbWF5YmUgd2Ugc2hvdWxkIGhh dmUgYSBzZXBhcmF0ZSBjYWxsYmFjayBmb3IgdGhpcywgYW5kIGNhbGwgaXQgZnJvbQorCSAq IHRoZSBpbmRleGFtLmMgZGlyZWN0bHkgd2hlbmV2ZXIgd2UgdGhpbmsgaXQncyBhcHByb3By aWF0ZT8gQW5kIG5vdCBvbmx5CisJICogZnJvbSBoZXJlIHdoZW4gZnJlZWluZyB0aGUgYmF0 Y2g/CisJICovCisJX2J0X2tpbGxpdGVtc19iYXRjaChzY2FuLCBiYXRjaCk7Cit9CisKKy8q CisgKglfYnRfcmVhZHBhZ2UoKSAtLSBMb2FkIGRhdGEgZnJvbSBjdXJyZW50IGluZGV4IHBh Z2UgaW50byBzby0+Y3VyclBvcworICoKKyAqIENhbGxlciBtdXN0IGhhdmUgcGlubmVkIGFu ZCByZWFkLWxvY2tlZCBzby0+Y3VyclBvcy5idWY7IHRoZSBidWZmZXIncyBzdGF0ZQorICog aXMgbm90IGNoYW5nZWQgaGVyZS4gIEFsc28sIGN1cnJQb3MubW9yZUxlZnQgYW5kIG1vcmVS aWdodCBtdXN0IGJlIHZhbGlkOworICogdGhleSBhcmUgdXBkYXRlZCBhcyBhcHByb3ByaWF0 ZS4gIEFsbCBvdGhlciBmaWVsZHMgb2Ygc28tPmN1cnJQb3MgYXJlCisgKiBpbml0aWFsaXpl ZCBmcm9tIHNjcmF0Y2ggaGVyZS4KKyAqCisgKiBXZSBzY2FuIHRoZSBjdXJyZW50IHBhZ2Ug c3RhcnRpbmcgYXQgb2ZmbnVtIGFuZCBtb3ZpbmcgaW4gdGhlIGluZGljYXRlZAorICogZGly ZWN0aW9uLiAgQWxsIGl0ZW1zIG1hdGNoaW5nIHRoZSBzY2FuIGtleXMgYXJlIGxvYWRlZCBp bnRvIGN1cnJQb3MuaXRlbXMuCisgKiBtb3JlTGVmdCBvciBtb3JlUmlnaHQgKGFzIGFwcHJv cHJpYXRlKSBpcyBjbGVhcmVkIGlmIF9idF9jaGVja2tleXMgcmVwb3J0cworICogdGhhdCB0 aGVyZSBjYW4gYmUgbm8gbW9yZSBtYXRjaGluZyB0dXBsZXMgaW4gdGhlIGN1cnJlbnQgc2Nh biBkaXJlY3Rpb24KKyAqIChjb3VsZCBqdXN0IGJlIGZvciB0aGUgY3VycmVudCBwcmltaXRp dmUgaW5kZXggc2NhbiB3aGVuIHNjYW4gaGFzIGFycmF5cykuCisgKgorICogSW4gdGhlIGNh c2Ugb2YgYSBwYXJhbGxlbCBzY2FuLCBjYWxsZXIgbXVzdCBoYXZlIGNhbGxlZCBfYnRfcGFy YWxsZWxfc2VpemUKKyAqIHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjsgdGhpcyBm dW5jdGlvbiB3aWxsIGludm9rZQorICogX2J0X3BhcmFsbGVsX3JlbGVhc2UgYmVmb3JlIHJl dHVybmluZy4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgYW55IG1hdGNoaW5nIGl0ZW1zIGZv dW5kIG9uIHRoZSBwYWdlLCBmYWxzZSBpZiBub25lLgorICovCitzdGF0aWMgYm9vbAorX2J0 X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNl dE51bWJlciBvZmZudW0sCisJCQkgYm9vbCBmaXJzdHBhZ2UpCit7CisJUmVsYXRpb24JcmVs ID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3Bh cXVlKSBzY2FuLT5vcGFxdWU7CisJUGFnZQkJcGFnZTsKKwlCVFBhZ2VPcGFxdWUgb3BhcXVl OworCU9mZnNldE51bWJlciBtaW5vZmY7CisJT2Zmc2V0TnVtYmVyIG1heG9mZjsKKwlCVFJl YWRQYWdlU3RhdGUgcHN0YXRlOworCWJvb2wJCWFycmF5S2V5czsKKwlpbnQJCQlpdGVtSW5k ZXgsCisJCQkJaW5kbmF0dHM7CisKKwkvKiBzYXZlIHRoZSBwYWdlL2J1ZmZlciBibG9jayBu dW1iZXIsIGFsb25nIHdpdGggaXRzIHNpYmxpbmcgbGlua3MgKi8KKwlwYWdlID0gQnVmZmVy R2V0UGFnZShzby0+Y3VyclBvcy5idWYpOworCW9wYXF1ZSA9IEJUUGFnZUdldE9wYXF1ZShw YWdlKTsKKwlzby0+Y3VyclBvcy5jdXJyUGFnZSA9IEJ1ZmZlckdldEJsb2NrTnVtYmVyKHNv LT5jdXJyUG9zLmJ1Zik7CisJc28tPmN1cnJQb3MucHJldlBhZ2UgPSBvcGFxdWUtPmJ0cG9f cHJldjsKKwlzby0+Y3VyclBvcy5uZXh0UGFnZSA9IG9wYXF1ZS0+YnRwb19uZXh0OworCisJ QXNzZXJ0KCFQX0lHTk9SRShvcGFxdWUpKTsKKwlBc3NlcnQoQlRTY2FuUG9zSXNQaW5uZWQo c28tPmN1cnJQb3MpKTsKKwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCisJaWYgKHNj YW4tPnBhcmFsbGVsX3NjYW4pCisJeworCQkvKiBhbGxvdyBuZXh0L3ByZXYgcGFnZSB0byBi ZSByZWFkIGJ5IG90aGVyIHdvcmtlciB3aXRob3V0IGRlbGF5ICovCisJCWlmIChTY2FuRGly ZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBz by0+Y3VyclBvcy5uZXh0UGFnZSwKKwkJCQkJCQkJIHNvLT5jdXJyUG9zLmN1cnJQYWdlKTsK KwkJZWxzZQorCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2Nhbiwgc28tPmN1cnJQb3MucHJl dlBhZ2UsCisJCQkJCQkJCSBzby0+Y3VyclBvcy5jdXJyUGFnZSk7CisJfQorCisJLyogaW5p dGlhbGl6ZSByZW1haW5pbmcgY3VyclBvcyBmaWVsZHMgcmVsYXRlZCB0byBjdXJyZW50IHBh Z2UgKi8KKwlzby0+Y3VyclBvcy5sc24gPSBCdWZmZXJHZXRMU05BdG9taWMoc28tPmN1cnJQ b3MuYnVmKTsKKwlzby0+Y3VyclBvcy5kaXIgPSBkaXI7CisJc28tPmN1cnJQb3MubmV4dFR1 cGxlT2Zmc2V0ID0gMDsKKwkvKiBlaXRoZXIgbW9yZUxlZnQgb3IgbW9yZVJpZ2h0IHNob3Vs ZCBiZSBzZXQgbm93IChtYXkgYmUgdW5zZXQgbGF0ZXIpICovCisJQXNzZXJ0KFNjYW5EaXJl Y3Rpb25Jc0ZvcndhcmQoZGlyKSA/IHNvLT5jdXJyUG9zLm1vcmVSaWdodCA6CisJCSAgIHNv LT5jdXJyUG9zLm1vcmVMZWZ0KTsKKworCVByZWRpY2F0ZUxvY2tQYWdlKHJlbCwgc28tPmN1 cnJQb3MuY3VyclBhZ2UsIHNjYW4tPnhzX3NuYXBzaG90KTsKKworCS8qIGluaXRpYWxpemUg bG9jYWwgdmFyaWFibGVzICovCisJaW5kbmF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVy T2ZBdHRyaWJ1dGVzKHJlbCk7CisJYXJyYXlLZXlzID0gc28tPm51bUFycmF5S2V5cyAhPSAw OworCW1pbm9mZiA9IFBfRklSU1REQVRBS0VZKG9wYXF1ZSk7CisJbWF4b2ZmID0gUGFnZUdl dE1heE9mZnNldE51bWJlcihwYWdlKTsKKworCS8qIGluaXRpYWxpemUgcGFnZS1sZXZlbCBz dGF0ZSB0aGF0IHdlJ2xsIHBhc3MgdG8gX2J0X2NoZWNra2V5cyAqLworCXBzdGF0ZS5taW5v ZmYgPSBtaW5vZmY7CisJcHN0YXRlLm1heG9mZiA9IG1heG9mZjsKKwlwc3RhdGUuZmluYWx0 dXAgPSBOVUxMOworCXBzdGF0ZS5wYWdlID0gcGFnZTsKKwlwc3RhdGUuZmlyc3RwYWdlID0g Zmlyc3RwYWdlOworCXBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7CisJcHN0YXRl LnN0YXJ0aWtleSA9IDA7CisJcHN0YXRlLm9mZm51bSA9IEludmFsaWRPZmZzZXROdW1iZXI7 CisJcHN0YXRlLnNraXAgPSBJbnZhbGlkT2Zmc2V0TnVtYmVyOworCXBzdGF0ZS5jb250aW51 ZXNjYW4gPSB0cnVlOyAvKiBkZWZhdWx0IGFzc3VtcHRpb24gKi8KKwlwc3RhdGUucmVjaGVj a3MgPSAwOworCXBzdGF0ZS50YXJnZXRkaXN0YW5jZSA9IDA7CisJcHN0YXRlLm5za2lwYWR2 YW5jZXMgPSAwOworCisJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwl7CisJ CS8qIFNLX1NFQVJDSEFSUkFZIGZvcndhcmQgc2NhbnMgbXVzdCBwcm92aWRlIGhpZ2gga2V5 IHVwIGZyb250ICovCisJCWlmIChhcnJheUtleXMpCisJCXsKKwkJCWlmICghUF9SSUdIVE1P U1Qob3BhcXVlKSkKKwkJCXsKKwkJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFn ZSwgUF9ISUtFWSk7CisKKwkJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFn ZUdldEl0ZW0ocGFnZSwgaWlkKTsKKworCQkJCWlmIChzby0+c2NhbkJlaGluZCAmJgorCQkJ CQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRpciwgcHN0YXRlLmZpbmFsdHVw KSkKKwkJCQl7CisJCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNj YW4gYWZ0ZXIgYWxsICovCisJCQkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZhbHNlOwor CQkJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKwkJCQkJaWYgKHNjYW4tPnBhcmFsbGVs X3NjYW4pCisJCQkJCQlfYnRfcGFyYWxsZWxfcHJpbXNjYW5fc2NoZWR1bGUoc2NhbiwKKwkJ CQkJCQkJCQkJCQkgICBzby0+Y3VyclBvcy5jdXJyUGFnZSk7CisJCQkJCXJldHVybiBmYWxz ZTsKKwkJCQl9CisJCQl9CisKKwkJCXNvLT5zY2FuQmVoaW5kID0gc28tPm9wcG9zaXRlRGly Q2hlY2sgPSBmYWxzZTsJLyogcmVzZXQgKi8KKwkJfQorCisJCS8qCisJCSAqIENvbnNpZGVy IHBzdGF0ZS5zdGFydGlrZXkgb3B0aW1pemF0aW9uIG9uY2UgdGhlIG9uZ29pbmcgcHJpbWl0 aXZlCisJCSAqIGluZGV4IHNjYW4gaGFzIGFscmVhZHkgcmVhZCBhdCBsZWFzdCBvbmUgcGFn ZQorCQkgKi8KKwkJaWYgKCFwc3RhdGUuZmlyc3RwYWdlICYmIG1pbm9mZiA8IG1heG9mZikK KwkJCV9idF9zZXRfc3RhcnRpa2V5KHNjYW4sICZwc3RhdGUpOworCisJCS8qIGxvYWQgaXRl bXNbXSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KKwkJaXRlbUluZGV4ID0gMDsKKworCQlvZmZu dW0gPSBNYXgob2ZmbnVtLCBtaW5vZmYpOworCisJCXdoaWxlIChvZmZudW0gPD0gbWF4b2Zm KQorCQl7CisJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsK KwkJCUluZGV4VHVwbGUJaXR1cDsKKwkJCWJvb2wJCXBhc3Nlc19xdWFsczsKKworCQkJLyoK KwkJCSAqIElmIHRoZSBzY2FuIHNwZWNpZmllcyBub3QgdG8gcmV0dXJuIGtpbGxlZCB0dXBs ZXMsIHRoZW4gd2UKKwkJCSAqIHRyZWF0IGEga2lsbGVkIHR1cGxlIGFzIG5vdCBwYXNzaW5n IHRoZSBxdWFsCisJCQkgKi8KKwkJCWlmIChzY2FuLT5pZ25vcmVfa2lsbGVkX3R1cGxlcyAm JiBJdGVtSWRJc0RlYWQoaWlkKSkKKwkJCXsKKwkJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJO ZXh0KG9mZm51bSk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWl0dXAgPSAoSW5kZXhU dXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJCUFzc2VydCghQlRyZWVUdXBsZUlz UGl2b3QoaXR1cCkpOworCisJCQlwc3RhdGUub2ZmbnVtID0gb2ZmbnVtOworCQkJcGFzc2Vz X3F1YWxzID0gX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBhcnJheUtleXMsCisJCQkJ CQkJCQkJIGl0dXAsIGluZG5hdHRzKTsKKworCQkJLyoKKwkJCSAqIENoZWNrIGlmIHdlIG5l ZWQgdG8gc2tpcCBhaGVhZCB0byBhIGxhdGVyIHR1cGxlIChvbmx5IHBvc3NpYmxlCisJCQkg KiB3aGVuIHRoZSBzY2FuIHVzZXMgYXJyYXkga2V5cykKKwkJCSAqLworCQkJaWYgKGFycmF5 S2V5cyAmJiBPZmZzZXROdW1iZXJJc1ZhbGlkKHBzdGF0ZS5za2lwKSkKKwkJCXsKKwkJCQlB c3NlcnQoIXBhc3Nlc19xdWFscyAmJiBwc3RhdGUuY29udGludWVzY2FuKTsKKwkJCQlBc3Nl cnQob2ZmbnVtIDwgcHN0YXRlLnNraXApOworCQkJCUFzc2VydCghcHN0YXRlLmZvcmNlbm9u cmVxdWlyZWQpOworCisJCQkJb2ZmbnVtID0gcHN0YXRlLnNraXA7CisJCQkJcHN0YXRlLnNr aXAgPSBJbnZhbGlkT2Zmc2V0TnVtYmVyOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlp ZiAocGFzc2VzX3F1YWxzKQorCQkJeworCQkJCS8qIHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBr ZXkgY29uZGl0aW9ucyAqLworCQkJCWlmICghQlRyZWVUdXBsZUlzUG9zdGluZyhpdHVwKSkK KwkJCQl7CisJCQkJCS8qIFJlbWVtYmVyIGl0ICovCisJCQkJCV9idF9zYXZlaXRlbShzbywg aXRlbUluZGV4LCBvZmZudW0sIGl0dXApOworCQkJCQlpdGVtSW5kZXgrKzsKKwkJCQl9CisJ CQkJZWxzZQorCQkJCXsKKwkJCQkJaW50CQkJdHVwbGVPZmZzZXQ7CisKKwkJCQkJLyoKKwkJ CQkJICogU2V0IHVwIHN0YXRlIHRvIHJldHVybiBwb3N0aW5nIGxpc3QsIGFuZCByZW1lbWJl ciBmaXJzdAorCQkJCQkgKiBUSUQKKwkJCQkJICovCisJCQkJCXR1cGxlT2Zmc2V0ID0KKwkJ CQkJCV9idF9zZXR1cHBvc3RpbmdpdGVtcyhzbywgaXRlbUluZGV4LCBvZmZudW0sCisJCQkJ CQkJCQkJCSAgQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIDApLAorCQkJCQkJCQkJCQkg IGl0dXApOworCQkJCQlpdGVtSW5kZXgrKzsKKwkJCQkJLyogUmVtZW1iZXIgYWRkaXRpb25h bCBUSURzICovCisJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgQlRyZWVUdXBsZUdldE5Qb3N0 aW5nKGl0dXApOyBpKyspCisJCQkJCXsKKwkJCQkJCV9idF9zYXZlcG9zdGluZ2l0ZW0oc28s IGl0ZW1JbmRleCwgb2ZmbnVtLAorCQkJCQkJCQkJCQlCVHJlZVR1cGxlR2V0UG9zdGluZ04o aXR1cCwgaSksCisJCQkJCQkJCQkJCXR1cGxlT2Zmc2V0KTsKKwkJCQkJCWl0ZW1JbmRleCsr OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJLyogV2hlbiAhY29udGludWVzY2FuLCB0aGVy ZSBjYW4ndCBiZSBhbnkgbW9yZSBtYXRjaGVzLCBzbyBzdG9wICovCisJCQlpZiAoIXBzdGF0 ZS5jb250aW51ZXNjYW4pCisJCQkJYnJlYWs7CisKKwkJCW9mZm51bSA9IE9mZnNldE51bWJl ck5leHQob2ZmbnVtKTsKKwkJfQorCisJCS8qCisJCSAqIFdlIGRvbid0IG5lZWQgdG8gdmlz aXQgcGFnZSB0byB0aGUgcmlnaHQgd2hlbiB0aGUgaGlnaCBrZXkKKwkJICogaW5kaWNhdGVz IHRoYXQgbm8gbW9yZSBtYXRjaGVzIHdpbGwgYmUgZm91bmQgdGhlcmUuCisJCSAqCisJCSAq IENoZWNraW5nIHRoZSBoaWdoIGtleSBsaWtlIHRoaXMgd29ya3Mgb3V0IG1vcmUgb2Z0ZW4g dGhhbiB5b3UgbWlnaHQKKwkJICogdGhpbmsuICBMZWFmIHBhZ2Ugc3BsaXRzIHBpY2sgYSBz cGxpdCBwb2ludCBiZXR3ZWVuIHRoZSB0d28gbW9zdAorCQkgKiBkaXNzaW1pbGFyIHR1cGxl cyAodGhpcyBpcyB3ZWlnaGVkIGFnYWluc3QgdGhlIG5lZWQgdG8gZXZlbmx5IHNoYXJlCisJ CSAqIGZyZWUgc3BhY2UpLiAgTGVhZiBwYWdlcyB3aXRoIGhpZ2gga2V5IGF0dHJpYnV0ZSB2 YWx1ZXMgdGhhdCBjYW4KKwkJICogb25seSBhcHBlYXIgb24gbm9uLXBpdm90IHR1cGxlcyBv biB0aGUgcmlnaHQgc2libGluZyBwYWdlIGFyZQorCQkgKiBjb21tb24uCisJCSAqLworCQlp ZiAocHN0YXRlLmNvbnRpbnVlc2NhbiAmJiAhc28tPnNjYW5CZWhpbmQgJiYgIVBfUklHSFRN T1NUKG9wYXF1ZSkpCisJCXsKKwkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdl LCBQX0hJS0VZKTsKKwkJCUluZGV4VHVwbGUJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0 SXRlbShwYWdlLCBpaWQpOworCQkJaW50CQkJdHJ1bmNhdHQ7CisKKwkJCXRydW5jYXR0ID0g QlRyZWVUdXBsZUdldE5BdHRzKGl0dXAsIHJlbCk7CisJCQlwc3RhdGUuZm9yY2Vub25yZXF1 aXJlZCA9IGZhbHNlOworCQkJcHN0YXRlLnN0YXJ0aWtleSA9IDA7CS8qIF9idF9zZXRfc3Rh cnRpa2V5IGlnbm9yZXMgUF9ISUtFWSAqLworCQkJX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0 YXRlLCBhcnJheUtleXMsIGl0dXAsIHRydW5jYXR0KTsKKwkJfQorCisJCWlmICghcHN0YXRl LmNvbnRpbnVlc2NhbikKKwkJCXNvLT5jdXJyUG9zLm1vcmVSaWdodCA9IGZhbHNlOworCisJ CUFzc2VydChpdGVtSW5kZXggPD0gTWF4VElEc1BlckJUcmVlUGFnZSk7CisJCXNvLT5jdXJy UG9zLmZpcnN0SXRlbSA9IDA7CisJCXNvLT5jdXJyUG9zLmxhc3RJdGVtID0gaXRlbUluZGV4 IC0gMTsKKwkJc28tPmN1cnJQb3MuaXRlbUluZGV4ID0gMDsKKwl9CisJZWxzZQorCXsKKwkJ LyogU0tfU0VBUkNIQVJSQVkgYmFja3dhcmQgc2NhbnMgbXVzdCBwcm92aWRlIGZpbmFsIHR1 cGxlIHVwIGZyb250ICovCisJCWlmIChhcnJheUtleXMpCisJCXsKKwkJCWlmIChtaW5vZmYg PD0gbWF4b2ZmICYmICFQX0xFRlRNT1NUKG9wYXF1ZSkpCisJCQl7CisJCQkJSXRlbUlkCQlp aWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIG1pbm9mZik7CisKKwkJCQlwc3RhdGUuZmluYWx0 dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKworCQkJCWlmIChz by0+c2NhbkJlaGluZCAmJgorCQkJCQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4s IGRpciwgcHN0YXRlLmZpbmFsdHVwKSkKKwkJCQl7CisJCQkJCS8qIFNjaGVkdWxlIGFub3Ro ZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gYWZ0ZXIgYWxsICovCisJCQkJCXNvLT5jdXJyUG9z Lm1vcmVMZWZ0ID0gZmFsc2U7CisJCQkJCXNvLT5uZWVkUHJpbVNjYW4gPSB0cnVlOworCQkJ CQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbikKKwkJCQkJCV9idF9wYXJhbGxlbF9wcmltc2Nh bl9zY2hlZHVsZShzY2FuLAorCQkJCQkJCQkJCQkJCSAgIHNvLT5jdXJyUG9zLmN1cnJQYWdl KTsKKwkJCQkJcmV0dXJuIGZhbHNlOworCQkJCX0KKwkJCX0KKworCQkJc28tPnNjYW5CZWhp bmQgPSBzby0+b3Bwb3NpdGVEaXJDaGVjayA9IGZhbHNlOwkvKiByZXNldCAqLworCQl9CisK KwkJLyoKKwkJICogQ29uc2lkZXIgcHN0YXRlLnN0YXJ0aWtleSBvcHRpbWl6YXRpb24gb25j ZSB0aGUgb25nb2luZyBwcmltaXRpdmUKKwkJICogaW5kZXggc2NhbiBoYXMgYWxyZWFkeSBy ZWFkIGF0IGxlYXN0IG9uZSBwYWdlCisJCSAqLworCQlpZiAoIXBzdGF0ZS5maXJzdHBhZ2Ug JiYgbWlub2ZmIDwgbWF4b2ZmKQorCQkJX2J0X3NldF9zdGFydGlrZXkoc2NhbiwgJnBzdGF0 ZSk7CisKKwkJLyogbG9hZCBpdGVtc1tdIGluIGRlc2NlbmRpbmcgb3JkZXIgKi8KKwkJaXRl bUluZGV4ID0gTWF4VElEc1BlckJUcmVlUGFnZTsKKworCQlvZmZudW0gPSBNaW4ob2ZmbnVt LCBtYXhvZmYpOworCisJCXdoaWxlIChvZmZudW0gPj0gbWlub2ZmKQorCQl7CisJCQlJdGVt SWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsKKwkJCUluZGV4VHVwbGUJ aXR1cDsKKwkJCWJvb2wJCXR1cGxlX2FsaXZlOworCQkJYm9vbAkJcGFzc2VzX3F1YWxzOwor CisJCQkvKgorCQkJICogSWYgdGhlIHNjYW4gc3BlY2lmaWVzIG5vdCB0byByZXR1cm4ga2ls bGVkIHR1cGxlcywgdGhlbiB3ZQorCQkJICogdHJlYXQgYSBraWxsZWQgdHVwbGUgYXMgbm90 IHBhc3NpbmcgdGhlIHF1YWwuICBNb3N0IG9mIHRoZQorCQkJICogdGltZSwgaXQncyBhIHdp biB0byBub3QgYm90aGVyIGV4YW1pbmluZyB0aGUgdHVwbGUncyBpbmRleAorCQkJICoga2V5 cywgYnV0IGp1c3Qgc2tpcCB0byB0aGUgbmV4dCB0dXBsZSAocHJldmlvdXMsIGFjdHVhbGx5 LAorCQkJICogc2luY2Ugd2UncmUgc2Nhbm5pbmcgYmFja3dhcmRzKS4gIEhvd2V2ZXIsIGlm IHRoaXMgaXMgdGhlIGZpcnN0CisJCQkgKiB0dXBsZSBvbiB0aGUgcGFnZSwgd2UgZG8gY2hl Y2sgdGhlIGluZGV4IGtleXMsIHRvIHByZXZlbnQKKwkJCSAqIHVzZWxlc3NseSBhZHZhbmNp bmcgdG8gdGhlIHBhZ2UgdG8gdGhlIGxlZnQuICBUaGlzIGlzIHNpbWlsYXIKKwkJCSAqIHRv IHRoZSBoaWdoIGtleSBvcHRpbWl6YXRpb24gdXNlZCBieSBmb3J3YXJkIHNjYW5zLgorCQkJ ICovCisJCQlpZiAoc2Nhbi0+aWdub3JlX2tpbGxlZF90dXBsZXMgJiYgSXRlbUlkSXNEZWFk KGlpZCkpCisJCQl7CisJCQkJaWYgKG9mZm51bSA+IG1pbm9mZikKKwkJCQl7CisJCQkJCW9m Zm51bSA9IE9mZnNldE51bWJlclByZXYob2ZmbnVtKTsKKwkJCQkJY29udGludWU7CisJCQkJ fQorCisJCQkJdHVwbGVfYWxpdmUgPSBmYWxzZTsKKwkJCX0KKwkJCWVsc2UKKwkJCQl0dXBs ZV9hbGl2ZSA9IHRydWU7CisKKwkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0o cGFnZSwgaWlkKTsKKwkJCUFzc2VydCghQlRyZWVUdXBsZUlzUGl2b3QoaXR1cCkpOworCisJ CQlwc3RhdGUub2ZmbnVtID0gb2ZmbnVtOworCQkJaWYgKGFycmF5S2V5cyAmJiBvZmZudW0g PT0gbWlub2ZmICYmIHBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkKQorCQkJeworCQkJCXBzdGF0 ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7CisJCQkJcHN0YXRlLnN0YXJ0aWtleSA9IDA7 CisJCQl9CisJCQlwYXNzZXNfcXVhbHMgPSBfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUs IGFycmF5S2V5cywKKwkJCQkJCQkJCQkgaXR1cCwgaW5kbmF0dHMpOworCisJCQlpZiAoYXJy YXlLZXlzICYmIHNvLT5zY2FuQmVoaW5kKQorCQkJeworCQkJCS8qCisJCQkJICogRG9uZSBz Y2FubmluZyB0aGlzIHBhZ2UsIGJ1dCBub3QgZG9uZSB3aXRoIHRoZSBjdXJyZW50CisJCQkJ ICogcHJpbXNjYW4uCisJCQkJICoKKwkJCQkgKiBOb3RlOiBGb3J3YXJkIHNjYW5zIGRvbid0 IGNoZWNrIHRoaXMgZXhwbGljaXRseSwgc2luY2UgdGhleQorCQkJCSAqIHByZWZlciB0byBy ZXVzZSBwc3RhdGUuc2tpcCBmb3IgdGhpcyBpbnN0ZWFkLgorCQkJCSAqLworCQkJCUFzc2Vy dCghcGFzc2VzX3F1YWxzICYmIHBzdGF0ZS5jb250aW51ZXNjYW4pOworCQkJCUFzc2VydCgh cHN0YXRlLmZvcmNlbm9ucmVxdWlyZWQpOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8q CisJCQkgKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNraXAgYWhlYWQgdG8gYSBsYXRlciB0dXBs ZSAob25seSBwb3NzaWJsZQorCQkJICogd2hlbiB0aGUgc2NhbiB1c2VzIGFycmF5IGtleXMp CisJCQkgKi8KKwkJCWlmIChhcnJheUtleXMgJiYgT2Zmc2V0TnVtYmVySXNWYWxpZChwc3Rh dGUuc2tpcCkpCisJCQl7CisJCQkJQXNzZXJ0KCFwYXNzZXNfcXVhbHMgJiYgcHN0YXRlLmNv bnRpbnVlc2Nhbik7CisJCQkJQXNzZXJ0KG9mZm51bSA+IHBzdGF0ZS5za2lwKTsKKwkJCQlB c3NlcnQoIXBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkKTsKKworCQkJCW9mZm51bSA9IHBzdGF0 ZS5za2lwOworCQkJCXBzdGF0ZS5za2lwID0gSW52YWxpZE9mZnNldE51bWJlcjsKKwkJCQlj b250aW51ZTsKKwkJCX0KKworCQkJaWYgKHBhc3Nlc19xdWFscyAmJiB0dXBsZV9hbGl2ZSkK KwkJCXsKKwkJCQkvKiB0dXBsZSBwYXNzZXMgYWxsIHNjYW4ga2V5IGNvbmRpdGlvbnMgKi8K KwkJCQlpZiAoIUJUcmVlVHVwbGVJc1Bvc3RpbmcoaXR1cCkpCisJCQkJeworCQkJCQkvKiBS ZW1lbWJlciBpdCAqLworCQkJCQlpdGVtSW5kZXgtLTsKKwkJCQkJX2J0X3NhdmVpdGVtKHNv LCBpdGVtSW5kZXgsIG9mZm51bSwgaXR1cCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJ CQkJCWludAkJCXR1cGxlT2Zmc2V0OworCisJCQkJCS8qCisJCQkJCSAqIFNldCB1cCBzdGF0 ZSB0byByZXR1cm4gcG9zdGluZyBsaXN0LCBhbmQgcmVtZW1iZXIgZmlyc3QKKwkJCQkJICog VElELgorCQkJCQkgKgorCQkJCQkgKiBOb3RlIHRoYXQgd2UgZGVsaWJlcmF0ZWx5IHNhdmUv cmV0dXJuIGl0ZW1zIGZyb20KKwkJCQkJICogcG9zdGluZyBsaXN0cyBpbiBhc2NlbmRpbmcg aGVhcCBUSUQgb3JkZXIgZm9yIGJhY2t3YXJkcworCQkJCQkgKiBzY2Fucy4gIFRoaXMgYWxs b3dzIF9idF9raWxsaXRlbXMoKSB0byBtYWtlIGEKKwkJCQkJICogY29uc2lzdGVudCBhc3N1 bXB0aW9uIGFib3V0IHRoZSBvcmRlciBvZiBpdGVtcworCQkJCQkgKiBhc3NvY2lhdGVkIHdp dGggdGhlIHNhbWUgcG9zdGluZyBsaXN0IHR1cGxlLgorCQkJCQkgKi8KKwkJCQkJaXRlbUlu ZGV4LS07CisJCQkJCXR1cGxlT2Zmc2V0ID0KKwkJCQkJCV9idF9zZXR1cHBvc3RpbmdpdGVt cyhzbywgaXRlbUluZGV4LCBvZmZudW0sCisJCQkJCQkJCQkJCSAgQlRyZWVUdXBsZUdldFBv c3RpbmdOKGl0dXAsIDApLAorCQkJCQkJCQkJCQkgIGl0dXApOworCQkJCQkvKiBSZW1lbWJl ciBhZGRpdGlvbmFsIFRJRHMgKi8KKwkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBCVHJlZVR1 cGxlR2V0TlBvc3RpbmcoaXR1cCk7IGkrKykKKwkJCQkJeworCQkJCQkJaXRlbUluZGV4LS07 CisJCQkJCQlfYnRfc2F2ZXBvc3RpbmdpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKKwkJ CQkJCQkJCQkJQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAorCQkJCQkJCQkJCQl0 dXBsZU9mZnNldCk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKiBXaGVuICFjb250aW51 ZXNjYW4sIHRoZXJlIGNhbid0IGJlIGFueSBtb3JlIG1hdGNoZXMsIHNvIHN0b3AgKi8KKwkJ CWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKKwkJCQlicmVhazsKKworCQkJb2ZmbnVtID0g T2Zmc2V0TnVtYmVyUHJldihvZmZudW0pOworCQl9CisKKwkJLyoKKwkJICogV2UgZG9uJ3Qg bmVlZCB0byB2aXNpdCBwYWdlIHRvIHRoZSBsZWZ0IHdoZW4gbm8gbW9yZSBtYXRjaGVzIHdp bGwKKwkJICogYmUgZm91bmQgdGhlcmUKKwkJICovCisJCWlmICghcHN0YXRlLmNvbnRpbnVl c2NhbikKKwkJCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gZmFsc2U7CisKKwkJQXNzZXJ0KGl0 ZW1JbmRleCA+PSAwKTsKKwkJc28tPmN1cnJQb3MuZmlyc3RJdGVtID0gaXRlbUluZGV4Owor CQlzby0+Y3VyclBvcy5sYXN0SXRlbSA9IE1heFRJRHNQZXJCVHJlZVBhZ2UgLSAxOworCQlz by0+Y3VyclBvcy5pdGVtSW5kZXggPSBNYXhUSURzUGVyQlRyZWVQYWdlIC0gMTsKKwl9CisK KwkvKgorCSAqIElmIF9idF9zZXRfc3RhcnRpa2V5IHRvbGQgdXMgdG8gdGVtcG9yYXJpbHkg dHJlYXQgdGhlIHNjYW4ncyBrZXlzIGFzCisJICogbm9ucmVxdWlyZWQgKHBvc3NpYmxlIG9u bHkgZHVyaW5nIHNjYW5zIHdpdGggYXJyYXkga2V5cyksIHRoZXJlIG11c3QgYmUKKwkgKiBu byBsYXN0aW5nIGNvbnNlcXVlbmNlcyBmb3IgdGhlIHNjYW4ncyBhcnJheSBrZXlzLiAgVGhl IHNjYW4ncyBhcnJheXMKKwkgKiBzaG91bGQgbm93IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBl bGVtZW50cyBhcyB0aGV5IHdvdWxkIGhhdmUgaGFkIGlmIHRoZQorCSAqIG5vbnJlcXVpcmVk IGJlaGF2aW9yIGhhZCBuZXZlciBiZWVuIHVzZWQuICAoSW4gZ2VuZXJhbCwgYSBzY2FuJ3Mg YXJyYXlzCisJICogYXJlIGV4cGVjdGVkIHRvIHRyYWNrIGl0cyBwcm9ncmVzcyB0aHJvdWdo IHRoZSBpbmRleCdzIGtleSBzcGFjZS4pCisJICoKKwkgKiBXZSBhcmUgcmVxdWlyZWQgKGJ5 IF9idF9zZXRfc3RhcnRpa2V5KSB0byBjYWxsIF9idF9jaGVja2tleXMgYWdhaW5zdAorCSAq IHBzdGF0ZS5maW5hbHR1cCB3aXRoIHBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkPWZhbHNlIHRv IGFsbG93IHRoZSBzY2FuJ3MKKwkgKiBhcnJheXMgdG8gcmVjb3Zlci4gIEFzc2VydCB0aGF0 IHRoYXQgc3RlcCBoYXNuJ3QgYmVlbiBtaXNzZWQuCisJICovCisJQXNzZXJ0KCFwc3RhdGUu Zm9yY2Vub25yZXF1aXJlZCk7CisKKwlyZXR1cm4gKHNvLT5jdXJyUG9zLmZpcnN0SXRlbSA8 PSBzby0+Y3VyclBvcy5sYXN0SXRlbSk7Cit9CisKK3N0YXRpYyBJbmRleFNjYW5CYXRjaAor X2J0X3JlYWRwYWdlX2JhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3Mg cG9zLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKKwkJCQkgICBi b29sIGZpcnN0cGFnZSkKK3sKKwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9u OworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlQ YWdlCQlwYWdlOworCUJUUGFnZU9wYXF1ZSBvcGFxdWU7CisJT2Zmc2V0TnVtYmVyIG1pbm9m ZjsKKwlPZmZzZXROdW1iZXIgbWF4b2ZmOworCUJUUmVhZFBhZ2VTdGF0ZSBwc3RhdGU7CisJ Ym9vbAkJYXJyYXlLZXlzOworCWludAkJCWl0ZW1JbmRleCwKKwkJCQlpbmRuYXR0czsKKwor CS8qIHJlc3VsdCAqLworCS8qIEluZGV4U2NhbkJhdGNoIGJhdGNoID0gZGRkOyAqLworCUlu ZGV4U2NhbkJhdGNoIGJhdGNoOworCisJLyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRo IHJlZ3VsYXIgc2Nhbi1sZXZlbCBwb3NpdGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lz VmFsaWQoc28tPmN1cnJQb3MpKTsKKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1h cmtQb3MpKTsKKworCS8qCisJICogRklYTUUgZmFrZSBmb3IgX2J0X2NoZWNra2V5cywgbmVl ZHMgdG8gYmUgc2V0IHByb3Blcmx5IGVsc2V3aGVyZSAobm90CisJICogc3VyZSB3aGVyZSkK KwkgKi8KKworCS8qCisJICogWFhYIHdlIHNob3VsZG4ndCBiZSBwYXNzaW5nIHRoaXMgaW5m byB0aHJvdWdoIGN1cnJQb3MgYnV0IGRpcmVjdGx5LCBJCisJICogZ3Vlc3MuCisJICovCisJ c28tPmN1cnJQb3MuZGlyID0gZGlyOworCisJLyoKKwkgKiBYWFggV2UgY2FuIHBhc3MgdGhl IGV4YWN0IG51bWJlciBpZiBpdGVtcyBmcm9tIHRoaXMgcGFnZSwgYnkgdXNpbmcKKwkgKiBt YXhvZmYKKwkgKi8KKwliYXRjaCA9IGluZGV4X2JhdGNoX2FsbG9jKE1heFRJRHNQZXJCVHJl ZVBhZ2UsIHNjYW4tPnhzX3dhbnRfaXR1cCk7CisKKwkvKiBGSVhNRSBidXQgd2UgZG9uJ3Qg Y29weSB0aGUgY29udGVudHMgdW50aWwgdGhlIGVuZCAqLworCWJhdGNoLT5vcGFxdWUgPSBw YWxsb2MwKHNpemVvZihCVEJhdGNoU2NhblBvc0RhdGEpKTsKKworCS8qIGJvZ3VzIHZhbHVl cyAqLworCWJhdGNoLT5maXJzdEl0ZW0gPSAtMTsKKwliYXRjaC0+bGFzdEl0ZW0gPSAtMTsK KwliYXRjaC0+aXRlbUluZGV4ID0gLTE7CisKKwkvKiBpZiAoc28tPmN1cnJUdXBsZXMpICov CisJLyogeyAqLworCS8qIGJhdGNoLT5jdXJyVHVwbGVzID0gKGNoYXIgKikgcGFsbG9jKEJM Q0tTWik7ICovCisJLyogbWVtY3B5KGJhdGNoLT5jdXJyVHVwbGVzLCBzby0+Y3VyclR1cGxl cywgQkxDS1NaKTsgKi8KKwkvKiB9ICovCisKKwkvKiBzYXZlIHRoZSBwYWdlL2J1ZmZlciBi bG9jayBudW1iZXIsIGFsb25nIHdpdGggaXRzIHNpYmxpbmcgbGlua3MgKi8KKwlwYWdlID0g QnVmZmVyR2V0UGFnZShwb3MtPmJ1Zik7CisJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBh Z2UpOworCXBvcy0+Y3VyclBhZ2UgPSBCdWZmZXJHZXRCbG9ja051bWJlcihwb3MtPmJ1Zik7 CisJcG9zLT5wcmV2UGFnZSA9IG9wYXF1ZS0+YnRwb19wcmV2OworCXBvcy0+bmV4dFBhZ2Ug PSBvcGFxdWUtPmJ0cG9fbmV4dDsKKworCUFzc2VydCghUF9JR05PUkUob3BhcXVlKSk7CisJ QXNzZXJ0KEJUQmF0Y2hTY2FuUG9zSXNQaW5uZWQoKnBvcykpOworCUFzc2VydCghc28tPm5l ZWRQcmltU2Nhbik7CisKKwlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbikKKwl7CisJCS8qIGFs bG93IG5leHQvcHJldiBwYWdlIHRvIGJlIHJlYWQgYnkgb3RoZXIgd29ya2VyIHdpdGhvdXQg ZGVsYXkgKi8KKwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCV9idF9w YXJhbGxlbF9yZWxlYXNlKHNjYW4sIHBvcy0+bmV4dFBhZ2UsCisJCQkJCQkJCSBwb3MtPmN1 cnJQYWdlKTsKKwkJZWxzZQorCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2NhbiwgcG9zLT5w cmV2UGFnZSwKKwkJCQkJCQkJIHBvcy0+Y3VyclBhZ2UpOworCX0KKworCS8qIGluaXRpYWxp emUgcmVtYWluaW5nIGN1cnJQb3MgZmllbGRzIHJlbGF0ZWQgdG8gY3VycmVudCBwYWdlICov CisJcG9zLT5sc24gPSBCdWZmZXJHZXRMU05BdG9taWMocG9zLT5idWYpOworCXBvcy0+ZGly ID0gZGlyOworCXBvcy0+bmV4dFR1cGxlT2Zmc2V0ID0gMDsKKwkvKiBlaXRoZXIgbW9yZUxl ZnQgb3IgbW9yZVJpZ2h0IHNob3VsZCBiZSBzZXQgbm93IChtYXkgYmUgdW5zZXQgbGF0ZXIp ICovCisJQXNzZXJ0KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSA/IHBvcy0+bW9yZVJp Z2h0IDogcG9zLT5tb3JlTGVmdCk7CisKKwlQcmVkaWNhdGVMb2NrUGFnZShyZWwsIHBvcy0+ Y3VyclBhZ2UsIHNjYW4tPnhzX3NuYXBzaG90KTsKKworCS8qIGluaXRpYWxpemUgbG9jYWwg dmFyaWFibGVzICovCisJaW5kbmF0dHMgPSBJbmRleFJlbGF0aW9uR2V0TnVtYmVyT2ZBdHRy aWJ1dGVzKHJlbCk7CisJYXJyYXlLZXlzID0gc28tPm51bUFycmF5S2V5cyAhPSAwOworCW1p bm9mZiA9IFBfRklSU1REQVRBS0VZKG9wYXF1ZSk7CisJbWF4b2ZmID0gUGFnZUdldE1heE9m ZnNldE51bWJlcihwYWdlKTsKKworCS8qIGluaXRpYWxpemUgcGFnZS1sZXZlbCBzdGF0ZSB0 aGF0IHdlJ2xsIHBhc3MgdG8gX2J0X2NoZWNra2V5cyAqLworCXBzdGF0ZS5taW5vZmYgPSBt aW5vZmY7CisJcHN0YXRlLm1heG9mZiA9IG1heG9mZjsKKwlwc3RhdGUuZmluYWx0dXAgPSBO VUxMOworCXBzdGF0ZS5wYWdlID0gcGFnZTsKKwlwc3RhdGUuZmlyc3RwYWdlID0gZmlyc3Rw YWdlOworCXBzdGF0ZS5mb3JjZW5vbnJlcXVpcmVkID0gZmFsc2U7CisJcHN0YXRlLnN0YXJ0 aWtleSA9IDA7CisJcHN0YXRlLm9mZm51bSA9IEludmFsaWRPZmZzZXROdW1iZXI7CisJcHN0 YXRlLnNraXAgPSBJbnZhbGlkT2Zmc2V0TnVtYmVyOworCXBzdGF0ZS5jb250aW51ZXNjYW4g PSB0cnVlOyAvKiBkZWZhdWx0IGFzc3VtcHRpb24gKi8KKwlwc3RhdGUucmVjaGVja3MgPSAw OworCXBzdGF0ZS50YXJnZXRkaXN0YW5jZSA9IDA7CisJcHN0YXRlLm5za2lwYWR2YW5jZXMg PSAwOworCisJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwl7CisJCS8qIFNL X1NFQVJDSEFSUkFZIGZvcndhcmQgc2NhbnMgbXVzdCBwcm92aWRlIGhpZ2gga2V5IHVwIGZy b250ICovCisJCWlmIChhcnJheUtleXMpCisJCXsKKwkJCWlmICghUF9SSUdIVE1PU1Qob3Bh cXVlKSkKKwkJCXsKKwkJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgUF9I SUtFWSk7CisKKwkJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0 ZW0ocGFnZSwgaWlkKTsKKworCQkJCWlmIChzby0+c2NhbkJlaGluZCAmJgorCQkJCQkhX2J0 X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRpciwgcHN0YXRlLmZpbmFsdHVwKSkKKwkJ CQl7CisJCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gYWZ0 ZXIgYWxsICovCisJCQkJCXBvcy0+bW9yZVJpZ2h0ID0gZmFsc2U7CisJCQkJCXNvLT5uZWVk UHJpbVNjYW4gPSB0cnVlOworCQkJCQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2NhbikKKwkJCQkJ CV9idF9wYXJhbGxlbF9wcmltc2Nhbl9zY2hlZHVsZShzY2FuLAorCQkJCQkJCQkJCQkJCSAg IHBvcy0+Y3VyclBhZ2UpOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisJCQl9CisKKwkJ CXNvLT5zY2FuQmVoaW5kID0gc28tPm9wcG9zaXRlRGlyQ2hlY2sgPSBmYWxzZTsJLyogcmVz ZXQgKi8KKwkJfQorCisJCS8qCisJCSAqIENvbnNpZGVyIHBzdGF0ZS5zdGFydGlrZXkgb3B0 aW1pemF0aW9uIG9uY2UgdGhlIG9uZ29pbmcgcHJpbWl0aXZlCisJCSAqIGluZGV4IHNjYW4g aGFzIGFscmVhZHkgcmVhZCBhdCBsZWFzdCBvbmUgcGFnZQorCQkgKi8KKwkJaWYgKCFwc3Rh dGUuZmlyc3RwYWdlICYmIG1pbm9mZiA8IG1heG9mZikKKwkJCV9idF9zZXRfc3RhcnRpa2V5 KHNjYW4sICZwc3RhdGUpOworCisJCS8qIGxvYWQgaXRlbXNbXSBpbiBhc2NlbmRpbmcgb3Jk ZXIgKi8KKwkJaXRlbUluZGV4ID0gMDsKKworCQlvZmZudW0gPSBNYXgob2ZmbnVtLCBtaW5v ZmYpOworCisJCXdoaWxlIChvZmZudW0gPD0gbWF4b2ZmKQorCQl7CisJCQlJdGVtSWQJCWlp ZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsKKwkJCUluZGV4VHVwbGUJaXR1cDsK IAkJCWJvb2wJCXBhc3Nlc19xdWFsczsKIAogCQkJLyoKQEAgLTE3NDAsNyArMjk5NCw3IEBA IF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBP ZmZzZXROdW1iZXIgb2ZmbnVtLAogCQkJCWlmICghQlRyZWVUdXBsZUlzUG9zdGluZyhpdHVw KSkKIAkJCQl7CiAJCQkJCS8qIFJlbWVtYmVyIGl0ICovCi0JCQkJCV9idF9zYXZlaXRlbShz bywgaXRlbUluZGV4LCBvZmZudW0sIGl0dXApOworCQkJCQlfYnRfc2F2ZWl0ZW1fYmF0Y2go YmF0Y2gsIGl0ZW1JbmRleCwgb2ZmbnVtLCBpdHVwKTsKIAkJCQkJaXRlbUluZGV4Kys7CiAJ CQkJfQogCQkJCWVsc2UKQEAgLTE3NTIsMTYgKzMwMDYsMTYgQEAgX2J0X3JlYWRwYWdlKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZu dW0sCiAJCQkJCSAqIFRJRAogCQkJCQkgKi8KIAkJCQkJdHVwbGVPZmZzZXQgPQotCQkJCQkJ X2J0X3NldHVwcG9zdGluZ2l0ZW1zKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKLQkJCQkJCQkJ CQkJICBCVHJlZVR1cGxlR2V0UG9zdGluZ04oaXR1cCwgMCksCi0JCQkJCQkJCQkJCSAgaXR1 cCk7CisJCQkJCQlfYnRfc2V0dXBwb3N0aW5naXRlbXNfYmF0Y2goYmF0Y2gsIGl0ZW1JbmRl eCwgb2ZmbnVtLAorCQkJCQkJCQkJCQkJCUJUcmVlVHVwbGVHZXRQb3N0aW5nTihpdHVwLCAw KSwKKwkJCQkJCQkJCQkJCQlpdHVwKTsKIAkJCQkJaXRlbUluZGV4Kys7CiAJCQkJCS8qIFJl bWVtYmVyIGFkZGl0aW9uYWwgVElEcyAqLwogCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IEJU cmVlVHVwbGVHZXROUG9zdGluZyhpdHVwKTsgaSsrKQogCQkJCQl7Ci0JCQkJCQlfYnRfc2F2 ZXBvc3RpbmdpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKLQkJCQkJCQkJCQkJQlRyZWVU dXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAotCQkJCQkJCQkJCQl0dXBsZU9mZnNldCk7CisJ CQkJCQlfYnRfc2F2ZXBvc3RpbmdpdGVtX2JhdGNoKGJhdGNoLCBpdGVtSW5kZXgsIG9mZm51 bSwKKwkJCQkJCQkJCQkJCSAgQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAorCQkJ CQkJCQkJCQkJICB0dXBsZU9mZnNldCk7CiAJCQkJCQlpdGVtSW5kZXgrKzsKIAkJCQkJfQog CQkJCX0KQEAgLTE3OTIsMTcgKzMwNDYsMTcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRl c2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0sCiAKIAkJ CXRydW5jYXR0ID0gQlRyZWVUdXBsZUdldE5BdHRzKGl0dXAsIHJlbCk7CiAJCQlwc3RhdGUu Zm9yY2Vub25yZXF1aXJlZCA9IGZhbHNlOwotCQkJcHN0YXRlLnN0YXJ0aWtleSA9IDA7CS8q IF9idF9zZXRfc3RhcnRpa2V5IGlnbm9yZXMgUF9ISUtFWSAqLworCQkJcHN0YXRlLnN0YXJ0 aWtleSA9IDA7CS8qIF9idF9zZXRfc3RhcnRpa2V5IGlnbm9yZXMgSElLRVkgKi8KIAkJCV9i dF9jaGVja2tleXMoc2NhbiwgJnBzdGF0ZSwgYXJyYXlLZXlzLCBpdHVwLCB0cnVuY2F0dCk7 CiAJCX0KIAogCQlpZiAoIXBzdGF0ZS5jb250aW51ZXNjYW4pCi0JCQlzby0+Y3VyclBvcy5t b3JlUmlnaHQgPSBmYWxzZTsKKwkJCXBvcy0+bW9yZVJpZ2h0ID0gZmFsc2U7CiAKIAkJQXNz ZXJ0KGl0ZW1JbmRleCA8PSBNYXhUSURzUGVyQlRyZWVQYWdlKTsKLQkJc28tPmN1cnJQb3Mu Zmlyc3RJdGVtID0gMDsKLQkJc28tPmN1cnJQb3MubGFzdEl0ZW0gPSBpdGVtSW5kZXggLSAx OwotCQlzby0+Y3VyclBvcy5pdGVtSW5kZXggPSAwOworCQliYXRjaC0+Zmlyc3RJdGVtID0g MDsKKwkJYmF0Y2gtPmxhc3RJdGVtID0gaXRlbUluZGV4IC0gMTsKKwkJYmF0Y2gtPml0ZW1J bmRleCA9IDA7CiAJfQogCWVsc2UKIAl7CkBAIC0xODE5LDEyICszMDczLDEyIEBAIF9idF9y ZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXRO dW1iZXIgb2ZmbnVtLAogCQkJCQkhX2J0X3NjYW5iZWhpbmRfY2hlY2trZXlzKHNjYW4sIGRp ciwgcHN0YXRlLmZpbmFsdHVwKSkKIAkJCQl7CiAJCQkJCS8qIFNjaGVkdWxlIGFub3RoZXIg cHJpbWl0aXZlIGluZGV4IHNjYW4gYWZ0ZXIgYWxsICovCi0JCQkJCXNvLT5jdXJyUG9zLm1v cmVMZWZ0ID0gZmFsc2U7CisJCQkJCXBvcy0+bW9yZUxlZnQgPSBmYWxzZTsKIAkJCQkJc28t Pm5lZWRQcmltU2NhbiA9IHRydWU7CiAJCQkJCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuKQog CQkJCQkJX2J0X3BhcmFsbGVsX3ByaW1zY2FuX3NjaGVkdWxlKHNjYW4sCi0JCQkJCQkJCQkJ CQkJICAgc28tPmN1cnJQb3MuY3VyclBhZ2UpOwotCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJ CQkJCQkJCQkJICAgcG9zLT5jdXJyUGFnZSk7CisJCQkJCXJldHVybiBOVUxMOwogCQkJCX0K IAkJCX0KIApAQCAtMTkyMiw3ICszMTc2LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRl c2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0sCiAJCQkJ ewogCQkJCQkvKiBSZW1lbWJlciBpdCAqLwogCQkJCQlpdGVtSW5kZXgtLTsKLQkJCQkJX2J0 X3NhdmVpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwgaXR1cCk7CisJCQkJCV9idF9zYXZl aXRlbV9iYXRjaChiYXRjaCwgaXRlbUluZGV4LCBvZmZudW0sIGl0dXApOwogCQkJCX0KIAkJ CQllbHNlCiAJCQkJewpAQCAtMTk0MCwxNiArMzE5NCwxNiBAQCBfYnRfcmVhZHBhZ2UoSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51 bSwKIAkJCQkJICovCiAJCQkJCWl0ZW1JbmRleC0tOwogCQkJCQl0dXBsZU9mZnNldCA9Ci0J CQkJCQlfYnRfc2V0dXBwb3N0aW5naXRlbXMoc28sIGl0ZW1JbmRleCwgb2ZmbnVtLAotCQkJ CQkJCQkJCQkgIEJUcmVlVHVwbGVHZXRQb3N0aW5nTihpdHVwLCAwKSwKLQkJCQkJCQkJCQkJ ICBpdHVwKTsKKwkJCQkJCV9idF9zZXR1cHBvc3RpbmdpdGVtc19iYXRjaChiYXRjaCwgaXRl bUluZGV4LCBvZmZudW0sCisJCQkJCQkJCQkJCQkJQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0 dXAsIDApLAorCQkJCQkJCQkJCQkJCWl0dXApOwogCQkJCQkvKiBSZW1lbWJlciBhZGRpdGlv bmFsIFRJRHMgKi8KIAkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBCVHJlZVR1cGxlR2V0TlBv c3RpbmcoaXR1cCk7IGkrKykKIAkJCQkJewogCQkJCQkJaXRlbUluZGV4LS07Ci0JCQkJCQlf YnRfc2F2ZXBvc3RpbmdpdGVtKHNvLCBpdGVtSW5kZXgsIG9mZm51bSwKLQkJCQkJCQkJCQkJ QlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkpLAotCQkJCQkJCQkJCQl0dXBsZU9mZnNl dCk7CisJCQkJCQlfYnRfc2F2ZXBvc3RpbmdpdGVtX2JhdGNoKGJhdGNoLCBpdGVtSW5kZXgs IG9mZm51bSwKKwkJCQkJCQkJCQkJCSAgQlRyZWVUdXBsZUdldFBvc3RpbmdOKGl0dXAsIGkp LAorCQkJCQkJCQkJCQkJICB0dXBsZU9mZnNldCk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBA IC0xOTY1LDEyICszMjE5LDEyIEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4s IFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtLAogCQkgKiBiZSBmb3Vu ZCB0aGVyZQogCQkgKi8KIAkJaWYgKCFwc3RhdGUuY29udGludWVzY2FuKQotCQkJc28tPmN1 cnJQb3MubW9yZUxlZnQgPSBmYWxzZTsKKwkJCXBvcy0+bW9yZUxlZnQgPSBmYWxzZTsKIAog CQlBc3NlcnQoaXRlbUluZGV4ID49IDApOwotCQlzby0+Y3VyclBvcy5maXJzdEl0ZW0gPSBp dGVtSW5kZXg7Ci0JCXNvLT5jdXJyUG9zLmxhc3RJdGVtID0gTWF4VElEc1BlckJUcmVlUGFn ZSAtIDE7Ci0JCXNvLT5jdXJyUG9zLml0ZW1JbmRleCA9IE1heFRJRHNQZXJCVHJlZVBhZ2Ug LSAxOworCQliYXRjaC0+Zmlyc3RJdGVtID0gaXRlbUluZGV4OworCQliYXRjaC0+bGFzdEl0 ZW0gPSBNYXhUSURzUGVyQlRyZWVQYWdlIC0gMTsKKwkJYmF0Y2gtPml0ZW1JbmRleCA9IE1h eFRJRHNQZXJCVHJlZVBhZ2UgLSAxOwogCX0KIAogCS8qCkBAIC0xOTg3LDcgKzMyNDEsMTIg QEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0sCiAJICovCiAJQXNzZXJ0KCFwc3RhdGUuZm9yY2Vub25y ZXF1aXJlZCk7CiAKLQlyZXR1cm4gKHNvLT5jdXJyUG9zLmZpcnN0SXRlbSA8PSBzby0+Y3Vy clBvcy5sYXN0SXRlbSk7CisJaWYgKGJhdGNoLT5maXJzdEl0ZW0gPiBiYXRjaC0+bGFzdEl0 ZW0pCisJCXJldHVybiBOVUxMOworCisJbWVtY3B5KGJhdGNoLT5vcGFxdWUsIHBvcywgc2l6 ZW9mKEJUQmF0Y2hTY2FuUG9zRGF0YSkpOworCisJcmV0dXJuIGJhdGNoOwogfQogCiAvKiBT YXZlIGFuIGluZGV4IGl0ZW0gaW50byBzby0+Y3VyclBvcy5pdGVtc1tpdGVtSW5kZXhdICov CkBAIC0yMDA1LDkgKzMyNjQsOTcgQEAgX2J0X3NhdmVpdGVtKEJUU2Nhbk9wYXF1ZSBzbywg aW50IGl0ZW1JbmRleCwKIAl7CiAJCVNpemUJCWl0dXBzeiA9IEluZGV4VHVwbGVTaXplKGl0 dXApOwogCi0JCWN1cnJJdGVtLT50dXBsZU9mZnNldCA9IHNvLT5jdXJyUG9zLm5leHRUdXBs ZU9mZnNldDsKLQkJbWVtY3B5KHNvLT5jdXJyVHVwbGVzICsgc28tPmN1cnJQb3MubmV4dFR1 cGxlT2Zmc2V0LCBpdHVwLCBpdHVwc3opOwotCQlzby0+Y3VyclBvcy5uZXh0VHVwbGVPZmZz ZXQgKz0gTUFYQUxJR04oaXR1cHN6KTsKKwkJY3Vyckl0ZW0tPnR1cGxlT2Zmc2V0ID0gc28t PmN1cnJQb3MubmV4dFR1cGxlT2Zmc2V0OworCQltZW1jcHkoc28tPmN1cnJUdXBsZXMgKyBz by0+Y3VyclBvcy5uZXh0VHVwbGVPZmZzZXQsIGl0dXAsIGl0dXBzeik7CisJCXNvLT5jdXJy UG9zLm5leHRUdXBsZU9mZnNldCArPSBNQVhBTElHTihpdHVwc3opOworCX0KK30KKworLyoK KyAqIFNldHVwIHN0YXRlIHRvIHNhdmUgVElEcy9pdGVtcyBmcm9tIGEgc2luZ2xlIHBvc3Rp bmcgbGlzdCB0dXBsZS4KKyAqCisgKiBTYXZlcyBhbiBpbmRleCBpdGVtIGludG8gc28tPmN1 cnJQb3MuaXRlbXNbaXRlbUluZGV4XSBmb3IgVElEIHRoYXQgaXMKKyAqIHJldHVybmVkIHRv IHNjYW4gZmlyc3QuICBTZWNvbmQgb3Igc3Vic2VxdWVudCBUSURzIGZvciBwb3N0aW5nIGxp c3Qgc2hvdWxkCisgKiBiZSBzYXZlZCBieSBjYWxsaW5nIF9idF9zYXZlcG9zdGluZ2l0ZW0o KS4KKyAqCisgKiBSZXR1cm5zIGFuIG9mZnNldCBpbnRvIHR1cGxlIHN0b3JhZ2Ugc3BhY2Ug dGhhdCBtYWluIHR1cGxlIGlzIHN0b3JlZCBhdCBpZgorICogbmVlZGVkLgorICovCitzdGF0 aWMgaW50CitfYnRfc2V0dXBwb3N0aW5naXRlbXMoQlRTY2FuT3BhcXVlIHNvLCBpbnQgaXRl bUluZGV4LCBPZmZzZXROdW1iZXIgb2ZmbnVtLAorCQkJCQkgIEl0ZW1Qb2ludGVyIGhlYXBU aWQsIEluZGV4VHVwbGUgaXR1cCkKK3sKKwlCVFNjYW5Qb3NJdGVtICpjdXJySXRlbSA9ICZz by0+Y3VyclBvcy5pdGVtc1tpdGVtSW5kZXhdOworCisJQXNzZXJ0KEJUcmVlVHVwbGVJc1Bv c3RpbmcoaXR1cCkpOworCisJY3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsKKwljdXJy SXRlbS0+aW5kZXhPZmZzZXQgPSBvZmZudW07CisJaWYgKHNvLT5jdXJyVHVwbGVzKQorCXsK KwkJLyogU2F2ZSBiYXNlIEluZGV4VHVwbGUgKHRydW5jYXRlIHBvc3RpbmcgbGlzdCkgKi8K KwkJSW5kZXhUdXBsZQliYXNlOworCQlTaXplCQlpdHVwc3ogPSBCVHJlZVR1cGxlR2V0UG9z dGluZ09mZnNldChpdHVwKTsKKworCQlpdHVwc3ogPSBNQVhBTElHTihpdHVwc3opOworCQlj dXJySXRlbS0+dHVwbGVPZmZzZXQgPSBzby0+Y3VyclBvcy5uZXh0VHVwbGVPZmZzZXQ7CisJ CWJhc2UgPSAoSW5kZXhUdXBsZSkgKHNvLT5jdXJyVHVwbGVzICsgc28tPmN1cnJQb3MubmV4 dFR1cGxlT2Zmc2V0KTsKKwkJbWVtY3B5KGJhc2UsIGl0dXAsIGl0dXBzeik7CisJCS8qIERl ZmVuc2l2ZWx5IHJlZHVjZSB3b3JrIGFyZWEgaW5kZXggdHVwbGUgaGVhZGVyIHNpemUgKi8K KwkJYmFzZS0+dF9pbmZvICY9IH5JTkRFWF9TSVpFX01BU0s7CisJCWJhc2UtPnRfaW5mbyB8 PSBpdHVwc3o7CisJCXNvLT5jdXJyUG9zLm5leHRUdXBsZU9mZnNldCArPSBpdHVwc3o7CisK KwkJcmV0dXJuIGN1cnJJdGVtLT50dXBsZU9mZnNldDsKKwl9CisKKwlyZXR1cm4gMDsKK30K KworLyoKKyAqIFNhdmUgYW4gaW5kZXggaXRlbSBpbnRvIHNvLT5jdXJyUG9zLml0ZW1zW2l0 ZW1JbmRleF0gZm9yIGN1cnJlbnQgcG9zdGluZworICogdHVwbGUuCisgKgorICogQXNzdW1l cyB0aGF0IF9idF9zZXR1cHBvc3RpbmdpdGVtcygpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVk IGZvciBjdXJyZW50CisgKiBwb3N0aW5nIGxpc3QgdHVwbGUuICBDYWxsZXIgcGFzc2VzIGl0 cyByZXR1cm4gdmFsdWUgYXMgdHVwbGVPZmZzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9p ZAorX2J0X3NhdmVwb3N0aW5naXRlbShCVFNjYW5PcGFxdWUgc28sIGludCBpdGVtSW5kZXgs IE9mZnNldE51bWJlciBvZmZudW0sCisJCQkJCUl0ZW1Qb2ludGVyIGhlYXBUaWQsIGludCB0 dXBsZU9mZnNldCkKK3sKKwlCVFNjYW5Qb3NJdGVtICpjdXJySXRlbSA9ICZzby0+Y3VyclBv cy5pdGVtc1tpdGVtSW5kZXhdOworCisJY3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsK KwljdXJySXRlbS0+aW5kZXhPZmZzZXQgPSBvZmZudW07CisKKwkvKgorCSAqIEhhdmUgaW5k ZXgtb25seSBzY2FucyByZXR1cm4gdGhlIHNhbWUgYmFzZSBJbmRleFR1cGxlIGZvciBldmVy eSBUSUQKKwkgKiB0aGF0IG9yaWdpbmF0ZXMgZnJvbSB0aGUgc2FtZSBwb3N0aW5nIGxpc3QK KwkgKi8KKwlpZiAoc28tPmN1cnJUdXBsZXMpCisJCWN1cnJJdGVtLT50dXBsZU9mZnNldCA9 IHR1cGxlT2Zmc2V0OworfQorCisvKiBTYXZlIGFuIGluZGV4IGl0ZW0gaW50byBzby0+Y3Vy clBvcy5pdGVtc1tpdGVtSW5kZXhdICovCitzdGF0aWMgdm9pZAorX2J0X3NhdmVpdGVtX2Jh dGNoKEluZGV4U2NhbkJhdGNoIGJhdGNoLCBpbnQgaXRlbUluZGV4LAorCQkJCSAgIE9mZnNl dE51bWJlciBvZmZudW0sIEluZGV4VHVwbGUgaXR1cCkKK3sKKwlCVEJhdGNoU2NhblBvcyBw b3MgPSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNoLT5vcGFxdWU7CisKKwlBc3NlcnQoIUJUcmVl VHVwbGVJc1Bpdm90KGl0dXApICYmICFCVHJlZVR1cGxlSXNQb3N0aW5nKGl0dXApKTsKKwor CS8qIGNvcHkgdGhlIHBvcHVsYXRlZCBwYXJ0IG9mIHRoZSBpdGVtcyBhcnJheSAqLworCWJh dGNoLT5pdGVtc1tpdGVtSW5kZXhdLmhlYXBUaWQgPSBpdHVwLT50X3RpZDsKKwliYXRjaC0+ aXRlbXNbaXRlbUluZGV4XS5pbmRleE9mZnNldCA9IG9mZm51bTsKKworCWlmIChiYXRjaC0+ Y3VyclR1cGxlcykKKwl7CisJCVNpemUJCWl0dXBzeiA9IEluZGV4VHVwbGVTaXplKGl0dXAp OworCisJCWJhdGNoLT5pdGVtc1tpdGVtSW5kZXhdLnR1cGxlT2Zmc2V0ID0gcG9zLT5uZXh0 VHVwbGVPZmZzZXQ7CisJCW1lbWNweShiYXRjaC0+Y3VyclR1cGxlcyArIHBvcy0+bmV4dFR1 cGxlT2Zmc2V0LCBpdHVwLCBpdHVwc3opOworCQlwb3MtPm5leHRUdXBsZU9mZnNldCArPSBN QVhBTElHTihpdHVwc3opOwogCX0KIH0KIApAQCAtMjAyMiwzMSArMzM2OSwzNCBAQCBfYnRf c2F2ZWl0ZW0oQlRTY2FuT3BhcXVlIHNvLCBpbnQgaXRlbUluZGV4LAogICogbmVlZGVkLgog ICovCiBzdGF0aWMgaW50Ci1fYnRfc2V0dXBwb3N0aW5naXRlbXMoQlRTY2FuT3BhcXVlIHNv LCBpbnQgaXRlbUluZGV4LCBPZmZzZXROdW1iZXIgb2ZmbnVtLAotCQkJCQkgIEl0ZW1Qb2lu dGVyIGhlYXBUaWQsIEluZGV4VHVwbGUgaXR1cCkKK19idF9zZXR1cHBvc3RpbmdpdGVtc19i YXRjaChJbmRleFNjYW5CYXRjaCBiYXRjaCwgaW50IGl0ZW1JbmRleCwgT2Zmc2V0TnVtYmVy IG9mZm51bSwKKwkJCQkJCQlJdGVtUG9pbnRlciBoZWFwVGlkLCBJbmRleFR1cGxlIGl0dXAp CiB7Ci0JQlRTY2FuUG9zSXRlbSAqY3Vyckl0ZW0gPSAmc28tPmN1cnJQb3MuaXRlbXNbaXRl bUluZGV4XTsKKwlCVEJhdGNoU2NhblBvcyBwb3MgPSAoQlRCYXRjaFNjYW5Qb3MpIGJhdGNo LT5vcGFxdWU7CisJSW5kZXhTY2FuQmF0Y2hQb3NJdGVtICppdGVtID0gJmJhdGNoLT5pdGVt c1tpdGVtSW5kZXhdOwogCiAJQXNzZXJ0KEJUcmVlVHVwbGVJc1Bvc3RpbmcoaXR1cCkpOwog Ci0JY3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsKLQljdXJySXRlbS0+aW5kZXhPZmZz ZXQgPSBvZmZudW07Ci0JaWYgKHNvLT5jdXJyVHVwbGVzKQorCS8qIGNvcHkgdGhlIHBvcHVs YXRlZCBwYXJ0IG9mIHRoZSBpdGVtcyBhcnJheSAqLworCWl0ZW0tPmhlYXBUaWQgPSAqaGVh cFRpZDsKKwlpdGVtLT5pbmRleE9mZnNldCA9IG9mZm51bTsKKworCWlmIChiYXRjaC0+Y3Vy clR1cGxlcykKIAl7CiAJCS8qIFNhdmUgYmFzZSBJbmRleFR1cGxlICh0cnVuY2F0ZSBwb3N0 aW5nIGxpc3QpICovCiAJCUluZGV4VHVwbGUJYmFzZTsKIAkJU2l6ZQkJaXR1cHN6ID0gQlRy ZWVUdXBsZUdldFBvc3RpbmdPZmZzZXQoaXR1cCk7CiAKIAkJaXR1cHN6ID0gTUFYQUxJR04o aXR1cHN6KTsKLQkJY3Vyckl0ZW0tPnR1cGxlT2Zmc2V0ID0gc28tPmN1cnJQb3MubmV4dFR1 cGxlT2Zmc2V0OwotCQliYXNlID0gKEluZGV4VHVwbGUpIChzby0+Y3VyclR1cGxlcyArIHNv LT5jdXJyUG9zLm5leHRUdXBsZU9mZnNldCk7CisJCWl0ZW0tPnR1cGxlT2Zmc2V0ID0gcG9z LT5uZXh0VHVwbGVPZmZzZXQ7CisJCWJhc2UgPSAoSW5kZXhUdXBsZSkgKGJhdGNoLT5jdXJy VHVwbGVzICsgcG9zLT5uZXh0VHVwbGVPZmZzZXQpOwogCQltZW1jcHkoYmFzZSwgaXR1cCwg aXR1cHN6KTsKIAkJLyogRGVmZW5zaXZlbHkgcmVkdWNlIHdvcmsgYXJlYSBpbmRleCB0dXBs ZSBoZWFkZXIgc2l6ZSAqLwogCQliYXNlLT50X2luZm8gJj0gfklOREVYX1NJWkVfTUFTSzsK IAkJYmFzZS0+dF9pbmZvIHw9IGl0dXBzejsKLQkJc28tPmN1cnJQb3MubmV4dFR1cGxlT2Zm c2V0ICs9IGl0dXBzejsKKwkJcG9zLT5uZXh0VHVwbGVPZmZzZXQgKz0gaXR1cHN6OwogCi0J CXJldHVybiBjdXJySXRlbS0+dHVwbGVPZmZzZXQ7CisJCXJldHVybiBpdGVtLT50dXBsZU9m ZnNldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIwNjAsMjAgKzM0MTAsMjAgQEAgX2J0X3Nl dHVwcG9zdGluZ2l0ZW1zKEJUU2Nhbk9wYXF1ZSBzbywgaW50IGl0ZW1JbmRleCwgT2Zmc2V0 TnVtYmVyIG9mZm51bSwKICAqIHBvc3RpbmcgbGlzdCB0dXBsZS4gIENhbGxlciBwYXNzZXMg aXRzIHJldHVybiB2YWx1ZSBhcyB0dXBsZU9mZnNldC4KICAqLwogc3RhdGljIGlubGluZSB2 b2lkCi1fYnRfc2F2ZXBvc3RpbmdpdGVtKEJUU2Nhbk9wYXF1ZSBzbywgaW50IGl0ZW1JbmRl eCwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKLQkJCQkJSXRlbVBvaW50ZXIgaGVhcFRpZCwgaW50 IHR1cGxlT2Zmc2V0KQorX2J0X3NhdmVwb3N0aW5naXRlbV9iYXRjaChJbmRleFNjYW5CYXRj aCBiYXRjaCwgaW50IGl0ZW1JbmRleCwgT2Zmc2V0TnVtYmVyIG9mZm51bSwKKwkJCQkJCSAg SXRlbVBvaW50ZXIgaGVhcFRpZCwgaW50IHR1cGxlT2Zmc2V0KQogewotCUJUU2NhblBvc0l0 ZW0gKmN1cnJJdGVtID0gJnNvLT5jdXJyUG9zLml0ZW1zW2l0ZW1JbmRleF07CisJSW5kZXhT Y2FuQmF0Y2hQb3NJdGVtICppdGVtID0gJmJhdGNoLT5pdGVtc1tpdGVtSW5kZXhdOwogCi0J Y3Vyckl0ZW0tPmhlYXBUaWQgPSAqaGVhcFRpZDsKLQljdXJySXRlbS0+aW5kZXhPZmZzZXQg PSBvZmZudW07CisJaXRlbS0+aGVhcFRpZCA9ICpoZWFwVGlkOworCWl0ZW0tPmluZGV4T2Zm c2V0ID0gb2ZmbnVtOwogCiAJLyoKIAkgKiBIYXZlIGluZGV4LW9ubHkgc2NhbnMgcmV0dXJu IHRoZSBzYW1lIGJhc2UgSW5kZXhUdXBsZSBmb3IgZXZlcnkgVElECiAJICogdGhhdCBvcmln aW5hdGVzIGZyb20gdGhlIHNhbWUgcG9zdGluZyBsaXN0CiAJICovCi0JaWYgKHNvLT5jdXJy VHVwbGVzKQotCQljdXJySXRlbS0+dHVwbGVPZmZzZXQgPSB0dXBsZU9mZnNldDsKKwlpZiAo YmF0Y2gtPmN1cnJUdXBsZXMpCisJCWl0ZW0tPnR1cGxlT2Zmc2V0ID0gdHVwbGVPZmZzZXQ7 CiB9CiAKIC8qCkBAIC0yMTg2LDYgKzM1MzYsNzEgQEAgX2J0X3N0ZXBwYWdlKEluZGV4U2Nh bkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJcmV0dXJuIF9idF9yZWFkbmV4dHBh Z2Uoc2NhbiwgYmxrbm8sIGxhc3RjdXJyYmxrbm8sIGRpciwgZmFsc2UpOwogfQogCisvKgor ICoJYSBiYXRjaGluZyB2ZXJzaW9uIG9mIF9idF9zdGVwcGFnZSgpLCBpZ25vcmluZyBpcnJl bGV2YW50IGJpdHMKKyAqLworc3RhdGljIEluZGV4U2NhbkJhdGNoCitfYnRfc3RlcHBhZ2Vf YmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNoU2NhblBvcyBwb3MsIFNjYW5EaXJl Y3Rpb24gZGlyKQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4t Pm9wYXF1ZTsKKwlCbG9ja051bWJlciBibGtubywKKwkJCQlsYXN0Y3VycmJsa25vOworCisJ LyogYmF0Y2hpbmcgZG9lcyBub3Qgd29yayB3aXRoIHJlZ3VsYXIgc2Nhbi1sZXZlbCBwb3Np dGlvbnMgKi8KKwlBc3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKTsKKwlB c3NlcnQoIUJUU2NhblBvc0lzVmFsaWQoc28tPm1hcmtQb3MpKTsKKworCS8qIEJhdGNoaW5n IGhhcyBhIGRpZmZlcmVudCBjb25jZXB0IG9mIHBvc2l0aW9uLCBzdG9yZWQgaW4gdGhlIGJh dGNoLiAqLworCUFzc2VydChCVEJhdGNoU2NhblBvc0lzVmFsaWQoKnBvcykpOworCisJLyoK KwkgKiBraWxsaXRlbXMKKwkgKgorCSAqIE5vIG5lZWQgdG8gaGFuZGxlIGtpbGx0dXBsZXMg aGVyZSwgdGhhdCdzIGdvaW5nIHRvIGJlIGRlYWx0IHdpdGggYXQgdGhlCisJICogaW5kZXhh bS5jIGxldmVsIHdoZW4gZnJlZWluZyB0aGUgYmF0Y2gsIG9yIHBvc3NpYmx5IGluIHdoZW4g Y2FsbGluZworCSAqIGFtZnJlZWJhdGNoLgorCSAqLworCisJLyoKKwkgKiBtYXJrL3Jlc3Rv cmUKKwkgKgorCSAqIE1hcmsvcmVzdG9yZSBzaGFsbCBhbHNvIGJlIGhhbmRsZWQgYXQgdGhl IGluZGV4YW0uYyBsZXZlbCwgYnkga2VlcGluZworCSAqIHRoZSBjb3JyZWN0IGJhdGNoIGFy b3VuZCwgZXRjLiBXZSBkb24ndCBkaXNjYXJkIHRoZSBvbGQgYmF0Y2ggaGVyZS4KKwkgKgor CSAqIEluIF9idF9zdGVwcGFnZSB0aGlzIGFsc28gaGFuZGxlZCBwcmltaXRpdmUgc2NhbnMg Zm9yIGFycmF5IGtleXMsIGJ1dAorCSAqIHRoYXQgcHJvYmFibHkgd291bGQgYmUgaGFuZGxl ZCBhdCBpbmRleGFtLmMgbGV2ZWwgdG9vLgorCSAqLworCisJLyogRG9uJ3QgdW5waW4gdGhl IGJ1ZmZlciBoZXJlLCBrZWVwIHRoZSBiYXRjaCBwaW5uZWQgdW50aWwgYW1mcmVlYmF0Y2gu ICovCisKKwkvKiBXYWxrIHRvIHRoZSBuZXh0IHBhZ2Ugd2l0aCBkYXRhICovCisJaWYgKFNj YW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJYmxrbm8gPSBwb3MtPm5leHRQYWdlOwor CWVsc2UKKwkJYmxrbm8gPSBwb3MtPnByZXZQYWdlOworCisJbGFzdGN1cnJibGtubyA9IHBv cy0+Y3VyclBhZ2U7CisKKwkvKgorCSAqIENhbmNlbCBwcmltaXRpdmUgaW5kZXggc2NhbnMg dGhhdCB3ZXJlIHNjaGVkdWxlZCB3aGVuIHRoZSBjYWxsIHRvCisJICogX2J0X3JlYWRwYWdl IGZvciBjdXJyUG9zIGhhcHBlbmVkIHRvIHVzZSB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIHRv IHRoZQorCSAqIG9uZSB0aGF0IHdlJ3JlIHN0ZXBwaW5nIGluIG5vdy4gIChJdCdzIG9rYXkg dG8gbGVhdmUgdGhlIHNjYW4ncyBhcnJheQorCSAqIGtleXMgYXMtaXMsIHNpbmNlIHRoZSBu ZXh0IF9idF9yZWFkcGFnZSB3aWxsIGFkdmFuY2UgdGhlbS4pCisJICoKKwkgKiBYWFggTm90 IHN1cmUgdGhpcyBpcyBjb3JyZWN0LiBDYW4gd2UgY29tYmluZSB0aGUgZGlyZWN0aW9uIGZy b20gc29tZQorCSAqIG9sZGVyIGJhdGNoICh3aXRoIG1hcmsvcmVzdG9yZT8pIGFuZCB0aGUg Y3VycmVudCBuZWVkUHJpbVNjYW4gZnJvbSB0aGUKKwkgKiBsYXRlc3QgYmF0Y2ggd2UgcHJv Y2Vzc2VkPyBCdXQsIHRoZSBtYXJrL3Jlc3RvcmUgY29kZSBpbiBpbmRleGFtIHNob3VsZAor CSAqIHJlc2V0IHRoaXMgc29tZWhvdy4KKwkgKgorCSAqIFhYWCBIb3dldmVyLCBhcmVuJ3Qg cHJpbWl0aXZlIHNjYW5zIHZlcnkgYnRyZWUtc3BlY2lmaWMgY29kZT8gSG93IGNvdWxkCisJ ICogaW5kZXhhbS5jIGV2ZXIgaGFuZGxlIHRoYXQ/CisJICovCisJaWYgKHBvcy0+ZGlyICE9 IGRpcikKKwkJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOworCisJcmV0dXJuIF9idF9yZWFk bmV4dHBhZ2VfYmF0Y2goc2NhbiwgcG9zLCBibGtubywgbGFzdGN1cnJibGtubywgZGlyLCBm YWxzZSk7Cit9CisKIC8qCiAgKglfYnRfcmVhZGZpcnN0cGFnZSgpIC0tIFJlYWQgZmlyc3Qg cGFnZSBjb250YWluaW5nIHZhbGlkIGRhdGEgZm9yIF9idF9maXJzdAogICoKQEAgLTIyNjUs NiArMzY4MCw3NyBAQCBfYnRfcmVhZGZpcnN0cGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIE9m ZnNldE51bWJlciBvZmZudW0sIFNjYW5EaXJlY3Rpb24gZGlyKQogCXJldHVybiB0cnVlOwog fQogCitzdGF0aWMgSW5kZXhTY2FuQmF0Y2gKK19idF9yZWFkZmlyc3RwYWdlX2JhdGNoKElu ZGV4U2NhbkRlc2Mgc2NhbiwgQlRCYXRjaFNjYW5Qb3MgcG9zLCBPZmZzZXROdW1iZXIgb2Zm bnVtLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2Fu T3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJSW5kZXhTY2FuQmF0Y2ggYmF0Y2g7CisKKwkvKiBi YXRjaGluZyBkb2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBzY2FuLWxldmVsIHBvc2l0aW9u cyAqLworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOworCUFzc2Vy dCghQlRTY2FuUG9zSXNWYWxpZChzby0+bWFya1BvcykpOworCisJc28tPm51bUtpbGxlZCA9 IDA7CQkJLyoganVzdCBwYXJhbm9pYSAqLworCXNvLT5tYXJrSXRlbUluZGV4ID0gLTE7CQkv KiBkaXR0byAqLworCisJLyogY29weSBwb3NpdGlvbiBpbmZvIGZyb20gQlRTY2FuT3BhcXVl ICovCisKKwkvKiBJbml0aWFsaXplIHNvLT5jdXJyUG9zIGZvciB0aGUgZmlyc3QgcGFnZSAo cGFnZSBpbiBzby0+Y3VyclBvcy5idWYpICovCisJaWYgKHNvLT5uZWVkUHJpbVNjYW4pCisJ eworCQlBc3NlcnQoc28tPm51bUFycmF5S2V5cyk7CisKKwkJcG9zLT5tb3JlTGVmdCA9IHRy dWU7CisJCXBvcy0+bW9yZVJpZ2h0ID0gdHJ1ZTsKKwkJc28tPm5lZWRQcmltU2NhbiA9IGZh bHNlOworCX0KKwllbHNlIGlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJewor CQlwb3MtPm1vcmVMZWZ0ID0gZmFsc2U7CisJCXBvcy0+bW9yZVJpZ2h0ID0gdHJ1ZTsKKwl9 CisJZWxzZQorCXsKKwkJcG9zLT5tb3JlTGVmdCA9IHRydWU7CisJCXBvcy0+bW9yZVJpZ2h0 ID0gZmFsc2U7CisJfQorCisJLyoKKwkgKiBBdHRlbXB0IHRvIGxvYWQgbWF0Y2hpbmcgdHVw bGVzIGZyb20gdGhlIGZpcnN0IHBhZ2UuCisJICoKKwkgKiBOb3RlIHRoYXQgX2J0X3JlYWRw YWdlIHdpbGwgZmluaXNoIGluaXRpYWxpemluZyB0aGUgc28tPmN1cnJQb3MgZmllbGRzLgor CSAqIF9idF9yZWFkcGFnZSBhbHNvIHJlbGVhc2VzIHBhcmFsbGVsIHNjYW4gKGV2ZW4gd2hl biBpdCByZXR1cm5zIGZhbHNlKS4KKwkgKi8KKwlpZiAoKGJhdGNoID0gX2J0X3JlYWRwYWdl X2JhdGNoKHNjYW4sIHBvcywgZGlyLCBvZmZudW0sIHRydWUpKSAhPSBOVUxMKQorCXsKKwkJ cG9zID0gKEJUQmF0Y2hTY2FuUG9zKSBiYXRjaC0+b3BhcXVlOworCisJCS8qCisJCSAqIF9i dF9yZWFkcGFnZSBzdWNjZWVkZWQuICBEcm9wIHRoZSBsb2NrIChhbmQgbWF5YmUgdGhlIHBp bikgb24KKwkJICogc28tPmN1cnJQb3MuYnVmIGluIHByZXBhcmF0aW9uIGZvciBidGdldHR1 cGxlIHJldHVybmluZyB0dXBsZXMuCisJCSAqLworCQlBc3NlcnQoQlRCYXRjaFNjYW5Qb3NJ c1Bpbm5lZCgqcG9zKSk7CisKKwkJLyogX2J0X2Ryb3BfbG9ja19hbmRfbWF5YmVfcGluX2Jh dGNoKHNjYW4sIHBvcyk7ICovCisJCS8qIFhYWCBkcm9wIGp1c3QgdGhlIGxvY2ssIG5vdCB0 aGUgcGluLCB0aGF0J3MgdXAgdG8gYnRmcmVlYmF0Y2ggKi8KKwkJLyogd2l0aG91dCB0aGlz IGJ0ZnJlZWJhdGNoIHRyaWdnZXJzIGFuIGFzc2VydCB3aGVuIHVucGlubmluZyB0aGUgKi8K KwkJLyogYnVmZmVyLCBiZWNhdXNlIHRoYXQgY2hlY2tzIHdlJ3JlIG5vdCBob2xkaW5nIGEg bG9jayBvbiBpdCAqLworCQlfYnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIHBv cy0+YnVmKTsKKwkJcmV0dXJuIGJhdGNoOworCX0KKworCS8qIFRoZXJlJ3Mgbm8gYWN0dWFs bHktbWF0Y2hpbmcgZGF0YSBvbiB0aGUgcGFnZSBpbiBzby0+Y3VyclBvcy5idWYgKi8KKwlf YnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIHBvcy0+YnVmKTsKKworCS8qIFhY WCBOb3Qgc3VyZSB3ZSBjYW4gZHJvcCB0aGUgcGluIGJlZm9yZSBjYWxsaW5nIHN0ZXBwYWdl X2JhdGNoPyBCdXQgKi8KKwkvKiB3aXRob3V0IHRoaXMsIFxkKyByZXBvcnRzIHVucmVsZWFz ZWQgYnVmZmVyIC4uLiAqLworCS8qIEFuZCB0aGUgbm9uLWJhdGNoIGNvZGUgZG9lc24ndCBu ZWVkIHRvIGRvIHRoaXMuICovCisJUmVsZWFzZUJ1ZmZlcihwb3MtPmJ1Zik7CisKKwkvKiBD YWxsIF9idF9yZWFkbmV4dHBhZ2UgdXNpbmcgaXRzIF9idF9zdGVwcGFnZSB3cmFwcGVyIGZ1 bmN0aW9uICovCisJcmV0dXJuIF9idF9zdGVwcGFnZV9iYXRjaChzY2FuLCBwb3MsIGRpcik7 Cit9CisKIC8qCiAgKglfYnRfcmVhZG5leHRwYWdlKCkgLS0gUmVhZCBuZXh0IHBhZ2UgY29u dGFpbmluZyB2YWxpZCBkYXRhIGZvciBfYnRfbmV4dAogICoKQEAgLTI0MTIsNiArMzg5OCwx MzggQEAgX2J0X3JlYWRuZXh0cGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVy IGJsa25vLAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgSW5kZXhTY2FuQmF0Y2gKK19i dF9yZWFkbmV4dHBhZ2VfYmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNoU2NhblBv cyBwb3MsIEJsb2NrTnVtYmVyIGJsa25vLAorCQkJCQkgICBCbG9ja051bWJlciBsYXN0Y3Vy cmJsa25vLCBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCBzZWl6ZWQpCit7CisJUmVsYXRpb24J cmVsID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlCVFNjYW5PcGFxdWUgc28gUEdfVVNFRF9G T1JfQVNTRVJUU19PTkxZID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCisJLyog QlRCYXRjaFNjYW5Qb3NEYXRhCW5ld3BvczsgKi8KKwlJbmRleFNjYW5CYXRjaCBuZXdiYXRj aCA9IE5VTEw7CisKKwkvKiBiYXRjaGluZyBkb2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBz Y2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+ Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+bWFya1BvcykpOwor CisJQXNzZXJ0KHBvcy0+Y3VyclBhZ2UgPT0gbGFzdGN1cnJibGtubyB8fCBzZWl6ZWQpOwor CUFzc2VydChCVEJhdGNoU2NhblBvc0lzUGlubmVkKCpwb3MpIHx8IHNlaXplZCk7CisKKwkv KiBpbml0aWFsaXplIHRoZSBuZXcgcG9zaXRpb24gdG8gdGhlIG9sZCBvbmUsIHdlJ2xsIG1v ZGlmeSBpdCAqLworCS8qIG5ld3BvcyA9ICpwb3M7ICovCisKKwkvKiBwb3MtPm1vcmVMZWZ0 ID0gcG9zLT5tb3JlUmlnaHQgPSBmYWxzZTsgKi8KKworCS8qCisJICogUmVtZW1iZXIgdGhh dCB0aGUgc2NhbiBhbHJlYWR5IHJlYWQgbGFzdGN1cnJibGtubywgYSBwYWdlIHRvIHRoZSBs ZWZ0CisJICogb2YgYmxrbm8gKG9yIHJlbWVtYmVyIHJlYWRpbmcgYSBwYWdlIHRvIHRoZSBy aWdodCwgZm9yIGJhY2t3YXJkcyBzY2FucykKKwkgKi8KKwlpZiAoU2NhbkRpcmVjdGlvbklz Rm9yd2FyZChkaXIpKQorCQlwb3MtPm1vcmVMZWZ0ID0gdHJ1ZTsKKwllbHNlCisJCXBvcy0+ bW9yZVJpZ2h0ID0gdHJ1ZTsKKworCWZvciAoOzspCisJeworCQlQYWdlCQlwYWdlOworCQlC VFBhZ2VPcGFxdWUgb3BhcXVlOworCisJCWlmIChibGtubyA9PSBQX05PTkUgfHwKKwkJCShT Y2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgPworCQkJICFwb3MtPm1vcmVSaWdodCA6ICFw b3MtPm1vcmVMZWZ0KSkKKwkJeworCQkJLyogbW9zdCByZWNlbnQgX2J0X3JlYWRwYWdlIGNh bGwgKGZvciBsYXN0Y3VycmJsa25vKSBlbmRlZCBzY2FuICovCisJCQlBc3NlcnQocG9zLT5j dXJyUGFnZSA9PSBsYXN0Y3VycmJsa25vICYmICFzZWl6ZWQpOworCQkJQlRCYXRjaFNjYW5Q b3NJbnZhbGlkYXRlKCpwb3MpOworCQkJX2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7CS8qIGlm ZiAhc28tPm5lZWRQcmltU2NhbiAqLworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlBc3Nl cnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCisJCS8qIHBhcmFsbGVsIHNjYW4gbXVzdCBuZXZl ciBhY3R1YWxseSB2aXNpdCBzby0+Y3VyclBvcyBibGtubyAqLworCQlpZiAoIXNlaXplZCAm JiBzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwgJiYKKwkJCSFfYnRfcGFyYWxsZWxfc2Vp emVfYmF0Y2goc2NhbiwgcG9zLCAmYmxrbm8sICZsYXN0Y3VycmJsa25vLCBmYWxzZSkpCisJ CXsKKwkJCS8qIHdob2xlIHNjYW4gaXMgbm93IGRvbmUgKG9yIGFub3RoZXIgcHJpbWl0aXZl IHNjYW4gcmVxdWlyZWQpICovCisJCQlCVEJhdGNoU2NhblBvc0ludmFsaWRhdGUoKnBvcyk7 CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJk KGRpcikpCisJCXsKKwkJCS8qIHJlYWQgYmxrbm8sIGJ1dCBjaGVjayBmb3IgaW50ZXJydXB0 cyBmaXJzdCAqLworCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwkJCXBvcy0+YnVmID0g X2J0X2dldGJ1ZihyZWwsIGJsa25vLCBCVF9SRUFEKTsKKwkJfQorCQllbHNlCisJCXsKKwkJ CS8qIHJlYWQgYmxrbm8sIGF2b2lkaW5nIHJhY2UgKGFsc28gY2hlY2tzIGZvciBpbnRlcnJ1 cHRzKSAqLworCQkJcG9zLT5idWYgPSBfYnRfbG9ja19hbmRfdmFsaWRhdGVfbGVmdChyZWws ICZibGtubywKKwkJCQkJCQkJCQkJCSAgbGFzdGN1cnJibGtubyk7CisJCQlpZiAocG9zLT5i dWYgPT0gSW52YWxpZEJ1ZmZlcikKKwkJCXsKKwkJCQkvKiBtdXN0IGhhdmUgYmVlbiBhIGNv bmN1cnJlbnQgZGVsZXRpb24gb2YgbGVmdG1vc3QgcGFnZSAqLworCQkJCUJUQmF0Y2hTY2Fu UG9zSW52YWxpZGF0ZSgqcG9zKTsKKwkJCQlfYnRfcGFyYWxsZWxfZG9uZShzY2FuKTsKKwkJ CQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKHBv cy0+YnVmKTsKKwkJb3BhcXVlID0gQlRQYWdlR2V0T3BhcXVlKHBhZ2UpOworCQlsYXN0Y3Vy cmJsa25vID0gYmxrbm87CisJCWlmIChsaWtlbHkoIVBfSUdOT1JFKG9wYXF1ZSkpKQorCQl7 CisJCQkvKiBzZWUgaWYgdGhlcmUgYXJlIGFueSBtYXRjaGVzIG9uIHRoaXMgcGFnZSAqLwor CQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJCXsKKwkJCQkvKiBub3Rl IHRoYXQgdGhpcyB3aWxsIGNsZWFyIG1vcmVSaWdodCBpZiB3ZSBjYW4gc3RvcCAqLworCQkJ CWlmICgobmV3YmF0Y2ggPSBfYnRfcmVhZHBhZ2VfYmF0Y2goc2NhbiwgcG9zLCBkaXIsIFBf RklSU1REQVRBS0VZKG9wYXF1ZSksIGZhbHNlKSkgIT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJ CQkJYmxrbm8gPSBwb3MtPm5leHRQYWdlOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8q IG5vdGUgdGhhdCB0aGlzIHdpbGwgY2xlYXIgbW9yZUxlZnQgaWYgd2UgY2FuIHN0b3AgKi8K KwkJCQlpZiAoKG5ld2JhdGNoID0gX2J0X3JlYWRwYWdlX2JhdGNoKHNjYW4sIHBvcywgZGly LCBQYWdlR2V0TWF4T2Zmc2V0TnVtYmVyKHBhZ2UpLCBmYWxzZSkpICE9IE5VTEwpCisJCQkJ CWJyZWFrOworCQkJCWJsa25vID0gcG9zLT5wcmV2UGFnZTsKKwkJCX0KKwkJfQorCQllbHNl CisJCXsKKwkJCS8qIF9idF9yZWFkcGFnZSBub3QgY2FsbGVkLCBzbyBkbyBhbGwgdGhpcyBm b3Igb3Vyc2VsdmVzICovCisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQor CQkJCWJsa25vID0gb3BhcXVlLT5idHBvX25leHQ7CisJCQllbHNlCisJCQkJYmxrbm8gPSBv cGFxdWUtPmJ0cG9fcHJldjsKKwkJCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwp CisJCQkJX2J0X3BhcmFsbGVsX3JlbGVhc2Uoc2NhbiwgYmxrbm8sIGxhc3RjdXJyYmxrbm8p OworCQl9CisKKwkJLyogbm8gbWF0Y2hpbmcgdHVwbGVzIG9uIHRoaXMgcGFnZSAqLworCQlf YnRfcmVsYnVmKHJlbCwgcG9zLT5idWYpOworCQlzZWl6ZWQgPSBmYWxzZTsJCQkvKiByZWxl YXNlZCBieSBfYnRfcmVhZHBhZ2UgKG9yIGJ5IHVzKSAqLworCX0KKworCS8qICovCisJQXNz ZXJ0KG5ld2JhdGNoICE9IE5VTEwpOworCisJcG9zID0gKEJUQmF0Y2hTY2FuUG9zKSBuZXdi YXRjaC0+b3BhcXVlOworCisJLyoKKwkgKiBfYnRfcmVhZHBhZ2Ugc3VjY2VlZGVkLiAgRHJv cCB0aGUgbG9jayAoYW5kIG1heWJlIHRoZSBwaW4pIG9uCisJICogc28tPmN1cnJQb3MuYnVm IGluIHByZXBhcmF0aW9uIGZvciBidGdldHR1cGxlIHJldHVybmluZyB0dXBsZXMuCisJICov CisJQXNzZXJ0KHBvcy0+Y3VyclBhZ2UgPT0gYmxrbm8pOworCUFzc2VydChCVEJhdGNoU2Nh blBvc0lzUGlubmVkKCpwb3MpKTsKKwkvKiBfYnRfZHJvcF9sb2NrX2FuZF9tYXliZV9waW5f YmF0Y2goc2NhbiwgcG9zKTsgKi8KKwlfYnRfdW5sb2NrYnVmKHNjYW4tPmluZGV4UmVsYXRp b24sIHBvcy0+YnVmKTsKKworCXJldHVybiBuZXdiYXRjaDsKK30KKwogLyoKICAqIF9idF9s b2NrX2FuZF92YWxpZGF0ZV9sZWZ0KCkgLS0gbG9jayBjYWxsZXIncyBsZWZ0IHNpYmxpbmcg Ymxrbm8sCiAgKiByZWNvdmVyaW5nIGZyb20gY29uY3VycmVudCBwYWdlIHNwbGl0cy9wYWdl IGRlbGV0aW9ucyB3aGVuIG5lY2Vzc2FyeQpAQCAtMjY5MywzICs0MzExLDc5IEBAIF9idF9l bmRwb2ludChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCV9idF9y ZXR1cm5pdGVtKHNjYW4sIHNvKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KKworLyoKKyAqCV9idF9l bmRwb2ludCgpIC0tIEZpbmQgdGhlIGZpcnN0IG9yIGxhc3QgcGFnZSBpbiB0aGUgaW5kZXgs IGFuZCBzY2FuCisgKiBmcm9tIHRoZXJlIHRvIHRoZSBmaXJzdCBrZXkgc2F0aXNmeWluZyBh bGwgdGhlIHF1YWxzLgorICoKKyAqIFRoaXMgaXMgdXNlZCBieSBfYnRfZmlyc3QoKSB0byBz ZXQgdXAgYSBzY2FuIHdoZW4gd2UndmUgZGV0ZXJtaW5lZAorICogdGhhdCB0aGUgc2NhbiBt dXN0IHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcgb3IgZW5kIG9mIHRoZSBpbmRleCAoZm9yCisg KiBhIGZvcndhcmQgb3IgYmFja3dhcmQgc2NhbiByZXNwZWN0aXZlbHkpLgorICoKKyAqIFBh cmFsbGVsIHNjYW4gY2FsbGVycyBtdXN0IGhhdmUgc2VpemVkIHRoZSBzY2FuIGJlZm9yZSBj YWxsaW5nIGhlcmUuCisgKiBFeGl0IGNvbmRpdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciBf YnRfZmlyc3QoKS4KKyAqLworc3RhdGljIEluZGV4U2NhbkJhdGNoCitfYnRfZW5kcG9pbnRf YmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlSZWxh dGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9uOworCUJUU2Nhbk9wYXF1ZSBzbyBQR19V U0VEX0ZPUl9BU1NFUlRTX09OTFkgPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJ UGFnZQkJcGFnZTsKKwlCVFBhZ2VPcGFxdWUgb3BhcXVlOworCU9mZnNldE51bWJlciBzdGFy dDsKKwlCVEJhdGNoU2NhblBvc0RhdGEgcG9zOworCisJQlRCYXRjaFNjYW5Qb3NJbnZhbGlk YXRlKHBvcyk7CisKKwkvKiBiYXRjaGluZyBkb2VzIG5vdCB3b3JrIHdpdGggcmVndWxhciBz Y2FuLWxldmVsIHBvc2l0aW9ucyAqLworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+ Y3VyclBvcykpOworCUFzc2VydCghQlRTY2FuUG9zSXNWYWxpZChzby0+bWFya1BvcykpOwor CisJQXNzZXJ0KCFCVFNjYW5Qb3NJc1ZhbGlkKHNvLT5jdXJyUG9zKSk7CisJQXNzZXJ0KCFz by0+bmVlZFByaW1TY2FuKTsKKworCS8qCisJICogU2NhbiBkb3duIHRvIHRoZSBsZWZ0bW9z dCBvciByaWdodG1vc3QgbGVhZiBwYWdlLiAgVGhpcyBpcyBhIHNpbXBsaWZpZWQKKwkgKiB2 ZXJzaW9uIG9mIF9idF9zZWFyY2goKS4KKwkgKi8KKwlwb3MuYnVmID0gX2J0X2dldF9lbmRw b2ludChyZWwsIDAsIFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikpOworCisJaWYgKCFC dWZmZXJJc1ZhbGlkKHBvcy5idWYpKQorCXsKKwkJLyoKKwkJICogRW1wdHkgaW5kZXguIExv Y2sgdGhlIHdob2xlIHJlbGF0aW9uLCBhcyBub3RoaW5nIGZpbmVyIHRvIGxvY2sKKwkJICog ZXhpc3RzLgorCQkgKi8KKwkJUHJlZGljYXRlTG9ja1JlbGF0aW9uKHJlbCwgc2Nhbi0+eHNf c25hcHNob3QpOworCQlfYnRfcGFyYWxsZWxfZG9uZShzY2FuKTsKKwkJcmV0dXJuIGZhbHNl OworCX0KKworCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKHBvcy5idWYpOworCW9wYXF1ZSA9IEJU UGFnZUdldE9wYXF1ZShwYWdlKTsKKwlBc3NlcnQoUF9JU0xFQUYob3BhcXVlKSk7CisKKwlp ZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCXsKKwkJLyogVGhlcmUgY291bGQg YmUgZGVhZCBwYWdlcyB0byB0aGUgbGVmdCwgc28gbm90IHRoaXM6ICovCisJCS8qIEFzc2Vy dChQX0xFRlRNT1NUKG9wYXF1ZSkpOyAqLworCisJCXN0YXJ0ID0gUF9GSVJTVERBVEFLRVko b3BhcXVlKTsKKwl9CisJZWxzZSBpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkK Kwl7CisJCUFzc2VydChQX1JJR0hUTU9TVChvcGFxdWUpKTsKKworCQlzdGFydCA9IFBhZ2VH ZXRNYXhPZmZzZXROdW1iZXIocGFnZSk7CisJfQorCWVsc2UKKwl7CisJCWVsb2coRVJST1Is ICJpbnZhbGlkIHNjYW4gZGlyZWN0aW9uOiAlZCIsIChpbnQpIGRpcik7CisJCXN0YXJ0ID0g MDsJCQkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLworCX0KKworCS8qCisJICogTm93IGxv YWQgZGF0YSBmcm9tIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSBzY2FuLgorCSAqLworCXJldHVy biBfYnRfcmVhZGZpcnN0cGFnZV9iYXRjaChzY2FuLCAmcG9zLCBzdGFydCwgZGlyKTsKK30K ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYyBiL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwppbmRleCA5ZTI3MzAyZmU4MS4u NWY4ODE4YjFhM2YgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0 dXRpbHMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMKQEAg LTM0ODEsNiArMzQ4MSwxODUgQEAgX2J0X2tpbGxpdGVtcyhJbmRleFNjYW5EZXNjIHNjYW4p CiAJX2J0X3VubG9ja2J1ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBzby0+Y3VyclBvcy5idWYp OwogfQogCisvKgorICogX2J0X2tpbGxpdGVtc19iYXRjaAorICoJCWEgdmFyaWFudCBvZiBf YnRfa2lsbGl0ZW1zLCB1c2luZyB0aGUgYmF0Y2gtbGV2ZWwga2lsbGVkSXRlbXMKKyAqLwor dm9pZAorX2J0X2tpbGxpdGVtc19iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2Nh bkJhdGNoIGJhdGNoKQoreworCS8qIEJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUp IHNjYW4tPm9wYXF1ZTsgKi8KKwlCVEJhdGNoU2NhblBvcyBwb3MgPSAoQlRCYXRjaFNjYW5Q b3MpIGJhdGNoLT5vcGFxdWU7CisJUGFnZQkJcGFnZTsKKwlCVFBhZ2VPcGFxdWUgb3BhcXVl OworCU9mZnNldE51bWJlciBtaW5vZmY7CisJT2Zmc2V0TnVtYmVyIG1heG9mZjsKKwlpbnQJ CQlpOworCWludAkJCW51bUtpbGxlZCA9IGJhdGNoLT5udW1LaWxsZWQ7CisJYm9vbAkJa2ls bGVkc29tZXRoaW5nID0gZmFsc2U7CisJYm9vbAkJZHJvcHBlZHBpbiBQR19VU0VEX0ZPUl9B U1NFUlRTX09OTFk7CisKKwlBc3NlcnQoQlRCYXRjaFNjYW5Qb3NJc1ZhbGlkKCpwb3MpKTsK KworCS8qCisJICogQWx3YXlzIHJlc2V0IHRoZSBzY2FuIHN0YXRlLCBzbyB3ZSBkb24ndCBs b29rIGZvciBzYW1lIGl0ZW1zIG9uIG90aGVyCisJICogcGFnZXMuCisJICovCisJYmF0Y2gt Pm51bUtpbGxlZCA9IDA7CisKKwlpZiAoQlRCYXRjaFNjYW5Qb3NJc1Bpbm5lZCgqcG9zKSkK Kwl7CisJCS8qCisJCSAqIFdlIGhhdmUgaGVsZCB0aGUgcGluIG9uIHRoaXMgcGFnZSBzaW5j ZSB3ZSByZWFkIHRoZSBpbmRleCB0dXBsZXMsCisJCSAqIHNvIGFsbCB3ZSBuZWVkIHRvIGRv IGlzIGxvY2sgaXQuICBUaGUgcGluIHdpbGwgaGF2ZSBwcmV2ZW50ZWQKKwkJICogcmUtdXNl IG9mIGFueSBUSUQgb24gdGhlIHBhZ2UsIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sg dGhlCisJCSAqIExTTi4KKwkJICovCisJCWRyb3BwZWRwaW4gPSBmYWxzZTsKKwkJX2J0X2xv Y2tidWYoc2Nhbi0+aW5kZXhSZWxhdGlvbiwgcG9zLT5idWYsIEJUX1JFQUQpOworCisJCXBh Z2UgPSBCdWZmZXJHZXRQYWdlKHBvcy0+YnVmKTsKKwl9CisJZWxzZQorCXsKKwkJQnVmZmVy CQlidWY7CisKKwkJZHJvcHBlZHBpbiA9IHRydWU7CisJCS8qIEF0dGVtcHQgdG8gcmUtcmVh ZCB0aGUgYnVmZmVyLCBnZXR0aW5nIHBpbiBhbmQgbG9jay4gKi8KKwkJYnVmID0gX2J0X2dl dGJ1ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBwb3MtPmN1cnJQYWdlLCBCVF9SRUFEKTsKKwor CQlwYWdlID0gQnVmZmVyR2V0UGFnZShidWYpOworCQlpZiAoQnVmZmVyR2V0TFNOQXRvbWlj KGJ1ZikgPT0gcG9zLT5sc24pCisJCQlwb3MtPmJ1ZiA9IGJ1ZjsKKwkJZWxzZQorCQl7CisJ CQkvKiBNb2RpZmllZCB3aGlsZSBub3QgcGlubmVkIG1lYW5zIGhpbnRpbmcgaXMgbm90IHNh ZmUuICovCisJCQlfYnRfcmVsYnVmKHNjYW4tPmluZGV4UmVsYXRpb24sIGJ1Zik7CisJCQly ZXR1cm47CisJCX0KKwl9CisKKwlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUocGFnZSk7CisJ bWlub2ZmID0gUF9GSVJTVERBVEFLRVkob3BhcXVlKTsKKwltYXhvZmYgPSBQYWdlR2V0TWF4 T2Zmc2V0TnVtYmVyKHBhZ2UpOworCisJZm9yIChpID0gMDsgaSA8IG51bUtpbGxlZDsgaSsr KQorCXsKKwkJaW50CQkJaXRlbUluZGV4ID0gYmF0Y2gtPmtpbGxlZEl0ZW1zW2ldOworCQlJ bmRleFNjYW5CYXRjaFBvc0l0ZW0gKmtpdGVtID0gJmJhdGNoLT5pdGVtc1tpdGVtSW5kZXhd OworCQlPZmZzZXROdW1iZXIgb2ZmbnVtID0ga2l0ZW0tPmluZGV4T2Zmc2V0OworCisJCUFz c2VydChpdGVtSW5kZXggPj0gYmF0Y2gtPmZpcnN0SXRlbSAmJgorCQkJICAgaXRlbUluZGV4 IDw9IGJhdGNoLT5sYXN0SXRlbSk7CisJCWlmIChvZmZudW0gPCBtaW5vZmYpCisJCQljb250 aW51ZTsJCQkvKiBwdXJlIHBhcmFub2lhICovCisJCXdoaWxlIChvZmZudW0gPD0gbWF4b2Zm KQorCQl7CisJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgb2ZmbnVtKTsK KwkJCUluZGV4VHVwbGUJaXR1cGxlID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2Us IGlpZCk7CisJCQlib29sCQlraWxsdHVwbGUgPSBmYWxzZTsKKworCQkJaWYgKEJUcmVlVHVw bGVJc1Bvc3RpbmcoaXR1cGxlKSkKKwkJCXsKKwkJCQlpbnQJCQlwaSA9IGkgKyAxOworCQkJ CWludAkJCW5wb3N0aW5nID0gQlRyZWVUdXBsZUdldE5Qb3N0aW5nKGl0dXBsZSk7CisJCQkJ aW50CQkJajsKKworCQkJCS8qCisJCQkJICogV2UgcmVseSBvbiB0aGUgY29udmVudGlvbiB0 aGF0IGhlYXAgVElEcyBpbiB0aGUgc2NhbnBvcworCQkJCSAqIGl0ZW1zIGFycmF5IGFyZSBz dG9yZWQgaW4gYXNjZW5kaW5nIGhlYXAgVElEIG9yZGVyIGZvciBhCisJCQkJICogZ3JvdXAg b2YgVElEcyB0aGF0IG9yaWdpbmFsbHkgY2FtZSBmcm9tIGEgcG9zdGluZyBsaXN0CisJCQkJ ICogdHVwbGUuICBUaGlzIGNvbnZlbnRpb24gZXZlbiBhcHBsaWVzIGR1cmluZyBiYWNrd2Fy ZHMKKwkJCQkgKiBzY2Fucywgd2hlcmUgcmV0dXJuaW5nIHRoZSBUSURzIGluIGRlc2NlbmRp bmcgb3JkZXIgbWlnaHQKKwkJCQkgKiBzZWVtIG1vcmUgbmF0dXJhbC4gIFRoaXMgaXMgYWJv dXQgZWZmZWN0aXZlbmVzcywgbm90CisJCQkJICogY29ycmVjdG5lc3MuCisJCQkJICoKKwkJ CQkgKiBOb3RlIHRoYXQgdGhlIHBhZ2UgbWF5IGhhdmUgYmVlbiBtb2RpZmllZCBpbiBhbG1v c3QgYW55IHdheQorCQkJCSAqIHNpbmNlIHdlIGZpcnN0IHJlYWQgaXQgKGluIHRoZSAhZHJv cHBlZHBpbiBjYXNlKSwgc28gaXQncworCQkJCSAqIHBvc3NpYmxlIHRoYXQgdGhpcyBwb3N0 aW5nIGxpc3QgdHVwbGUgd2Fzbid0IGEgcG9zdGluZyBsaXN0CisJCQkJICogdHVwbGUgd2hl biB3ZSBmaXJzdCBlbmNvdW50ZXJlZCBpdHMgaGVhcCBUSURzLgorCQkJCSAqLworCQkJCWZv ciAoaiA9IDA7IGogPCBucG9zdGluZzsgaisrKQorCQkJCXsKKwkJCQkJSXRlbVBvaW50ZXIg aXRlbSA9IEJUcmVlVHVwbGVHZXRQb3N0aW5nTihpdHVwbGUsIGopOworCisJCQkJCWlmICgh SXRlbVBvaW50ZXJFcXVhbHMoaXRlbSwgJmtpdGVtLT5oZWFwVGlkKSkKKwkJCQkJCWJyZWFr OwkvKiBvdXQgb2YgcG9zdGluZyBsaXN0IGxvb3AgKi8KKworCQkJCQkvKgorCQkJCQkgKiBr aXRlbSBtdXN0IGhhdmUgbWF0Y2hpbmcgb2ZmbnVtIHdoZW4gaGVhcCBUSURzIG1hdGNoLAor CQkJCQkgKiB0aG91Z2ggb25seSBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhlIHBhZ2Ug Y2FuJ3QKKwkJCQkJICogaGF2ZSBiZWVuIGNvbmN1cnJlbnRseSBtb2RpZmllZAorCQkJCQkg Ki8KKwkJCQkJQXNzZXJ0KGtpdGVtLT5pbmRleE9mZnNldCA9PSBvZmZudW0gfHwgIWRyb3Bw ZWRwaW4pOworCisJCQkJCS8qCisJCQkJCSAqIFJlYWQtYWhlYWQgdG8gbGF0ZXIga2l0ZW1z IGhlcmUuCisJCQkJCSAqCisJCQkJCSAqIFdlIHJlbHkgb24gdGhlIGFzc3VtcHRpb24gdGhh dCBub3QgYWR2YW5jaW5nIGtpdGVtIGhlcmUKKwkJCQkJICogd2lsbCBwcmV2ZW50IHVzIGZy b20gY29uc2lkZXJpbmcgdGhlIHBvc3RpbmcgbGlzdCB0dXBsZQorCQkJCQkgKiBmdWxseSBk ZWFkIGJ5IG5vdCBtYXRjaGluZyBpdHMgbmV4dCBoZWFwIFRJRCBpbiBuZXh0CisJCQkJCSAq IGxvb3AgaXRlcmF0aW9uLgorCQkJCQkgKgorCQkJCQkgKiBJZiwgb24gdGhlIG90aGVyIGhh bmQsIHRoaXMgaXMgdGhlIGZpbmFsIGhlYXAgVElEIGluCisJCQkJCSAqIHRoZSBwb3N0aW5n IGxpc3QgdHVwbGUsIHRoZW4gdHVwbGUgZ2V0cyBraWxsZWQKKwkJCQkJICogcmVnYXJkbGVz cyAoaS5lLiB3ZSBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGxhc3QKKwkJCQkJICoga2l0 ZW0gaXMgYWxzbyB0aGUgbGFzdCBoZWFwIFRJRCBpbiB0aGUgbGFzdCBpbmRleCB0dXBsZQor CQkJCQkgKiBjb3JyZWN0bHkgLS0gcG9zdGluZyB0dXBsZSBzdGlsbCBnZXRzIGtpbGxlZCku CisJCQkJCSAqLworCQkJCQlpZiAocGkgPCBudW1LaWxsZWQpCisJCQkJCQlraXRlbSA9ICZi YXRjaC0+aXRlbXNbYmF0Y2gtPmtpbGxlZEl0ZW1zW3BpKytdXTsKKwkJCQl9CisKKwkJCQkv KgorCQkJCSAqIERvbid0IGJvdGhlciBhZHZhbmNpbmcgdGhlIG91dGVybW9zdCBsb29wJ3Mg aW50IGl0ZXJhdG9yIHRvCisJCQkJICogYXZvaWQgcHJvY2Vzc2luZyBraWxsZWQgaXRlbXMg dGhhdCByZWxhdGUgdG8gdGhlIHNhbWUKKwkJCQkgKiBvZmZudW0vcG9zdGluZyBsaXN0IHR1 cGxlLiAgVGhpcyBtaWNyby1vcHRpbWl6YXRpb24gaGFyZGx5CisJCQkJICogc2VlbXMgd29y dGggaXQuICAoRnVydGhlciBpdGVyYXRpb25zIG9mIHRoZSBvdXRlcm1vc3QgbG9vcAorCQkJ CSAqIHdpbGwgZmFpbCB0byBtYXRjaCBvbiB0aGlzIHNhbWUgcG9zdGluZyBsaXN0J3MgZmly c3QgaGVhcAorCQkJCSAqIFRJRCBpbnN0ZWFkLCBzbyB3ZSdsbCBhZHZhbmNlIHRvIHRoZSBu ZXh0IG9mZm51bS9pbmRleAorCQkJCSAqIHR1cGxlIHByZXR0eSBxdWlja2x5LikKKwkJCQkg Ki8KKwkJCQlpZiAoaiA9PSBucG9zdGluZykKKwkJCQkJa2lsbHR1cGxlID0gdHJ1ZTsKKwkJ CX0KKwkJCWVsc2UgaWYgKEl0ZW1Qb2ludGVyRXF1YWxzKCZpdHVwbGUtPnRfdGlkLCAma2l0 ZW0tPmhlYXBUaWQpKQorCQkJCWtpbGx0dXBsZSA9IHRydWU7CisKKwkJCS8qCisJCQkgKiBN YXJrIGluZGV4IGl0ZW0gYXMgZGVhZCwgaWYgaXQgaXNuJ3QgYWxyZWFkeS4gIFNpbmNlIHRo aXMKKwkJCSAqIGhhcHBlbnMgd2hpbGUgaG9sZGluZyBhIGJ1ZmZlciBsb2NrIHBvc3NpYmx5 IGluIHNoYXJlZCBtb2RlLAorCQkJICogaXQncyBwb3NzaWJsZSB0aGF0IG11bHRpcGxlIHBy b2Nlc3NlcyBhdHRlbXB0IHRvIGRvIHRoaXMKKwkJCSAqIHNpbXVsdGFuZW91c2x5LCBsZWFk aW5nIHRvIG11bHRpcGxlIGZ1bGwtcGFnZSBpbWFnZXMgYmVpbmcgc2VudAorCQkJICogdG8g V0FMIChpZiB3YWxfbG9nX2hpbnRzIG9yIGRhdGEgY2hlY2tzdW1zIGFyZSBlbmFibGVkKSwg d2hpY2gKKwkJCSAqIGlzIHVuZGVzaXJhYmxlLgorCQkJICovCisJCQlpZiAoa2lsbHR1cGxl ICYmICFJdGVtSWRJc0RlYWQoaWlkKSkKKwkJCXsKKwkJCQkvKiBmb3VuZCB0aGUgaXRlbS9h bGwgcG9zdGluZyBsaXN0IGl0ZW1zICovCisJCQkJSXRlbUlkTWFya0RlYWQoaWlkKTsKKwkJ CQlraWxsZWRzb21ldGhpbmcgPSB0cnVlOworCQkJCWJyZWFrOwkJCS8qIG91dCBvZiBpbm5l ciBzZWFyY2ggbG9vcCAqLworCQkJfQorCQkJb2ZmbnVtID0gT2Zmc2V0TnVtYmVyTmV4dChv ZmZudW0pOworCQl9CisJfQorCisJLyoKKwkgKiBTaW5jZSB0aGlzIGNhbiBiZSByZWRvbmUg bGF0ZXIgaWYgbmVlZGVkLCBtYXJrIGFzIGRpcnR5IGhpbnQuCisJICoKKwkgKiBXaGVuZXZl ciB3ZSBtYXJrIGFueXRoaW5nIExQX0RFQUQsIHdlIGFsc28gc2V0IHRoZSBwYWdlJ3MKKwkg KiBCVFBfSEFTX0dBUkJBR0UgZmxhZywgd2hpY2ggaXMgbGlrZXdpc2UganVzdCBhIGhpbnQu ICAoTm90ZSB0aGF0IHdlCisJICogb25seSByZWx5IG9uIHRoZSBwYWdlLWxldmVsIGZsYWcg aW4gIWhlYXBrZXlzcGFjZSBpbmRleGVzLikKKwkgKi8KKwlpZiAoa2lsbGVkc29tZXRoaW5n KQorCXsKKwkJb3BhcXVlLT5idHBvX2ZsYWdzIHw9IEJUUF9IQVNfR0FSQkFHRTsKKwkJTWFy a0J1ZmZlckRpcnR5SGludChwb3MtPmJ1ZiwgdHJ1ZSk7CisJfQorCisJX2J0X3VubG9ja2J1 ZihzY2FuLT5pbmRleFJlbGF0aW9uLCBwb3MtPmJ1Zik7Cit9CiAKIC8qCiAgKiBUaGUgZm9s bG93aW5nIHJvdXRpbmVzIG1hbmFnZSBhIHNoYXJlZC1tZW1vcnkgYXJlYSBpbiB3aGljaCB3 ZSB0cmFjawpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oIGIvc3Jj L2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCmluZGV4IGViY2EwMjU4OGQzLi5hMDBhMTEwOGJh NSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oCisrKyBiL3NyYy9p bmNsdWRlL2FjY2Vzcy9uYnRyZWUuaApAQCAtMTAwMSw2ICsxMDAxLDM4IEBAIHR5cGVkZWYg c3RydWN0IEJUU2NhblBvc0RhdGEKIAogdHlwZWRlZiBCVFNjYW5Qb3NEYXRhICpCVFNjYW5Q b3M7CiAKKy8qCisgKiBNaW5pbWFsIEFNLXNwZWNpZmljIGNvbmNlcHQgb2YgInBvc2l0aW9u IiBmb3IgYmF0Y2hpbmcuCisgKi8KK3R5cGVkZWYgc3RydWN0IEJUQmF0Y2hTY2FuUG9zRGF0 YQoreworCUJ1ZmZlcgkJYnVmOwkJCS8qIGN1cnJQYWdlIGJ1ZiAoaW52YWxpZCBtZWFucyB1 bnBpbm5lZCkgKi8KKworCS8qIHBhZ2UgZGV0YWlscyBhcyBvZiB0aGUgc2F2ZWQgcG9zaXRp b24ncyBjYWxsIHRvIF9idF9yZWFkcGFnZSAqLworCUJsb2NrTnVtYmVyIGN1cnJQYWdlOwkJ LyogcGFnZSByZWZlcmVuY2VkIGJ5IGl0ZW1zIGFycmF5ICovCisJQmxvY2tOdW1iZXIgcHJl dlBhZ2U7CQkvKiBjdXJyUGFnZSdzIGxlZnQgbGluayAqLworCUJsb2NrTnVtYmVyIG5leHRQ YWdlOwkJLyogY3VyclBhZ2UncyByaWdodCBsaW5rICovCisJWExvZ1JlY1B0cglsc247CQkJ LyogY3VyclBhZ2UncyBMU04gKi8KKworCS8qIHNjYW4gZGlyZWN0aW9uIGZvciB0aGUgc2F2 ZWQgcG9zaXRpb24ncyBjYWxsIHRvIF9idF9yZWFkcGFnZSAqLworCVNjYW5EaXJlY3Rpb24g ZGlyOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZG9pbmcgYW4gaW5kZXgtb25seSBzY2FuLCBu ZXh0VHVwbGVPZmZzZXQgaXMgdGhlIGZpcnN0IGZyZWUKKwkgKiBsb2NhdGlvbiBpbiB0aGUg YXNzb2NpYXRlZCB0dXBsZSBzdG9yYWdlIHdvcmtzcGFjZS4KKwkgKi8KKwlpbnQJCQluZXh0 VHVwbGVPZmZzZXQ7CisKKwkvKgorCSAqIG1vcmVMZWZ0IGFuZCBtb3JlUmlnaHQgdHJhY2sg d2hldGhlciB3ZSB0aGluayB0aGVyZSBtYXkgYmUgbWF0Y2hpbmcKKwkgKiBpbmRleCBlbnRy aWVzIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBvZiB0aGUgY3VycmVudCBwYWdlLCByZXNwZWN0 aXZlbHkuCisJICovCisJYm9vbAkJbW9yZUxlZnQ7CisJYm9vbAkJbW9yZVJpZ2h0OworfSBC VEJhdGNoU2NhblBvc0RhdGE7CisKK3R5cGVkZWYgQlRCYXRjaFNjYW5Qb3NEYXRhICpCVEJh dGNoU2NhblBvczsKKwogI2RlZmluZSBCVFNjYW5Qb3NJc1Bpbm5lZChzY2FucG9zKSBcCiAo IFwKIAlBc3NlcnRNYWNybyhCbG9ja051bWJlcklzVmFsaWQoKHNjYW5wb3MpLmN1cnJQYWdl KSB8fCBcCkBAIC0xMDE3LDcgKzEwNDksNiBAQCB0eXBlZGVmIEJUU2NhblBvc0RhdGEgKkJU U2NhblBvczsKIAkJaWYgKEJUU2NhblBvc0lzUGlubmVkKHNjYW5wb3MpKSBcCiAJCQlCVFNj YW5Qb3NVbnBpbihzY2FucG9zKTsgXAogCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgQlRTY2Fu UG9zSXNWYWxpZChzY2FucG9zKSBcCiAoIFwKIAlBc3NlcnRNYWNybyhCbG9ja051bWJlcklz VmFsaWQoKHNjYW5wb3MpLmN1cnJQYWdlKSB8fCBcCkBAIC0xMDMwLDYgKzEwNjEsMzUgQEAg dHlwZWRlZiBCVFNjYW5Qb3NEYXRhICpCVFNjYW5Qb3M7CiAJCShzY2FucG9zKS5jdXJyUGFn ZSA9IEludmFsaWRCbG9ja051bWJlcjsgXAogCX0gd2hpbGUgKDApCiAKKyNkZWZpbmUgQlRC YXRjaFNjYW5Qb3NJc1Bpbm5lZChzY2FucG9zKSBcCisoIFwKKwlBc3NlcnRNYWNybyhCbG9j a051bWJlcklzVmFsaWQoKHNjYW5wb3MpLmN1cnJQYWdlKSB8fCBcCisJCQkJIUJ1ZmZlcklz VmFsaWQoKHNjYW5wb3MpLmJ1ZikpLCBcCisJQnVmZmVySXNWYWxpZCgoc2NhbnBvcykuYnVm KSBcCispCisjZGVmaW5lIEJUQmF0Y2hTY2FuUG9zVW5waW4oc2NhbnBvcykgXAorCWRvIHsg XAorCQlSZWxlYXNlQnVmZmVyKChzY2FucG9zKS5idWYpOyBcCisJCShzY2FucG9zKS5idWYg PSBJbnZhbGlkQnVmZmVyOyBcCisJfSB3aGlsZSAoMCkKKyNkZWZpbmUgQlRCYXRjaFNjYW5Q b3NVbnBpbklmUGlubmVkKHNjYW5wb3MpIFwKKwlkbyB7IFwKKwkJaWYgKEJUQmF0Y2hTY2Fu UG9zSXNQaW5uZWQoc2NhbnBvcykpIFwKKwkJCUJUQmF0Y2hTY2FuUG9zVW5waW4oc2NhbnBv cyk7IFwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBCVEJhdGNoU2NhblBvc0lzVmFsaWQoc2Nh bnBvcykgXAorKCBcCisJQXNzZXJ0TWFjcm8oQmxvY2tOdW1iZXJJc1ZhbGlkKChzY2FucG9z KS5jdXJyUGFnZSkgfHwgXAorCQkJCSFCdWZmZXJJc1ZhbGlkKChzY2FucG9zKS5idWYpKSwg XAorCUJsb2NrTnVtYmVySXNWYWxpZCgoc2NhbnBvcykuY3VyclBhZ2UpIFwKKykKKyNkZWZp bmUgQlRCYXRjaFNjYW5Qb3NJbnZhbGlkYXRlKHNjYW5wb3MpIFwKKwlkbyB7IFwKKwkJKHNj YW5wb3MpLmJ1ZiA9IEludmFsaWRCdWZmZXI7IFwKKwkJKHNjYW5wb3MpLmN1cnJQYWdlID0g SW52YWxpZEJsb2NrTnVtYmVyOyBcCisJfSB3aGlsZSAoMCkKKworCiAvKiBXZSBuZWVkIG9u ZSBvZiB0aGVzZSBmb3IgZWFjaCBlcXVhbGl0eS10eXBlIFNLX1NFQVJDSEFSUkFZIHNjYW4g a2V5ICovCiB0eXBlZGVmIHN0cnVjdCBCVEFycmF5S2V5SW5mbwogewpAQCAtMTE5MSw2ICsx MjUxLDggQEAgZXh0ZXJuIEluZGV4U2NhbkRlc2MgYnRiZWdpbnNjYW4oUmVsYXRpb24gcmVs LCBpbnQgbmtleXMsIGludCBub3JkZXJieXMpOwogZXh0ZXJuIFNpemUgYnRlc3RpbWF0ZXBh cmFsbGVsc2NhbihSZWxhdGlvbiByZWwsIGludCBua2V5cywgaW50IG5vcmRlcmJ5cyk7CiBl eHRlcm4gdm9pZCBidGluaXRwYXJhbGxlbHNjYW4odm9pZCAqdGFyZ2V0KTsKIGV4dGVybiBi b29sIGJ0Z2V0dHVwbGUoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7 CitleHRlcm4gSW5kZXhTY2FuQmF0Y2ggYnRnZXRiYXRjaChJbmRleFNjYW5EZXNjIHNjYW4s IFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiB2b2lkIGJ0ZnJlZWJhdGNoKEluZGV4U2Nh bkRlc2Mgc2NhbiwgSW5kZXhTY2FuQmF0Y2ggYmF0Y2gpOwogZXh0ZXJuIGludDY0IGJ0Z2V0 Yml0bWFwKEluZGV4U2NhbkRlc2Mgc2NhbiwgVElEQml0bWFwICp0Ym0pOwogZXh0ZXJuIHZv aWQgYnRyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBu c2NhbmtleXMsCiAJCQkJCSBTY2FuS2V5IG9yZGVyYnlzLCBpbnQgbm9yZGVyYnlzKTsKQEAg LTEyMTUsNiArMTI3Nyw5IEBAIGV4dGVybiBTdHJhdGVneU51bWJlciBidHRyYW5zbGF0ZWNt cHR5cGUoQ29tcGFyZVR5cGUgY21wdHlwZSwgT2lkIG9wZmFtaWx5KTsKICAqLwogZXh0ZXJu IGJvb2wgX2J0X3BhcmFsbGVsX3NlaXplKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1i ZXIgKm5leHRfc2Nhbl9wYWdlLAogCQkJCQkJCSAgIEJsb2NrTnVtYmVyICpsYXN0X2N1cnJf cGFnZSwgYm9vbCBmaXJzdCk7CitleHRlcm4gYm9vbCBfYnRfcGFyYWxsZWxfc2VpemVfYmF0 Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBCVEJhdGNoU2NhblBvcyBwb3MsCisJCQkJCQkJCQkg QmxvY2tOdW1iZXIgKm5leHRfc2Nhbl9wYWdlLAorCQkJCQkJCQkJIEJsb2NrTnVtYmVyICps YXN0X2N1cnJfcGFnZSwgYm9vbCBmaXJzdCk7CiBleHRlcm4gdm9pZCBfYnRfcGFyYWxsZWxf cmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sCiAJCQkJCQkJCSBCbG9ja051bWJlciBuZXh0 X3NjYW5fcGFnZSwKIAkJCQkJCQkJIEJsb2NrTnVtYmVyIGN1cnJfcGFnZSk7CkBAIC0xMzA4 LDYgKzEzNzMsMTAgQEAgZXh0ZXJuIGJvb2wgX2J0X2ZpcnN0KEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIpOwogZXh0ZXJuIGJvb2wgX2J0X25leHQoSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CiBleHRlcm4gQnVmZmVyIF9idF9nZXRf ZW5kcG9pbnQoUmVsYXRpb24gcmVsLCB1aW50MzIgbGV2ZWwsIGJvb2wgcmlnaHRtb3N0KTsK IAorZXh0ZXJuIEluZGV4U2NhbkJhdGNoIF9idF9maXJzdF9iYXRjaChJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiBJbmRleFNjYW5CYXRjaCBfYnRf bmV4dF9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIEJUQmF0Y2hTY2FuUG9zIHBvcywgU2Nh bkRpcmVjdGlvbiBkaXIpOworZXh0ZXJuIHZvaWQgX2J0X2tpbGxfYmF0Y2goSW5kZXhTY2Fu RGVzYyBzY2FuLCBJbmRleFNjYW5CYXRjaCBiYXRjaCk7CisKIC8qCiAgKiBwcm90b3R5cGVz IGZvciBmdW5jdGlvbnMgaW4gbmJ0dXRpbHMuYwogICovCkBAIC0xMzI2LDYgKzEzOTUsNyBA QCBleHRlcm4gYm9vbCBfYnRfc2NhbmJlaGluZF9jaGVja2tleXMoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpciwKIAkJCQkJCQkJCSBJbmRleFR1cGxlIGZpbmFsdHVw KTsKIGV4dGVybiB2b2lkIF9idF9zZXRfc3RhcnRpa2V5KEluZGV4U2NhbkRlc2Mgc2Nhbiwg QlRSZWFkUGFnZVN0YXRlICpwc3RhdGUpOwogZXh0ZXJuIHZvaWQgX2J0X2tpbGxpdGVtcyhJ bmRleFNjYW5EZXNjIHNjYW4pOworZXh0ZXJuIHZvaWQgX2J0X2tpbGxpdGVtc19iYXRjaChJ bmRleFNjYW5EZXNjIHNjYW4sIEluZGV4U2NhbkJhdGNoIGJhdGNoKTsKIGV4dGVybiBCVEN5 Y2xlSWQgX2J0X3ZhY3V1bV9jeWNsZWlkKFJlbGF0aW9uIHJlbCk7CiBleHRlcm4gQlRDeWNs ZUlkIF9idF9zdGFydF92YWN1dW0oUmVsYXRpb24gcmVsKTsKIGV4dGVybiB2b2lkIF9idF9l bmRfdmFjdXVtKFJlbGF0aW9uIHJlbCk7CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRl bnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0Cmlu ZGV4IDA2MGQ5NjRlMzk5Li4xZTU1NDhhYWNiOSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3Bn aW5kZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKQEAgLTE5NSw2ICsxOTUsOCBAQCBCT09MCiBCT09MRUFOCiBCT1gKIEJUQXJyYXlL ZXlJbmZvCitCVEJhdGNoSW5mbworQlRCYXRjaFNjYW5Qb3NEYXRhCiBCVEJ1aWxkU3RhdGUK IEJUQ2FsbGJhY2tTdGF0ZQogQlRDeWNsZUlkCi0tIAoyLjQ5LjAKCg== --------------TIm4EPVLTEyhZ61bk9DD3aiF Content-Type: text/x-patch; charset=UTF-8; name="v20250422-0003-WIP-Don-t-read-the-same-block-repeatedly.patch" Content-Disposition: attachment; filename*0="v20250422-0003-WIP-Don-t-read-the-same-block-repeatedly.patc"; filename*1="h" Content-Transfer-Encoding: base64 RnJvbSA4ZDU2OTY1Yzc4NGVkMzA4ZmM4NGY0Njk1MzlhMzY5ZDZkZTcxOTc0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogV2VkLCAxIEphbiAyMDI1IDIyOjEwOjM3ICswMTAwClN1YmplY3Q6IFtQQVRDSCB2 MjAyNTA0MjIgMy81XSBXSVA6IERvbid0IHJlYWQgdGhlIHNhbWUgYmxvY2sgcmVwZWF0ZWRs eQoKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jIHwgNTcg KysrKysrKysrKysrKysrKysrKysrKy0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5k ZXhhbS5jICAgICAgIHwgMTEgKysrKysKIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1 Zm1nci5jICAgICAgfCA0MCArKysrKysrKysrKysrKysrKwogc3JjL2luY2x1ZGUvYWNjZXNz L3JlbHNjYW4uaCAgICAgICAgICAgICB8ICAyICsKIHNyYy9pbmNsdWRlL3N0b3JhZ2UvYnVm bWdyLmggICAgICAgICAgICAgfCAgMiArCiA1IGZpbGVzIGNoYW5nZWQsIDEwOSBpbnNlcnRp b25zKCspLCAzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vz cy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFw YW1faGFuZGxlci5jCmluZGV4IGY3OWQ5N2E4YzY0Li4zMjZkNWZlZDY4MSAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYworKysgYi9zcmMv YmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCkBAIC0xMzYsNiArMTM2LDcg QEAgaGVhcGFtX2luZGV4X2ZldGNoX3R1cGxlKHN0cnVjdCBJbmRleEZldGNoVGFibGVEYXRh ICpzY2FuLAogCXsKIAkJLyogU3dpdGNoIHRvIGNvcnJlY3QgYnVmZmVyIGlmIHdlIGRvbid0 IGhhdmUgaXQgYWxyZWFkeSAqLwogCQlCdWZmZXIJCXByZXZfYnVmID0gaHNjYW4tPnhzX2Ni dWY7CisJCWJvb2wJCXJlbGVhc2VfcHJldiA9IHRydWU7CiAKIAkJLyoKIAkJICogUmVhZCB0 aGUgYmxvY2sgZm9yIHRoZSByZXF1ZXN0ZWQgVElELiBXaXRoIGEgcmVhZCBzdHJlYW0sIHNp bXBseQpAQCAtMTU3LDcgKzE1OCw1NiBAQCBoZWFwYW1faW5kZXhfZmV0Y2hfdHVwbGUoc3Ry dWN0IEluZGV4RmV0Y2hUYWJsZURhdGEgKnNjYW4sCiAJCSAqIEFQSS4KIAkJICovCiAJCWlm IChzY2FuLT5ycykKLQkJCWhzY2FuLT54c19jYnVmID0gcmVhZF9zdHJlYW1fbmV4dF9idWZm ZXIoc2Nhbi0+cnMsIE5VTEwpOworCQl7CisJCQkvKgorCQkJICogSWYgd2UncmUgdHJ5aW5n IHRvIHJlYWQgdGhlIHNhbWUgYmxvY2sgYXMgdGhlIGxhc3QgdGltZSwgZG9uJ3QKKwkJCSAq IHRyeSByZWFkaW5nIGl0IGZyb20gdGhlIHN0cmVhbSBhZ2FpbiwgYnV0IGp1c3QgcmV0dXJu IHRoZSBsYXN0CisJCQkgKiBidWZmZXIuIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIHByZXZp b3VzIGJ1ZmZlciBpcyBzdGlsbCBwaW5uZWQKKwkJCSAqIGFuZCBjb250YWlucyB0aGUgY29y cmVjdCBibG9jayAoaXQgbWlnaHQgaGF2ZSBiZWVuIHVucGlubmVkLAorCQkJICogdXNlZCBm b3IgYSBkaWZmZXJlbnQgYmxvY2ssIHNvIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCkuCisJCQkg KgorCQkJICogVGhlIHBsYWNlIHNjaGVkdWxpbmcgdGhlIGJsb2NrcyAoaW5kZXhfc2Nhbl9z dHJlYW1fcmVhZF9uZXh0KQorCQkJICogbmVlZHMgdG8gZG8gdGhlIHNhbWUgdGhpbmcgYW5k IG5vdCBzY2hlZHVsZSB0aGUgYmxvY2tzIGlmIGl0CisJCQkgKiBtYXRjaGVzIHRoZSBwcmV2 aW91cyBvbmUuIE90aGVyd2lzZSB0aGUgc3RyZWFtIHdpbGwgZ2V0IG91dCBvZgorCQkJICog c3luYywgY2F1c2luZyBjb25mdXNpb24uCisJCQkgKgorCQkJICogVGhpcyBpcyB3aGF0IFJl bGVhc2VBbmRSZWFkQnVmZmVyIGRvZXMgdG9vLCBidXQgaXQgZG9lcyBub3QKKwkJCSAqIGhh dmUgYSBxdWV1ZSBvZiByZXF1ZXN0cyBzY2hlZHVsZWQgZnJvbSBzb21ld2hlcmUgZWxzZSwg c28gaXQKKwkJCSAqIGRvZXMgbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC4KKwkJCSAq CisJCQkgKiBYWFggTWF5YmUgd2Ugc2hvdWxkIHJlbWVtYmVyIHRoZSBibG9jayBpbiBJbmRl eEZldGNoVGFibGVEYXRhLAorCQkJICogc28gdGhhdCB3ZSBjYW4gbWFrZSB0aGUgY2hlY2sg ZXZlbiBjaGVhcGVyLCB3aXRob3V0IGxvb2tpbmcgYXQKKwkJCSAqIHRoZSBidWZmZXIgZGVz Y3JpcHRvcj8gQnV0IHRoYXQgYXNzdW1lcyB0aGUgYnVmZmVyIHdhcyBub3QKKwkJCSAqIHVu cGlubmVkIChvciByZXBpbm5lZCkgZWxzZXdoZXJlLCBiZWZvcmUgd2UgZ290IGJhY2sgaGVy ZS4gQnV0CisJCQkgKiBjYW4gdGhhdCBldmVuIGhhcHBlbj8gSWYgeWVzLCBJIGd1ZXNzIHdl IHNob3VsZG4ndCBiZSByZWxlYXNpbmcKKwkJCSAqIHRoZSBwcmV2IGJ1ZmZlciBhbnl3YXku CisJCQkgKgorCQkJICogWFhYIFRoaXMgaGFzIHVuZGVzaXJlZCBpbXBhY3Qgb24gcHJlZmV0 Y2ggZGlzdGFuY2UuIFRoZSByZWFkCisJCQkgKiBzdHJlYW0gc2NoZWR1bGVzIHJlYWRzIGZv ciBhIGNlcnRhaW4gbnVtYmVyIG9mIGZ1dHVyZSBibG9ja3MsCisJCQkgKiBidXQgaWYgd2Ug c2tpcCBkdXBsaWNhdGUgYmxvY2tzLCB0aGUgcHJlZmV0Y2ggZGlzdGFuY2UgbWF5IGdldAor CQkJICogdW5leHBlY3RlZGx5IGxhcmdlIChlLmcuIGZvciBjb3JyZWxhdGVkIGluZGV4ZXMs IHdpdGggbG9uZyBydW5zCisJCQkgKiBvZiBUSURzIGZyb20gdGhlIHNhbWUgaGVhcCBwYWdl KS4gVGhpcyBtYXkgc3BlbmQgYSBsb3Qgb2YgQ1BVCisJCQkgKiB0aW1lIGluIHRoZSBpbmRl eF9zY2FuX3N0cmVhbV9yZWFkX25leHQgY2FsbGJhY2ssIGJ1dCBtb3JlCisJCQkgKiBpbXBv cnRhbnRseSBpdCBtYXkgcmVxdWlyZSByZWFkaW5nIChhbmQga2VlcGluZykgYSBsb3Qgb2Yg bGVhZgorCQkJICogcGFnZXMgZnJvbSB0aGUgaW5kZXguCisJCQkgKgorCQkJICogWFhYIFdo YXQgaWYgd2UgcGlubmVkIHRoZSBidWZmZXIgdHdpY2UgKGluY3JlYXNlIHRoZSByZWZjb3Vu dCksCisJCQkgKiBzbyB0aGF0IGlmIHRoZSBjYWxsZXIgdW5waW5zIHRoZSBidWZmZXIsIHdl IHN0aWxsIGtlZXAgdGhlCisJCQkgKiBzZWNvbmQgcGluLiBXb3VsZG4ndCB0aGF0IG1lYW4g d2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUKKwkJCSAqIHBvc3NpYmlsaXR5IHNv bWVvbmUgbG9hZGVkIGFub3RoZXIgcGFnZSBpbnRvIHRoZSBidWZmZXI/CisJCQkgKgorCQkJ ICogWFhYIFdlIG1pZ2h0IGFsc28ga2VlcCBhIGxvbmdlciBoaXN0b3J5IG9mIHJlY2VudCBi bG9ja3MsIG5vdAorCQkJICoganVzdCB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIG9uZS4g QnV0IHRoYXQgbWFrZXMgaXQgaGFyZGVyLAorCQkJICogYmVjYXVzZSB0aGUgdHdvIHBsYWNl cyAocmVhZF9uZXh0IGNhbGxiYWNrIGFuZCBoZXJlKSBuZWVkIHRvCisJCQkgKiBoYXZlIGEg c2xpZ2h0bHkgZGlmZmVyZW50IHZpZXcuCisJCQkgKi8KKwkJCWlmIChCdWZmZXJNYXRjaGVz KGhzY2FuLT54c19jYnVmLAorCQkJCQkJCSAgaHNjYW4tPnhzX2Jhc2UucmVsLAorCQkJCQkJ CSAgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQpKSkKKwkJCQlyZWxlYXNlX3ByZXYg PSBmYWxzZTsKKwkJCWVsc2UKKwkJCQloc2Nhbi0+eHNfY2J1ZiA9IHJlYWRfc3RyZWFtX25l eHRfYnVmZmVyKHNjYW4tPnJzLCBOVUxMKTsKKwkJfQogCQllbHNlCiAJCQloc2Nhbi0+eHNf Y2J1ZiA9IFJlbGVhc2VBbmRSZWFkQnVmZmVyKGhzY2FuLT54c19jYnVmLAogCQkJCQkJCQkJ CQkJICBoc2Nhbi0+eHNfYmFzZS5yZWwsCkBAIC0xODEsNyArMjMxLDggQEAgaGVhcGFtX2lu ZGV4X2ZldGNoX3R1cGxlKHN0cnVjdCBJbmRleEZldGNoVGFibGVEYXRhICpzY2FuLAogCQkJ aGVhcF9wYWdlX3BydW5lX29wdChoc2Nhbi0+eHNfYmFzZS5yZWwsIGhzY2FuLT54c19jYnVm KTsKIAogCQkvKgotCQkgKiBXaGVuIHVzaW5nIHRoZSByZWFkIHN0cmVhbSwgcmVsZWFzZSB0 aGUgb2xkIGJ1ZmZlci4KKwkJICogV2hlbiB1c2luZyB0aGUgcmVhZCBzdHJlYW0sIHJlbGVh c2UgdGhlIG9sZCBidWZmZXIgLSBidXQgb25seSBpZgorCQkgKiB3ZSdyZSByZWFkaW5nIGEg ZGlmZmVyZW50IGJsb2NrLgogCQkgKgogCQkgKiBYWFggTm90IHN1cmUgdGhpcyBpcyByZWFs bHkgbmVlZGVkLCBvciBtYXliZSB0aGlzIGlzIG5vdCB0aGUgcmlnaHQKIAkJICogcGxhY2Ug dG8gZG8gdGhpcywgYW5kIGJ1ZmZlcnMgc2hvdWxkIGJlIHJlbGVhc2VkIGVsc2V3aGVyZS4g VGhlCkBAIC0xOTksNyArMjUwLDcgQEAgaGVhcGFtX2luZGV4X2ZldGNoX3R1cGxlKHN0cnVj dCBJbmRleEZldGNoVGFibGVEYXRhICpzY2FuLAogCQkgKiBYWFggRG9lcyB0aGlzIGRvIHRo ZSByaWdodCB0aGluZyB3aGVuIHJlYWRpbmcgdGhlIHNhbWUgcGFnZT8gVGhhdAogCQkgKiBz aG91bGQgcmV0dXJuIHRoZSBzYW1lIGJ1ZmZlciwgc28gd29uJ3Qgd2UgcmVsZWFzZSBpdCBw cmVtYXR1cmVseT8KIAkJICovCi0JCWlmIChzY2FuLT5ycyAmJiAocHJldl9idWYgIT0gSW52 YWxpZEJ1ZmZlcikpCisJCWlmIChzY2FuLT5ycyAmJiAocHJldl9idWYgIT0gSW52YWxpZEJ1 ZmZlcikgJiYgcmVsZWFzZV9wcmV2KQogCQl7CiAJCQlSZWxlYXNlQnVmZmVyKHByZXZfYnVm KTsKIAkJfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0u YyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFtLmMKaW5kZXggMTkwYTExMmU0 NTcuLmFlNGYzZmZiMGNhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgv aW5kZXhhbS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFtLmMKQEAg LTE5MDgsNiArMTkwOCwxNSBAQCBpbmRleF9zY2FuX3N0cmVhbV9yZWFkX25leHQoUmVhZFN0 cmVhbSAqc3RyZWFtLAogCQkJCWNvbnRpbnVlOwogCQkJfQogCisJCQkvKiBzYW1lIGJsb2Nr IGFzIGJlZm9yZSwgZG9uJ3QgbmVlZCB0byByZWFkIGl0ICovCisJCQlpZiAoc2Nhbi0+eHNf YmF0Y2hlcy0+bGFzdEJsb2NrID09IEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSkK KwkJCXsKKwkJCQlERUJVR19MT0coImluZGV4X3NjYW5fc3RyZWFtX3JlYWRfbmV4dDogc2tp cCBibG9jayAobGFzdEJsb2NrKSIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlzY2Fu LT54c19iYXRjaGVzLT5sYXN0QmxvY2sgPSBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRp ZCk7CisKIAkJCXJldHVybiBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCk7CiAJCX0K IApAQCAtMjI2OCw2ICsyMjc3LDcgQEAgaW5kZXhfYmF0Y2hfaW5pdChJbmRleFNjYW5EZXNj IHNjYW4pCiAJaW5kZXhfYmF0Y2hfcG9zX3Jlc2V0KHNjYW4sICZzY2FuLT54c19iYXRjaGVz LT5tYXJrUG9zKTsKIAogCS8vIHNjYW4tPnhzX2JhdGNoZXMtPmN1cnJlbnRCYXRjaCA9IE5V TEw7CisJc2Nhbi0+eHNfYmF0Y2hlcy0+bGFzdEJsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVy OwogfQogCiAvKgpAQCAtMjM1MCw2ICsyMzYwLDcgQEAgaW5kZXhfYmF0Y2hfcmVzZXQoSW5k ZXhTY2FuRGVzYyBzY2FuLCBib29sIGNvbXBsZXRlKQogCWJhdGNoZXMtPmZpbmlzaGVkID0g ZmFsc2U7CiAJYmF0Y2hlcy0+cmVzZXQgPSBmYWxzZTsKIAkvLyBiYXRjaGVzLT5jdXJyZW50 QmF0Y2ggPSBOVUxMOworCWJhdGNoZXMtPmxhc3RCbG9jayA9IEludmFsaWRCbG9ja051bWJl cjsKIAogCUFzc2VydENoZWNrQmF0Y2hlcyhzY2FuKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2J1Zm1nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9i dWZmZXIvYnVmbWdyLmMKaW5kZXggZmUwY2VlYWRjMTMuLjhhMWQ5MTZkZGZmIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYworKysgYi9zcmMvYmFj a2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwpAQCAtMzA0NSw2ICszMDQ1LDQ2IEBAIFJl bGVhc2VBbmRSZWFkQnVmZmVyKEJ1ZmZlciBidWZmZXIsCiAJcmV0dXJuIFJlYWRCdWZmZXIo cmVsYXRpb24sIGJsb2NrTnVtKTsKIH0KIAorLyoKKyAqIEJ1ZmZlck1hdGNoZXMKKyAqCQlD aGVjayBpZiB0aGUgYnVmZmVyIChzdGlsbCkgY29udGFpbnMgdGhlIGV4cGVjdGVkIHBhZ2Uu CisgKgorICogQ2hlY2sgaWYgdGhlIGJ1ZmZlciBjb250YWlucyB0aGUgZXhwZWN0ZWQgcGFn ZS4gVGhlIGJ1ZmZlciBtYXkgYmUgaW52YWxpZCwKKyAqIG9yIHZhbGlkIGFuZCBwaW5uZWQu CisgKi8KK2Jvb2wKK0J1ZmZlck1hdGNoZXMoQnVmZmVyIGJ1ZmZlciwKKwkJCSAgUmVsYXRp b24gcmVsYXRpb24sCisJCQkgIEJsb2NrTnVtYmVyIGJsb2NrTnVtKQoreworCUZvcmtOdW1i ZXIJZm9ya051bSA9IE1BSU5fRk9SS05VTTsKKwlCdWZmZXJEZXNjICpidWZIZHI7CisKKwlp ZiAoQnVmZmVySXNWYWxpZChidWZmZXIpKQorCXsKKwkJQXNzZXJ0KEJ1ZmZlcklzUGlubmVk KGJ1ZmZlcikpOworCQlpZiAoQnVmZmVySXNMb2NhbChidWZmZXIpKQorCQl7CisJCQlidWZI ZHIgPSBHZXRMb2NhbEJ1ZmZlckRlc2NyaXB0b3IoLWJ1ZmZlciAtIDEpOworCQkJaWYgKGJ1 Zkhkci0+dGFnLmJsb2NrTnVtID09IGJsb2NrTnVtICYmCisJCQkJQnVmVGFnTWF0Y2hlc1Jl bEZpbGVMb2NhdG9yKCZidWZIZHItPnRhZywgJnJlbGF0aW9uLT5yZF9sb2NhdG9yKSAmJgor CQkJCUJ1ZlRhZ0dldEZvcmtOdW0oJmJ1Zkhkci0+dGFnKSA9PSBmb3JrTnVtKQorCQkJCXJl dHVybiB0cnVlOworCQl9CisJCWVsc2UKKwkJeworCQkJYnVmSGRyID0gR2V0QnVmZmVyRGVz Y3JpcHRvcihidWZmZXIgLSAxKTsKKwkJCS8qIHdlIGhhdmUgcGluLCBzbyBpdCdzIG9rIHRv IGV4YW1pbmUgdGFnIHdpdGhvdXQgc3BpbmxvY2sgKi8KKwkJCWlmIChidWZIZHItPnRhZy5i bG9ja051bSA9PSBibG9ja051bSAmJgorCQkJCUJ1ZlRhZ01hdGNoZXNSZWxGaWxlTG9jYXRv cigmYnVmSGRyLT50YWcsICZyZWxhdGlvbi0+cmRfbG9jYXRvcikgJiYKKwkJCQlCdWZUYWdH ZXRGb3JrTnVtKCZidWZIZHItPnRhZykgPT0gZm9ya051bSkKKwkJCQlyZXR1cm4gdHJ1ZTsK KwkJfQorCX0KKworCXJldHVybiBmYWxzZTsKK30KKwogLyoKICAqIFBpbkJ1ZmZlciAtLSBt YWtlIGJ1ZmZlciB1bmF2YWlsYWJsZSBmb3IgcmVwbGFjZW1lbnQuCiAgKgpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9y ZWxzY2FuLmgKaW5kZXggYjYzYWY4NDVjYTYuLjJiYmQwZGIwMjIzIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9hY2Nlc3MvcmVsc2Nhbi5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9y ZWxzY2FuLmgKQEAgLTI0Miw2ICsyNDIsOCBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5C YXRjaGVzCiAJYm9vbAkJZmluaXNoZWQ7CiAJYm9vbAkJcmVzZXQ7CiAKKwlCbG9ja051bWJl ciBsYXN0QmxvY2s7CisKIAkvKgogCSAqIEN1cnJlbnQgc2NhbiBkaXJlY3Rpb24sIGZvciB0 aGUgY3VycmVudGx5IGxvYWRlZCBiYXRjaGVzLiBUaGlzIGlzIHVzZWQKIAkgKiB0byBsb2Fk IGRhdGEgaW4gdGhlIHJlYWQgc3RyZWFtIEFQSSBjYWxsYmFjaywgZXRjLgpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv YnVmbWdyLmgKaW5kZXggNDFmZGMxZTc2OTMuLjNiN2Q0ZTZhNmEyIDEwMDY0NAotLS0gYS9z cmMvaW5jbHVkZS9zdG9yYWdlL2J1Zm1nci5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uv YnVmbWdyLmgKQEAgLTIzNyw2ICsyMzcsOCBAQCBleHRlcm4gdm9pZCBJbmNyQnVmZmVyUmVm Q291bnQoQnVmZmVyIGJ1ZmZlcik7CiBleHRlcm4gdm9pZCBDaGVja0J1ZmZlcklzUGlubmVk T25jZShCdWZmZXIgYnVmZmVyKTsKIGV4dGVybiBCdWZmZXIgUmVsZWFzZUFuZFJlYWRCdWZm ZXIoQnVmZmVyIGJ1ZmZlciwgUmVsYXRpb24gcmVsYXRpb24sCiAJCQkJCQkJCSAgIEJsb2Nr TnVtYmVyIGJsb2NrTnVtKTsKK2V4dGVybiBib29sIEJ1ZmZlck1hdGNoZXMoQnVmZmVyIGJ1 ZmZlciwgUmVsYXRpb24gcmVsYXRpb24sCisJCQkJCQkgIEJsb2NrTnVtYmVyIGJsb2NrTnVt KTsKIAogZXh0ZXJuIEJ1ZmZlciBFeHRlbmRCdWZmZXJlZFJlbChCdWZmZXJNYW5hZ2VyUmVs YXRpb24gYm1yLAogCQkJCQkJCQlGb3JrTnVtYmVyIGZvcmtOdW0sCi0tIAoyLjQ5LjAKCg== --------------TIm4EPVLTEyhZ61bk9DD3aiF--