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 1skUrw-000Z6N-QX for pgsql-hackers@arkaria.postgresql.org; Sat, 31 Aug 2024 20:38:50 +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 1skUqw-003JNa-Dx for pgsql-hackers@arkaria.postgresql.org; Sat, 31 Aug 2024 20:37:46 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1skUqv-003JGn-25 for pgsql-hackers@lists.postgresql.org; Sat, 31 Aug 2024 20:37:46 +0000 Received: from relay8-d.mail.gandi.net ([217.70.183.201]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1skUqn-0002Gt-16 for pgsql-hackers@lists.postgresql.org; Sat, 31 Aug 2024 20:37:44 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id 8F8171BF204; Sat, 31 Aug 2024 20:37:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1725136655; 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=SFqdNowiWQ9lX5DcO6MBr696ao6EqPZg6iqW9BTyPvs=; b=o5+U7ZRifTi3aFQy3j9fC7I3FG74V8x6sxfbaHt8pkstQu8cu4Dx93X4JcQmsEJXy7Ue+2 4K0PiRX8XbIiIttSW1Dq4W9MSEbGc4ZUSffGSnLT6FrYcEbYNA/7c0b0jXk8RqFK+mOFuY NR+kAN+0os2gMxq7LdTCtcMlRzk22zohF4JlcAsmKkItb5ntJ8J0KH3h/H9zXvywJxT6Zd 8EdKgbRNSa/S0x2QAOIl1W6blDq2yz9xKY2VgAU+Gc/Aex4fjjDCwYsAWvHjw1kAE9BShv x3WqsWh7+ABD1V9iBODBeNgPg759CHOR2lAm0BawnYhSTAqMxNKYzC0qBw97KA== Content-Type: multipart/mixed; boundary="------------qQktLOnZJ105OojbhJsWMB4K" Message-ID: <6761860c-c66e-400a-b45f-aa741f548771@vondra.me> Date: Sat, 31 Aug 2024 22:37:31 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: index prefetching To: Peter Geoghegan Cc: Andres Freund , Melanie Plageman , Robert Haas , PostgreSQL Hackers , Georgios , Thomas Munro , Konstantin Knizhnik , Dilip Kumar References: <4f5f16ef-df1e-4e09-9b3f-2e0961ab5117@enterprisedb.com> <4736207c-8ea6-40cb-ac52-41af00b58bbc@enterprisedb.com> <20240215201337.7amzw3hpvng7wphb@awork3.anarazel.de> <48d3ff87-a435-488f-b803-258dab6485d6@enterprisedb.com> Content-Language: en-US From: Tomas Vondra In-Reply-To: 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. --------------qQktLOnZJ105OojbhJsWMB4K Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit Hi, Here's an updated (and pretty fundamentally reworked) patch to add prefetching to regular index scans. I'm far happier with this approach than with either of the two earlier ones, and I actually think it might even be easier to combine this with the streaming read (which the patch does not use at all for now). I feeling cautiously optimistic. The patch is still WIP, but everything should be working fine (including optimizations like kill_prior_tuple etc.). The patch actually passes "make check-world" (even with valgrind) and I'm not aware of any bugs. There are a couple limitations and things that need cleanup, ofc. Those are mentioned at the end of this message. The index prefetching had two prior patch versions, with very different approaches, each having different drawbacks. The first one (posted shortly before pgcon 2023) did the prefetching at a very low level, in each index AM. We'd call amgettuple() -> btgettuple(), and that issued prefetches for "future" TIDs from the same leaf page (in the correct prefetch distance, etc). That mostly worked ... sort of. Every index AM had to reimplement the logic, but the main problem was that it had no idea what happened above the index AM. So it regressed cases that are unlikely to benefit from prefetches - like IOS, where we don't need the heap page at all if it's all-visible. And if we disabled prefetching for IOS, it could easily lead to cases where regular index scan is much faster than IOS (which for users would seem quite bizarre). We'd either need to teach the index AM about visibility checks (seems it should not need to know about that), or inject the information in some way, but then also cache the visibility check results (because checking visibility map is not free, and doing it repeatedly can regresses the "cached" case of IOS). Perhaps that was solvable, but it felt uglier and uglier, and in the end my conclusion was it's not the right place to do the prefetches. Why should an index AM initiate prefetches against a heap? It seems the right place to do prefetches is somewhere higher, where we actually have the information to decide if the heap page is needed. (I believe this uncertainty made it harder to adopt streaming read API too.) This led to the second patch, which did pretty much everything in the executor. The Index(Only)Scans simply called index_getnext_tid() in a loop to fill a local "queue" driving the prefetching, and then also consumed the TIDs from it again. The nice thing was this seemed to work with any index AM as long as it had the amgettuple() callback. Unfortunately, this complete separation of prefetching from index AM turned out to be a problem. The ultimate issue that killed this was the kill_prior_tuple, which we use to "remove" pointers to provably dead heap tuples from the index early. With the single-tuple approach the index AM processes the information before it unpins the leaf page, but with a batch snapping multiple leaf pages, we can't rely on that - we might have unpinned the page long before we get to process the list of tuples to kill. We have discussed different ways to deal with this - an obvious option is to rework the index AMs to hold pins on all leaf pages needed by the current batch. But despite the "obviousness" it's a pretty unattractive option. It would require a lot of complexity and reworks in each index AM to support this, which directly contradicts the primary benefit of doing this in the executor - not having to do anything in the index AMs and working for all index AMs. Also, locking/pinning resources accessed asynchronously seems like a great place for subtle bugs. However, I had a bit of a lightbulb moment at pgconf.dev, when talking to Andres about something only very remotely related, something to do with accessing batches of items instead of individually. What if we didn't get the TIDs from the index one by one, but in larger batches, and the index AM never gave us a batch spanning multiple leaf pages? A sort of a "contract" for the API. Yes, this requires extending the index AM. The existing amgettuple() callback is not sufficient for that, because we don't know when leaf pages change. Or will change, which makes it hard to communicate information about past tuples. There's a fairly long comment in indexam.c before the chunk of new code, trying to explain how this is supposed to work. There's also a lot of XXX comments scattered around, with open questions / ideas about various parts of this. But let me share a brief overview here ... The patch adds a new callback amgettuplebatch() which loads an array of items (into IndexScanDesc). It also adds index_batch_getnext() and index_batch_getnext_tid() wrappers to access the batch. This means if we have loop reading tuples from an indexscan while ((tid = index_getnext_slot(scan, dir, slot)) != NULL) { ... process the slot ... } we could replace it with something like while (index_batch_getnext(scan, dir)) { while ((tid = index_batch_getnext_slot(scan, dir, slot)) != NULL) { ... process the slot ... } } Obviously, nodeIndescan.c does that a bit differently, but I think the I idea is clear. For index-only scans it'd be more complicated, due to visibility checks etc. but the overall idea is the same. For kill_prior_tuple, the principle is about the same, except that we collect information about which tuples to kill in the batch, and the AM only gets the information before reading the next batch - at which point it simply adds them to the private list and kills them when switching to the next leaf page. Obviously, this requires some new code in the index AM - I don't think there's a way around that, the index AM has to have a say in this one way or the other. Either it has to keep multiple leaf pages pinned, or it needs to generate batches in a way that works with a single pin. I've only done this for btree for now, but the amount of code needed is pretty small - essentially I needed the btgettuplebatch, which is maybe 20 lines plus comments, and then _bt_first_batch/_bt_next_batch, which are just simplified versions of _bt_first/_bt_next. The _bt_first_batch/_bt_next_batch are a bit long, but there's a lot of redundancy and it shouldn't be hard to cut them down to ~1/2 with a bit of effort. I'm pretty sure other index AMs (e.g. hash) can do a very similar approach to implement this. A detail worth mentioning - the batches start small and gradually grow over time, up to some maximum size (the patch hardcodes these limits as 8 and 64, at the moment). The reason are similar to why we do this for prefetching - not harming queries that only need a single row. The changes to nodeIndexscan.c and nodeIndexonlyscan.c have a lot of duplicate code too. That's partially intentional - I wanted to retain the ability to test the "old" code easily, so I added a GUC to switch between the two. For plain indexscans it might even be possible to "unite" the two paths by tweaking index_getnext_slot to either get the TID from the index or do the batch loop (with batching enabled). Not sure about IOS, we don't want to repeat the visibility check in that case :-( Actually, couldn't we have a per-batch cache of visibility checks? I don't think we can get different answers to visibility checks for two TIDs (for the same block) within the same batch, right? It'd simplify the code I think, and perhaps it'd be useful even without prefetching. I think the main priority is clarifying the boundary between indexam and the AM code. Right now, it's a bit messy and not quite clear which code is responsible for which fields. Sometimes a field is set by indexam, but then one random place in nbtsearch.c sets it too, etc. Finally, two things that might be an issue / I'm not quite sure about. Firstly, do we need to support mixing batched and non-batched calls? That is, given an index scan, should it be possible to interleave calls to index_getnext_tid and index_batch_getnext/index_batch_getnext_tid? I'm pretty sure that doesn't work, at least not right now. Because with batching the index AM does not have an exact idea "where" on the page we actually are / which item is "current". I believe it might be possible to improve this by "synchronizing" whenever we switch between the two approaches. But I'm not sure it's something we need/want to support. I can't quite imagine why would I need this. The other thing is mark/restore. At the moment this does not work, for pretty much the same reason - the index AM has no idea what's the exact "current" item on the page, so mark/restore does unexpected things. In the patch I "fixed" this by disabling batching/prefetching for plans with EXEC_FLAG_MARK, so e.g. mergejoins won't benefit from this. It did seem like an acceptable limitation to me, but now that I think about it, if we could "synchronize" the position from the batch (if the index AM requests it), I think this might work correctly. I'm yet to do a comprehensive benchmark, but the tests I've done during development suggest the gains are in line with what we saw for the earlier versions. regards -- Tomas Vondra --------------qQktLOnZJ105OojbhJsWMB4K Content-Type: text/x-patch; charset=UTF-8; name="v20240831-0001-WIP-index-batching-prefetching.patch" Content-Disposition: attachment; filename="v20240831-0001-WIP-index-batching-prefetching.patch" Content-Transfer-Encoding: base64 RnJvbSBmMzRiODFlMzNiMTczYTExMmJjNjBhZDM4YjM5Y2UzZDU2NzJjMjU1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogV2VkLCAyOCBBdWcgMjAyNCAxODoyMToyNyArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djIwMjQwODMxXSBXSVA6IGluZGV4IGJhdGNoaW5nIC8gcHJlZmV0Y2hpbmcKCi0tLQogc3Jj L2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyAgICAgICAgICAgIHwgNjY0ICsrKysr KysrKysrKysrKysrKwogc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYyAgICAg ICAgICAgIHwgIDU2ICsrCiBzcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5j ICAgICAgICAgfCAzNjMgKysrKysrKysrKwogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUlu ZGV4b25seXNjYW4uYyAgICAgIHwgNDk2ICsrKysrKysrKystLS0KIHNyYy9iYWNrZW5kL2V4 ZWN1dG9yL25vZGVJbmRleHNjYW4uYyAgICAgICAgICB8IDExMSArKy0KIHNyYy9iYWNrZW5k L3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jICAgICAgICAgICB8ICAxMCArCiBzcmMvYmFja2Vu ZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgfCAgIDEgKwogc3JjL2luY2x1 ZGUvYWNjZXNzL2FtYXBpLmggICAgICAgICAgICAgICAgICAgIHwgICA1ICsKIHNyYy9pbmNs dWRlL2FjY2Vzcy9nZW5hbS5oICAgICAgICAgICAgICAgICAgICB8ICAyNCArCiBzcmMvaW5j bHVkZS9hY2Nlc3MvbmJ0cmVlLmggICAgICAgICAgICAgICAgICAgfCAgIDQgKwogc3JjL2lu Y2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCAgICAgICAgICAgICAgICAgIHwgIDQwICsrCiBzcmMv aW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaCAgICAgICAgICAgICAgICAgfCAgIDcgKwogc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQgICAgICAgIHwgICAzICstCiAx MyBmaWxlcyBjaGFuZ2VkLCAxNjYyIGluc2VydGlvbnMoKyksIDEyMiBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jIGIvc3Jj L2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYwppbmRleCBkY2QwNGI4MTNkOC4uN2My ZDdkMjRiMTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFt LmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYwpAQCAtMzMsNiAr MzMsMTQgQEAKICAqCQlpbmRleF9jYW5fcmV0dXJuCS0gZG9lcyBpbmRleCBzdXBwb3J0IGlu ZGV4LW9ubHkgc2NhbnM/CiAgKgkJaW5kZXhfZ2V0cHJvY2lkIC0gZ2V0IGEgc3VwcG9ydCBw cm9jZWR1cmUgT0lECiAgKgkJaW5kZXhfZ2V0cHJvY2luZm8gLSBnZXQgYSBzdXBwb3J0IHBy b2NlZHVyZSdzIGxvb2t1cCBpbmZvCisgKgkJaW5kZXhfYmF0Y2hfZ2V0bmV4dAktIGdldCB0 aGUgbmV4dCBiYXRjaCBvZiBUSURzIGZyb20gYSBzY2FuCisgKgkJaW5kZXhfYmF0Y2hfZ2V0 bmV4dF90aWQJLSBnZXQgdGhlIG5leHQgVElEcyBmcm9tIGEgYmF0Y2gKKyAqCQlpbmRleF9i YXRjaF9nZXRuZXh0X3Nsb3QJLSBnZXQgdGhlIG5leHQgdHVwbGUgZnJvbSBhIGJhdGNoCisg KgkJaW5kZXhfYmF0Y2hfcHJlZmV0Y2gJLSBwcmVmZXRjaCBoZWFwIHBhZ2VzIGZvciBhIGJh dGNoCisgKgkJaW5kZXhfYmF0Y2hfc3VwcG9ydGVkCS0gZG9lcyB0aGUgQU0gc3VwcG9ydC9h bGxvdyBiYXRjaGluZz8KKyAqCQlpbmRleF9iYXRjaF9pbml0CS0gaW5pdGlhbGl6ZSB0aGUg VElEIGJhdGNoIGFycmF5cworICoJCWluZGV4X2JhdGNoX3Jlc2V0CS0gcmVzZXQgdGhlIFRJ RCBiYXRjaCAoYmVmb3JlIG5leHQgYmF0Y2gpCisgKgkJaW5kZXhfYmF0Y2hfYWRkCQktIGFk ZCBhbiBpdGVtIChUSUQsIGl0dXApIHRvIHRoZSBiYXRjaAogICoKICAqIE5PVEVTCiAgKgkJ VGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbmRleF8gcm91dGluZXMgd2hpY2ggdXNlZApAQCAt NDQsNiArNTIsNyBAQAogI2luY2x1ZGUgInBvc3RncmVzLmgiCiAKICNpbmNsdWRlICJhY2Nl c3MvYW1hcGkuaCIKKyNpbmNsdWRlICJhY2Nlc3MvbmJ0cmVlLmgiCQkvKiBYWFggTWF4VElE c1BlckJUcmVlUGFnZSAqLwogI2luY2x1ZGUgImFjY2Vzcy9yZWxhdGlvbi5oIgogI2luY2x1 ZGUgImFjY2Vzcy9yZWxvcHRpb25zLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3JlbHNjYW4uaCIK QEAgLTU2LDggKzY1LDExIEBACiAjaW5jbHVkZSAic3RvcmFnZS9wcmVkaWNhdGUuaCIKICNp bmNsdWRlICJ1dGlscy9ydWxldXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy9zbmFwbWdyLmgi CisjaW5jbHVkZSAidXRpbHMvc3BjY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9zeXNjYWNo ZS5oIgogCisvKiBlbmFibGUgcmVhZGluZyBiYXRjaGVzIG9mIFRJRHMgZnJvbSB0aGUgaW5k ZXggKi8KK2Jvb2wJCWVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmcgPSBmYWxzZTsKIAogLyog LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQogICoJCQkJCW1hY3JvcyB1c2VkIGluIGluZGV4XyByb3V0aW5lcwpAQCAt MzMzLDYgKzM0NSwxMiBAQCBpbmRleF9iZWdpbnNjYW5faW50ZXJuYWwoUmVsYXRpb24gaW5k ZXhSZWxhdGlvbiwKIAlzY2FuLT5wYXJhbGxlbF9zY2FuID0gcHNjYW47CiAJc2Nhbi0+eHNf dGVtcF9zbmFwID0gdGVtcF9zbmFwOwogCisJLyogTm8gYmF0Y2hpbmcgdW5sZXNzIGV4cGxp Y2l0bHkgZW5hYmxlZCwgc2V0IGV2ZXJ5dGhpbmcgdG8gTlVMTC4gKi8KKwlzY2FuLT54c19i YXRjaC5oZWFwdGlkcyA9IE5VTEw7CisJc2Nhbi0+eHNfYmF0Y2guaXR1cHMgPSBOVUxMOwor CXNjYW4tPnhzX2JhdGNoLnByaXZhdGVEYXRhID0gTlVMTDsKKwlzY2FuLT54c19iYXRjaC5r aWxsZWRJdGVtcyA9IE5VTEw7CisKIAlyZXR1cm4gc2NhbjsKIH0KIApAQCAtMzY4LDYgKzM4 NiwxMyBAQCBpbmRleF9yZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuLAogCiAJc2Nhbi0+aW5k ZXhSZWxhdGlvbi0+cmRfaW5kYW0tPmFtcmVzY2FuKHNjYW4sIGtleXMsIG5rZXlzLAogCQkJ CQkJCQkJCQlvcmRlcmJ5cywgbm9yZGVyYnlzKTsKKworCS8qCisJICogUmVzZXQgdGhlIGJh dGNoLCB0byBtYWtlIGl0IGxvb2sgZW1wdHkuIFRoaXMgbmVlZHMgdG8gaGFwcGVuIGFmdGVy IHRoZQorCSAqIGFtcmVzdHJwb3MoKSBjYWxsLCBpbiBjYXNlIHRoZSBBTSBuZWVkcyBzb21l IG9mIHRoZSBiYXRjaCBpbmZvIChlLmcuIHRvCisJICogcHJvcGVybHkgdHJhbnNmZXIgdGhl IGtpbGxlZCB0dXBsZXMpLgorCSAqLworCWluZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIEZvcndh cmRTY2FuRGlyZWN0aW9uKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDQ0LDYg KzQ2OSwxMyBAQCBpbmRleF9yZXN0cnBvcyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJc2Nhbi0+ eHNfaGVhcF9jb250aW51ZSA9IGZhbHNlOwogCiAJc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRf aW5kYW0tPmFtcmVzdHJwb3Moc2Nhbik7CisKKwkvKgorCSAqIFJlc2V0IHRoZSBiYXRjaCwg dG8gbWFrZSBpdCBsb29rIGVtcHR5LiBUaGlzIG5lZWRzIHRvIGhhcHBlbiBhZnRlciB0aGUK KwkgKiBhbXJlc3RycG9zKCkgY2FsbCwgaW4gY2FzZSB0aGUgQU0gbmVlZHMgc29tZSBvZiB0 aGUgYmF0Y2ggaW5mbyAoZS5nLiB0bworCSAqIHByb3Blcmx5IHRyYW5zZmVyIHRoZSBraWxs ZWQgdHVwbGVzKS4KKwkgKi8KKwlpbmRleF9iYXRjaF9yZXNldChzY2FuLCBGb3J3YXJkU2Nh bkRpcmVjdGlvbik7CiB9CiAKIC8qCkBAIC0xMDM3LDMgKzEwNjksNjM1IEBAIGluZGV4X29w Y2xhc3Nfb3B0aW9ucyhSZWxhdGlvbiBpbmRyZWwsIEF0dHJOdW1iZXIgYXR0bnVtLCBEYXR1 bSBhdHRvcHRpb25zLAogCiAJcmV0dXJuIGJ1aWxkX2xvY2FsX3JlbG9wdGlvbnMoJnJlbG9w dHMsIGF0dG9wdGlvbnMsIHZhbGlkYXRlKTsKIH0KKworLyoKKyAqIElOREVYIEJBVENISU5H IEFORCBQUkVGRVRDSElORworICoKKyAqIEFsbG93cyByZWFkaW5nIGNodW5rcyBvZiBpdGVt cyBmcm9tIGFuIGluZGV4LCBpbnN0ZWFkIG9mIHJlYWRpbmcgdGhlbQorICogb25lIGJ5IG9u ZS4gVGhpcyByZWR1Y2VzIHRoZSBvdmVyaGVhZCBvZiBhY2Nlc3NpbmcgaW5kZXggcGFnZXMs IGFuZAorICogYWxzbyBhbGxvd3MgYWN0aW5nIG9uICJmdXR1cmUiIFRJRHMgLSBlLmcuIHdl IGNhbiBwcmVmZXRjaCBoZWFwIHBhZ2VzCisgKiB0aGF0IHdpbGwgYmUgbmVlZGVkLCBldGMu CisgKgorICoKKyAqIGluZGV4IEFNIGNvbnRyYWN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLQor ICoKKyAqIFRoaXMgcmVxdWlyZXMgc29tZSBsZXZlbCBvZiBjb29wZXJhdGlvbiBmcm9tIHRo ZSBpbmRleCBBTSAtIHRoZSBpbmRleAorICogbmVlZHMgdG8gaW1wbGVtZW50IGFuIG9wdGlv bmFsIGNhbGxiYWNsIGFtZ2V0dHVwbGViYXRjaCgpIHdoaWNoIGZpbGxzCisgKiBkYXRhIGlu dG8gdGhlIGJhdGNoIChpbiB0aGUgc2NhbiBkZXNjcmlwdG9yKS4KKyAqCisgKiBUaGUgaW5k ZXggQU0gYWxzbyBuZWVkcyB0byBlbnN1cmUgaXQgY2FuIHBlcmZvcm0gYWxsIG9wdGltaXph dGlvbnMgZm9yCisgKiBhbGwgVElEcyBpbiB0aGUgY3VycmVudCBiYXRjaC4gQSBnb29kIGV4 YW1wbGUgb2YgaXMgdGhlIGtpbGxfcHJpb3JfdHVwbGUKKyAqIG9wdGltaXphdGlvbiAtIHdp dGggYmF0Y2hpbmcsIHRoZSBpbmRleCBBTSBtYXkgcmVjZWl2ZSB0aGUgaW5mb3JtYXRpb24K KyAqIHdoaWNoIHR1cGxlcyBhcmUgdG8gYmUga2lsbGVkIHdpdGggYSBkZWxheSAtIHdoZW4g bG9hZGluZyB0aGUgbmV4dAorICogYmF0Y2gsIHdoZW4gZW5kaW5nL3Jlc3RhcnRpbmcgdGhl IHNjYW4sIGV0Yy4gVGhlIEFNIG5lZWRzIHRvIGVuc3VyZSBpdAorICogY2FuIHN0aWxsIHBy b2Nlc3Mgc3VjaCBpbmZvcm1hdGlvbi4KKyAqCisgKiBXaGF0IHRoaXMgbWVhbnMvcmVxdWly ZXMgaXMgdmVyeSBkZXBlbmRlbnQgb24gdGhlIGluZGV4IEFNLCBvZiBjb3Vyc2UuCisgKiBG b3IgQi1UcmVlIChhbmQgbW9zdCBvdGhlciBpbmRleCBBTXMpLCBiYXRjaGVzIHNwYW5uaW5n IG11bHRpcGxlIGxlYWYKKyAqIHBhZ2VzIHdvdWxkIGJlIHByb2JsZW1hdGljLiBTdWNoIGJh dGNoZXMgd291bGQgd29yayBmb3IgYmFzaWMgaW5kZXgKKyAqIHNjYW5zLCBidXQgdGhlIGtp bGxfcHJpb3JfdHVwbGUgd291bGQgYmUgYW4gaXNzdWUgLSB0aGUgQU1zIGtlZXAgb25seQor ICogYSBzaW5nbGUgbGVhZiBwaW5uZWQuIFdlJ2QgZWl0aGVyIG5lZWQgdG8ga2VlcCBtdWx0 aXBsZSBwaW5zLCBvciBhbGxvdworICogcmVhZGluZyBvbGRlciBsZWFmIHBhZ2VzIHBhZ2Vz ICh3aGljaCBtaWdodCBoYXZlIGJlZW4gbW9kaWZpZWQpLiBJbmRleAorICogb25seS1zY2Fu cyBpcyBjaGFsbGVuZ2luZyB0b28gLSB3ZSBrZWVwIEluZGV4VHVwbGUgcG9pbnRlcnMgaW50 byB0aGUKKyAqIGxlYWYgcGFnZXMsIHdoaWNoIHJlcXVpcmVzIGtlZXBpbmcgdGhvc2UgcGlu cyB0b28uCisgKgorICogVG8gc29sdmUgdGhpcywgd2UgZ2l2ZSB0aGUgQU0gdGhlIGNvbnRy b2wgb3ZlciBiYXRjaCBib3VuZGFyaWVzLiBJdCBpcworICogdXAgdG8gdGhlIGluZGV4IEFN IHRvIHBpY2sgd2hpY2ggcmFuZ2Ugb2YgaW5kZXggaXRlbXMgdG8gbG9hZCBpbnRvIHRoZQor ICogYmF0Y2gsIGFuZCBob3cgdG8gZW5zdXJlIGFsbCB0aGUgb3B0aW1pemF0aW9ucyBhcmUg cG9zc2libGUuCisgKgorICogRm9yIG1vc3QgaW5kZXggQU1zIHRoZSBlYXNpZXN0IHdheSBp cyB0byBub3QgbG9hZCBiYXRjaGVzIHNwYW5uaW5nCisgKiBtdWx0aXBsZSBsZWFmIHBhZ2Vz LiBUaGlzIG1heSBpbXBhY3QgdGhlIGVmZmljaWVuY3ksIGVzcGVjaWFsbHkgZm9yCisgKiBp bmRleGVzIHdpdGggd2lkZSBpbmRleCB0dXBsZXMsIGJ1dCB0aG9zZSBjYXNlcyBhcmUgcmFy ZS4KKyAqCisgKiBUaGUgYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gbWFrZSB0aGUgaW5kZXgg QU1zIG1vcmUgY29tcGxleCwgdG8ga2VlcAorICogbW9yZSBsZWFmIHBhZ2VzIHBpbm5lZCwg ZXRjLiBCdXQgdGhhdCBkb2VzIG5vdCBzZWVtIGxpa2UgYSBnb29kIHRyYWRlCisgKiBvZmYg ZHVlIHRvICJkaW1pbmlzaGluZyByZXR1cm5zIiBiZWhhdmlvciAtIHdlIHNlZSBzaWduaWZp Y2FudCBnYWlucworICogaW5pdGlhbGx5ICh3aXRoIGV2ZW4gc21hbGwgYmF0Y2hlcyksIGJ1 dCBhcyB0aGUgYmF0Y2ggZ3Jvd3MgdGhlIGdhaW5zCisgKiBnZXQgc21hbGxlciBhbmQgc21h bGxlci4gSXQgZG9lcyBub3Qgc2VlbSB3b3J0aCB0aGUgY29tcGxleGl0eSBvZgorICogcGlu bmluZyBtb3JlIHBhZ2VzIGV0Yy4KKyAqCisgKgorICogYmF0Y2ggPSBzbGlkaW5nIHdpbmRv dworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqIEEgZ29vZCB3YXkgdG8gdmlz dWFsaXplIHRoZSBiYXRjaCBpcyBhIHNsaWRpbmcgd2luZG93IG92ZXIgdGhlIGFycmF5Cisg KiBvZiBpdGVtcyBvbiBhIGxlYWYgcGFnZS4gSW4gdGhlIHNpbXBsZXN0IGV4YW1wbGUgKGZv cndhcmQgc2NhbiB3aXRoIG5vCisgKiBjaGFuZ2VzIG9mIGRpcmVjdGlvbiksIHdlIHNsaWNl IHRoZSBhcnJheSBpbnRvIHNtYWxsZXIgY2h1bmtzLCBhbmQKKyAqIHRoZW4gcHJvY2VzcyBl YWNoIG9mIHRob3NlIGNodW5rcy4KKyAqCisgKiBUaGUgYmF0Y2ggc2l6ZSBpcyBhZGFwdGl2 ZSAtIGl0IHN0YXJ0cyBzbWFsbCAob25seSA4IGVsZW1lbnRzKSBhbmQKKyAqIGluY3JlYXNl cyBhcyB3ZSByZWFkIG1vcmUgYmF0Y2hlcyAodXAgdG8gNjQgZWxlbWVudHMpLiBXZSBkb24n dCB3YW50CisgKiB0byByZWdyZXNzIGNhc2VzIHRoYXQgb25seSBuZWVkIGEgc2luZ2xlIGl0 ZW0gKGUuZy4gTElNSVQgMSBxdWVyaWVzKSwKKyAqIGFuZCBsb2FkaW5nL2NvcHlpbmcgYSBs b3Qgb2YgZGF0YSBtaWdodCBjYXVzZSB0aGF0LiBTbyB3ZSBzdGFydCBzbWFsbAorICogYW5k IGluY3JlYXNlIHRoZSBzaXplIC0gdGhhdCBzdGlsbCBpbXByb3ZlcyBjYXNlcyByZWFkaW5n IGEgbG90IG9mCisgKiBkYXRhIGZyb20gdGhlIGluZGV4LCB3aXRob3V0IGh1cnRpbmcgc21h bGwgcXVlcmllcy4KKyAqCisgKiBOb3RlOiBUaGlzIGdyYWR1YWwgcmFtcCB1cCBpcyBmb3Ig YmF0Y2ggc2l6ZSwgaW5kZXBlbmRlbnQgb2Ygd2hhdCB3ZQorICogZG8gZm9yIHByZWZldGNo LiBUaGUgcHJlZmV0Y2ggZGlzdGFuY2UgaXMgZ3JhZHVhbGx5IGluY3JlYXNlZCB0b28sIGJ1 dAorICogaXQncyBpbmRlcGVuZGVudCAvIG9ydGhvZ29uYWwgdG8gdGhlIGJhdGNoIHNpemUu IFRoZSBiYXRjaCBzaXplIGxpbWl0cworICogaG93IGZhciBhaGVhZCB3ZSBjYW4gcHJlZmV0 Y2gsIG9mIGNvdXJzZS4KKyAqCisgKiBOb3RlOiBUaGUgY3VycmVudCBsaW1pdHMgb24gYmF0 Y2ggc2l6ZSAoaW5pdGlhbCA4LCBtYXhpbXVtIDY0KSBhcmUKKyAqIHF1aXRlIGFyYml0cmFy eSwgaXQganVzdCBzZWVtZWQgdGhvc2UgdmFsdWVzIGFyZSBzYW5lLiBXZSBjb3VsZCBhZGp1 c3QKKyAqIHRoZSBpbml0aWFsIHNpemUsIGJ1dCBJIGRvbid0IHRoaW5rIGl0J2QgbWFrZSBh IGZ1bmRhbWVudGFsIGRpZmZlcmVuY2UuCisgKiBHcm93aW5nIHRoZSBiYXRjaGVzIGZhc3Rl ci9zbG93ZXIgaGFzIGJpZ2dlciBpbXBhY3QuCisgKgorICogVGhlIG1heGltdW0gYmF0Y2gg c2l6ZSBkb2VzIG5vdCBtYXR0ZXIgbXVjaCAtIGl0J3MgdHJ1ZSBhIGJ0cmVlIGluZGV4IGNh bgorICogaGF2ZSB1cCB0byB+MTMwMCBpdGVtcyBwZXIgOEsgbGVhZiBwYWdlLCBidXQgaW4g bW9zdCBjYXNlcyB0aGUgYWN0dWFsCisgKiBudW1iZXIgaXMgbG93ZXIsIHBlcmhhcHMgfjMw MC4gVGhhdCdzIG5vdCB0aGF0IGZhciBmcm9tIDY0LgorICoKKyAqIEVhY2ggYmF0Y2ggaGFz IGEgZmlyc3RJbmRleC9sYXN0SW5kZXggdG8gdHJhY2sgd2hpY2ggcGFydCBvZiB0aGUgbGVh ZgorICogcGFnZSBpdCBjdXJyZW50bHkgcmVwcmVzZW50cy4KKyAqCisgKgorICoga2lsbF9w cmlvcl90dXBsZXMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSWYgd2UgZGVjaWRl IGEgdHVwbGUgY2FuIGJlIGtpbGxlZCwgdGhlIGJhdGNoIGl0ZW0gaXMgbWFya2VkIGFjY29y ZGluZ2x5LAorICogYW5kIHRoZSBmbGFnIGlzIHJlc2V0IHRvIGZhbHNlIChzbyB0aGF0IHRo ZSBpbmRleCBBTSBkb2VzIG5vdCBkbyBzb21ldGhpbmcKKyAqIHNpbGx5IHRvIGEgcmFuZG9t IHR1cGxlIGl0IHRoaW5rcyBpcyAiY3VycmVudCIpLgorICoKKyAqIFRoZW4gdGhlIG5leHQg dGltZSB0aGUgQU0gZGVjaWRlcyBpdCdzIHRpbWUgdG8ga2lsbCB0dXBsZXMsIHRoZSBBTSBu ZWVkcworICogdG8gbG9vayBhdCB0aGUgYmF0Y2ggYW5kIGNvbnNpZGVyIHRoZSB0dXBsZXMg bWFya2VkIHRvIGJlIGtpbGxlZC4gQi1UcmVlCisgKiBzaW1wbHkgYWRkcyB0aG9zZSBUSURz IHRvIHRoZSByZWd1bGFyICJraWxsSXRlbXMiIGFycmF5LgorICoKKyAqCisgKiBtYXJrL3Jl c3RvcmUgbGltaXRhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBB dCB0aGUgbW9tZW50LCBiYXRjaGluZyBpcyBpbmNvbXBhdGlibGUgd2l0aCBtYXJrL3Jlc3Rv cmUgLSB0aGUgaW5kZXggQU0KKyAqIGRvZXMgbm90IGtub3cgd2hhdCdzIHRoZSAiY3VycmVu dCIgaXRlbSBhcyBzZWVuIGJ5IHRoZSB1c2VyLCBiZWNhdXNlCisgKiB0aGF0J3MgaW4gdGhl IGJhdGNoIG9ubHkuIFNvIHRoZSBhbW1hcmtwb3MoKSBoYXMgYSBiaXQgbWlzZ3VpZGVkIGlk ZWEKKyAqIG9mIHdoYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMuCisgKgorICogRm9yIG5v dywgYmF0Y2hpbmcgaXMgc2ltcGx5IGRpc2FibGVkIGZybyBwbGFucyByZXF1aXJpbmcgbWFy ay9yZXN0b3JlLAorICogd2hpY2ggYWxzbyBkaXNhYmVzIHByZWZldGNoaW5nLiBJbiBwYXJ0 aWN1bGFyLCB0aGlzIG1lYW5zIG1lcmdlam9pbgorICogY2FuJ3Qgc2VlIHRoaXMgYmVuZWZp dC4KKyAqCisgKiBOb3RlOiBJdCBtaWdodCBiZSBwb3NzaWJsZSB0byBmaXggdGhpcywgaWYg dGhlIEFNIGNvdWxkIGFzayBmb3IgY3VycmVudAorICogcG9zaXRpb24gaW4gdGhlIGJhdGNo LiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBmaXN0SW5kZXgvbGFzdEluZGV4LCB0aGF0CisgKiBz aG91bGQgbm90IGJlIHZlcnkgZGlmZmljdWx0LiBUaGVuIG1hcmtwb3MoKSB3b3VsZCBjaGVj ayBpZiBiYXRjaGluZworICogaXMgdXNlZCwgYW5kIHdvdWxkIHVzZSB0aGF0IGN1cnJlbnQg cG9zaXRpb24gaW5zdGVhZCBvZiB3aGF0ZXZlciBpdAorICogdGhpbmtzIGlzIGN1cnJlbnQg KHdoaWNoIGlzIGFsd2F5cyB0byBiZWZvcmUvYWZ0ZXIgdGhlIGJhdGNoKS4KKyAqLworCisv KgorICogQ29tcHJlaGVuc2l2ZSBjaGVjayBvZiB2YXJpb3VzIGludmFyaWFudHMgb24gdGhl IGluZGV4IGJhdGNoLiBNYWtlcyBzdXJlCisgKiB0aGUgaW5kZXhlcyBhcmUgc2V0IGFzIGV4 cGVjdGVkLCB0aGUgYnVmZmVyIHNpemUgaXMgd2l0aGluIGxpbWl0cywgYW5kCisgKiBzbyBv bi4KKyAqLworc3RhdGljIHZvaWQKK0Fzc2VydENoZWNrQmF0Y2hJbmZvKEluZGV4U2NhbkRl c2Mgc2NhbikKK3sKKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCisJLyogYWxsIHRoZSBh cnJheXMgbmVlZCB0byBiZSBhbGxvY2F0ZWQgKi8KKwlBc3NlcnQoKHNjYW4tPnhzX2JhdGNo LmhlYXB0aWRzICE9IE5VTEwpICYmCisJCSAgIChzY2FuLT54c19iYXRjaC5raWxsZWRJdGVt cyAhPSBOVUxMKSAmJgorCQkgICAoc2Nhbi0+eHNfYmF0Y2gucHJpdmF0ZURhdGEgIT0gTlVM TCkpOworCisJLyogaWYgSW5kZXhUdXBsZXMgZXhwZWN0ZWQsIHNob3VsZCBiZSBhbGxvY2F0 ZWQgdG9vICovCisJQXNzZXJ0KCEoc2Nhbi0+eHNfd2FudF9pdHVwICYmIChzY2FuLT54c19i YXRjaC5pdHVwcyA9PSBOVUxMKSkpOworCisJLyogVmFyaW91cyBjaGVjayBvbiBiYXRjaCBz aXplcyAqLworCUFzc2VydCgoc2Nhbi0+eHNfYmF0Y2guaW5pdFNpemUgPj0gMCkgJiYKKwkJ ICAgKHNjYW4tPnhzX2JhdGNoLmluaXRTaXplIDw9IHNjYW4tPnhzX2JhdGNoLmN1cnJTaXpl KSAmJgorCQkgICAoc2Nhbi0+eHNfYmF0Y2guY3VyclNpemUgPD0gc2Nhbi0+eHNfYmF0Y2gu bWF4U2l6ZSkgJiYKKwkJICAgKHNjYW4tPnhzX2JhdGNoLm1heFNpemUgPD0gMTAyNCkpOwkv KiBhcmJpdHJhcnkgbGltaXQgKi8KKworCS8qIElzIHRoZSBudW1iZXIgb2YgaW4gdGhlIGJh dGNoIFRJRHMgaW4gYSB2YWxpZCByYW5nZT8gKi8KKwlBc3NlcnQoKHNjYW4tPnhzX2JhdGNo Lm5oZWFwdGlkcyA+PSAwKSAmJgorCQkgICAoc2Nhbi0+eHNfYmF0Y2gubmhlYXB0aWRzIDw9 IHNjYW4tPnhzX2JhdGNoLm1heFNpemUpKTsKKworCS8qCisJICogVGhlIGN1cnJlbnQgaXRl bSBtdXN0IGJlIGJldHdlZW4gLTEgYW5kIG5oZWFwdGlkcy4gVGhvc2UgdHdvIGV4dHJlbWUK KwkgKiB2YWx1ZXMgYXJlIHN0YXJ0aW5nIHBvaW50cyBmb3IgZm9yd2FyZC9iYWNrd2FyZCBz Y2Fucy4KKwkgKi8KKwlBc3NlcnQoKHNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleCA+PSAtMSkg JiYKKwkJICAgKHNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleCA8PSBzY2FuLT54c19iYXRjaC5u aGVhcHRpZHMpKTsKKworCS8qIGNoZWNrIHByZWZldGNoIGRhdGEgKi8KKwlBc3NlcnQoKHNj YW4tPnhzX2JhdGNoLnByZWZldGNoVGFyZ2V0ID49IDApICYmCisJCSAgIChzY2FuLT54c19i YXRjaC5wcmVmZXRjaFRhcmdldCA8PSBzY2FuLT54c19iYXRjaC5wcmVmZXRjaE1heGltdW0p KTsKKworCUFzc2VydCgoc2Nhbi0+eHNfYmF0Y2gucHJlZmV0Y2hJbmRleCA+PSAtMSkgJiYK KwkJICAgKHNjYW4tPnhzX2JhdGNoLnByZWZldGNoSW5kZXggPD0gc2Nhbi0+eHNfYmF0Y2gu bmhlYXB0aWRzKSk7CisKKwkvKgorCSAqIFhYWCBOb3QgcXVpdGUgY29ycmVjdCB0byB1c2Ug TWF4VElEc1BlckJUcmVlUGFnZSwgd2hpY2ggaXMgYnRyZWUKKwkgKiBzcGVjaWZpYy4gQWxz byB3ZSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGRlcGVuZCBvbiBBTXMgbGlrZSB0aGlzLgor CSAqLworCUFzc2VydCgoc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRleCA+PSAtMSkgJiYKKwkJ ICAgKHNjYW4tPnhzX2JhdGNoLmZpcnN0SW5kZXggPD0gTWF4VElEc1BlckJUcmVlUGFnZSkp OworCUFzc2VydCgoc2Nhbi0+eHNfYmF0Y2gubGFzdEluZGV4ID49IC0xKSAmJgorCQkgICAo c2Nhbi0+eHNfYmF0Y2gubGFzdEluZGV4IDw9IE1heFRJRHNQZXJCVHJlZVBhZ2UpKTsKKwor CWZvciAoaW50IGkgPSAwOyBpIDwgc2Nhbi0+eHNfYmF0Y2gubmhlYXB0aWRzOyBpKyspCisJ CUFzc2VydChJdGVtUG9pbnRlcklzVmFsaWQoJnNjYW4tPnhzX2JhdGNoLmhlYXB0aWRzW2ld KSk7CisjZW5kaWYKK30KKworLyogSXMgdGhlIGJhdGNoIGZ1bGwgKFRJRHMgdXAgdG8gY2Fw YWNpdHkpPyAqLworI2RlZmluZQlJTkRFWF9CQVRDSF9JU19GVUxMKHNjYW4pCVwKKwkoKHNj YW4pLT54c19iYXRjaC5uaGVhcHRpZHMgPT0gKHNjYW4pLT54c19iYXRjaC5jdXJyU2l6ZSkK KworLyogSXMgdGhlIGJhdGNoIGVtcHR5IChubyBUSURzKT8gKi8KKyNkZWZpbmUJSU5ERVhf QkFUQ0hfSVNfRU1QVFkoc2NhbikJXAorCSgoc2NhbiktPnhzX2JhdGNoLm5oZWFwdGlkcyA9 PSAwKQorCisvKgorICogRGlkIHdlIHByb2Nlc3MgYWxsIGl0ZW1zPyBGb3IgZm9yd2FyZCBz Y2FuIGl0IG1lYW5zIHRoZSBpbmRleCBwb2ludHMgdG8gdGhlCisgKiBsYXN0IGl0ZW0sIGZv ciBiYWNrd2FyZCBzY2FucyBpdCBoYXMgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IG9uZS4KKyAq CisgKiBUaGlzIGRvZXMgbm90IGNvdmVyIGVtcHR5IGJhdGNoZXMgcHJvcGVybHksIGJlY2F1 c2Ugb2YgYmFja3dhcmQgc2NhbnMuCisgKi8KKyNkZWZpbmUJSU5ERVhfQkFUQ0hfSVNfUFJP Q0VTU0VEKHNjYW4sIGRpcmVjdGlvbikJXAorCShTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRp cmVjdGlvbikgPyBcCisJCSgoc2NhbiktPnhzX2JhdGNoLm5oZWFwdGlkcyA9PSAoKHNjYW4p LT54c19iYXRjaC5jdXJySW5kZXggKyAxKSkgOiBcCisJCSgoc2NhbiktPnhzX2JhdGNoLmN1 cnJJbmRleCA9PSAwKSkKKworLyogRG9lcyB0aGUgYmF0Y2ggaXRlbXMgaW4gdGhlIHJlcXVl c3RlZCBkaXJlY3Rpb24/ICovCisjZGVmaW5lIElOREVYX0JBVENIX0hBU19JVEVNUyhzY2Fu LCBkaXJlY3Rpb24pIFwKKwkoIUlOREVYX0JBVENIX0lTX0VNUFRZKHNjYW4pICYmICFJTkRF WF9CQVRDSF9JU19QUk9DRVNTRUQoc2NhbiwgZGlyZWN0aW9uKSkKKworCisvKiAtLS0tLS0t LS0tLS0tLS0tCisgKgkJaW5kZXhfYmF0Y2hfZ2V0bmV4dCAtIGdldCB0aGUgbmV4dCBiYXRj aCBvZiBUSURzIGZyb20gYSBzY2FuCisgKgorICogUmV0dXJucyB0cnVlIGlmIHdlIG1hbmFn ZWQgdG8gcmVhZCBhdCBsZWFzdCBzb21lIFRJRHMgaW50byB0aGUgYmF0Y2gsCisgKiBvciBm YWxzZSBpZiB0aGVyZSBhcmUgbm8gbW9yZSBUSURzIGluIHRoZSBzY2FuLiBUaGUgeHNfaGVh cHRpZHMgYW5kCisgKiB4c19uaGVhcHRpZHMgZmllbGRzIGNvbnRhaW4gdGhlIFRJRFMgYW5k IHRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgKgorICogWFhYIFRoaXMgb25seSBsb2FkcyB0 aGUgVElEcyBhbmQgcmVzZXRzIHRoZSB2YXJpb3VzIGJhdGNoIGZpZWxkcyB0bworICogZnJl c2ggc3RhdGUuIEl0IGRvZXMgbm90IHNldCB4c19oZWFwdGlkL3hzX2l0dXAveHNfaGl0dXAs IHRoYXQncyB0aGUKKyAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBmb2xsb3dpbmcgaW5kZXhf YmF0Y2hfZ2V0bmV4dF90aWQoKSBjYWxscy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqLwor Ym9vbAoraW5kZXhfYmF0Y2hfZ2V0bmV4dChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyZWN0aW9uKQoreworCWJvb2wJCWZvdW5kOworCisJU0NBTl9DSEVDS1M7CisJ Q0hFQ0tfU0NBTl9QUk9DRURVUkUoYW1nZXR0dXBsZWJhdGNoKTsKKworCS8qIFhYWDogd2Ug c2hvdWxkIGFzc2VydCB0aGF0IGEgc25hcHNob3QgaXMgcHVzaGVkIG9yIHJlZ2lzdGVyZWQg Ki8KKwlBc3NlcnQoVHJhbnNhY3Rpb25JZElzVmFsaWQoUmVjZW50WG1pbikpOworCisJLyog Y29tcHJlaGVuc2l2ZSBjaGVja3Mgb2YgYmF0Y2hpbmcgaW5mbyAqLworCUFzc2VydENoZWNr QmF0Y2hJbmZvKHNjYW4pOworCisJLyoKKwkgKiBXZSBuZXZlciByZWFkIGEgbmV3IGJhdGNo IGJlZm9yZSB3ZSBydW4gb3V0IG9mIGl0ZW1zIGluIHRoZSBjdXJyZW50CisJICogb25lLiBU aGUgY3VycmVudCBiYXRjaCBoYXMgdG8gYmUgZWl0aGVyIGVtcHR5IG9yIHdlIHJhbiBvdXQg b2YgaXRlbXMKKwkgKiAoaW4gdGhlIGdpdmVuIGRpcmVjdGlvbikuCisJICovCisJQXNzZXJ0 KCFJTkRFWF9CQVRDSF9IQVNfSVRFTVMoc2NhbiwgZGlyZWN0aW9uKSk7CisKKwkvKgorCSAq IFRoZSBBTSdzIGFtZ2V0dHVwbGViYXRjaCBwcm9jIGxvYWRzIGEgY2h1bmsgb2YgVElEcyBt YXRjaGluZyB0aGUgc2NhbgorCSAqIGtleXMsIGFuZCBwdXRzIHRoZSBUSURzIGludG8gc2Nh bi0+eHNfYmF0Y2guaGVhcHRpZHMuICBJdCBzaG91bGQgYWxzbworCSAqIHNldCBzY2FuLT54 c19yZWNoZWNrIGFuZCBwb3NzaWJseQorCSAqIHNjYW4tPnhzX2JhdGNoLml0dXBzL3NjYW4t PnhzX2JhdGNoLmhpdHVwcywgdGhvdWdoIHdlIHBheSBubyBhdHRlbnRpb24KKwkgKiB0byB0 aG9zZSBmaWVsZHMgaGVyZS4KKwkgKgorCSAqIEZJWE1FIEF0IHRoZSBtb21lbnQgdGhpcyBk b2VzIG5vdGhpbmcgd2l0aCBoaXR1cC4gTmVlZHMgdG8gYmUgZml4ZWQ/CisJICovCisJZm91 bmQgPSBzY2FuLT5pbmRleFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1nZXR0dXBsZWJhdGNoKHNj YW4sIGRpcmVjdGlvbik7CisKKwkvKiBSZXNldCBraWxsIGZsYWcgaW1tZWRpYXRlbHkgZm9y IHNhZmV0eSAqLworCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBmYWxzZTsKKwlzY2FuLT54 c19oZWFwX2NvbnRpbnVlID0gZmFsc2U7CisKKwkvKiBJZiB3ZSdyZSBvdXQgb2YgaW5kZXgg ZW50cmllcywgd2UncmUgZG9uZSAqLworCWlmICghZm91bmQpCisJeworCQkvKiByZWxlYXNl IHJlc291cmNlcyAobGlrZSBidWZmZXIgcGlucykgZnJvbSB0YWJsZSBhY2Nlc3NlcyAqLwor CQlpZiAoc2Nhbi0+eHNfaGVhcGZldGNoKQorCQkJdGFibGVfaW5kZXhfZmV0Y2hfcmVzZXQo c2Nhbi0+eHNfaGVhcGZldGNoKTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogV2Ug c2hvdWxkIGhhdmUgYSBub24tZW1wdHkgYmF0Y2ggd2l0aCBpdGVtcy4gKi8KKwlBc3NlcnQo SU5ERVhfQkFUQ0hfSEFTX0lURU1TKHNjYW4sIGRpcmVjdGlvbikpOworCisJcGdzdGF0X2Nv dW50X2luZGV4X3R1cGxlcyhzY2FuLT5pbmRleFJlbGF0aW9uLCBzY2FuLT54c19iYXRjaC5u aGVhcHRpZHMpOworCisJLyoKKwkgKiBTZXQgdGhlIHByZWZldGNoIGluZGV4IHRvIHRoZSBm aXJzdCBpdGVtIGluIHRoZSBsb2FkZWQgYmF0Y2ggKHdlIGV4cGVjdAorCSAqIHRoZSBpbmRl eCBBTSB0byBzZXQgdGhhdCkuCisJICoKKwkgKiBGSVhNRSBNYXliZSBzZXQgdGhlIGN1cnJJ bmRleCBoZXJlLCBub3QgaW4gdGhlIGluZGV4IEFNLiBJdCBzZWVtcyBtdWNoCisJICogbW9y ZSBsaWtlIGluZGV4YW0uYyByZXNwb25zaWJpbGl0eSByYXRoZXIgdGhhbiBzb21ldGhpbmcg ZXZlcnkgaW5kZXggQU0KKwkgKiBzaG91bGQgYmUgZG9pbmcgKGluIF9idF9maXJzdF9iYXRj aCBldGMuKS4KKwkgKgorCSAqIEZJWE1FIEl0J3MgYSBiaXQgdW5jbGVhciB3aG8gKGluZGV4 YW0uYyBvciB0aGUgaW5kZXggQU0pIGlzIHJlc3BvbnNpYmxlCisJICogZm9yIHNldHRpbmcg d2hpY2ggZmllbGRzLiBUaGlzIG5lZWRzIGNsYXJpZmljYXRpb24uCisJICovCisJc2Nhbi0+ eHNfYmF0Y2gucHJlZmV0Y2hJbmRleCA9IHNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleDsKKwor CS8qIGNvbXByZWhlbnNpdmUgY2hlY2tzIG9mIGJhdGNoaW5nIGluZm8gKi8KKwlBc3NlcnRD aGVja0JhdGNoSW5mbyhzY2FuKTsKKworCS8qIFJldHVybiB0aGUgYmF0Y2ggb2YgVElEcyB3 ZSBmb3VuZC4gKi8KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLQor ICoJCWluZGV4X2dldG5leHRfYmF0Y2hfdGlkIC0gZ2V0IHRoZSBuZXh0IFRJRCBmcm9tIHRo ZSBjdXJyZW50IGJhdGNoCisgKgorICogU2FtZSBjYWxsaW5nIGNvbnZlbnRpb24gYXMgaW5k ZXhfZ2V0bmV4dF90aWQoKSwgZXhjZXB0IHRoYXQgTlVMTCBtZWFucworICogbm8gbW9yZSBp dGVtcyBpbiB0aGUgY3VycmVudCBiYXRjaCwgdGhlcmUgbWF5IGJlIG1vcmUgYmF0Y2hlcy4K KyAqCisgKiBYWFggVGhpcyBvbmx5IHNldHMgeHNfaGVhcHRpZCBhbmQgeHNfaXR1cCAoaWYg cmVxdWVzdGVkKS4gTm90IHN1cmUgaWYKKyAqIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIHdp dGggeHNfaGl0dXAuCisgKgorICogRklYTUUgU2hvdWxkIHRoaXMgc2V0IHhzX2hpdHVwPwor ICogLS0tLS0tLS0tLS0tLS0tLQorICovCitJdGVtUG9pbnRlcgoraW5kZXhfYmF0Y2hfZ2V0 bmV4dF90aWQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcmVjdGlvbikK K3sKKwkvKiBjb21wcmVoZW5zaXZlIGNoZWNrcyBvZiBiYXRjaGluZyBpbmZvICovCisJQXNz ZXJ0Q2hlY2tCYXRjaEluZm8oc2Nhbik7CisKKwkvKgorCSAqIEJhaWwgb3V0IGlmIGhlIGJh dGNoIGRvZXMgbm90IGhhdmUgbW9yZSBpdGVtcyBpbiB0aGUgcmVxdWVzdGVkIGRpcmVjdGlv CisJICogKGVpdGhlciBlbXB0eSBvciBldmVydGhpbmcgcHJvY2Vzc2VkKS4KKwkgKi8KKwlp ZiAoIUlOREVYX0JBVENIX0hBU19JVEVNUyhzY2FuLCBkaXJlY3Rpb24pKQorCQlyZXR1cm4g TlVMTDsKKworCS8qCisJICogQWR2YW5jZSB0byB0aGUgbmV4dCBiYXRjaCBpdGVtIC0gd2Ug a25vdyBpdCdzIG5vdCBlbXB0eSBhbmQgdGhlcmUgYXJlCisJICogaXRlbXMgdG8gcHJvY2Vz cywgc28gdGhpcyBpcyB2YWxpZC4KKwkgKi8KKwlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2Fy ZChkaXJlY3Rpb24pKQorCQlzY2FuLT54c19iYXRjaC5jdXJySW5kZXgrKzsKKwllbHNlCisJ CXNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleC0tOworCisJLyogbmV4dCBUSUQgZnJvbSB0aGUg YmF0Y2gsIG9wdGlvbmFsbHkgYWxzbyB0aGUgSW5kZXhUdXBsZSAqLworCXNjYW4tPnhzX2hl YXB0aWQgPSBzY2FuLT54c19iYXRjaC5oZWFwdGlkc1tzY2FuLT54c19iYXRjaC5jdXJySW5k ZXhdOworCWlmIChzY2FuLT54c193YW50X2l0dXApCisJCXNjYW4tPnhzX2l0dXAgPSBzY2Fu LT54c19iYXRjaC5pdHVwc1tzY2FuLT54c19iYXRjaC5jdXJySW5kZXhdOworCisJLyogY29t cHJlaGVuc2l2ZSBjaGVja3Mgb2YgYmF0Y2hpbmcgaW5mbyAqLworCUFzc2VydENoZWNrQmF0 Y2hJbmZvKHNjYW4pOworCisJcmV0dXJuICZzY2FuLT54c19oZWFwdGlkOworfQorCisvKiAt LS0tLS0tLS0tLS0tLS0tCisgKiBpbmRleF9nZXRuZXh0X2JhdGNoX3Nsb3QgLSBnZXQgdGhl IG5leHQgdHVwbGUgZnJvbSBhIHNjYW4gYmF0Y2gKKyAqCisgKiBTYW1lIGNhbGxpbmcgY29u dmVudGlvbiBhcyBpbmRleF9nZXRuZXh0X3Nsb3QoKSwgZXhjZXB0IHRoYXQgTlVMTCBtZWFu cworICogbm8gbW9yZSBpdGVtcyBvbmx5IGluIHRoZSBjdXJyZW50IGJhdGNoLCB0aGVyZSBt YXkgYmUgbW9yZSBiYXRjaGVzLgorICoKKyAqIFhYWCBTZWUgaW5kZXhfZ2V0bmV4dF9zbG90 IGNvbW1lbnRzLgorICogLS0tLS0tLS0tLS0tLS0tLQorICovCitib29sCitpbmRleF9iYXRj aF9nZXRuZXh0X3Nsb3QoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcmVj dGlvbiwKKwkJCQkJCSBUdXBsZVRhYmxlU2xvdCAqc2xvdCkKK3sKKwkvKiBjb21wcmVoZW5z aXZlIGNoZWNrcyBvZiBiYXRjaGluZyBpbmZvICovCisJQXNzZXJ0Q2hlY2tCYXRjaEluZm8o c2Nhbik7CisKKwlmb3IgKDs7KQorCXsKKwkJaWYgKCFzY2FuLT54c19oZWFwX2NvbnRpbnVl KQorCQl7CisJCQlJdGVtUG9pbnRlciB0aWQ7CisKKwkJCS8qIFRpbWUgdG8gZmV0Y2ggdGhl IG5leHQgVElEIGZyb20gdGhlIGluZGV4ICovCisJCQl0aWQgPSBpbmRleF9iYXRjaF9nZXRu ZXh0X3RpZChzY2FuLCBkaXJlY3Rpb24pOworCisJCQkvKiBJZiB3ZSdyZSBvdXQgb2YgaW5k ZXggZW50cmllcywgd2UncmUgZG9uZSAqLworCQkJaWYgKHRpZCA9PSBOVUxMKQorCQkJCWJy ZWFrOworCisJCQlBc3NlcnQoSXRlbVBvaW50ZXJFcXVhbHModGlkLCAmc2Nhbi0+eHNfaGVh cHRpZCkpOworCQl9CisKKwkJLyoKKwkJICogRmV0Y2ggdGhlIG5leHQgKG9yIG9ubHkpIHZp c2libGUgaGVhcCB0dXBsZSBmb3IgdGhpcyBpbmRleCBlbnRyeS4KKwkJICogSWYgd2UgZG9u J3QgZmluZCBhbnl0aGluZywgbG9vcCBhcm91bmQgYW5kIGdyYWIgdGhlIG5leHQgVElEIGZy b20KKwkJICogdGhlIGluZGV4LgorCQkgKi8KKwkJQXNzZXJ0KEl0ZW1Qb2ludGVySXNWYWxp ZCgmc2Nhbi0+eHNfaGVhcHRpZCkpOworCQlpZiAoaW5kZXhfZmV0Y2hfaGVhcChzY2FuLCBz bG90KSkKKwkJeworCQkJLyogSWYgd2UgZm91bmQgYSB2aXNpYmxlIHR1cGxlLCB3ZSBzaG91 bGRuJ3Qga2lsbCBpdC4gKi8KKwkJCUFzc2VydCghc2Nhbi0+a2lsbF9wcmlvcl90dXBsZSk7 CisKKwkJCS8qIGNvbXByZWhlbnNpdmUgY2hlY2tzIG9mIGJhdGNoaW5nIGluZm8gKi8KKwkJ CUFzc2VydENoZWNrQmF0Y2hJbmZvKHNjYW4pOworCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQor CisJCS8qCisJCSAqIElmIHdlIGhhdmVuJ3QgZm91bmQgYW55IHZpc2libGUgdHVwbGUgZm9y IHRoZSBUSUQsIGNoYW5jZXMgYXJlIGFsbAorCQkgKiB2ZXJzaW9ucyBhcmUgZGVhZCBhbmQg bWF5IGtpbGwgaXQgZnJvbSB0aGUgaW5kZXguIElmIHNvLCBmbGFnIGl0IGluCisJCSAqIHRo ZSBraWxsIGJpdG1hcCAtIHdlJ2xsIHRyYW5zbGF0ZSBpdCB0byBpbmRleGVzIGxhdGVyLgor CQkgKgorCQkgKiBYWFggV2l0aCB0aGUgZmlyc3RJbmRleC9sYXN0SW5kZXggaXQgd291bGQg bm90IGJlIHRvbyBoYXJkIHRvIGRvCisJCSAqIHRoZSB0cmFuc2xhdGlvbiBoZXJlLiBCdXQg ZG8gd2Ugd2FudCB0bz8gSG93IG11Y2ggaXMgdGhhdAorCQkgKiBjb25zaWRlcmVkIGFuIGlu dGVybmFsIGRldGFpbCBvZiB0aGUgQU0/CisJCSAqCisJCSAqIFhYWCBNYXliZSB3ZSBzaG91 bGQgaW50ZWdyYXRlIHRoaXMgaW50byBpbmRleF9mZXRjaF9oZWFwKCksIHNvIHRoYXQKKwkJ ICogd2UgZG9uJ3QgbmVlZCB0byBkbyBpdCBhZnRlciBlYWNoIGNhbGw/IFNlZW1zIGVhc3kg dG8gZmVyZ2V0L21pc3MuCisJCSAqLworCQlpZiAoc2Nhbi0+a2lsbF9wcmlvcl90dXBsZSkK KwkJeworCQkJLyoKKwkJCSAqIEZJWE1FIFRoaXMgaXMgbm90IGdyZWF0LCBiZWNhdXNlIHdl J2xsIGhhdmUgdG8gd2FsayB0aHJvdWdoIHRoZQorCQkJICogd2hvbGUgYml0bWFwIGxhdGVy LCB0byBtYXliZSBhZGQga2lsbGVkIHR1cGxlcyB0byB0aGUgcmVndWxhcgorCQkJICogYXJy YXkuIE1pZ2h0IGJlIGNvc3RseSBmb3IgbGFyZ2UgYmF0Y2hlcy4gTWF5YmUgaXQnZCBiZSBi ZXR0ZXIKKwkJCSAqIHRvIGRvIHdoYXQgYnRyZWUgZG9lcyBhbmQgc3Rhc2ggdGhlIGluZGV4 ZXMgKGp1c3Qgc29tZSBsaW1pdGVkCisJCQkgKiBudW1iZXIpLgorCQkJICovCisJCQlzY2Fu LT54c19iYXRjaC5raWxsZWRJdGVtc1tzY2FuLT54c19iYXRjaC5jdXJySW5kZXhdID0gdHJ1 ZTsKKwkJCXNjYW4tPmtpbGxfcHJpb3JfdHVwbGUgPSBmYWxzZTsKKwkJfQorCX0KKworCS8q IGNvbXByZWhlbnNpdmUgY2hlY2tzIG9mIGJhdGNoaW5nIGluZm8gKi8KKwlBc3NlcnRDaGVj a0JhdGNoSW5mbyhzY2FuKTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyogLS0tLS0tLS0t LS0tLS0tLQorICoJCWluZGV4X2dldG5leHRfYmF0Y2hfcHJlZmV0Y2ggLSBwcmVmZXRjaCBw YWdlcyBmb3IgVElEcyBpbiBjdXJyZW50IGJhdGNoCisgKgorICogVGhlIHByZWZldGNoIGRp c3RhbmNlIGlzIGluY3JlYXNlZCBncmFkdWFsbHksIHNpbWlsYXIgdG8gd2hhdCB3ZSBkbyBm b3IKKyAqIGJpdG1hcCBoZWFwIHNjYW5zLiBXZSBzdGFydCBmcm9tIGRpc3RhbmNlIDAgKG5v IHByZWZldGNoKSwgYW5kIHRoZW4gaW4gZWFjaAorICogaXRlcmF0aW9uIGluY3JlbWVudCB0 aGUgZGlzdGFuY2UgdXAgdG8gcHJlZmV0Y2hNYXhpbXVtLgorICoKKyAqIFRoZSBwcmVmZXRj aCBkaXN0YW5jZSBpcyByZXNldCAodG8gMCkgb25seSBvbiByZXNjYW5zLCBub3QgYmV0d2Vl biBiYXRjaGVzLgorICoKKyAqIEl0J3MgcG9zc2libGUgdG8gcHJvdmlkZSBhbiBpbmRleF9w cmVmZXRjaF9jYWxsYmFjayBjYWxsYmFjaywgdG8gYWZmZWN0CisgKiB3aGljaCBpdGVtcyBu ZWVkIHRvIGJlIHByZWZldGNoZWQuIFdpdGggcHJlZmV0Y2hfY2FsbGJhY2s9TlVMTCwgYWxs CisgKiBpdGVtcyBhcmUgcHJlZmV0Y2hlZC4gV2l0aCB0aGUgY2FsbGJhY2sgcHJvdmlkZWQs IHRoZSBpdGVtIGlzIHByZWZldGNoZWQKKyAqIGlmZiB0aGUgY2FsbGJhY2sgYW5kIHJldHVy bnMgdHJ1ZS4KKyAqCisgKiBUaGUgImFyZyIgYXJndW1lbnQgaXMgdXNlZCB0byBwYXNzIGEg c3RhdGUgZm9yIHRoZSBwbGFuIG5vZGUgaW52b2tpbmcgdGhlCisgKiBmdW5jdGlvbiwgYW5k IGlzIHRoZW4gcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4gVGhpcyBtZWFucyB0aGUgY2FsbGJh Y2sgaXMKKyAqIHNwZWNpZmljIHRvIHRoZSBwbGFuIHN0YXRlLgorICoKKyAqIFhYWCB0aGUg cHJlZmV0Y2hNYXhpbXVtIGRlcGVuZHMgb24gZWZmZWN0aXZlX2lvX2NvbmN1cnJlbmN5LCBh bmQgYWxzbyBvbgorICogdGFibGVzcGFjZSBvcHRpb25zLgorICoKKyAqIFhYWCBGb3IgYWNj ZXNzZXMgdGhhdCBjaGFuZ2Ugc2NhbiBkaXJlY3Rpb24sIHdlIG1heSBkbyBhIGxvdCBvZiB1 bm5lY2Vzc2FyeQorICogcHJlZmV0Y2hpbmcgKGJlY2F1c2Ugd2Ugd2lsbCByZS1pc3N1ZSBw cmVmZXRjaGVzIGZvciB3aGF0IHdlIHJlY2VudGx5IHJlYWQpLgorICogSSdtIG5vdCBzdXJl IGlmIHRoZXJlJ3MgYSBzaW1wbGUgd2F5IHRvIHRyYWNrIHdoYXQgd2FzIGFscmVhZHkgcHJl ZmV0Y2hlZC4KKyAqIE1heWJlIHdlIGNvdWxkIGNvdW50IGhvdyBmYXIgd2UgZ290IChpbiB0 aGUgZm9yd2FyZCBkaXJlY3Rpb24pLCBrZWVwIHRoYXQKKyAqIGFzIGEgd2F0ZXJtYXJrLCBh bmQgbmV2ZXIgcHJlZmV0Y2ggYWdhaW4gYmVsb3cgaXQuCisgKgorICogWFhYIE1heWJlIHdy YXAgdGhpcyBpbiBpZmRlZiBVU0VfUFJFRkVUQ0g/CisgKiAtLS0tLS0tLS0tLS0tLS0tCisg Ki8KK3ZvaWQKK2luZGV4X2JhdGNoX3ByZWZldGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bkRpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJCSBpbmRleF9wcmVmZXRjaF9jYWxsYmFjayBw cmVmZXRjaF9jYWxsYmFjaywgdm9pZCAqYXJnKQoreworCWludAkJCXByZWZldGNoU3RhcnQs CisJCQkJcHJlZmV0Y2hFbmQ7CisKKwlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXJl Y3Rpb24pKQorCXsKKwkJLyogV2hlcmUgc2hvdWxkIHdlIHN0YXJ0IHRvIHByZWZldGNoPyAq LworCQlwcmVmZXRjaFN0YXJ0ID0gTWF4KHNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleCwKKwkJ CQkJCQlzY2FuLT54c19iYXRjaC5wcmVmZXRjaEluZGV4KTsKKworCQkvKgorCQkgKiBXaGVy ZSBzaG91bGQgd2Ugc3RvcCBwcmVmZXRjaGluZz8gdGhpcyBpcyB0aGUgZmlyc3QgaXRlbSB0 aGF0IHdlIGRvCisJCSAqIE5PVCBwcmVmZXRjaCwgaS5lLiBpdCBjYW4gYmUgdGhlIGZpcnN0 IGl0ZW0gYWZ0ZXIgdGhlIGJhdGNoLgorCQkgKi8KKwkJcHJlZmV0Y2hFbmQgPSBNaW4oKHNj YW4tPnhzX2JhdGNoLmN1cnJJbmRleCArIDEpICsgc2Nhbi0+eHNfYmF0Y2gucHJlZmV0Y2hU YXJnZXQsCisJCQkJCQkgIHNjYW4tPnhzX2JhdGNoLm5oZWFwdGlkcyk7CisKKwkJLyogRklY TUUgc2hvdWxkIGNhbGN1bGF0ZSBpbiBhIHdheSB0byBtYWtlIHRoaXMgdW5uZWNlc3Nhcnkg Ki8KKwkJcHJlZmV0Y2hTdGFydCA9IE1heChNaW4ocHJlZmV0Y2hTdGFydCwgc2Nhbi0+eHNf YmF0Y2gubmhlYXB0aWRzIC0gMSksIDApOworCQlwcmVmZXRjaEVuZCA9IE1heChNaW4ocHJl ZmV0Y2hFbmQsIHNjYW4tPnhzX2JhdGNoLm5oZWFwdGlkcyAtIDEpLCAwKTsKKworCQkvKiBy ZW1lbWJlciBob3cgZmFyIHdlIHByZWZldGNoZWQgLyB3aGVyZSB0byBzdGFydCB0aGUgbmV4 dCBwcmVmZXRjaCAqLworCQlzY2FuLT54c19iYXRjaC5wcmVmZXRjaEluZGV4ID0gcHJlZmV0 Y2hFbmQ7CisJfQorCWVsc2UKKwl7CisJCS8qIFdoZXJlIHNob3VsZCB3ZSBzdGFydCB0byBw cmVmZXRjaD8gKi8KKwkJcHJlZmV0Y2hFbmQgPSBNaW4oc2Nhbi0+eHNfYmF0Y2guY3Vycklu ZGV4LAorCQkJCQkJICBzY2FuLT54c19iYXRjaC5wcmVmZXRjaEluZGV4KTsKKworCQkvKgor CQkgKiBXaGVyZSBzaG91bGQgd2Ugc3RvcCBwcmVmZXRjaGluZz8gdGhpcyBpcyB0aGUgZmly c3QgaXRlbSB0aGF0IHdlIGRvCisJCSAqIE5PVCBwcmVmZXRjaCwgaS5lLiBpdCBjYW4gYmUg dGhlIGZpcnN0IGl0ZW0gYWZ0ZXIgdGhlIGJhdGNoLgorCQkgKi8KKwkJcHJlZmV0Y2hTdGFy dCA9IE1heCgoc2Nhbi0+eHNfYmF0Y2guY3VyckluZGV4IC0gMSkgLSBzY2FuLT54c19iYXRj aC5wcmVmZXRjaFRhcmdldCwKKwkJCQkJCQktMSk7CisKKwkJLyogRklYTUUgc2hvdWxkIGNh bGN1bGF0ZSBpbiBhIHdheSB0byBtYWtlIHRoaXMgdW5uZWNlc3NhcnkgKi8KKwkJcHJlZmV0 Y2hTdGFydCA9IE1heChNaW4ocHJlZmV0Y2hTdGFydCwgc2Nhbi0+eHNfYmF0Y2gubmhlYXB0 aWRzIC0gMSksIDApOworCQlwcmVmZXRjaEVuZCA9IE1heChNaW4ocHJlZmV0Y2hFbmQsIHNj YW4tPnhzX2JhdGNoLm5oZWFwdGlkcyAtIDEpLCAwKTsKKworCQkvKiByZW1lbWJlciBob3cg ZmFyIHdlIHByZWZldGNoZWQgLyB3aGVyZSB0byBzdGFydCB0aGUgbmV4dCBwcmVmZXRjaCAq LworCQlzY2FuLT54c19iYXRjaC5wcmVmZXRjaEluZGV4ID0gcHJlZmV0Y2hTdGFydDsKKwl9 CisKKwkvKiB3ZSBzaG91bGRuJ3QgZ2V0IGludmVydGVkIHByZWZldGNoIHJhbmdlICovCisJ QXNzZXJ0KHByZWZldGNoU3RhcnQgPD0gcHJlZmV0Y2hFbmQpOworCisJLyoKKwkgKiBJbmNy ZWFzZSB0aGUgcHJlZmV0Y2ggZGlzdGFuY2UsIGJ1dCBub3QgYmV5b25kIHByZWZldGNoTWF4 aW11bS4gV2UKKwkgKiBpbnRlbnRpb25hbGx5IGRvIHRoaXMgYWZ0ZXIgY2FsY3VsYXRpbmcg c3RhcnQvZW5kLCBzbyB0aGF0IHdlIHN0YXJ0CisJICogYWN0dWFsbHkgcHJlZmV0Y2hpbmcg b25seSBhZnRlciB0aGUgZmlyc3QgaXRlbS4KKwkgKi8KKwlzY2FuLT54c19iYXRjaC5wcmVm ZXRjaFRhcmdldCA9IE1pbihzY2FuLT54c19iYXRjaC5wcmVmZXRjaFRhcmdldCArIDEsCisJ CQkJCQkJCQkJc2Nhbi0+eHNfYmF0Y2gucHJlZmV0Y2hNYXhpbXVtKTsKKworCS8qIGNvbXBy ZWhlbnNpdmUgY2hlY2tzIG9mIGJhdGNoaW5nIGluZm8gKi8KKwlBc3NlcnRDaGVja0JhdGNo SW5mbyhzY2FuKTsKKworCS8qIGZpbmFsbHksIGRvIHRoZSBhY3R1YWwgcHJlZmV0Y2hpbmcg Ki8KKwlmb3IgKGludCBpID0gcHJlZmV0Y2hTdGFydDsgaSA8IHByZWZldGNoRW5kOyBpKysp CisJeworCQkvKiBza2lwIGJsb2NrIGlmIHRoZSBwcm92aWRlZCBjYWxsYmFjayBzYXlzIHNv ICovCisJCWlmIChwcmVmZXRjaF9jYWxsYmFjayAmJiAhcHJlZmV0Y2hfY2FsbGJhY2soc2Nh biwgZGlyZWN0aW9uLCBhcmcsIGkpKQorCQkJY29udGludWU7CisKKwkJUHJlZmV0Y2hCdWZm ZXIoc2Nhbi0+aGVhcFJlbGF0aW9uLCBNQUlOX0ZPUktOVU0sCisJCQkJCSAgIEl0ZW1Qb2lu dGVyR2V0QmxvY2tOdW1iZXIoJnNjYW4tPnhzX2JhdGNoLmhlYXB0aWRzW2ldKSk7CisJfQor fQorCisvKgorICogRG9lcyB0aGUgYWNjZXNzIG1ldGhvZCBzdXBwb3J0IGJhdGNoaW5nPyBX ZSBqdXN0IGNoZWNrIHRoZSBpbmRleCBBTSBoYXMKKyAqIGFtZ2V0dHVwbGViYXRjaCgpIG1l dGhvZC4KKyAqLworYm9vbAoraW5kZXhfYmF0Y2hfc3VwcG9ydGVkKEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJcmV0dXJuIChzY2FuLT5pbmRl eFJlbGF0aW9uLT5yZF9pbmRhbS0+YW1nZXR0dXBsZWJhdGNoICE9IE5VTEwpOworfQorCisv KgorICogaW5kZXhfYmF0Y2hfaW5pdAorICoJCUluaXRpYWxpemUgdmFyaW91cyBmaWVsZHMg LyBhcnJheXMgbmVlZGVkIGJ5IGJhdGNoaW5nLgorICoKKyAqIEZJWE1FIFRoaXMgaXMgYSBi aXQgYWQtaG9jIGhvZGdlIHBvZGdlLCBkdWUgdG8gaG93IEkgd2FzIGFkZGluZyBtb3JlIGFu ZAorICogbW9yZSBwaWVjZXMuIFNvbWUgb2YgdGhlIGZpZWxkcyBtYXkgYmUgbm90IHF1aXRl IG5lY2Vzc2FyeSwgbmVlZHMgY2xlYW51cC4KKyAqLwordm9pZAoraW5kZXhfYmF0Y2hfaW5p dChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKQoreworCS8q IGluaXQgYmF0Y2hpbmcgaW5mbywgYnV0IG9ubHkgaWYgYmF0Y2ggc3VwcG9ydGVkICovCisJ aWYgKCFpbmRleF9iYXRjaF9zdXBwb3J0ZWQoc2NhbiwgZGlyZWN0aW9uKSkKKwkJcmV0dXJu OworCisJc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRleCA9IC0xOworCXNjYW4tPnhzX2JhdGNo Lmxhc3RJbmRleCA9IC0xOworCisJLyoKKwkgKiBTZXQgc29tZSByZWFzb25hYmxlIGJhdGNo IHNpemUgZGVmYXVsdHMuCisJICoKKwkgKiBYWFggTWF5YmUgc2hvdWxkIGRlcGVuZCBvbiBw cmVmZXRjaCBkaXN0YW5jZSwgb3Igc29tZXRoaW5nIGxpa2UgdGhhdD8KKwkgKiBUaGUgaW5p dFNpemUgd2lsbCBhZmZlY3QgaG93IGZhciBhaGVhZCB3ZSBjYW4gcHJlZmV0Y2guCisJICov CisJc2Nhbi0+eHNfYmF0Y2gubWF4U2l6ZSA9IDY0OworCXNjYW4tPnhzX2JhdGNoLmluaXRT aXplID0gODsKKwlzY2FuLT54c19iYXRjaC5jdXJyU2l6ZSA9IHNjYW4tPnhzX2JhdGNoLmlu aXRTaXplOworCisJLyogaW5pdGlhbGl6ZSBwcmVmZXRjaGluZyBpbmZvICovCisJc2Nhbi0+ eHNfYmF0Y2gucHJlZmV0Y2hNYXhpbXVtID0KKwkJZ2V0X3RhYmxlc3BhY2VfaW9fY29uY3Vy cmVuY3koc2Nhbi0+aGVhcFJlbGF0aW9uLT5yZF9yZWwtPnJlbHRhYmxlc3BhY2UpOworCXNj YW4tPnhzX2JhdGNoLnByZWZldGNoVGFyZ2V0ID0gMDsKKwlzY2FuLT54c19iYXRjaC5wcmVm ZXRjaEluZGV4ID0gMDsKKworCS8qICovCisJc2Nhbi0+eHNfYmF0Y2guY3VyckluZGV4ID0g LTE7CisKKwkvKiBQcmVhbGxvY2F0ZSB0aGUgbGFyZ2VzdCBhbGxvd2VkIGFycmF5IG9mIFRJ RHMuICovCisJc2Nhbi0+eHNfYmF0Y2gubmhlYXB0aWRzID0gMDsKKwlzY2FuLT54c19iYXRj aC5oZWFwdGlkcyA9IHBhbGxvYzAoc2l6ZW9mKEl0ZW1Qb2ludGVyRGF0YSkgKiBzY2FuLT54 c19iYXRjaC5tYXhTaXplKTsKKworCWlmIChzY2FuLT54c193YW50X2l0dXApCisJCXNjYW4t PnhzX2JhdGNoLml0dXBzID0gcGFsbG9jKHNpemVvZihJbmRleFR1cGxlKSAqIHNjYW4tPnhz X2JhdGNoLm1heFNpemUpOworCisJLyoKKwkgKiBYWFggTWF5YmUgdXNlIGEgbW9yZSBjb21w YWN0IGJpdG1hcD8gV2UgbmVlZCBqdXN0IG9uZSBiaXQgcGVyIGVsZW1lbnQsCisJICogbm90 IGEgYm9vbC4gVGhpcyBpcyBlYXNpZXIgLyBtb3JlIGNvbnZlbmllbnQgdG8gbWFuaXB1bGF0 ZSwgdGhvdWdoLgorCSAqLworCXNjYW4tPnhzX2JhdGNoLmtpbGxlZEl0ZW1zID0gKGJvb2wg KikgcGFsbG9jMChzaXplb2YoYm9vbCkgKiBzY2FuLT54c19iYXRjaC5tYXhTaXplKTsKKwor CS8qCisJICogWFhYIE1heWJlIGFsbG9jYXRlIG9ubHkgd2hlbiBhY3R1YWxseSBuZWVkZWQ/ IEFsc28sIHNob3VsZG4ndCB3ZSBoYXZlIGEKKwkgKiBtZW1vcnkgY29udGV4dCBmb3IgdGhl IHByaXZhdGUgZGF0YT8KKwkgKi8KKwlzY2FuLT54c19iYXRjaC5wcml2YXRlRGF0YSA9IChE YXR1bSAqKSBwYWxsb2MwKHNpemVvZihEYXR1bSkgKiBzY2FuLT54c19iYXRjaC5tYXhTaXpl KTsKKworCS8qIGNvbXByZWhlbnNpdmUgY2hlY2tzICovCisJQXNzZXJ0Q2hlY2tCYXRjaElu Zm8oc2Nhbik7Cit9CisKKy8qCisgKiBpbmRleF9iYXRjaF9yZXNldAorICoJCVJlc2V0IHRo ZSBiYXRjaCBiZWZvcmUgcmVhZGluZyB0aGUgbmV4dCBjaHVuayBvZiBkYXRhLgorICoKKyAq IEZJWE1FIEFub3RoZXIgYml0IGluIG5lZWQgb2YgY2xlYW51cC4gVGhlIGN1cnJJbmRleCBk ZWZhdWx0ICgtMSkgaXMgbm90IHF1aXRlCisgKiBjb3JyZWN0LCBiZWNhdXNlIGZvciBiYWNr d2FyZHMgc2NhbnMgaXMgd3JvbmcuCisgKi8KK3ZvaWQKK2luZGV4X2JhdGNoX3Jlc2V0KElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisJLyogbWF5 YmUgaW5pdGlhbGl6ZSAqLworCXNjYW4tPnhzX2JhdGNoLm5oZWFwdGlkcyA9IDA7CisJc2Nh bi0+eHNfYmF0Y2gucHJlZmV0Y2hJbmRleCA9IDA7CisJc2Nhbi0+eHNfYmF0Y2guY3Vycklu ZGV4ID0gLTE7Cit9CisKKy8qCisgKiBpbmRleF9iYXRjaF9hZGQKKyAqCQlBZGQgYW4gaXRl bSB0byB0aGUgYmF0Y2guCisgKgorICogVGhlIGl0ZW0gaXMgYWx3YXlzIGEgVElELCBhbmQg dGhlbiBhbHNvIEluZGV4VHVwbGUgaWYgcmVxdWVzdGVkIChmb3IgSU9TKS4KKyAqIEl0ZW1z IGFyZSBhbHdheXMgYWRkZWQgZnJvbSB0aGUgYmVnaW5uaW5nIChpbmRleCAwKS4KKyAqCisg KiBSZXR1cm5zIHRydWUgd2hlbiBhZGRpbmcgdGhlIGl0ZW0gd2FzIHN1Y2Nlc3NmdWwsIG9y IGZhbHNlIHdoZW4gdGhlIGJhdGNoCisgKiBpcyBmdWxsIChhbmQgdGhlIGl0ZW0gc2hvdWxk IGJlIGFkZGVkIHRvIHRoZSBuZXh0IGJhdGNoKS4KKyAqLworYm9vbAoraW5kZXhfYmF0Y2hf YWRkKEluZGV4U2NhbkRlc2Mgc2NhbiwgSXRlbVBvaW50ZXJEYXRhIHRpZCwgSW5kZXhUdXBs ZSBpdHVwKQoreworCS8qIGNvbXByZWhlbnNpdmUgY2hlY2tzIG9uIHRoZSBiYXRjaCBpbmZv ICovCisJQXNzZXJ0Q2hlY2tCYXRjaEluZm8oc2Nhbik7CisKKwkvKiBkb24ndCBhZGQgVElE cyBiZXlvbmQgdGhlIGN1cnJlbnQgYmF0Y2ggc2l6ZSAqLworCWlmIChJTkRFWF9CQVRDSF9J U19GVUxMKHNjYW4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFRoZXJlIG11c3Qg YmUgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBlbnRyeS4KKwkgKgorCSAqIFhYWCBTZWVtcyBy ZWR1bmRhbnQgd2l0aCB0aGUgZWFybGllciBJTkRFWF9CQVRDSF9JU19GVUxMIGNoZWNrLgor CSAqLworCUFzc2VydChzY2FuLT54c19iYXRjaC5uaGVhcHRpZHMgPCBzY2FuLT54c19iYXRj aC5jdXJyU2l6ZSk7CisJQXNzZXJ0KHNjYW4tPnhzX2JhdGNoLm5oZWFwdGlkcyA+PSAwKTsK KworCXNjYW4tPnhzX2JhdGNoLmhlYXB0aWRzW3NjYW4tPnhzX2JhdGNoLm5oZWFwdGlkc10g PSB0aWQ7CisJc2Nhbi0+eHNfYmF0Y2gua2lsbGVkSXRlbXNbc2Nhbi0+eHNfYmF0Y2gubmhl YXB0aWRzXSA9IGZhbHNlOworCXNjYW4tPnhzX2JhdGNoLnByaXZhdGVEYXRhW3NjYW4tPnhz X2JhdGNoLm5oZWFwdGlkc10gPSAoRGF0dW0pIDA7CisKKwlpZiAoc2Nhbi0+eHNfd2FudF9p dHVwKQorCQlzY2FuLT54c19iYXRjaC5pdHVwc1tzY2FuLT54c19iYXRjaC5uaGVhcHRpZHNd ID0gaXR1cDsKKworCXNjYW4tPnhzX2JhdGNoLm5oZWFwdGlkcysrOworCisJLyogY29tcHJl aGVuc2l2ZSBjaGVja3Mgb24gdGhlIGJhdGNoIGluZm8gKi8KKwlBc3NlcnRDaGVja0JhdGNo SW5mbyhzY2FuKTsKKworCXJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvYWNjZXNzL25idHJlZS9uYnRyZWUuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUv bmJ0cmVlLmMKaW5kZXggNjg2YTMyMDZmNzIuLjUzMzc1ZGU5YzY2IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0cmVlLmMKQEAgLTE0MSw2ICsxNDEsNyBAQCBidGhhbmRsZXIoUEdf RlVOQ1RJT05fQVJHUykKIAlhbXJvdXRpbmUtPmFtYmVnaW5zY2FuID0gYnRiZWdpbnNjYW47 CiAJYW1yb3V0aW5lLT5hbXJlc2NhbiA9IGJ0cmVzY2FuOwogCWFtcm91dGluZS0+YW1nZXR0 dXBsZSA9IGJ0Z2V0dHVwbGU7CisJYW1yb3V0aW5lLT5hbWdldHR1cGxlYmF0Y2ggPSBidGdl dHR1cGxlYmF0Y2g7CiAJYW1yb3V0aW5lLT5hbWdldGJpdG1hcCA9IGJ0Z2V0Yml0bWFwOwog CWFtcm91dGluZS0+YW1lbmRzY2FuID0gYnRlbmRzY2FuOwogCWFtcm91dGluZS0+YW1tYXJr cG9zID0gYnRtYXJrcG9zOwpAQCAtMjU5LDYgKzI2MCw1MiBAQCBidGdldHR1cGxlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJcmV0dXJuIHJlczsKIH0KIAor LyoKKyAqCWJ0Z2V0dHVwbGViYXRjaCgpIC0tIEdldCB0aGUgbmV4dCBiYXRjaCBvZiB0dXBs ZXMgaW4gdGhlIHNjYW4uCisgKgorICogWFhYIFByZXR0eSBtdWNoIGxpa2UgYnRnZXR0dXBs ZSgpLCBidXQgZm9yIGJhdGNoZXMgb2YgdHVwbGVzLgorICovCitib29sCitidGdldHR1cGxl YmF0Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNj YW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJYm9vbAkJcmVz OworCisJLyogYnRyZWUgaW5kZXhlcyBhcmUgbmV2ZXIgbG9zc3kgKi8KKwlzY2FuLT54c19y ZWNoZWNrID0gZmFsc2U7CisKKwkvKiBFYWNoIGxvb3AgaXRlcmF0aW9uIHBlcmZvcm1zIGFu b3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KKwlkbworCXsKKwkJLyoKKwkJICogSWYg d2UndmUgYWxyZWFkeSBpbml0aWFsaXplZCB0aGlzIHNjYW4sIHdlIGNhbiBqdXN0IGFkdmFu Y2UgaXQgaW4KKwkJICogdGhlIGFwcHJvcHJpYXRlIGRpcmVjdGlvbi4gIElmIHdlIGhhdmVu J3QgZG9uZSBzbyB5ZXQsIHdlIGNhbGwKKwkJICogX2J0X2ZpcnN0KCkgdG8gZ2V0IHRoZSBm aXJzdCBpdGVtIGluIHRoZSBzY2FuLgorCQkgKi8KKwkJaWYgKCFCVFNjYW5Qb3NJc1ZhbGlk KHNvLT5jdXJyUG9zKSkKKwkJCXJlcyA9IF9idF9maXJzdF9iYXRjaChzY2FuLCBkaXIpOwor CQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGtp bGwgdHVwbGVzIGZyb20gdGhlIHByZXZpb3VzIGJhdGNoLgorCQkJICovCisJCQlfYnRfa2ls bF9iYXRjaChzY2FuKTsKKworCQkJLyoKKwkJCSAqIE5vdyBjb250aW51ZSB0aGUgc2Nhbi4K KwkJCSAqLworCQkJcmVzID0gX2J0X25leHRfYmF0Y2goc2NhbiwgZGlyKTsKKwkJfQorCisJ CS8qIElmIHdlIGhhdmUgYSB0dXBsZSwgcmV0dXJuIGl0IC4uLiAqLworCQlpZiAocmVzKQor CQkJYnJlYWs7CisJCS8qIC4uLiBvdGhlcndpc2Ugc2VlIGlmIHdlIG5lZWQgYW5vdGhlciBw cmltaXRpdmUgaW5kZXggc2NhbiAqLworCX0gd2hpbGUgKHNvLT5udW1BcnJheUtleXMgJiYg X2J0X3N0YXJ0X3ByaW1fc2NhbihzY2FuLCBkaXIpKTsKKworCXJldHVybiByZXM7Cit9CisK IC8qCiAgKiBidGdldGJpdG1hcCgpIC0tIGdldHMgYWxsIG1hdGNoaW5nIHR1cGxlcywgYW5k IGFkZHMgdGhlbSB0byBhIGJpdG1hcAogICovCkBAIC0zNjQsNiArNDExLDkgQEAgYnRyZXNj YW4oSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMs CiAJLyogd2UgYXJlbid0IGhvbGRpbmcgYW55IHJlYWQgbG9ja3MsIGJ1dCBnb3R0YSBkcm9w IHRoZSBwaW5zICovCiAJaWYgKEJUU2NhblBvc0lzVmFsaWQoc28tPmN1cnJQb3MpKQogCXsK KwkJLyogVHJhbnNmZXIga2lsbGVkIGl0ZW1zIGZyb20gdGhlIGJhdGNoIHRvIHRoZSByZWd1 bGFyIGFycmF5LiAqLworCQlfYnRfa2lsbF9iYXRjaChzY2FuKTsKKwogCQkvKiBCZWZvcmUg bGVhdmluZyBjdXJyZW50IHBhZ2UsIGRlYWwgd2l0aCBhbnkga2lsbGVkIGl0ZW1zICovCiAJ CWlmIChzby0+bnVtS2lsbGVkID4gMCkKIAkJCV9idF9raWxsaXRlbXMoc2Nhbik7CkBAIC00 MjEsNiArNDcxLDkgQEAgYnRlbmRzY2FuKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkvKiB3ZSBh cmVuJ3QgaG9sZGluZyBhbnkgcmVhZCBsb2NrcywgYnV0IGdvdHRhIGRyb3AgdGhlIHBpbnMg Ki8KIAlpZiAoQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpCiAJeworCQkvKiBUcmFu c2ZlciBraWxsZWQgaXRlbXMgZnJvbSB0aGUgYmF0Y2ggdG8gdGhlIHJlZ3VsYXIgYXJyYXku ICovCisJCV9idF9raWxsX2JhdGNoKHNjYW4pOworCiAJCS8qIEJlZm9yZSBsZWF2aW5nIGN1 cnJlbnQgcGFnZSwgZGVhbCB3aXRoIGFueSBraWxsZWQgaXRlbXMgKi8KIAkJaWYgKHNvLT5u dW1LaWxsZWQgPiAwKQogCQkJX2J0X2tpbGxpdGVtcyhzY2FuKTsKQEAgLTUwMSw2ICs1NTQs OSBAQCBidHJlc3RycG9zKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkJICovCiAJCWlmIChCVFNj YW5Qb3NJc1ZhbGlkKHNvLT5jdXJyUG9zKSkKIAkJeworCQkJLyogVHJhbnNmZXIga2lsbGVk IGl0ZW1zIGZyb20gdGhlIGJhdGNoIHRvIHRoZSByZWd1bGFyIGFycmF5LiAqLworCQkJX2J0 X2tpbGxfYmF0Y2goc2Nhbik7CisKIAkJCS8qIEJlZm9yZSBsZWF2aW5nIGN1cnJlbnQgcGFn ZSwgZGVhbCB3aXRoIGFueSBraWxsZWQgaXRlbXMgKi8KIAkJCWlmIChzby0+bnVtS2lsbGVk ID4gMCkKIAkJCQlfYnRfa2lsbGl0ZW1zKHNjYW4pOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRy ZWUvbmJ0c2VhcmNoLmMKaW5kZXggMjU1MWRmOGE2NzEuLmU3YzMzMTM2OTZkIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jCisrKyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKQEAgLTE1MjcsNiArMTUyNywzNjYg QEAgX2J0X25leHQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAly ZXR1cm4gdHJ1ZTsKIH0KIAorLyoKKyAqCV9idF9maXJzdF9iYXRjaCgpIC0tIEZpbmQgdGhl IGZpcnN0IGJhdGNoIGluIGEgc2Nhbi4KKyAqCisgKiBBIGJhdGNoIHZhcmlhbnQgb2YgX2J0 X2ZpcnN0KCkuIE1vc3Qgb2YgdGhlIGNvbW1lbnRzIGZvciB0aGF0IGZ1bmN0aW9uCisgKiBh cHBseSBoZXJlIHRvby4KKyAqCisgKiBYWFggVGhpcyBvbmx5IHBvcHVsYXRlcyB0aGUgYmF0 Y2gsIGl0IGRvZXMgbm90IHNldCBhbnkgb3RoZXIgZmllbGRzIGxpa2UKKyAqIHNjYW4tPnhz X2hlYXB0aWQgb3Igc2Nhbi0+eHNfaXR1cC4gVGhhdCBoYXBwZW5zIGluIGdldG5leHRfdGlk KCkgY2FsbHMuCisgKgorICogWFhYIEknbSBub3Qgc3VyZSBpdCB3b3JrcyB0byBtaXggYmF0 Y2hlZCBhbmQgbm9uLWJhdGNoZXMgY2FsbHMsIGUuZy4gZ2V0CisgKiBhIFRJRCBhbmQgdGhl biBhIGJhdGNoIG9mIFRJRHMuIEl0IHByb2JhYmx5IHNob3VsZCB3b3JrIGFzIGxvbmcgYXMg d2UKKyAqIHVwZGF0ZSBpdGVtSW5kZXggY29ycmVjdGx5LCBidXQgd2UgbmVlZCB0byBiZSBj YXJlZnVsIGFib3V0IGtpbGxlZCBpdGVtcworICogKHJpZ2h0IG5vdyB0aGUgdHdvIHBsYWNl cyB1c2UgZGlmZmVyZW50IHdheXMgdG8gY29tbXVuaWNhdGUgd2hpY2ggaXRlbXMKKyAqIHNo b3VsZCBiZSBraWxsZWQpLgorICovCitib29sCitfYnRfZmlyc3RfYmF0Y2goSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAo QlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwkvKiBzdGFydCBhIG5ldyBiYXRjaCAq LworCWluZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIGRpcik7CisKKwkvKgorCSAqIFJlc2V0IHRo ZSBiYXRjaCBzaXplIHRvIHRoZSBpbml0aWFsIHNpemUuCisJICoKKwkgKiBGSVhNRSBzaG91 bGQgYmUgZG9uZSBpbiBpbmRleGFtLmMgcHJvYmFibHksIGF0IHRoZSBiZWdpbm5pbmcgb2Yg ZWFjaAorCSAqIGluZGV4IHJlc2Nhbj8KKwkgKi8KKwlzY2FuLT54c19iYXRjaC5jdXJyU2l6 ZSA9IHNjYW4tPnhzX2JhdGNoLmluaXRTaXplOworCisJLyogd2UgaGF2ZW4ndCB2aXNpdGVk IGFueSBsZWFmIHBhZ2VzIHlldCwgc28gcHJvY2VlZCB0byByZWFkaW5nIG9uZSAqLworCWlm IChfYnRfZmlyc3Qoc2NhbiwgZGlyKSkKKwl7CisJCS8qIHJhbmdlIG9mIHRoZSBsZWFmIHRv IGNvcHkgaW50byB0aGUgYmF0Y2ggKi8KKwkJaW50CQkJc3RhcnQsCisJCQkJCWVuZDsKKwor CQkvKiBkZXRlcm1pbmUgd2hpY2ggcGFydCBvZiB0aGUgbGVhZiBwYWdlIHRvIGV4dHJhY3Qg Ki8KKwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkKKwkJeworCQkJc3RhcnQg PSBzby0+Y3VyclBvcy5maXJzdEl0ZW07CisJCQllbmQgPSBNaW4oc3RhcnQgKyAoc2Nhbi0+ eHNfYmF0Y2guY3VyclNpemUgLSAxKSwgc28tPmN1cnJQb3MubGFzdEl0ZW0pOworCQkJc28t PmN1cnJQb3MuaXRlbUluZGV4ID0gKGVuZCArIDEpOworCQl9CisJCWVsc2UKKwkJeworCQkJ ZW5kID0gc28tPmN1cnJQb3MubGFzdEl0ZW07CisJCQlzdGFydCA9IE1heChlbmQgLSAoc2Nh bi0+eHNfYmF0Y2guY3VyclNpemUgLSAxKSwKKwkJCQkJCXNvLT5jdXJyUG9zLmZpcnN0SXRl bSk7CisJCQlzby0+Y3VyclBvcy5pdGVtSW5kZXggPSAoc3RhcnQgLSAxKTsKKwkJfQorCisJ CS8qCisJCSAqIFdlJ3JlIHJlYWRpbmcgdGhlIGZpcnN0IGJhdGNoLCBhbmQgdGhlcmUgc2hv dWxkIGFsd2F5cyBiZSBhdCBsZWFzdAorCQkgKiBvbmUgaXRlbSAob3RoZXJ3aXNlIF9idF9m aXJzdCB3b3VsZCByZXR1cm4gZmFsc2UpLiBTbyB3ZSBzaG91bGQKKwkJICogbmV2ZXIgZ2V0 IGludG8gc2l0dWF0aW9uIHdpdGggZW1wdHkgc3RhcnQvZW5kIHJhbmdlLiBJbiB0aGUgd29y c3QKKwkJICogY2FzZSwgdGhlcmUgaXMganVzdCBhIHNpbmdsZSBpdGVtLCBpbiB3aGljaCBj YXNlIChzdGFydCA9PSBlbmQpLgorCQkgKi8KKwkJQXNzZXJ0KHN0YXJ0IDw9IGVuZCk7CisK KwkJc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRleCA9IHN0YXJ0OworCQlzY2FuLT54c19iYXRj aC5sYXN0SW5kZXggPSBlbmQ7CisKKwkJLyogVGhlIHJhbmdlIG9mIGl0ZW1zIHNob3VsZCBm aXQgaW50byB0aGUgY3VycmVudCBiYXRjaCBzaXplLiAqLworCQlBc3NlcnQoKGVuZCAtIHN0 YXJ0ICsgMSkgPD0gc2Nhbi0+eHNfYmF0Y2guY3VyclNpemUpOworCisJCS8qIHNob3VsZCBi ZSB2YWxpZCBpdGVtcyAod2l0aCByZXNwZWN0IHRvIHRoZSBsZWFmIHBhZ2UpICovCisJCUFz c2VydChzby0+Y3VyclBvcy5maXJzdEl0ZW0gPD0gc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRl eCk7CisJCUFzc2VydChzY2FuLT54c19iYXRjaC5maXJzdEluZGV4IDw9IHNjYW4tPnhzX2Jh dGNoLmxhc3RJbmRleCk7CisJCUFzc2VydChzY2FuLT54c19iYXRjaC5sYXN0SW5kZXggPD0g c28tPmN1cnJQb3MubGFzdEl0ZW0pOworCisJCS8qCisJCSAqIFdhbGsgdGhyb3VnaCB0aGUg cmFuZ2Ugb2YgaW5kZXggdHVwbGVzLCBjb3B5IHRoZW0gaW50byB0aGUgYmF0Y2guCisJCSAq IElmIHJlcXVlc3RlZCwgc2V0IHRoZSBpbmRleCB0dXBsZSB0b28uCisJCSAqCisJCSAqIFdl IGRvbid0IGtub3cgaWYgdGhlIGJhdGNoIGlzIGZ1bGwgYWxyZWFkeSAtIHdlIGp1c3QgdHJ5 IHRvIGFkZCBpdCwKKwkJICogYW5kIGJhaWwgb3V0IGlmIGl0IGZhaWxzLgorCQkgKgorCQkg KiBGSVhNRSBUaGlzIHNlZW1zIHdyb25nLCBhY3R1YWxseS4gV2UgdXNlIGN1cnJTaXplIHdo ZW4gY2FsY3VsYXRpbmcKKwkJICogdGhlIHN0YXJ0L2VuZCByYW5nZSwgc28gdGhlIGFkZCBz aG91bGQgYWx3YXlzIHN1Y2NlZWQuCisJCSAqLworCQl3aGlsZSAoc3RhcnQgPD0gZW5kKQor CQl7CisJCQlCVFNjYW5Qb3NJdGVtICpjdXJySXRlbSA9ICZzby0+Y3VyclBvcy5pdGVtc1tz dGFydF07CisJCQlJbmRleFR1cGxlCWl0dXAgPSBOVUxMOworCisJCQlpZiAoc2Nhbi0+eHNf d2FudF9pdHVwKQorCQkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgKHNvLT5jdXJyVHVwbGVzICsg Y3Vyckl0ZW0tPnR1cGxlT2Zmc2V0KTsKKworCQkJLyogdHJ5IHRvIGFkZCBpdCB0byBiYXRj aCwgaWYgdGhlcmUncyBzcGFjZSAqLworCQkJaWYgKCFpbmRleF9iYXRjaF9hZGQoc2Nhbiwg Y3Vyckl0ZW0tPmhlYXBUaWQsIGl0dXApKQorCQkJCWJyZWFrOworCisJCQlzdGFydCsrOwor CQl9CisKKwkJLyoKKwkJICogc2V0IHRoZSBzdGFydGluZyBwb2ludAorCQkgKgorCQkgKiBY WFggbWlnaHQgYmUgYmV0dGVyIGRvbmUgaW4gaW5kZXhhbS5jCisJCSAqLworCQlpZiAoU2Nh bkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJc2Nhbi0+eHNfYmF0Y2guY3VyckluZGV4 ID0gLTE7CisJCWVsc2UKKwkJCXNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleCA9IHNjYW4tPnhz X2JhdGNoLm5oZWFwdGlkczsKKworCQkvKiBzaG91bGRuJ3QgYmUgcG9zc2libGUgdG8gZW5k IGhlcmUgd2l0aCBhbiBlbXB0eSBiYXRjaCAqLworCQlBc3NlcnQoc2Nhbi0+eHNfYmF0Y2gu bmhlYXB0aWRzID4gMCk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNl OworfQorCisvKgorICoJX2J0X25leHRfYmF0Y2goKSAtLSBHZXQgdGhlIG5leHQgYmF0Y2gg b2YgaXRlbXMgaW4gYSBzY2FuLgorICoKKyAqIEEgYmF0Y2ggdmFyaWFudCBvZiBfYnRfbmV4 dCgpLiBNb3N0IG9mIHRoZSBjb21tZW50cyBmb3IgdGhhdCBmdW5jdGlvbgorICogYXBwbHkg aGVyZSB0b28uCisgKgorICogV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgb25seSB3aGVuIHRo ZSBjdXJyZW50IGJhdGNoIGhhcyBubyBtb3JlIGl0ZW1zCisgKiBpbiB0aGUgZ2l2ZW4gZGly ZWN0aW9uLiBXZSBkb24ndCBnZXQgaGVyZSB3aXRoIGVtcHR5IGJhdGNoZXMsIHRoYXQncwor ICogaGFuZGxlZCBieSBfYnRfZmlzdF9iYXRjaCgpLgorICoKKyAqIFhYWCBTZWUgYWxzbyB0 aGUgY29tbWVudHMgYXQgX2J0X2ZpcnN0X2JhdGNoKCkgYWJvdXQgcmV0dXJuaW5nIGEgc2lu Z2xlCisgKiBiYXRjaCBmb3IgdGhlIHBhZ2UsIGV0Yy4KKyAqCisgKiBGSVhNRSBUaGVyZSdz IGEgbG90IG9mIHJlZHVuZGFudCAoYWxtb3N0IHRoZSBzYW1lKSBjb2RlIGhlcmUgLSBoYW5k bGluZworICogdGhlIGN1cnJlbnQgYW5kIG5ldyBsZWFmIHBhZ2UgaXMgdmVyeSBzaW1pbGFy LCBhbmQgaXQncyBhbHNvIHNpbWlsYXIgdG8KKyAqIF9idF9maXJzdF9iYXRjaCgpLiBXZSBz aG91bGQgdHJ5IHRvIHJlZHVjZSB0aGlzIGEgYml0LgorICovCitib29sCitfYnRfbmV4dF9i YXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQoreworCUJUU2Nh bk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKworCWludAkJCXN0 YXJ0LAorCQkJCWVuZDsKKworCS8qIHNob3VsZCBiZSB2YWxpZCBpdGVtcyAod2l0aCByZXNw ZWN0IHRvIHRoZSBsZWFmIHBhZ2UpICovCisJQXNzZXJ0KHNvLT5jdXJyUG9zLmZpcnN0SXRl bSA8PSBzY2FuLT54c19iYXRjaC5maXJzdEluZGV4KTsKKwlBc3NlcnQoc2Nhbi0+eHNfYmF0 Y2guZmlyc3RJbmRleCA8PSBzY2FuLT54c19iYXRjaC5sYXN0SW5kZXgpOworCUFzc2VydChz Y2FuLT54c19iYXRjaC5sYXN0SW5kZXggPD0gc28tPmN1cnJQb3MubGFzdEl0ZW0pOworCisJ LyoKKwkgKiBUcnkgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIGJhdGNoLiBJbnRlbnRp b25hbGx5IGRvbmUgYmVmb3JlIHRyeWluZworCSAqIHRvIHJlYWQgaXRlbXMgZnJvbSB0aGUg Y3VycmVudCBwYWdlLCBzbyB0aGF0IHRoZSBpbmNyZWFzZWQgYmF0Y2gKKwkgKiBhcHBsaWVz IHRvIHRoYXQgdG9vLgorCSAqCisJICogRklYTUUgU2hvdWxkIGJlIGRvbmUgaW4gaW5kZXhh bS5jIHByb2JhYmx5PyBGSVhNRSBNYXliZSBpdCBzaG91bGQgZ3JvdworCSAqIGZhc3Rlcj8g VGhpcyBpcyB3aGF0IGJpdG1hcCBzY2FucyBkby4KKwkgKi8KKwlzY2FuLT54c19iYXRjaC5j dXJyU2l6ZSA9IE1pbihzY2FuLT54c19iYXRjaC5jdXJyU2l6ZSArIDEsCisJCQkJCQkJCSAg c2Nhbi0+eHNfYmF0Y2gubWF4U2l6ZSk7CisKKwkvKgorCSAqIENoZWNrIGlmIHdlIHN0aWxs IGhhdmUgc29tZSBpdGVtcyBvbiB0aGUgY3VycmVudCBsZWFmIHBhZ2UuIElmIHllcywKKwkg KiBsb2FkIHRoZW0gaW50byBhIGJhdGNoIGFuZCByZXR1cm4uCisJICoKKwkgKiBYWFggdHJ5 IGNvbWJpbmluZyB0aGF0IHdpdGggdGhlIG5leHQgYmxvY2ssIHRoZSBpbm5lciB3aGlsZSBs b29wIGlzCisJICogZXhhY3RseSB0aGUgc2FtZS4KKwkgKi8KKwlpZiAoU2NhbkRpcmVjdGlv bklzRm9yd2FyZChkaXIpKQorCXsKKwkJc3RhcnQgPSBzY2FuLT54c19iYXRjaC5sYXN0SW5k ZXggKyAxOworCQllbmQgPSBNaW4oc3RhcnQgKyAoc2Nhbi0+eHNfYmF0Y2guY3VyclNpemUg LSAxKSwgc28tPmN1cnJQb3MubGFzdEl0ZW0pOworCQlzby0+Y3VyclBvcy5pdGVtSW5kZXgg PSAoZW5kICsgMSk7CisJfQorCWVsc2UKKwl7CisJCWVuZCA9IHNjYW4tPnhzX2JhdGNoLmZp cnN0SW5kZXggLSAxOworCQlzdGFydCA9IE1heChlbmQgLSAoc2Nhbi0+eHNfYmF0Y2guY3Vy clNpemUgLSAxKSwKKwkJCQkJc28tPmN1cnJQb3MuZmlyc3RJdGVtKTsKKwkJc28tPmN1cnJQ b3MuaXRlbUluZGV4ID0gKHN0YXJ0IC0gMSk7CisJfQorCisJLyoKKwkgKiByZXNldCB0aGUg YmF0Y2ggYmVmb3JlIGxvYWRpbmcgbmV3IGRhdGEKKwkgKgorCSAqIFhYWCBuZWVkcyB0byBo YXBwZW4gYWZ0ZXIgd2UgY2FsY3VsYXRlIHRoZSBzdGFydC9lbmQgYWJvdmUsIGFzIGl0CisJ ICogcmVzZXRzIHNvbWUgb2YgdGhlIGZpZWxkcyBuZWVkZWQgYnkgdGhlIGNhbGN1bGF0aW9u LgorCSAqLworCWluZGV4X2JhdGNoX3Jlc2V0KHNjYW4sIGRpcik7CisKKwkvKgorCSAqIFdl IGhhdmUgbW9yZSBpdGVtcyBvbiB0aGUgY3VycmVudCBsZWFmIHBhZ2UuCisJICovCisJaWYg KHN0YXJ0IDw9IGVuZCkKKwl7CisJCS8qIHVwZGF0ZSB0aGUgIndpbmRvdyIgdGhlIGJhdGNo IHJlcHJlc2VudHMgKi8KKwkJc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRleCA9IHN0YXJ0Owor CQlzY2FuLT54c19iYXRjaC5sYXN0SW5kZXggPSBlbmQ7CisKKwkJLyogc2hvdWxkIGZpdCBp bnRvIHRoZSBjdXJyZW50IGJhdGNoICovCisJCUFzc2VydCgoZW5kIC0gc3RhcnQgKyAxKSA8 PSBzY2FuLT54c19iYXRjaC5jdXJyU2l6ZSk7CisKKwkJLyogc2hvdWxkIGJlIHZhbGlkIGl0 ZW1zICh3aXRoIHJlc3BlY3QgdG8gdGhlIGxlYWYgcGFnZSkgKi8KKwkJQXNzZXJ0KHNvLT5j dXJyUG9zLmZpcnN0SXRlbSA8PSBzY2FuLT54c19iYXRjaC5maXJzdEluZGV4KTsKKwkJQXNz ZXJ0KHNjYW4tPnhzX2JhdGNoLmZpcnN0SW5kZXggPD0gc2Nhbi0+eHNfYmF0Y2gubGFzdElu ZGV4KTsKKwkJQXNzZXJ0KHNjYW4tPnhzX2JhdGNoLmxhc3RJbmRleCA8PSBzby0+Y3VyclBv cy5sYXN0SXRlbSk7CisKKwkJLyoKKwkJICogV2FsayB0aHJvdWdoIHRoZSByYW5nZSBvZiBp bmRleCB0dXBsZXMsIGNvcHkgdGhlbSBpbnRvIHRoZSBiYXRjaC4KKwkJICogSWYgcmVxdWVz dGVkLCBzZXQgdGhlIGluZGV4IHR1cGxlIHRvby4KKwkJICoKKwkJICogV2UgZG9uJ3Qga25v dyBpZiB0aGUgYmF0Y2ggaXMgZnVsbCBhbHJlYWR5IC0gd2UganVzdCB0cnkgdG8gYWRkIGl0 LAorCQkgKiBhbmQgYmFpbCBvdXQgaWYgaXQgZmFpbHMuCisJCSAqCisJCSAqIEZJWE1FIFRo aXMgc2VlbXMgd3JvbmcsIGFjdHVhbGx5LiBXZSB1c2UgY3VyclNpemUgd2hlbiBjYWxjdWxh dGluZworCQkgKiB0aGUgc3RhcnQvZW5kIHJhbmdlLCBzbyB0aGUgYWRkIHNob3VsZCBhbHdh eXMgc3VjY2VlZC4KKwkJICovCisJCXdoaWxlIChzdGFydCA8PSBlbmQpCisJCXsKKwkJCUJU U2NhblBvc0l0ZW0gKmN1cnJJdGVtID0gJnNvLT5jdXJyUG9zLml0ZW1zW3N0YXJ0XTsKKwkJ CUluZGV4VHVwbGUJaXR1cCA9IE5VTEw7CisKKwkJCWlmIChzY2FuLT54c193YW50X2l0dXAp CisJCQkJaXR1cCA9IChJbmRleFR1cGxlKSAoc28tPmN1cnJUdXBsZXMgKyBjdXJySXRlbS0+ dHVwbGVPZmZzZXQpOworCisJCQkvKiB0cnkgdG8gYWRkIGl0IHRvIGJhdGNoLCBpZiB0aGVy ZSdzIHNwYWNlICovCisJCQlpZiAoIWluZGV4X2JhdGNoX2FkZChzY2FuLCBjdXJySXRlbS0+ aGVhcFRpZCwgaXR1cCkpCisJCQkJYnJlYWs7CisKKwkJCXN0YXJ0Kys7CisJCX0KKworCQkv KgorCQkgKiBzZXQgdGhlIHN0YXJ0aW5nIHBvaW50CisJCSAqCisJCSAqIFhYWCBtaWdodCBi ZSBiZXR0ZXIgZG9uZSBpbiBpbmRleGFtLmMKKwkJICovCisJCWlmIChTY2FuRGlyZWN0aW9u SXNGb3J3YXJkKGRpcikpCisJCQlzY2FuLT54c19iYXRjaC5jdXJySW5kZXggPSAtMTsKKwkJ ZWxzZQorCQkJc2Nhbi0+eHNfYmF0Y2guY3VyckluZGV4ID0gc2Nhbi0+eHNfYmF0Y2gubmhl YXB0aWRzOworCisJCS8qIHNob3VsZG4ndCBiZSBwb3NzaWJsZSB0byBlbmQgaGVyZSB3aXRo IGFuIGVtcHR5IGJhdGNoICovCisJCUFzc2VydChzY2FuLT54c19iYXRjaC5uaGVhcHRpZHMg PiAwKTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIFdlJ3ZlIGNvbnN1bWVk IGFsbCBpdGVtcyBmcm9tIHRoZSBjdXJyZW50IGxlYWYgcGFnZSwgc28gdHJ5IHJlYWRpbmcg dGhlCisJICogbmV4dCBvbmUsIGFuZCBwcm9jZXNzIGl0LgorCSAqLworCWlmIChfYnRfbmV4 dChzY2FuLCBkaXIpKQorCXsKKwkJLyoKKwkJICogQ2hlY2sgaWYgd2Ugc3RpbGwgaGF2ZSBz b21lIGl0ZW1zIG9uIHRoZSBjdXJyZW50IGxlYWYgcGFnZS4gSWYgeWVzLAorCQkgKiBsb2Fk IHRoZW0gaW50byBhIGJhdGNoIGFuZCByZXR1cm4uCisJCSAqCisJCSAqIFhYWCB0cnkgY29t YmluaW5nIHRoYXQgd2l0aCB0aGUgbmV4dCBibG9jaywgdGhlIGlubmVyIHdoaWxlIGxvb3Ag aXMKKwkJICogZXhhY3RseSB0aGUgc2FtZS4KKwkJICovCisJCWlmIChTY2FuRGlyZWN0aW9u SXNGb3J3YXJkKGRpcikpCisJCXsKKwkJCXN0YXJ0ID0gc28tPmN1cnJQb3MuZmlyc3RJdGVt OworCQkJZW5kID0gTWluKHN0YXJ0ICsgKHNjYW4tPnhzX2JhdGNoLmN1cnJTaXplIC0gMSks IHNvLT5jdXJyUG9zLmxhc3RJdGVtKTsKKwkJCXNvLT5jdXJyUG9zLml0ZW1JbmRleCA9IChl bmQgKyAxKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWVuZCA9IHNvLT5jdXJyUG9zLmxhc3RJ dGVtOworCQkJc3RhcnQgPSBNYXgoZW5kIC0gKHNjYW4tPnhzX2JhdGNoLmN1cnJTaXplIC0g MSksCisJCQkJCQlzby0+Y3VyclBvcy5maXJzdEl0ZW0pOworCQkJc28tPmN1cnJQb3MuaXRl bUluZGV4ID0gKHN0YXJ0IC0gMSk7CisJCX0KKworCQkvKiB1cGRhdGUgdGhlICJ3aW5kb3ci IHRoZSBiYXRjaCByZXByZXNlbnRzICovCisJCXNjYW4tPnhzX2JhdGNoLmZpcnN0SW5kZXgg PSBzdGFydDsKKwkJc2Nhbi0+eHNfYmF0Y2gubGFzdEluZGV4ID0gZW5kOworCisJCS8qIHNo b3VsZCBmaXQgaW50byB0aGUgY3VycmVudCBiYXRjaCAqLworCQlBc3NlcnQoKGVuZCAtIHN0 YXJ0ICsgMSkgPD0gc2Nhbi0+eHNfYmF0Y2guY3VyclNpemUpOworCisJCS8qIHNob3VsZCBi ZSB2YWxpZCBpdGVtcyAod2l0aCByZXNwZWN0IHRvIHRoZSBsZWFmIHBhZ2UpICovCisJCUFz c2VydChzby0+Y3VyclBvcy5maXJzdEl0ZW0gPD0gc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRl eCk7CisJCUFzc2VydChzY2FuLT54c19iYXRjaC5maXJzdEluZGV4IDw9IHNjYW4tPnhzX2Jh dGNoLmxhc3RJbmRleCk7CisJCUFzc2VydChzY2FuLT54c19iYXRjaC5sYXN0SW5kZXggPD0g c28tPmN1cnJQb3MubGFzdEl0ZW0pOworCisJCS8qCisJCSAqIFdhbGsgdGhyb3VnaCB0aGUg cmFuZ2Ugb2YgaW5kZXggdHVwbGVzLCBjb3B5IHRoZW0gaW50byB0aGUgYmF0Y2guCisJCSAq IElmIHJlcXVlc3RlZCwgc2V0IHRoZSBpbmRleCB0dXBsZSB0b28uCisJCSAqCisJCSAqIFdl IGRvbid0IGtub3cgaWYgdGhlIGJhdGNoIGlzIGZ1bGwgYWxyZWFkeSAtIHdlIGp1c3QgdHJ5 IHRvIGFkZCBpdCwKKwkJICogYW5kIGJhaWwgb3V0IGlmIGl0IGZhaWxzLgorCQkgKgorCQkg KiBGSVhNRSBUaGlzIHNlZW1zIHdyb25nLCBhY3R1YWxseS4gV2UgdXNlIGN1cnJTaXplIHdo ZW4gY2FsY3VsYXRpbmcKKwkJICogdGhlIHN0YXJ0L2VuZCByYW5nZSwgc28gdGhlIGFkZCBz aG91bGQgYWx3YXlzIHN1Y2NlZWQuCisJCSAqLworCQl3aGlsZSAoc3RhcnQgPD0gZW5kKQor CQl7CisJCQlCVFNjYW5Qb3NJdGVtICpjdXJySXRlbSA9ICZzby0+Y3VyclBvcy5pdGVtc1tz dGFydF07CisJCQlJbmRleFR1cGxlCWl0dXAgPSBOVUxMOworCisJCQlpZiAoc2Nhbi0+eHNf d2FudF9pdHVwKQorCQkJCWl0dXAgPSAoSW5kZXhUdXBsZSkgKHNvLT5jdXJyVHVwbGVzICsg Y3Vyckl0ZW0tPnR1cGxlT2Zmc2V0KTsKKworCQkJLyogdHJ5IHRvIGFkZCBpdCB0byBiYXRj aCwgaWYgdGhlcmUncyBzcGFjZSAqLworCQkJaWYgKCFpbmRleF9iYXRjaF9hZGQoc2Nhbiwg Y3Vyckl0ZW0tPmhlYXBUaWQsIGl0dXApKQorCQkJCWJyZWFrOworCisJCQlzdGFydCsrOwor CQl9CisKKwkJLyoKKwkJICogc2V0IHRoZSBzdGFydGluZyBwb2ludAorCQkgKgorCQkgKiBY WFggbWlnaHQgYmUgYmV0dGVyIGRvbmUgaW4gaW5kZXhhbS5jCisJCSAqLworCQlpZiAoU2Nh bkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJc2Nhbi0+eHNfYmF0Y2guY3VyckluZGV4 ID0gLTE7CisJCWVsc2UKKwkJCXNjYW4tPnhzX2JhdGNoLmN1cnJJbmRleCA9IHNjYW4tPnhz X2JhdGNoLm5oZWFwdGlkczsKKworCQkvKiBzaG91bGRuJ3QgYmUgcG9zc2libGUgdG8gZW5k IGhlcmUgd2l0aCBhbiBlbXB0eSBiYXRjaCAqLworCQlBc3NlcnQoc2Nhbi0+eHNfYmF0Y2gu bmhlYXB0aWRzID4gMCk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNl OworfQorCisvKgorICoJX2J0X2tpbGxfYmF0Y2goKSAtLSByZW1lbWJlciB0aGUgaXRlbXMt dG8tYmUta2lsbGVkIGZyb20gdGhlIGN1cnJlbnQgYmF0Y2gKKyAqCisgKiBXZSBzaW1wbHkg dHJhbnNsYXRlIHRoZSBiaXRtYXAgaW50byB0aGUgInJlZ3VsYXIiIGtpbGxlZEl0ZW1zIGFy cmF5LCBhbmQgbGV0CisgKiB0aGF0IHRvIGRyaXZlIHdoaWNoIGl0ZW1zIGFyZSBraWxsZWQu CisgKi8KK3ZvaWQKK19idF9raWxsX2JhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbikKK3sKKwlC VFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisKKwlmb3Ig KGludCBpID0gMDsgaSA8IHNjYW4tPnhzX2JhdGNoLm5oZWFwdGlkczsgaSsrKQorCXsKKwkJ LyogU2tpcCBiYXRjaCBpdGVtcyBub3QgbWFya2VkIGFzIGtpbGxlZC4gKi8KKwkJaWYgKCFz Y2FuLT54c19iYXRjaC5raWxsZWRJdGVtc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJ CSAqIFllcywgcmVtZW1iZXIgaXQgZm9yIGxhdGVyLiAoV2UnbGwgZGVhbCB3aXRoIGFsbCBz dWNoIHR1cGxlcyBhdAorCQkgKiBvbmNlIHJpZ2h0IGJlZm9yZSBsZWF2aW5nIHRoZSBpbmRl eCBwYWdlLikgIFRoZSB0ZXN0IGZvciBudW1LaWxsZWQKKwkJICogb3ZlcnJ1biBpcyBub3Qg anVzdCBwYXJhbm9pYTogaWYgdGhlIGNhbGxlciByZXZlcnNlcyBkaXJlY3Rpb24gaW4KKwkJ ICogdGhlIGluZGV4c2NhbiB0aGVuIHRoZSBzYW1lIGl0ZW0gbWlnaHQgZ2V0IGVudGVyZWQg bXVsdGlwbGUgdGltZXMuCisJCSAqIEl0J3Mgbm90IHdvcnRoIHRyeWluZyB0byBvcHRpbWl6 ZSB0aGF0LCBzbyB3ZSBkb24ndCBkZXRlY3QgaXQsIGJ1dAorCQkgKiBpbnN0ZWFkIGp1c3Qg Zm9yZ2V0IGFueSBleGNlc3MgZW50cmllcy4KKwkJICovCisJCWlmIChzby0+a2lsbGVkSXRl bXMgPT0gTlVMTCkKKwkJCXNvLT5raWxsZWRJdGVtcyA9IChpbnQgKikKKwkJCQlwYWxsb2Mo TWF4VElEc1BlckJUcmVlUGFnZSAqIHNpemVvZihpbnQpKTsKKwkJaWYgKHNvLT5udW1LaWxs ZWQgPCBNYXhUSURzUGVyQlRyZWVQYWdlKQorCQkJc28tPmtpbGxlZEl0ZW1zW3NvLT5udW1L aWxsZWQrK10gPSAoc2Nhbi0+eHNfYmF0Y2guZmlyc3RJbmRleCArIGkpOworCX0KK30KKwog LyoKICAqCV9idF9yZWFkcGFnZSgpIC0tIExvYWQgZGF0YSBmcm9tIGN1cnJlbnQgaW5kZXgg cGFnZSBpbnRvIHNvLT5jdXJyUG9zCiAgKgpAQCAtMjA0OCw2ICsyNDA4LDkgQEAgX2J0X3N0 ZXBwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAKIAlBc3Nl cnQoQlRTY2FuUG9zSXNWYWxpZChzby0+Y3VyclBvcykpOwogCisJLyogVHJhbnNmZXIga2ls bGVkIGl0ZW1zIGZyb20gdGhlIGJhdGNoIHRvIHRoZSByZWd1bGFyIGFycmF5LiAqLworCV9i dF9raWxsX2JhdGNoKHNjYW4pOworCiAJLyogQmVmb3JlIGxlYXZpbmcgY3VycmVudCBwYWdl LCBkZWFsIHdpdGggYW55IGtpbGxlZCBpdGVtcyAqLwogCWlmIChzby0+bnVtS2lsbGVkID4g MCkKIAkJX2J0X2tpbGxpdGVtcyhzY2FuKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4 ZWN1dG9yL25vZGVJbmRleG9ubHlzY2FuLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2Rl SW5kZXhvbmx5c2Nhbi5jCmluZGV4IDYxMmM2NzM4OTUwLi5iODgzZWZjN2ZhMCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4b25seXNjYW4uYworKysgYi9z cmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhvbmx5c2Nhbi5jCkBAIC00OSw3ICs0OSwx MyBAQAogc3RhdGljIFR1cGxlVGFibGVTbG90ICpJbmRleE9ubHlOZXh0KEluZGV4T25seVNj YW5TdGF0ZSAqbm9kZSk7CiBzdGF0aWMgdm9pZCBTdG9yZUluZGV4VHVwbGUoSW5kZXhPbmx5 U2NhblN0YXRlICpub2RlLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCwKIAkJCQkJCQlJbmRleFR1 cGxlIGl0dXAsIFR1cGxlRGVzYyBpdHVwZGVzYyk7CitzdGF0aWMgYm9vbCBpb3NfcHJlZmV0 Y2hfYmxvY2soSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcmVjdGlvbiwK KwkJCQkJCQkgICB2b2lkICpkYXRhLCBpbnQgaW5kZXgpOwogCisvKiB2YWx1ZXMgc3RvcmVk IGluIGlvc19wcmVmZXRjaF9ibG9jayBpbiB0aGUgYmF0Y2ggY2FjaGUgKi8KKyNkZWZpbmUJ CUlPU19VTktOT1dOX1ZJU0lCSUxJVFkJCTAJLyogWFhYIGRlZmF1bHQgdmFsdWUgKi8KKyNk ZWZpbmUJCUlPU19BTExfVklTSUJMRQkJCQkxCisjZGVmaW5lCQlJT1NfTk9UX0FMTF9WSVNJ QkxFCQkJMgogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKgkJSW5kZXhPbmx5TmV4dApAQCAtMTEyLDE0 MiArMTE4LDM2MyBAQCBJbmRleE9ubHlOZXh0KEluZGV4T25seVNjYW5TdGF0ZSAqbm9kZSkK IAkJCQkJCSBub2RlLT5pb3NzX051bVNjYW5LZXlzLAogCQkJCQkJIG5vZGUtPmlvc3NfT3Jk ZXJCeUtleXMsCiAJCQkJCQkgbm9kZS0+aW9zc19OdW1PcmRlckJ5S2V5cyk7CisKKwkJaW5k ZXhfYmF0Y2hfaW5pdChzY2FuZGVzYywgRm9yd2FyZFNjYW5EaXJlY3Rpb24pOwogCX0KIAog CS8qCi0JICogT0ssIG5vdyB0aGF0IHdlIGhhdmUgd2hhdCB3ZSBuZWVkLCBmZXRjaCB0aGUg bmV4dCB0dXBsZS4KKwkgKiBJZiB0aGUgYmF0Y2hpbmcgaXMgZGlzYWJsZWQgYnkgYSBHVUMs IG9yIGlmIGl0J3Mgbm90IHN1cHBvcnRlZCBieSB0aGUKKwkgKiBpbmRleCBBTSwgZG8gdGhl IG9yaWdpbmFsIGFwcHJvYWNoLgorCSAqCisJICogWFhYIE1heWJlIHdlIHNob3VsZCBlbmFi bGUgYmF0Y2hpbmcgYmFzZWQgb24gdGhlIHBsYW4gdG9vLCBzbyB0aGF0IHdlCisJICogZG9u J3QgZG8gYmF0Y2hpbmcgd2hlbiBpdCdzIHByb2JhYmx5IHVzZWxlc3MgKGUuZy4gc2VtaWpv aW5zIG9yIHF1ZXJpZXMKKwkgKiB3aXRoIExJTUlUIDEgZXRjLikuIEJ1dCBtYXliZSB0aGUg YXBwcm9hY2ggd2l0aCBzbG93IHJhbXAtdXAgKHN0YXJ0aW5nCisJICogd2l0aCBzbWFsbCBi YXRjaGVzKSB3aWxsIGhhbmRsZSB0aGF0IHdlbGwgZW5vdWdoLgorCSAqCisJICogWFhYIFBl cmhhcHMgaXQnZCBiZSBwb3NzaWJsZSB0byBkbyBib3RoIGluIGluZGV4X2dldG5leHRfc2xv dCgpLCBpLmUuCisJICogY2FsbCBlaXRoZXIgdGhlIG9yaWdpbmFsIGNvZGUgd2l0aG91dCBi YXRjaGluZywgb3IgdGhlIG5ldyBiYXRjaGluZworCSAqIGNvZGUgaWYgc3VwcG9ydGVkL2Vu YWJsZWQuIEl0J3Mgbm90IGdyZWF0IHRvIGhhdmUgZHVwbGljYXRlZCBjb2RlLgogCSAqLwot CXdoaWxlICgodGlkID0gaW5kZXhfZ2V0bmV4dF90aWQoc2NhbmRlc2MsIGRpcmVjdGlvbikp ICE9IE5VTEwpCisJaWYgKCEoZW5hYmxlX2luZGV4c2Nhbl9iYXRjaGluZyAmJgorCQkgIGlu ZGV4X2JhdGNoX3N1cHBvcnRlZChzY2FuZGVzYywgZGlyZWN0aW9uKSAmJgorCQkgIG5vZGUt Pmlvc3NfQ2FuQmF0Y2gpKQogCXsKLQkJYm9vbAkJdHVwbGVfZnJvbV9oZWFwID0gZmFsc2U7 Ci0KLQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKLQogCQkvKgotCQkgKiBXZSBjYW4gc2tp cCB0aGUgaGVhcCBmZXRjaCBpZiB0aGUgVElEIHJlZmVyZW5jZXMgYSBoZWFwIHBhZ2Ugb24K LQkJICogd2hpY2ggYWxsIHR1cGxlcyBhcmUga25vd24gdmlzaWJsZSB0byBldmVyeWJvZHku ICBJbiBhbnkgY2FzZSwKLQkJICogd2UnbGwgdXNlIHRoZSBpbmRleCB0dXBsZSBub3QgdGhl IGhlYXAgdHVwbGUgYXMgdGhlIGRhdGEgc291cmNlLgotCQkgKgotCQkgKiBOb3RlIG9uIE1l bW9yeSBPcmRlcmluZyBFZmZlY3RzOiB2aXNpYmlsaXR5bWFwX2dldF9zdGF0dXMgZG9lcyBu b3QKLQkJICogbG9jayB0aGUgdmlzaWJpbGl0eSBtYXAgYnVmZmVyLCBhbmQgdGhlcmVmb3Jl IHRoZSByZXN1bHQgd2UgcmVhZAotCQkgKiBoZXJlIGNvdWxkIGJlIHNsaWdodGx5IHN0YWxl LiAgSG93ZXZlciwgaXQgY2FuJ3QgYmUgc3RhbGUgZW5vdWdoIHRvCi0JCSAqIG1hdHRlci4K LQkJICoKLQkJICogV2UgbmVlZCB0byBkZXRlY3QgY2xlYXJpbmcgYSBWTSBiaXQgZHVlIHRv IGFuIGluc2VydCByaWdodCBhd2F5LAotCQkgKiBiZWNhdXNlIHRoZSB0dXBsZSBpcyBwcmVz ZW50IGluIHRoZSBpbmRleCBwYWdlIGJ1dCBub3QgdmlzaWJsZS4gVGhlCi0JCSAqIHJlYWRp bmcgb2YgdGhlIFRJRCBieSB0aGlzIHNjYW4gKHVzaW5nIGEgc2hhcmVkIGxvY2sgb24gdGhl IGluZGV4Ci0JCSAqIGJ1ZmZlcikgaXMgc2VyaWFsaXplZCB3aXRoIHRoZSBpbnNlcnQgb2Yg dGhlIFRJRCBpbnRvIHRoZSBpbmRleAotCQkgKiAodXNpbmcgYW4gZXhjbHVzaXZlIGxvY2sg b24gdGhlIGluZGV4IGJ1ZmZlcikuIEJlY2F1c2UgdGhlIFZNIGJpdAotCQkgKiBpcyBjbGVh cmVkIGJlZm9yZSB1cGRhdGluZyB0aGUgaW5kZXgsIGFuZCBsb2NraW5nL3VubG9ja2luZyBv ZiB0aGUKLQkJICogaW5kZXggcGFnZSBhY3RzIGFzIGEgZnVsbCBtZW1vcnkgYmFycmllciwg d2UgYXJlIHN1cmUgdG8gc2VlIHRoZQotCQkgKiBjbGVhcmVkIGJpdCBpZiB3ZSBzZWUgYSBy ZWNlbnRseS1pbnNlcnRlZCBUSUQuCi0JCSAqCi0JCSAqIERlbGV0ZXMgZG8gbm90IHVwZGF0 ZSB0aGUgaW5kZXggcGFnZSAob25seSBWQUNVVU0gd2lsbCBjbGVhciBvdXQKLQkJICogdGhl IFRJRCksIHNvIHRoZSBjbGVhcmluZyBvZiB0aGUgVk0gYml0IGJ5IGEgZGVsZXRlIGlzIG5v dAotCQkgKiBzZXJpYWxpemVkIHdpdGggdGhpcyB0ZXN0IGJlbG93LCBhbmQgd2UgbWF5IHNl ZSBhIHZhbHVlIHRoYXQgaXMKLQkJICogc2lnbmlmaWNhbnRseSBzdGFsZS4gSG93ZXZlciwg d2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgZGVsZXRlIHJpZ2h0Ci0JCSAqIGF3YXksIGJlY2F1 c2UgdGhlIHR1cGxlIGlzIHN0aWxsIHZpc2libGUgdW50aWwgdGhlIGRlbGV0aW5nCi0JCSAq IHRyYW5zYWN0aW9uIGNvbW1pdHMgb3IgdGhlIHN0YXRlbWVudCBlbmRzIChpZiBpdCdzIG91 cgotCQkgKiB0cmFuc2FjdGlvbikuIEluIGVpdGhlciBjYXNlLCB0aGUgbG9jayBvbiB0aGUg Vk0gYnVmZmVyIHdpbGwgaGF2ZQotCQkgKiBiZWVuIHJlbGVhc2VkIChhY3RpbmcgYXMgYSB3 cml0ZSBiYXJyaWVyKSBhZnRlciBjbGVhcmluZyB0aGUgYml0LgotCQkgKiBBbmQgZm9yIHVz IHRvIGhhdmUgYSBzbmFwc2hvdCB0aGF0IGluY2x1ZGVzIHRoZSBkZWxldGluZwotCQkgKiB0 cmFuc2FjdGlvbiAobWFraW5nIHRoZSB0dXBsZSBpbnZpc2libGUpLCB3ZSBtdXN0IGhhdmUg YWNxdWlyZWQKLQkJICogUHJvY0FycmF5TG9jayBhZnRlciB0aGF0IHRpbWUsIGFjdGluZyBh cyBhIHJlYWQgYmFycmllci4KLQkJICoKLQkJICogSXQncyB3b3J0aCBnb2luZyB0aHJvdWdo IHRoaXMgY29tcGxleGl0eSB0byBhdm9pZCBuZWVkaW5nIHRvIGxvY2sKLQkJICogdGhlIFZN IGJ1ZmZlciwgd2hpY2ggY291bGQgY2F1c2Ugc2lnbmlmaWNhbnQgY29udGVudGlvbi4KKwkJ ICogT0ssIG5vdyB0aGF0IHdlIGhhdmUgd2hhdCB3ZSBuZWVkLCBmZXRjaCB0aGUgbmV4dCB0 dXBsZS4KIAkJICovCi0JCWlmICghVk1fQUxMX1ZJU0lCTEUoc2NhbmRlc2MtPmhlYXBSZWxh dGlvbiwKLQkJCQkJCQlJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCksCi0JCQkJCQkJ Jm5vZGUtPmlvc3NfVk1CdWZmZXIpKQorCQl3aGlsZSAoKHRpZCA9IGluZGV4X2dldG5leHRf dGlkKHNjYW5kZXNjLCBkaXJlY3Rpb24pKSAhPSBOVUxMKQogCQl7CisJCQlib29sCQl0dXBs ZV9mcm9tX2hlYXAgPSBmYWxzZTsKKworCQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKwog CQkJLyoKLQkJCSAqIFJhdHMsIHdlIGhhdmUgdG8gdmlzaXQgdGhlIGhlYXAgdG8gY2hlY2sg dmlzaWJpbGl0eS4KKwkJCSAqIFdlIGNhbiBza2lwIHRoZSBoZWFwIGZldGNoIGlmIHRoZSBU SUQgcmVmZXJlbmNlcyBhIGhlYXAgcGFnZSBvbgorCQkJICogd2hpY2ggYWxsIHR1cGxlcyBh cmUga25vd24gdmlzaWJsZSB0byBldmVyeWJvZHkuICBJbiBhbnkgY2FzZSwKKwkJCSAqIHdl J2xsIHVzZSB0aGUgaW5kZXggdHVwbGUgbm90IHRoZSBoZWFwIHR1cGxlIGFzIHRoZSBkYXRh CisJCQkgKiBzb3VyY2UuCisJCQkgKgorCQkJICogTm90ZSBvbiBNZW1vcnkgT3JkZXJpbmcg RWZmZWN0czogdmlzaWJpbGl0eW1hcF9nZXRfc3RhdHVzIGRvZXMKKwkJCSAqIG5vdCBsb2Nr IHRoZSB2aXNpYmlsaXR5IG1hcCBidWZmZXIsIGFuZCB0aGVyZWZvcmUgdGhlIHJlc3VsdCB3 ZQorCQkJICogcmVhZCBoZXJlIGNvdWxkIGJlIHNsaWdodGx5IHN0YWxlLiAgSG93ZXZlciwg aXQgY2FuJ3QgYmUgc3RhbGUKKwkJCSAqIGVub3VnaCB0byBtYXR0ZXIuCisJCQkgKgorCQkJ ICogV2UgbmVlZCB0byBkZXRlY3QgY2xlYXJpbmcgYSBWTSBiaXQgZHVlIHRvIGFuIGluc2Vy dCByaWdodAorCQkJICogYXdheSwgYmVjYXVzZSB0aGUgdHVwbGUgaXMgcHJlc2VudCBpbiB0 aGUgaW5kZXggcGFnZSBidXQgbm90CisJCQkgKiB2aXNpYmxlLiBUaGUgcmVhZGluZyBvZiB0 aGUgVElEIGJ5IHRoaXMgc2NhbiAodXNpbmcgYSBzaGFyZWQKKwkJCSAqIGxvY2sgb24gdGhl IGluZGV4IGJ1ZmZlcikgaXMgc2VyaWFsaXplZCB3aXRoIHRoZSBpbnNlcnQgb2YgdGhlCisJ CQkgKiBUSUQgaW50byB0aGUgaW5kZXggKHVzaW5nIGFuIGV4Y2x1c2l2ZSBsb2NrIG9uIHRo ZSBpbmRleAorCQkJICogYnVmZmVyKS4gQmVjYXVzZSB0aGUgVk0gYml0IGlzIGNsZWFyZWQg YmVmb3JlIHVwZGF0aW5nIHRoZQorCQkJICogaW5kZXgsIGFuZCBsb2NraW5nL3VubG9ja2lu ZyBvZiB0aGUgaW5kZXggcGFnZSBhY3RzIGFzIGEgZnVsbAorCQkJICogbWVtb3J5IGJhcnJp ZXIsIHdlIGFyZSBzdXJlIHRvIHNlZSB0aGUgY2xlYXJlZCBiaXQgaWYgd2Ugc2VlIGEKKwkJ CSAqIHJlY2VudGx5LWluc2VydGVkIFRJRC4KKwkJCSAqCisJCQkgKiBEZWxldGVzIGRvIG5v dCB1cGRhdGUgdGhlIGluZGV4IHBhZ2UgKG9ubHkgVkFDVVVNIHdpbGwgY2xlYXIKKwkJCSAq IG91dCB0aGUgVElEKSwgc28gdGhlIGNsZWFyaW5nIG9mIHRoZSBWTSBiaXQgYnkgYSBkZWxl dGUgaXMgbm90CisJCQkgKiBzZXJpYWxpemVkIHdpdGggdGhpcyB0ZXN0IGJlbG93LCBhbmQg d2UgbWF5IHNlZSBhIHZhbHVlIHRoYXQgaXMKKwkJCSAqIHNpZ25pZmljYW50bHkgc3RhbGUu IEhvd2V2ZXIsIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIGRlbGV0ZQorCQkJICogcmlnaHQg YXdheSwgYmVjYXVzZSB0aGUgdHVwbGUgaXMgc3RpbGwgdmlzaWJsZSB1bnRpbCB0aGUKKwkJ CSAqIGRlbGV0aW5nIHRyYW5zYWN0aW9uIGNvbW1pdHMgb3IgdGhlIHN0YXRlbWVudCBlbmRz IChpZiBpdCdzIG91cgorCQkJICogdHJhbnNhY3Rpb24pLiBJbiBlaXRoZXIgY2FzZSwgdGhl IGxvY2sgb24gdGhlIFZNIGJ1ZmZlciB3aWxsCisJCQkgKiBoYXZlIGJlZW4gcmVsZWFzZWQg KGFjdGluZyBhcyBhIHdyaXRlIGJhcnJpZXIpIGFmdGVyIGNsZWFyaW5nCisJCQkgKiB0aGUg Yml0LiBBbmQgZm9yIHVzIHRvIGhhdmUgYSBzbmFwc2hvdCB0aGF0IGluY2x1ZGVzIHRoZQor CQkJICogZGVsZXRpbmcgdHJhbnNhY3Rpb24gKG1ha2luZyB0aGUgdHVwbGUgaW52aXNpYmxl KSwgd2UgbXVzdCBoYXZlCisJCQkgKiBhY3F1aXJlZCBQcm9jQXJyYXlMb2NrIGFmdGVyIHRo YXQgdGltZSwgYWN0aW5nIGFzIGEgcmVhZAorCQkJICogYmFycmllci4KKwkJCSAqCisJCQkg KiBJdCdzIHdvcnRoIGdvaW5nIHRocm91Z2ggdGhpcyBjb21wbGV4aXR5IHRvIGF2b2lkIG5l ZWRpbmcgdG8KKwkJCSAqIGxvY2sgdGhlIFZNIGJ1ZmZlciwgd2hpY2ggY291bGQgY2F1c2Ug c2lnbmlmaWNhbnQgY29udGVudGlvbi4KIAkJCSAqLwotCQkJSW5zdHJDb3VudFR1cGxlczIo bm9kZSwgMSk7Ci0JCQlpZiAoIWluZGV4X2ZldGNoX2hlYXAoc2NhbmRlc2MsIG5vZGUtPmlv c3NfVGFibGVTbG90KSkKLQkJCQljb250aW51ZTsJCS8qIG5vIHZpc2libGUgdHVwbGUsIHRy eSBuZXh0IGluZGV4IGVudHJ5ICovCisJCQlpZiAoIVZNX0FMTF9WSVNJQkxFKHNjYW5kZXNj LT5oZWFwUmVsYXRpb24sCisJCQkJCQkJCUl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlk KSwKKwkJCQkJCQkJJm5vZGUtPmlvc3NfVk1CdWZmZXIpKQorCQkJeworCQkJCS8qCisJCQkJ ICogUmF0cywgd2UgaGF2ZSB0byB2aXNpdCB0aGUgaGVhcCB0byBjaGVjayB2aXNpYmlsaXR5 LgorCQkJCSAqLworCQkJCUluc3RyQ291bnRUdXBsZXMyKG5vZGUsIDEpOworCQkJCWlmICgh aW5kZXhfZmV0Y2hfaGVhcChzY2FuZGVzYywgbm9kZS0+aW9zc19UYWJsZVNsb3QpKQorCQkJ CQljb250aW51ZTsJLyogbm8gdmlzaWJsZSB0dXBsZSwgdHJ5IG5leHQgaW5kZXggZW50cnkg Ki8KKworCQkJCUV4ZWNDbGVhclR1cGxlKG5vZGUtPmlvc3NfVGFibGVTbG90KTsKKworCQkJ CS8qCisJCQkJICogT25seSBNVkNDIHNuYXBzaG90cyBhcmUgc3VwcG9ydGVkIGhlcmUsIHNv IHRoZXJlIHNob3VsZCBiZQorCQkJCSAqIG5vIG5lZWQgdG8ga2VlcCBmb2xsb3dpbmcgdGhl IEhPVCBjaGFpbiBvbmNlIGEgdmlzaWJsZQorCQkJCSAqIGVudHJ5IGhhcyBiZWVuIGZvdW5k LiAgSWYgd2UgZGlkIHdhbnQgdG8gYWxsb3cgdGhhdCwgd2UnZAorCQkJCSAqIG5lZWQgdG8g a2VlcCBtb3JlIHN0YXRlIHRvIHJlbWVtYmVyIG5vdCB0byBjYWxsCisJCQkJICogaW5kZXhf Z2V0bmV4dF90aWQgbmV4dCB0aW1lLgorCQkJCSAqLworCQkJCWlmIChzY2FuZGVzYy0+eHNf aGVhcF9jb250aW51ZSkKKwkJCQkJZWxvZyhFUlJPUiwgIm5vbi1NVkNDIHNuYXBzaG90cyBh cmUgbm90IHN1cHBvcnRlZCBpbiBpbmRleC1vbmx5IHNjYW5zIik7CisKKwkJCQkvKgorCQkJ CSAqIE5vdGU6IGF0IHRoaXMgcG9pbnQgd2UgYXJlIGhvbGRpbmcgYSBwaW4gb24gdGhlIGhl YXAgcGFnZSwKKwkJCQkgKiBhcyByZWNvcmRlZCBpbiBzY2FuZGVzYy0+eHNfY2J1Zi4gIFdl IGNvdWxkIHJlbGVhc2UgdGhhdAorCQkJCSAqIHBpbiBub3csIGJ1dCBpdCdzIG5vdCBjbGVh ciB3aGV0aGVyIGl0J3MgYSB3aW4gdG8gZG8gc28uCisJCQkJICogVGhlIG5leHQgaW5kZXgg ZW50cnkgbWlnaHQgcmVxdWlyZSBhIHZpc2l0IHRvIHRoZSBzYW1lIGhlYXAKKwkJCQkgKiBw YWdlLgorCQkJCSAqLworCisJCQkJdHVwbGVfZnJvbV9oZWFwID0gdHJ1ZTsKKwkJCX0KIAot CQkJRXhlY0NsZWFyVHVwbGUobm9kZS0+aW9zc19UYWJsZVNsb3QpOworCQkJLyoKKwkJCSAq IEZpbGwgdGhlIHNjYW4gdHVwbGUgc2xvdCB3aXRoIGRhdGEgZnJvbSB0aGUgaW5kZXguICBU aGlzIG1pZ2h0CisJCQkgKiBiZSBwcm92aWRlZCBpbiBlaXRoZXIgSGVhcFR1cGxlIG9yIElu ZGV4VHVwbGUgZm9ybWF0LgorCQkJICogQ29uY2VpdmFibHkgYW4gaW5kZXggQU0gbWlnaHQg ZmlsbCBib3RoIGZpZWxkcywgaW4gd2hpY2ggY2FzZQorCQkJICogd2UgcHJlZmVyIHRoZSBo ZWFwIGZvcm1hdCwgc2luY2UgaXQncyBwcm9iYWJseSBhIGJpdCBjaGVhcGVyIHRvCisJCQkg KiBmaWxsIGEgc2xvdCBmcm9tLgorCQkJICovCisJCQlpZiAoc2NhbmRlc2MtPnhzX2hpdHVw KQorCQkJeworCQkJCS8qCisJCQkJICogV2UgZG9uJ3QgdGFrZSB0aGUgdHJvdWJsZSB0byB2 ZXJpZnkgdGhhdCB0aGUgcHJvdmlkZWQgdHVwbGUKKwkJCQkgKiBoYXMgZXhhY3RseSB0aGUg c2xvdCdzIGZvcm1hdCwgYnV0IGl0IHNlZW1zIHdvcnRoIGRvaW5nIGEKKwkJCQkgKiBxdWlj ayBjaGVjayBvbiB0aGUgbnVtYmVyIG9mIGZpZWxkcy4KKwkJCQkgKi8KKwkJCQlBc3NlcnQo c2xvdC0+dHRzX3R1cGxlRGVzY3JpcHRvci0+bmF0dHMgPT0KKwkJCQkJICAgc2NhbmRlc2Mt PnhzX2hpdHVwZGVzYy0+bmF0dHMpOworCQkJCUV4ZWNGb3JjZVN0b3JlSGVhcFR1cGxlKHNj YW5kZXNjLT54c19oaXR1cCwgc2xvdCwgZmFsc2UpOworCQkJfQorCQkJZWxzZSBpZiAoc2Nh bmRlc2MtPnhzX2l0dXApCisJCQkJU3RvcmVJbmRleFR1cGxlKG5vZGUsIHNsb3QsIHNjYW5k ZXNjLT54c19pdHVwLCBzY2FuZGVzYy0+eHNfaXR1cGRlc2MpOworCQkJZWxzZQorCQkJCWVs b2coRVJST1IsICJubyBkYXRhIHJldHVybmVkIGZvciBpbmRleC1vbmx5IHNjYW4iKTsKIAog CQkJLyoKLQkJCSAqIE9ubHkgTVZDQyBzbmFwc2hvdHMgYXJlIHN1cHBvcnRlZCBoZXJlLCBz byB0aGVyZSBzaG91bGQgYmUgbm8KLQkJCSAqIG5lZWQgdG8ga2VlcCBmb2xsb3dpbmcgdGhl IEhPVCBjaGFpbiBvbmNlIGEgdmlzaWJsZSBlbnRyeSBoYXMKLQkJCSAqIGJlZW4gZm91bmQu ICBJZiB3ZSBkaWQgd2FudCB0byBhbGxvdyB0aGF0LCB3ZSdkIG5lZWQgdG8ga2VlcAotCQkJ ICogbW9yZSBzdGF0ZSB0byByZW1lbWJlciBub3QgdG8gY2FsbCBpbmRleF9nZXRuZXh0X3Rp ZCBuZXh0IHRpbWUuCisJCQkgKiBJZiB0aGUgaW5kZXggd2FzIGxvc3N5LCB3ZSBoYXZlIHRv IHJlY2hlY2sgdGhlIGluZGV4IHF1YWxzLgogCQkJICovCi0JCQlpZiAoc2NhbmRlc2MtPnhz X2hlYXBfY29udGludWUpCi0JCQkJZWxvZyhFUlJPUiwgIm5vbi1NVkNDIHNuYXBzaG90cyBh cmUgbm90IHN1cHBvcnRlZCBpbiBpbmRleC1vbmx5IHNjYW5zIik7CisJCQlpZiAoc2NhbmRl c2MtPnhzX3JlY2hlY2spCisJCQl7CisJCQkJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0g c2xvdDsKKwkJCQlpZiAoIUV4ZWNRdWFsQW5kUmVzZXQobm9kZS0+cmVjaGVja3F1YWwsIGVj b250ZXh0KSkKKwkJCQl7CisJCQkJCS8qIEZhaWxzIHJlY2hlY2ssIHNvIGRyb3AgaXQgYW5k IGxvb3AgYmFjayBmb3IgYW5vdGhlciAqLworCQkJCQlJbnN0ckNvdW50RmlsdGVyZWQyKG5v ZGUsIDEpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CiAKIAkJCS8qCi0JCQkgKiBO b3RlOiBhdCB0aGlzIHBvaW50IHdlIGFyZSBob2xkaW5nIGEgcGluIG9uIHRoZSBoZWFwIHBh Z2UsIGFzCi0JCQkgKiByZWNvcmRlZCBpbiBzY2FuZGVzYy0+eHNfY2J1Zi4gIFdlIGNvdWxk IHJlbGVhc2UgdGhhdCBwaW4gbm93LAotCQkJICogYnV0IGl0J3Mgbm90IGNsZWFyIHdoZXRo ZXIgaXQncyBhIHdpbiB0byBkbyBzby4gIFRoZSBuZXh0IGluZGV4Ci0JCQkgKiBlbnRyeSBt aWdodCByZXF1aXJlIGEgdmlzaXQgdG8gdGhlIHNhbWUgaGVhcCBwYWdlLgorCQkJICogV2Ug ZG9uJ3QgY3VycmVudGx5IHN1cHBvcnQgcmVjaGVja2luZyBPUkRFUiBCWSBkaXN0YW5jZXMu ICAoSW4KKwkJCSAqIHByaW5jaXBsZSwgaWYgdGhlIGluZGV4IGNhbiBzdXBwb3J0IHJldHJp ZXZhbCBvZiB0aGUgb3JpZ2luYWxseQorCQkJICogaW5kZXhlZCB2YWx1ZSwgaXQgc2hvdWxk IGJlIGFibGUgdG8gcHJvZHVjZSBhbiBleGFjdCBkaXN0YW5jZQorCQkJICogY2FsY3VsYXRp b24gdG9vLiAgU28gaXQncyBub3QgY2xlYXIgdGhhdCBhZGRpbmcgY29kZSBoZXJlIGZvcgor CQkJICogcmVjaGVjay9yZS1zb3J0IHdvdWxkIGJlIHdvcnRoIHRoZSB0cm91YmxlLiAgQnV0 IHdlIHNob3VsZCBhdAorCQkJICogbGVhc3QgdGhyb3cgYW4gZXJyb3IgaWYgc29tZW9uZSB0 cmllcyBpdC4pCiAJCQkgKi8KKwkJCWlmIChzY2FuZGVzYy0+bnVtYmVyT2ZPcmRlckJ5cyA+ IDAgJiYgc2NhbmRlc2MtPnhzX3JlY2hlY2tvcmRlcmJ5KQorCQkJCWVyZXBvcnQoRVJST1Is CisJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJ CQkgZXJybXNnKCJsb3NzeSBkaXN0YW5jZSBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQg aW4gaW5kZXgtb25seSBzY2FucyIpKSk7CiAKLQkJCXR1cGxlX2Zyb21faGVhcCA9IHRydWU7 Ci0JCX0KKwkJCS8qCisJCQkgKiBJZiB3ZSBkaWRuJ3QgYWNjZXNzIHRoZSBoZWFwLCB0aGVu IHdlJ2xsIG5lZWQgdG8gdGFrZSBhCisJCQkgKiBwcmVkaWNhdGUgbG9jayBleHBsaWNpdGx5 LCBhcyBpZiB3ZSBoYWQuICBGb3Igbm93IHdlIGRvIHRoYXQgYXQKKwkJCSAqIHBhZ2UgbGV2 ZWwuCisJCQkgKi8KKwkJCWlmICghdHVwbGVfZnJvbV9oZWFwKQorCQkJCVByZWRpY2F0ZUxv Y2tQYWdlKHNjYW5kZXNjLT5oZWFwUmVsYXRpb24sCisJCQkJCQkJCSAgSXRlbVBvaW50ZXJH ZXRCbG9ja051bWJlcih0aWQpLAorCQkJCQkJCQkgIGVzdGF0ZS0+ZXNfc25hcHNob3QpOwog Ci0JCS8qCi0JCSAqIEZpbGwgdGhlIHNjYW4gdHVwbGUgc2xvdCB3aXRoIGRhdGEgZnJvbSB0 aGUgaW5kZXguICBUaGlzIG1pZ2h0IGJlCi0JCSAqIHByb3ZpZGVkIGluIGVpdGhlciBIZWFw VHVwbGUgb3IgSW5kZXhUdXBsZSBmb3JtYXQuICBDb25jZWl2YWJseSBhbgotCQkgKiBpbmRl eCBBTSBtaWdodCBmaWxsIGJvdGggZmllbGRzLCBpbiB3aGljaCBjYXNlIHdlIHByZWZlciB0 aGUgaGVhcAotCQkgKiBmb3JtYXQsIHNpbmNlIGl0J3MgcHJvYmFibHkgYSBiaXQgY2hlYXBl ciB0byBmaWxsIGEgc2xvdCBmcm9tLgotCQkgKi8KLQkJaWYgKHNjYW5kZXNjLT54c19oaXR1 cCkKKwkJCXJldHVybiBzbG90OworCQl9CisJfQorCWVsc2UKKwl7CituZXdfYmF0Y2g6CisJ CS8qIGRvIHdlIGhhdmUgVElEcyBpbiB0aGUgY3VycmVudCBiYXRjaCAqLworCQl3aGlsZSAo KHRpZCA9IGluZGV4X2JhdGNoX2dldG5leHRfdGlkKHNjYW5kZXNjLCBkaXJlY3Rpb24pKSAh PSBOVUxMKQogCQl7CisJCQlib29sCQlhbGxfdmlzaWJsZTsKKwkJCWJvb2wJCXR1cGxlX2Zy b21faGVhcCA9IGZhbHNlOworCisJCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOworCisJCQkv KiBJcyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgaXRlbSB2YWxpZCBmb3IgdGhlIGJhdGNo PyAqLworCQkJQXNzZXJ0KChzY2FuZGVzYy0+eHNfYmF0Y2guY3VyckluZGV4ID49IDApICYm CisJCQkJICAgKHNjYW5kZXNjLT54c19iYXRjaC5jdXJySW5kZXggPCBzY2FuZGVzYy0+eHNf YmF0Y2gubmhlYXB0aWRzKSk7CisKKwkJCS8qIFByZWZldGNoIHNvbWUgb2YgdGhlIGZvbGxv d2luZyBpdGVtcyBpbiB0aGUgYmF0Y2guICovCisJCQlpbmRleF9iYXRjaF9wcmVmZXRjaChz Y2FuZGVzYywgZGlyZWN0aW9uLCBpb3NfcHJlZmV0Y2hfYmxvY2ssIG5vZGUpOworCiAJCQkv KgotCQkJICogV2UgZG9uJ3QgdGFrZSB0aGUgdHJvdWJsZSB0byB2ZXJpZnkgdGhhdCB0aGUg cHJvdmlkZWQgdHVwbGUgaGFzCi0JCQkgKiBleGFjdGx5IHRoZSBzbG90J3MgZm9ybWF0LCBi dXQgaXQgc2VlbXMgd29ydGggZG9pbmcgYSBxdWljawotCQkJICogY2hlY2sgb24gdGhlIG51 bWJlciBvZiBmaWVsZHMuCisJCQkgKiBSZXVzZSB0aGUgcHJldmlvdXNseSBkZXRlcm1pbmVk IHBhZ2UgdmlzaWJpbGl0eSBpbmZvLCBvcgorCQkJICogY2FsY3VsYXRlIGl0IG5vdy4gSWYg d2UgZGVjaWRlZCBub3QgdG8gcHJlZmV0Y2ggdGhlIGJsb2NrLCB0aGUKKwkJCSAqIHBhZ2Ug aGFzIHRvIGJlIGFsbC12aXNpYmxlLgorCQkJICoKKwkJCSAqIFhYWCBJdCdzIGEgYmlyIHdl aXJkIHdlIHVzZSB0aGUgdmlzaWJpbGl0eSB0byBkZWNpZGUgaWYgd2UKKwkJCSAqIHNob3Vs ZCBza2lwIHByZWZldGNoaW5nIHRoZSBibG9jaywgYW5kIHRoZW4gZGVkdWNlIHRoZQorCQkJ ICogdmlzaWJpbGl0eSBmcm9tIHRoYXQuIE1heWJlIHdlIGNvdWxkL3Nob3VsZCBoYXZlIGEg bW9yZSBkaXJlY3QKKwkJCSAqIHdheT8KIAkJCSAqLwotCQkJQXNzZXJ0KHNsb3QtPnR0c190 dXBsZURlc2NyaXB0b3ItPm5hdHRzID09Ci0JCQkJICAgc2NhbmRlc2MtPnhzX2hpdHVwZGVz Yy0+bmF0dHMpOwotCQkJRXhlY0ZvcmNlU3RvcmVIZWFwVHVwbGUoc2NhbmRlc2MtPnhzX2hp dHVwLCBzbG90LCBmYWxzZSk7Ci0JCX0KLQkJZWxzZSBpZiAoc2NhbmRlc2MtPnhzX2l0dXAp Ci0JCQlTdG9yZUluZGV4VHVwbGUobm9kZSwgc2xvdCwgc2NhbmRlc2MtPnhzX2l0dXAsIHNj YW5kZXNjLT54c19pdHVwZGVzYyk7Ci0JCWVsc2UKLQkJCWVsb2coRVJST1IsICJubyBkYXRh IHJldHVybmVkIGZvciBpbmRleC1vbmx5IHNjYW4iKTsKKwkJCWFsbF92aXNpYmxlID0gIWlv c19wcmVmZXRjaF9ibG9jayhzY2FuZGVzYywgZGlyZWN0aW9uLCBub2RlLAorCQkJCQkJCQkJ CQkgIHNjYW5kZXNjLT54c19iYXRjaC5jdXJySW5kZXgpOwogCi0JCS8qCi0JCSAqIElmIHRo ZSBpbmRleCB3YXMgbG9zc3ksIHdlIGhhdmUgdG8gcmVjaGVjayB0aGUgaW5kZXggcXVhbHMu Ci0JCSAqLwotCQlpZiAoc2NhbmRlc2MtPnhzX3JlY2hlY2spCi0JCXsKLQkJCWVjb250ZXh0 LT5lY3h0X3NjYW50dXBsZSA9IHNsb3Q7Ci0JCQlpZiAoIUV4ZWNRdWFsQW5kUmVzZXQobm9k ZS0+cmVjaGVja3F1YWwsIGVjb250ZXh0KSkKKwkJCS8qCisJCQkgKiBXZSBjYW4gc2tpcCB0 aGUgaGVhcCBmZXRjaCBpZiB0aGUgVElEIHJlZmVyZW5jZXMgYSBoZWFwIHBhZ2Ugb24KKwkJ CSAqIHdoaWNoIGFsbCB0dXBsZXMgYXJlIGtub3duIHZpc2libGUgdG8gZXZlcnlib2R5LiAg SW4gYW55IGNhc2UsCisJCQkgKiB3ZSdsbCB1c2UgdGhlIGluZGV4IHR1cGxlIG5vdCB0aGUg aGVhcCB0dXBsZSBhcyB0aGUgZGF0YQorCQkJICogc291cmNlLgorCQkJICoKKwkJCSAqIE5v dGUgb24gTWVtb3J5IE9yZGVyaW5nIEVmZmVjdHM6IHZpc2liaWxpdHltYXBfZ2V0X3N0YXR1 cyBkb2VzCisJCQkgKiBub3QgbG9jayB0aGUgdmlzaWJpbGl0eSBtYXAgYnVmZmVyLCBhbmQg dGhlcmVmb3JlIHRoZSByZXN1bHQgd2UKKwkJCSAqIHJlYWQgaGVyZSBjb3VsZCBiZSBzbGln aHRseSBzdGFsZS4gIEhvd2V2ZXIsIGl0IGNhbid0IGJlIHN0YWxlCisJCQkgKiBlbm91Z2gg dG8gbWF0dGVyLgorCQkJICoKKwkJCSAqIFdlIG5lZWQgdG8gZGV0ZWN0IGNsZWFyaW5nIGEg Vk0gYml0IGR1ZSB0byBhbiBpbnNlcnQgcmlnaHQKKwkJCSAqIGF3YXksIGJlY2F1c2UgdGhl IHR1cGxlIGlzIHByZXNlbnQgaW4gdGhlIGluZGV4IHBhZ2UgYnV0IG5vdAorCQkJICogdmlz aWJsZS4gVGhlIHJlYWRpbmcgb2YgdGhlIFRJRCBieSB0aGlzIHNjYW4gKHVzaW5nIGEgc2hh cmVkCisJCQkgKiBsb2NrIG9uIHRoZSBpbmRleCBidWZmZXIpIGlzIHNlcmlhbGl6ZWQgd2l0 aCB0aGUgaW5zZXJ0IG9mIHRoZQorCQkJICogVElEIGludG8gdGhlIGluZGV4ICh1c2luZyBh biBleGNsdXNpdmUgbG9jayBvbiB0aGUgaW5kZXgKKwkJCSAqIGJ1ZmZlcikuIEJlY2F1c2Ug dGhlIFZNIGJpdCBpcyBjbGVhcmVkIGJlZm9yZSB1cGRhdGluZyB0aGUKKwkJCSAqIGluZGV4 LCBhbmQgbG9ja2luZy91bmxvY2tpbmcgb2YgdGhlIGluZGV4IHBhZ2UgYWN0cyBhcyBhIGZ1 bGwKKwkJCSAqIG1lbW9yeSBiYXJyaWVyLCB3ZSBhcmUgc3VyZSB0byBzZWUgdGhlIGNsZWFy ZWQgYml0IGlmIHdlIHNlZSBhCisJCQkgKiByZWNlbnRseS1pbnNlcnRlZCBUSUQuCisJCQkg KgorCQkJICogRGVsZXRlcyBkbyBub3QgdXBkYXRlIHRoZSBpbmRleCBwYWdlIChvbmx5IFZB Q1VVTSB3aWxsIGNsZWFyCisJCQkgKiBvdXQgdGhlIFRJRCksIHNvIHRoZSBjbGVhcmluZyBv ZiB0aGUgVk0gYml0IGJ5IGEgZGVsZXRlIGlzIG5vdAorCQkJICogc2VyaWFsaXplZCB3aXRo IHRoaXMgdGVzdCBiZWxvdywgYW5kIHdlIG1heSBzZWUgYSB2YWx1ZSB0aGF0IGlzCisJCQkg KiBzaWduaWZpY2FudGx5IHN0YWxlLiBIb3dldmVyLCB3ZSBkb24ndCBjYXJlIGFib3V0IHRo ZSBkZWxldGUKKwkJCSAqIHJpZ2h0IGF3YXksIGJlY2F1c2UgdGhlIHR1cGxlIGlzIHN0aWxs IHZpc2libGUgdW50aWwgdGhlCisJCQkgKiBkZWxldGluZyB0cmFuc2FjdGlvbiBjb21taXRz IG9yIHRoZSBzdGF0ZW1lbnQgZW5kcyAoaWYgaXQncyBvdXIKKwkJCSAqIHRyYW5zYWN0aW9u KS4gSW4gZWl0aGVyIGNhc2UsIHRoZSBsb2NrIG9uIHRoZSBWTSBidWZmZXIgd2lsbAorCQkJ ICogaGF2ZSBiZWVuIHJlbGVhc2VkIChhY3RpbmcgYXMgYSB3cml0ZSBiYXJyaWVyKSBhZnRl ciBjbGVhcmluZworCQkJICogdGhlIGJpdC4gQW5kIGZvciB1cyB0byBoYXZlIGEgc25hcHNo b3QgdGhhdCBpbmNsdWRlcyB0aGUKKwkJCSAqIGRlbGV0aW5nIHRyYW5zYWN0aW9uIChtYWtp bmcgdGhlIHR1cGxlIGludmlzaWJsZSksIHdlIG11c3QgaGF2ZQorCQkJICogYWNxdWlyZWQg UHJvY0FycmF5TG9jayBhZnRlciB0aGF0IHRpbWUsIGFjdGluZyBhcyBhIHJlYWQKKwkJCSAq IGJhcnJpZXIuCisJCQkgKgorCQkJICogSXQncyB3b3J0aCBnb2luZyB0aHJvdWdoIHRoaXMg Y29tcGxleGl0eSB0byBhdm9pZCBuZWVkaW5nIHRvCisJCQkgKiBsb2NrIHRoZSBWTSBidWZm ZXIsIHdoaWNoIGNvdWxkIGNhdXNlIHNpZ25pZmljYW50IGNvbnRlbnRpb24uCisJCQkgKi8K KwkJCWlmICghYWxsX3Zpc2libGUpCiAJCQl7Ci0JCQkJLyogRmFpbHMgcmVjaGVjaywgc28g ZHJvcCBpdCBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyICovCi0JCQkJSW5zdHJDb3VudEZp bHRlcmVkMihub2RlLCAxKTsKLQkJCQljb250aW51ZTsKKwkJCQkvKgorCQkJCSAqIFJhdHMs IHdlIGhhdmUgdG8gdmlzaXQgdGhlIGhlYXAgdG8gY2hlY2sgdmlzaWJpbGl0eS4KKwkJCQkg Ki8KKwkJCQlJbnN0ckNvdW50VHVwbGVzMihub2RlLCAxKTsKKwkJCQlpZiAoIWluZGV4X2Zl dGNoX2hlYXAoc2NhbmRlc2MsIG5vZGUtPmlvc3NfVGFibGVTbG90KSkKKwkJCQl7CisJCQkJ CS8qCisJCQkJCSAqIElmIHdlIGhhdmVuJ3QgZm91bmQgYW55IHZpc2libGUgdHVwbGUgZm9y IHRoZSBUSUQsCisJCQkJCSAqIGNoYW5jZXMgYXJlIGFsbCB2ZXJzaW9ucyBhcmUgZGVhZCBh bmQgbWF5IGtpbGwgaXQgZnJvbQorCQkJCQkgKiB0aGUgaW5kZXguIElmIHNvLCBmbGFnIGl0 IGluIHRoZSBraWxsIGJpdG1hcCAtIHdlJ2xsCisJCQkJCSAqIHRyYW5zbGF0ZSBpdCB0byBp bmRleGVzIGxhdGVyLgorCQkJCQkgKgorCQkJCQkgKiBYWFggV2l0aCB0aGUgZmlyc3RJbmRl eC9sYXN0SW5kZXggaXQgd291bGQgbm90IGJlIHRvbworCQkJCQkgKiBoYXJkIHRvIGRvIHRo ZSB0cmFuc2xhdGlvbiBoZXJlLiBCdXQgZG8gd2Ugd2FudCB0bz8gSG93CisJCQkJCSAqIG11 Y2ggaXMgdGhhdCBjb25zaWRlcmVkIGFuIGludGVybmFsIGRldGFpbCBvZiB0aGUgQU0/CisJ CQkJCSAqCisJCQkJCSAqIEZJWE1FIE1heWJlIHdlIGNvdWxkL3Nob3VsZCBtYWtlIHRoaXMg cGFydCBvZgorCQkJCQkgKiBpbmRleF9mZXRjaF9oZWFwLCBzbyB0aGF0IHdlIGRvbid0IGhh dmUgdG8gZG8gdGhpcworCQkJCQkgKiBhZnRlciBlYWNoIGNhbGw/CisJCQkJCSAqLworCQkJ CQlpZiAoc2NhbmRlc2MtPmtpbGxfcHJpb3JfdHVwbGUpCisJCQkJCXsKKwkJCQkJCXNjYW5k ZXNjLT54c19iYXRjaC5raWxsZWRJdGVtc1tzY2FuZGVzYy0+eHNfYmF0Y2guY3VyckluZGV4 XSA9IHRydWU7CisJCQkJCQlzY2FuZGVzYy0+a2lsbF9wcmlvcl90dXBsZSA9IGZhbHNlOwor CQkJCQl9CisKKwkJCQkJY29udGludWU7CS8qIG5vIHZpc2libGUgdHVwbGUsIHRyeSBuZXh0 IGluZGV4IGVudHJ5ICovCisJCQkJfQorCisJCQkJRXhlY0NsZWFyVHVwbGUobm9kZS0+aW9z c19UYWJsZVNsb3QpOworCisJCQkJLyoKKwkJCQkgKiBPbmx5IE1WQ0Mgc25hcHNob3RzIGFy ZSBzdXBwb3J0ZWQgaGVyZSwgc28gdGhlcmUgc2hvdWxkIGJlCisJCQkJICogbm8gbmVlZCB0 byBrZWVwIGZvbGxvd2luZyB0aGUgSE9UIGNoYWluIG9uY2UgYSB2aXNpYmxlCisJCQkJICog ZW50cnkgaGFzIGJlZW4gZm91bmQuICBJZiB3ZSBkaWQgd2FudCB0byBhbGxvdyB0aGF0LCB3 ZSdkCisJCQkJICogbmVlZCB0byBrZWVwIG1vcmUgc3RhdGUgdG8gcmVtZW1iZXIgbm90IHRv IGNhbGwKKwkJCQkgKiBpbmRleF9nZXRuZXh0X3RpZCBuZXh0IHRpbWUuCisJCQkJICovCisJ CQkJaWYgKHNjYW5kZXNjLT54c19oZWFwX2NvbnRpbnVlKQorCQkJCQllbG9nKEVSUk9SLCAi bm9uLU1WQ0Mgc25hcHNob3RzIGFyZSBub3Qgc3VwcG9ydGVkIGluIGluZGV4LW9ubHkgc2Nh bnMiKTsKKworCQkJCS8qCisJCQkJICogTm90ZTogYXQgdGhpcyBwb2ludCB3ZSBhcmUgaG9s ZGluZyBhIHBpbiBvbiB0aGUgaGVhcCBwYWdlLAorCQkJCSAqIGFzIHJlY29yZGVkIGluIHNj YW5kZXNjLT54c19jYnVmLiAgV2UgY291bGQgcmVsZWFzZSB0aGF0CisJCQkJICogcGluIG5v dywgYnV0IGl0J3Mgbm90IGNsZWFyIHdoZXRoZXIgaXQncyBhIHdpbiB0byBkbyBzby4KKwkJ CQkgKiBUaGUgbmV4dCBpbmRleCBlbnRyeSBtaWdodCByZXF1aXJlIGEgdmlzaXQgdG8gdGhl IHNhbWUgaGVhcAorCQkJCSAqIHBhZ2UuCisJCQkJICovCisKKwkJCQl0dXBsZV9mcm9tX2hl YXAgPSB0cnVlOwogCQkJfQotCQl9CiAKLQkJLyoKLQkJICogV2UgZG9uJ3QgY3VycmVudGx5 IHN1cHBvcnQgcmVjaGVja2luZyBPUkRFUiBCWSBkaXN0YW5jZXMuICAoSW4KLQkJICogcHJp bmNpcGxlLCBpZiB0aGUgaW5kZXggY2FuIHN1cHBvcnQgcmV0cmlldmFsIG9mIHRoZSBvcmln aW5hbGx5Ci0JCSAqIGluZGV4ZWQgdmFsdWUsIGl0IHNob3VsZCBiZSBhYmxlIHRvIHByb2R1 Y2UgYW4gZXhhY3QgZGlzdGFuY2UKLQkJICogY2FsY3VsYXRpb24gdG9vLiAgU28gaXQncyBu b3QgY2xlYXIgdGhhdCBhZGRpbmcgY29kZSBoZXJlIGZvcgotCQkgKiByZWNoZWNrL3JlLXNv cnQgd291bGQgYmUgd29ydGggdGhlIHRyb3VibGUuICBCdXQgd2Ugc2hvdWxkIGF0IGxlYXN0 Ci0JCSAqIHRocm93IGFuIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgaXQuKQotCQkgKi8KLQkJ aWYgKHNjYW5kZXNjLT5udW1iZXJPZk9yZGVyQnlzID4gMCAmJiBzY2FuZGVzYy0+eHNfcmVj aGVja29yZGVyYnkpCi0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQkoZXJyY29kZShFUlJDT0RF X0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJCSBlcnJtc2coImxvc3N5IGRpc3RhbmNl IGZ1bmN0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBpbiBpbmRleC1vbmx5IHNjYW5zIikpKTsK KwkJCS8qCisJCQkgKiBGaWxsIHRoZSBzY2FuIHR1cGxlIHNsb3Qgd2l0aCBkYXRhIGZyb20g dGhlIGluZGV4LiAgVGhpcyBtaWdodAorCQkJICogYmUgcHJvdmlkZWQgaW4gZWl0aGVyIEhl YXBUdXBsZSBvciBJbmRleFR1cGxlIGZvcm1hdC4KKwkJCSAqIENvbmNlaXZhYmx5IGFuIGlu ZGV4IEFNIG1pZ2h0IGZpbGwgYm90aCBmaWVsZHMsIGluIHdoaWNoIGNhc2UKKwkJCSAqIHdl IHByZWZlciB0aGUgaGVhcCBmb3JtYXQsIHNpbmNlIGl0J3MgcHJvYmFibHkgYSBiaXQgY2hl YXBlciB0bworCQkJICogZmlsbCBhIHNsb3QgZnJvbS4KKwkJCSAqLworCQkJaWYgKHNjYW5k ZXNjLT54c19oaXR1cCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFdlIGRvbid0IHRha2UgdGhl IHRyb3VibGUgdG8gdmVyaWZ5IHRoYXQgdGhlIHByb3ZpZGVkIHR1cGxlCisJCQkJICogaGFz IGV4YWN0bHkgdGhlIHNsb3QncyBmb3JtYXQsIGJ1dCBpdCBzZWVtcyB3b3J0aCBkb2luZyBh CisJCQkJICogcXVpY2sgY2hlY2sgb24gdGhlIG51bWJlciBvZiBmaWVsZHMuCisJCQkJICov CisJCQkJQXNzZXJ0KHNsb3QtPnR0c190dXBsZURlc2NyaXB0b3ItPm5hdHRzID09CisJCQkJ CSAgIHNjYW5kZXNjLT54c19oaXR1cGRlc2MtPm5hdHRzKTsKKwkJCQlFeGVjRm9yY2VTdG9y ZUhlYXBUdXBsZShzY2FuZGVzYy0+eHNfaGl0dXAsIHNsb3QsIGZhbHNlKTsKKwkJCX0KKwkJ CWVsc2UgaWYgKHNjYW5kZXNjLT54c19pdHVwKQorCQkJCVN0b3JlSW5kZXhUdXBsZShub2Rl LCBzbG90LCBzY2FuZGVzYy0+eHNfaXR1cCwgc2NhbmRlc2MtPnhzX2l0dXBkZXNjKTsKKwkJ CWVsc2UKKwkJCQllbG9nKEVSUk9SLCAibm8gZGF0YSByZXR1cm5lZCBmb3IgaW5kZXgtb25s eSBzY2FuIik7CiAKLQkJLyoKLQkJICogSWYgd2UgZGlkbid0IGFjY2VzcyB0aGUgaGVhcCwg dGhlbiB3ZSdsbCBuZWVkIHRvIHRha2UgYSBwcmVkaWNhdGUKLQkJICogbG9jayBleHBsaWNp dGx5LCBhcyBpZiB3ZSBoYWQuICBGb3Igbm93IHdlIGRvIHRoYXQgYXQgcGFnZSBsZXZlbC4K LQkJICovCi0JCWlmICghdHVwbGVfZnJvbV9oZWFwKQotCQkJUHJlZGljYXRlTG9ja1BhZ2Uo c2NhbmRlc2MtPmhlYXBSZWxhdGlvbiwKLQkJCQkJCQkgIEl0ZW1Qb2ludGVyR2V0QmxvY2tO dW1iZXIodGlkKSwKLQkJCQkJCQkgIGVzdGF0ZS0+ZXNfc25hcHNob3QpOworCQkJLyoKKwkJ CSAqIElmIHRoZSBpbmRleCB3YXMgbG9zc3ksIHdlIGhhdmUgdG8gcmVjaGVjayB0aGUgaW5k ZXggcXVhbHMuCisJCQkgKi8KKwkJCWlmIChzY2FuZGVzYy0+eHNfcmVjaGVjaykKKwkJCXsK KwkJCQllY29udGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OworCQkJCWlmICghRXhlY1F1 YWxBbmRSZXNldChub2RlLT5yZWNoZWNrcXVhbCwgZWNvbnRleHQpKQorCQkJCXsKKwkJCQkJ LyogRmFpbHMgcmVjaGVjaywgc28gZHJvcCBpdCBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVy ICovCisJCQkJCUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgMSk7CisJCQkJCWNvbnRpbnVl OworCQkJCX0KKwkJCX0KKworCQkJLyoKKwkJCSAqIFdlIGRvbid0IGN1cnJlbnRseSBzdXBw b3J0IHJlY2hlY2tpbmcgT1JERVIgQlkgZGlzdGFuY2VzLiAgKEluCisJCQkgKiBwcmluY2lw bGUsIGlmIHRoZSBpbmRleCBjYW4gc3VwcG9ydCByZXRyaWV2YWwgb2YgdGhlIG9yaWdpbmFs bHkKKwkJCSAqIGluZGV4ZWQgdmFsdWUsIGl0IHNob3VsZCBiZSBhYmxlIHRvIHByb2R1Y2Ug YW4gZXhhY3QgZGlzdGFuY2UKKwkJCSAqIGNhbGN1bGF0aW9uIHRvby4gIFNvIGl0J3Mgbm90 IGNsZWFyIHRoYXQgYWRkaW5nIGNvZGUgaGVyZSBmb3IKKwkJCSAqIHJlY2hlY2svcmUtc29y dCB3b3VsZCBiZSB3b3J0aCB0aGUgdHJvdWJsZS4gIEJ1dCB3ZSBzaG91bGQgYXQKKwkJCSAq IGxlYXN0IHRocm93IGFuIGVycm9yIGlmIHNvbWVvbmUgdHJpZXMgaXQuKQorCQkJICovCisJ CQlpZiAoc2NhbmRlc2MtPm51bWJlck9mT3JkZXJCeXMgPiAwICYmIHNjYW5kZXNjLT54c19y ZWNoZWNrb3JkZXJieSkKKwkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJKGVycmNvZGUoRVJS Q09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAorCQkJCQkJIGVycm1zZygibG9zc3kgZGlz dGFuY2UgZnVuY3Rpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGluIGluZGV4LW9ubHkgc2NhbnMi KSkpOworCisJCQkvKgorCQkJICogSWYgd2UgZGlkbid0IGFjY2VzcyB0aGUgaGVhcCwgdGhl biB3ZSdsbCBuZWVkIHRvIHRha2UgYQorCQkJICogcHJlZGljYXRlIGxvY2sgZXhwbGljaXRs eSwgYXMgaWYgd2UgaGFkLiAgRm9yIG5vdyB3ZSBkbyB0aGF0IGF0CisJCQkgKiBwYWdlIGxl dmVsLgorCQkJICovCisJCQlpZiAoIXR1cGxlX2Zyb21faGVhcCkKKwkJCQlQcmVkaWNhdGVM b2NrUGFnZShzY2FuZGVzYy0+aGVhcFJlbGF0aW9uLAorCQkJCQkJCQkgIEl0ZW1Qb2ludGVy R2V0QmxvY2tOdW1iZXIodGlkKSwKKwkJCQkJCQkJICBlc3RhdGUtPmVzX3NuYXBzaG90KTsK KworCQkJcmV0dXJuIHNsb3Q7CisJCX0KIAotCQlyZXR1cm4gc2xvdDsKKwkJLyogYmF0Y2gg aXMgZW1wdHksIHRyeSByZWFkaW5nIHRoZSBuZXh0IGJhdGNoIG9mIHR1cGxlcyAqLworCQlp ZiAoaW5kZXhfYmF0Y2hfZ2V0bmV4dChzY2FuZGVzYywgZGlyZWN0aW9uKSkKKwkJeworCQkJ aW5kZXhfYmF0Y2hfcHJlZmV0Y2goc2NhbmRlc2MsIGRpcmVjdGlvbiwgaW9zX3ByZWZldGNo X2Jsb2NrLCBub2RlKTsKKwkJCWdvdG8gbmV3X2JhdGNoOworCQl9CisKKwkJcmV0dXJuIE5V TEw7CiAJfQogCiAJLyoKQEAgLTU3NCw2ICs4MDEsMTYgQEAgRXhlY0luaXRJbmRleE9ubHlT Y2FuKEluZGV4T25seVNjYW4gKm5vZGUsIEVTdGF0ZSAqZXN0YXRlLCBpbnQgZWZsYWdzKQog CWluZGV4c3RhdGUtPnJlY2hlY2txdWFsID0KIAkJRXhlY0luaXRRdWFsKG5vZGUtPnJlY2hl Y2txdWFsLCAoUGxhblN0YXRlICopIGluZGV4c3RhdGUpOwogCisJLyoKKwkgKiBDYW4ndCBk byBiYXRjaGluZyAoYW5kIHRodXMgcHJlZmV0Y2hpbmcpIHdoZW4gdGhlIHBsYW4gcmVxdWly ZXMgbWFyaworCSAqIGFuZCByZXN0b3JlLiBUaGVyZSdzIGFuIGlzc3VlIHdpdGggdHJhbnNs YXRpbmcgdGhlIG1hcmsvcmVzdG9yZQorCSAqIHBvc2l0aW9ucyBiZXR3ZWVuIHRoZSBiYXRj aCBpbiBzY2FuIGRlc2NyaXB0b3IgYW5kIHRoZSBvcmlnaW5hbAorCSAqIHBvc2l0aW9uIHJl Y29nbml6ZWQgaW4gdGhlIGluZGV4IEFNLgorCSAqCisJICogWFhYIEhvcGVmdWxseSBqdXN0 IGEgdGVtcG9yYXJ5IGxpbWl0YXRpb24/CisJICovCisJaW5kZXhzdGF0ZS0+aW9zc19DYW5C YXRjaCA9ICEoZWZsYWdzICYgRVhFQ19GTEFHX01BUkspOworCiAJLyoKIAkgKiBJZiB3ZSBh cmUganVzdCBkb2luZyBFWFBMQUlOIChpZSwgYXJlbid0IGdvaW5nIHRvIHJ1biB0aGUgcGxh biksIHN0b3AKIAkgKiBoZXJlLiAgVGhpcyBhbGxvd3MgYW4gaW5kZXgtYWR2aXNvciBwbHVn aW4gdG8gRVhQTEFJTiBhIHBsYW4gY29udGFpbmluZwpAQCAtNzQ0LDYgKzk4MSwxNCBAQCBF eGVjSW5kZXhPbmx5U2NhbkluaXRpYWxpemVEU00oSW5kZXhPbmx5U2NhblN0YXRlICpub2Rl LAogCW5vZGUtPmlvc3NfU2NhbkRlc2MtPnhzX3dhbnRfaXR1cCA9IHRydWU7CiAJbm9kZS0+ aW9zc19WTUJ1ZmZlciA9IEludmFsaWRCdWZmZXI7CiAKKwkvKgorCSAqIFhYWCBkbyB3ZSBh Y3R1YWxseSB3YW50IHByZWZldGNoaW5nIGZvciBwYXJhbGxlbCBpbmRleCBzY2Fucz8gTWF5 YmUKKwkgKiBub3QsIGJ1dCB0aGVuIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBub3QgdG8gY2Fs bCBpbmRleF9iYXRjaF9nZXRuZXh0X3RpZAorCSAqICh3aGljaCBub3cgY2FuIGhhcHBlbiwg YmVjYXVzZSB3ZSdsbCBjYWxsIEluZGV4T25seU5leHQgZXZlbiBmb3IKKwkgKiBwYXJhbGxl bCBwbGFucykuCisJICovCisJaW5kZXhfYmF0Y2hfaW5pdChub2RlLT5pb3NzX1NjYW5EZXNj LCBGb3J3YXJkU2NhbkRpcmVjdGlvbik7CisKIAkvKgogCSAqIElmIG5vIHJ1bi10aW1lIGtl eXMgdG8gY2FsY3VsYXRlIG9yIHRoZXkgYXJlIHJlYWR5LCBnbyBhaGVhZCBhbmQgcGFzcwog CSAqIHRoZSBzY2Fua2V5cyB0byB0aGUgaW5kZXggQU0uCkBAIC03ODgsNiArMTAzMyw5IEBA IEV4ZWNJbmRleE9ubHlTY2FuSW5pdGlhbGl6ZVdvcmtlcihJbmRleE9ubHlTY2FuU3RhdGUg Km5vZGUsCiAJCQkJCQkJCSBwaXNjYW4pOwogCW5vZGUtPmlvc3NfU2NhbkRlc2MtPnhzX3dh bnRfaXR1cCA9IHRydWU7CiAKKwkvKiBYWFggZG8gd2UgYWN0dWFsbHkgd2FudCBwcmVmZXRj aGluZyBmb3IgcGFyYWxsZWwgaW5kZXggc2NhbnM/ICovCisJaW5kZXhfYmF0Y2hfaW5pdChu b2RlLT5pb3NzX1NjYW5EZXNjLCBGb3J3YXJkU2NhbkRpcmVjdGlvbik7CisKIAkvKgogCSAq IElmIG5vIHJ1bi10aW1lIGtleXMgdG8gY2FsY3VsYXRlIG9yIHRoZXkgYXJlIHJlYWR5LCBn byBhaGVhZCBhbmQgcGFzcwogCSAqIHRoZSBzY2Fua2V5cyB0byB0aGUgaW5kZXggQU0uCkBA IC03OTcsMyArMTA0NSwzNSBAQCBFeGVjSW5kZXhPbmx5U2NhbkluaXRpYWxpemVXb3JrZXIo SW5kZXhPbmx5U2NhblN0YXRlICpub2RlLAogCQkJCQkgbm9kZS0+aW9zc19TY2FuS2V5cywg bm9kZS0+aW9zc19OdW1TY2FuS2V5cywKIAkJCQkJIG5vZGUtPmlvc3NfT3JkZXJCeUtleXMs IG5vZGUtPmlvc3NfTnVtT3JkZXJCeUtleXMpOwogfQorCisvKgorICogaW9zX3ByZWZldGNo X2Jsb2NrCisgKgkJQ2FsbGJhY2sgdG8gb25seSBwcmVmZXRjaCBibG9ja3MgdGhhdCBhcmUg bm90IGFsbC12aXNpYmxlLgorICoKKyAqIFdlIGRvbid0IHdhbnQgdG8gaW5zcGVjdCB0aGUg dmlzaWJpbGl0eSBtYXAgcmVwZWF0ZWRseSwgc28gdGhlIHJlc3VsdCBvZgorICogVk1fQUxM X1ZJU0lCTEUgaXMgc3RvcmVkIGluIHRoZSBiYXRjaCBwcml2YXRlIGRhdGEuIFRoZSB2YWx1 ZXMgYXJlIHNldAorICogdG8gMCBieSBkZWZhdWx0LCBzbyB3ZSB1c2UgdHdvIGNvbnN0YW50 cyB0byByZW1lbWJlciBpZiBhbGwtdmlzaWJsZSBvcgorICogbm90IGFsbC12aXNpYmxlLgor ICovCitzdGF0aWMgYm9vbAoraW9zX3ByZWZldGNoX2Jsb2NrKEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJICAgdm9pZCAqYXJnLCBpbnQgaW5k ZXgpCit7CisJSW5kZXhPbmx5U2NhblN0YXRlICpub2RlID0gKEluZGV4T25seVNjYW5TdGF0 ZSAqKSBhcmc7CisKKwlpZiAoc2Nhbi0+eHNfYmF0Y2gucHJpdmF0ZURhdGFbaW5kZXhdID09 IElPU19VTktOT1dOX1ZJU0lCSUxJVFkpCisJeworCQlib29sCQlhbGxfdmlzaWJsZTsKKwkJ SXRlbVBvaW50ZXIgdGlkID0gJnNjYW4tPnhzX2JhdGNoLmhlYXB0aWRzW2luZGV4XTsKKwor CQlhbGxfdmlzaWJsZSA9IFZNX0FMTF9WSVNJQkxFKHNjYW4tPmhlYXBSZWxhdGlvbiwKKwkJ CQkJCQkJCSBJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCksCisJCQkJCQkJCQkgJm5v ZGUtPmlvc3NfVk1CdWZmZXIpOworCisJCXNjYW4tPnhzX2JhdGNoLnByaXZhdGVEYXRhW2lu ZGV4XQorCQkJPSBhbGxfdmlzaWJsZSA/IElPU19BTExfVklTSUJMRSA6IElPU19OT1RfQUxM X1ZJU0lCTEU7CisJfQorCisJLyogcHJlZmV0Y2ggb25seSBibG9ja3MgdGhhdCBhcmUgbm90 IGFsbC12aXNpYmxlICovCisJcmV0dXJuIChzY2FuLT54c19iYXRjaC5wcml2YXRlRGF0YVtp bmRleF0gPT0gSU9TX05PVF9BTExfVklTSUJMRSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9leGVjdXRvci9ub2RlSW5kZXhzY2FuLmMgYi9zcmMvYmFja2VuZC9leGVjdXRvci9u b2RlSW5kZXhzY2FuLmMKaW5kZXggODAwMGZlZmY0YzkuLmQ5ZjkyNjUzNmFkIDEwMDY0NAot LS0gYS9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhzY2FuLmMKKysrIGIvc3JjL2Jh Y2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5j bHVkZSAibGliL3BhaXJpbmdoZWFwLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5j bHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCisjaW5jbHVkZSAib3B0aW1pemVyL2Nvc3QuaCIK ICNpbmNsdWRlICJ1dGlscy9hcnJheS5oIgogI2luY2x1ZGUgInV0aWxzL2RhdHVtLmgiCiAj aW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCkBAIC0xMjIsMzEgKzEyMyw4OSBAQCBJbmRl eE5leHQoSW5kZXhTY2FuU3RhdGUgKm5vZGUpCiAJCQlpbmRleF9yZXNjYW4oc2NhbmRlc2Ms CiAJCQkJCQkgbm9kZS0+aXNzX1NjYW5LZXlzLCBub2RlLT5pc3NfTnVtU2NhbktleXMsCiAJ CQkJCQkgbm9kZS0+aXNzX09yZGVyQnlLZXlzLCBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMp OworCisJCWluZGV4X2JhdGNoX2luaXQoc2NhbmRlc2MsIEZvcndhcmRTY2FuRGlyZWN0aW9u KTsKIAl9CiAKIAkvKgotCSAqIG9rLCBub3cgdGhhdCB3ZSBoYXZlIHdoYXQgd2UgbmVlZCwg ZmV0Y2ggdGhlIG5leHQgdHVwbGUuCisJICogSWYgdGhlIGJhdGNoaW5nIGlzIGRpc2FibGVk IGJ5IGEgR1VDLCBvciBpZiBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlCisJICogaW5kZXgg QU0sIGRvIHRoZSBvcmlnaW5hbCBhcHByb2FjaC4KKwkgKgorCSAqIFhYWCBNYXliZSB3ZSBz aG91bGQgZW5hYmxlIGJhdGNoaW5nIGJhc2VkIG9uIHRoZSBwbGFuIHRvbywgc28gdGhhdCB3 ZQorCSAqIGRvbid0IGRvIGJhdGNoaW5nIHdoZW4gaXQncyBwcm9iYWJseSB1c2VsZXNzIChl LmcuIHNlbWlqb2lucyBvciBxdWVyaWVzCisJICogd2l0aCBMSU1JVCAxIGV0Yy4pLiBCdXQg bWF5YmUgdGhlIGFwcHJvYWNoIHdpdGggc2xvdyByYW1wLXVwIChzdGFydGluZworCSAqIHdp dGggc21hbGwgYmF0Y2hlcykgd2lsbCBoYW5kbGUgdGhhdCB3ZWxsIGVub3VnaC4KKwkgKgor CSAqIFhYWCBQZXJoYXBzIGl0J2QgYmUgcG9zc2libGUgdG8gZG8gYm90aCBpbiBpbmRleF9n ZXRuZXh0X3Nsb3QoKSwgaS5lLgorCSAqIGNhbGwgZWl0aGVyIHRoZSBvcmlnaW5hbCBjb2Rl IHdpdGhvdXQgYmF0Y2hpbmcsIG9yIHRoZSBuZXcgYmF0Y2hpbmcKKwkgKiBjb2RlIGlmIHN1 cHBvcnRlZC9lbmFibGVkLiBJdCdzIG5vdCBncmVhdCB0byBoYXZlIGR1cGxpY2F0ZWQgY29k ZS4KIAkgKi8KLQl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KHNjYW5kZXNjLCBkaXJlY3Rp b24sIHNsb3QpKQorCWlmICghKGVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmcgJiYKKwkJICBp bmRleF9iYXRjaF9zdXBwb3J0ZWQoc2NhbmRlc2MsIGRpcmVjdGlvbikgJiYKKwkJICBub2Rl LT5pc3NfQ2FuQmF0Y2gpKQogCXsKLQkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKLQogCQkv KgotCQkgKiBJZiB0aGUgaW5kZXggd2FzIGxvc3N5LCB3ZSBoYXZlIHRvIHJlY2hlY2sgdGhl IGluZGV4IHF1YWxzIHVzaW5nCi0JCSAqIHRoZSBmZXRjaGVkIHR1cGxlLgorCQkgKiBvaywg bm93IHRoYXQgd2UgaGF2ZSB3aGF0IHdlIG5lZWQsIGZldGNoIHRoZSBuZXh0IHR1cGxlLgog CQkgKi8KLQkJaWYgKHNjYW5kZXNjLT54c19yZWNoZWNrKQorCQl3aGlsZSAoaW5kZXhfZ2V0 bmV4dF9zbG90KHNjYW5kZXNjLCBkaXJlY3Rpb24sIHNsb3QpKQogCQl7Ci0JCQllY29udGV4 dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OwotCQkJaWYgKCFFeGVjUXVhbEFuZFJlc2V0KG5v ZGUtPmluZGV4cXVhbG9yaWcsIGVjb250ZXh0KSkKKwkJCUNIRUNLX0ZPUl9JTlRFUlJVUFRT KCk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgaW5kZXggd2FzIGxvc3N5LCB3ZSBoYXZlIHRv IHJlY2hlY2sgdGhlIGluZGV4IHF1YWxzCisJCQkgKiB1c2luZyB0aGUgZmV0Y2hlZCB0dXBs ZS4KKwkJCSAqLworCQkJaWYgKHNjYW5kZXNjLT54c19yZWNoZWNrKQogCQkJewotCQkJCS8q IEZhaWxzIHJlY2hlY2ssIHNvIGRyb3AgaXQgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciAq LwotCQkJCUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgMSk7Ci0JCQkJY29udGludWU7CisJ CQkJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0gc2xvdDsKKwkJCQlpZiAoIUV4ZWNRdWFs QW5kUmVzZXQobm9kZS0+aW5kZXhxdWFsb3JpZywgZWNvbnRleHQpKQorCQkJCXsKKwkJCQkJ LyogRmFpbHMgcmVjaGVjaywgc28gZHJvcCBpdCBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVy ICovCisJCQkJCUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgMSk7CisJCQkJCWNvbnRpbnVl OworCQkJCX0KIAkJCX0KKworCQkJcmV0dXJuIHNsb3Q7CiAJCX0KKwl9CisJZWxzZQorCXsK K25ld19iYXRjaDoKKwkJLyogZG8gd2UgaGF2ZSBUSURzIGluIHRoZSBjdXJyZW50IGJhdGNo ICovCisJCXdoaWxlIChpbmRleF9iYXRjaF9nZXRuZXh0X3Nsb3Qoc2NhbmRlc2MsIGRpcmVj dGlvbiwgc2xvdCkpCisJCXsKKwkJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CiAKLQkJcmV0 dXJuIHNsb3Q7CisJCQkvKiBmaXJzdCwgdGFrZSBjYXJlIG9mIHByZWZldGNoaW5nIGZ1cnRo ZXIgaXRlbXMgKi8KKwkJCWluZGV4X2JhdGNoX3ByZWZldGNoKHNjYW5kZXNjLCBkaXJlY3Rp b24sIE5VTEwsIE5VTEwpOworCisJCQkvKgorCQkJICogSWYgdGhlIGluZGV4IHdhcyBsb3Nz eSwgd2UgaGF2ZSB0byByZWNoZWNrIHRoZSBpbmRleCBxdWFscworCQkJICogdXNpbmcgdGhl IGZldGNoZWQgdHVwbGUuCisJCQkgKi8KKwkJCWlmIChzY2FuZGVzYy0+eHNfcmVjaGVjaykK KwkJCXsKKwkJCQllY29udGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OworCQkJCWlmICgh RXhlY1F1YWxBbmRSZXNldChub2RlLT5pbmRleHF1YWxvcmlnLCBlY29udGV4dCkpCisJCQkJ eworCQkJCQkvKiBGYWlscyByZWNoZWNrLCBzbyBkcm9wIGl0IGFuZCBsb29wIGJhY2sgZm9y IGFub3RoZXIgKi8KKwkJCQkJSW5zdHJDb3VudEZpbHRlcmVkMihub2RlLCAxKTsKKwkJCQkJ Y29udGludWU7CisJCQkJfQorCQkJfQorCisJCQlyZXR1cm4gc2xvdDsKKwkJfQorCisJCS8q IGJhdGNoIGlzIGVtcHR5LCB0cnkgcmVhZGluZyB0aGUgbmV4dCBiYXRjaCBvZiB0dXBsZXMg Ki8KKwkJaWYgKGluZGV4X2JhdGNoX2dldG5leHQoc2NhbmRlc2MsIGRpcmVjdGlvbikpCisJ CXsKKwkJCWluZGV4X2JhdGNoX3ByZWZldGNoKHNjYW5kZXNjLCBkaXJlY3Rpb24sIE5VTEws IE5VTEwpOworCQkJZ290byBuZXdfYmF0Y2g7CisJCX0KKworCQlyZXR1cm4gTlVMTDsKIAl9 CiAKIAkvKgpAQCAtOTQyLDYgKzEwMDEsMTYgQEAgRXhlY0luaXRJbmRleFNjYW4oSW5kZXhT Y2FuICpub2RlLCBFU3RhdGUgKmVzdGF0ZSwgaW50IGVmbGFncykKIAlpbmRleHN0YXRlLT5p bmRleG9yZGVyYnlvcmlnID0KIAkJRXhlY0luaXRFeHByTGlzdChub2RlLT5pbmRleG9yZGVy YnlvcmlnLCAoUGxhblN0YXRlICopIGluZGV4c3RhdGUpOwogCisJLyoKKwkgKiBDYW4ndCBk byBiYXRjaGluZyAoYW5kIHRodXMgcHJlZmV0Y2hpbmcpIHdoZW4gdGhlIHBsYW4gcmVxdWly ZXMgbWFyaworCSAqIGFuZCByZXN0b3JlLiBUaGVyZSdzIGFuIGlzc3VlIHdpdGggdHJhbnNs YXRpbmcgdGhlIG1hcmsvcmVzdG9yZQorCSAqIHBvc2l0aW9ucyBiZXR3ZWVuIHRoZSBiYXRj aCBpbiBzY2FuIGRlc2NyaXB0b3IgYW5kIHRoZSBvcmlnaW5hbAorCSAqIHBvc2l0aW9uIHJl Y29nbml6ZWQgaW4gdGhlIGluZGV4IEFNLgorCSAqCisJICogWFhYIEhvcGVmdWxseSBqdXN0 IGEgdGVtcG9yYXJ5IGxpbWl0YXRpb24/CisJICovCisJaW5kZXhzdGF0ZS0+aXNzX0NhbkJh dGNoID0gIShlZmxhZ3MgJiBFWEVDX0ZMQUdfTUFSSyk7CisKIAkvKgogCSAqIElmIHdlIGFy ZSBqdXN0IGRvaW5nIEVYUExBSU4gKGllLCBhcmVuJ3QgZ29pbmcgdG8gcnVuIHRoZSBwbGFu KSwgc3RvcAogCSAqIGhlcmUuICBUaGlzIGFsbG93cyBhbiBpbmRleC1hZHZpc29yIHBsdWdp biB0byBFWFBMQUlOIGEgcGxhbiBjb250YWluaW5nCkBAIC0xNjc3LDYgKzE3NDYsMTQgQEAg RXhlY0luZGV4U2NhbkluaXRpYWxpemVEU00oSW5kZXhTY2FuU3RhdGUgKm5vZGUsCiAJCQkJ CQkJCSBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMsCiAJCQkJCQkJCSBwaXNjYW4pOwogCisJ LyoKKwkgKiBYWFggZG8gd2UgYWN0dWFsbHkgd2FudCBwcmVmZXRjaGluZyBmb3IgcGFyYWxs ZWwgaW5kZXggc2NhbnM/IE1heWJlCisJICogbm90LCBidXQgdGhlbiB3ZSBuZWVkIHRvIGJl IGNhcmVmdWwgbm90IHRvIGNhbGwgaW5kZXhfYmF0Y2hfZ2V0bmV4dF90aWQKKwkgKiAod2hp Y2ggbm93IGNhbiBoYXBwZW4sIGJlY2F1c2Ugd2UnbGwgY2FsbCBJbmRleE9ubHlOZXh0IGV2 ZW4gZm9yCisJICogcGFyYWxsZWwgcGxhbnMpLgorCSAqLworCWluZGV4X2JhdGNoX2luaXQo bm9kZS0+aXNzX1NjYW5EZXNjLCBGb3J3YXJkU2NhbkRpcmVjdGlvbik7CisKIAkvKgogCSAq IElmIG5vIHJ1bi10aW1lIGtleXMgdG8gY2FsY3VsYXRlIG9yIHRoZXkgYXJlIHJlYWR5LCBn byBhaGVhZCBhbmQgcGFzcwogCSAqIHRoZSBzY2Fua2V5cyB0byB0aGUgaW5kZXggQU0uCkBA IC0xNzIwLDYgKzE3OTcsMTQgQEAgRXhlY0luZGV4U2NhbkluaXRpYWxpemVXb3JrZXIoSW5k ZXhTY2FuU3RhdGUgKm5vZGUsCiAJCQkJCQkJCSBub2RlLT5pc3NfTnVtT3JkZXJCeUtleXMs CiAJCQkJCQkJCSBwaXNjYW4pOwogCisJLyoKKwkgKiBYWFggZG8gd2UgYWN0dWFsbHkgd2Fu dCBwcmVmZXRjaGluZyBmb3IgcGFyYWxsZWwgaW5kZXggc2NhbnM/IE1heWJlCisJICogbm90 LCBidXQgdGhlbiB3ZSBuZWVkIHRvIGJlIGNhcmVmdWwgbm90IHRvIGNhbGwgaW5kZXhfYmF0 Y2hfZ2V0bmV4dF90aWQKKwkgKiAod2hpY2ggbm93IGNhbiBoYXBwZW4sIGJlY2F1c2Ugd2Un bGwgY2FsbCBJbmRleE9ubHlOZXh0IGV2ZW4gZm9yCisJICogcGFyYWxsZWwgcGxhbnMpLgor CSAqLworCWluZGV4X2JhdGNoX2luaXQobm9kZS0+aXNzX1NjYW5EZXNjLCBGb3J3YXJkU2Nh bkRpcmVjdGlvbik7CisKIAkvKgogCSAqIElmIG5vIHJ1bi10aW1lIGtleXMgdG8gY2FsY3Vs YXRlIG9yIHRoZXkgYXJlIHJlYWR5LCBnbyBhaGVhZCBhbmQgcGFzcwogCSAqIHRoZSBzY2Fu a2V5cyB0byB0aGUgaW5kZXggQU0uCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9t aXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5j CmluZGV4IDUyMWVjNTU5MWM4Li40N2E5ZWQ5ZDUyNyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWNfdGFibGVzLmMKQEAgLTc4OSw2ICs3ODksMTYgQEAgc3RydWN0IGNvbmZpZ19ib29s IENvbmZpZ3VyZU5hbWVzQm9vbFtdID0KIAkJdHJ1ZSwKIAkJTlVMTCwgTlVMTCwgTlVMTAog CX0sCisJeworCQl7ImVuYWJsZV9pbmRleHNjYW5fYmF0Y2hpbmciLCBQR0NfVVNFUlNFVCwg UVVFUllfVFVOSU5HX01FVEhPRCwKKwkJCWdldHRleHRfbm9vcCgiRW5hYmxlcyB0aGUgcGxh bm5lcidzIHVzZSBvZiBpbmRleC1zY2FuIGJhdGNoaW5nLiIpLAorCQkJTlVMTCwKKwkJCUdV Q19FWFBMQUlOCisJCX0sCisJCSZlbmFibGVfaW5kZXhzY2FuX2JhdGNoaW5nLAorCQl0cnVl LAorCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKIAl7CiAJCXsiZW5hYmxlX2luZGV4b25seXNj YW4iLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01FVEhPRCwKIAkJCWdldHRleHRfbm9v cCgiRW5hYmxlcyB0aGUgcGxhbm5lcidzIHVzZSBvZiBpbmRleC1vbmx5LXNjYW4gcGxhbnMu IiksCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29u Zi5zYW1wbGUgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1w bGUKaW5kZXggNjY3ZTBkYzQwYTIuLmIyNTA5MzM3NzU1IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUKKysrIGIvc3JjL2JhY2tl bmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCkBAIC0zOTgsNiArMzk4LDcg QEAKICNlbmFibGVfaGFzaGpvaW4gPSBvbgogI2VuYWJsZV9pbmNyZW1lbnRhbF9zb3J0ID0g b24KICNlbmFibGVfaW5kZXhzY2FuID0gb24KKyNlbmFibGVfaW5kZXhzY2FuX2JhdGNoaW5n ID0gb24KICNlbmFibGVfaW5kZXhvbmx5c2NhbiA9IG9uCiAjZW5hYmxlX21hdGVyaWFsID0g b24KICNlbmFibGVfbWVtb2l6ZSA9IG9uCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9hY2Nl c3MvYW1hcGkuaCBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9hbWFwaS5oCmluZGV4IGYyNWM5ZDU4 YTdkLi44ODcwZjdlYjY3NiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNzL2FtYXBp LmgKKysrIGIvc3JjL2luY2x1ZGUvYWNjZXNzL2FtYXBpLmgKQEAgLTE3Nyw2ICsxNzcsMTAg QEAgdHlwZWRlZiB2b2lkICgqYW1yZXNjYW5fZnVuY3Rpb24pIChJbmRleFNjYW5EZXNjIHNj YW4sCiB0eXBlZGVmIGJvb2wgKCphbWdldHR1cGxlX2Z1bmN0aW9uKSAoSW5kZXhTY2FuRGVz YyBzY2FuLAogCQkJCQkJCQkJIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKIAorLyogbmV4 dCBiYXRjaCBvZiB2YWxpZCB0dXBsZXMgKi8KK3R5cGVkZWYgYm9vbCAoKmFtZ2V0dHVwbGVi YXRjaF9mdW5jdGlvbikgKEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJCQkJCQkJCQkgIFNjYW5E aXJlY3Rpb24gZGlyZWN0aW9uKTsKKwogLyogZmV0Y2ggYWxsIHZhbGlkIHR1cGxlcyAqLwog dHlwZWRlZiBpbnQ2NCAoKmFtZ2V0Yml0bWFwX2Z1bmN0aW9uKSAoSW5kZXhTY2FuRGVzYyBz Y2FuLAogCQkJCQkJCQkJICAgVElEQml0bWFwICp0Ym0pOwpAQCAtMjgwLDYgKzI4NCw3IEBA IHR5cGVkZWYgc3RydWN0IEluZGV4QW1Sb3V0aW5lCiAJYW1iZWdpbnNjYW5fZnVuY3Rpb24g YW1iZWdpbnNjYW47CiAJYW1yZXNjYW5fZnVuY3Rpb24gYW1yZXNjYW47CiAJYW1nZXR0dXBs ZV9mdW5jdGlvbiBhbWdldHR1cGxlOyAvKiBjYW4gYmUgTlVMTCAqLworCWFtZ2V0dHVwbGVi YXRjaF9mdW5jdGlvbiBhbWdldHR1cGxlYmF0Y2g7CS8qIGNhbiBiZSBOVUxMICovCiAJYW1n ZXRiaXRtYXBfZnVuY3Rpb24gYW1nZXRiaXRtYXA7CS8qIGNhbiBiZSBOVUxMICovCiAJYW1l bmRzY2FuX2Z1bmN0aW9uIGFtZW5kc2NhbjsKIAlhbW1hcmtwb3NfZnVuY3Rpb24gYW1tYXJr cG9zOwkvKiBjYW4gYmUgTlVMTCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNz L2dlbmFtLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvZ2VuYW0uaAppbmRleCBmZGNmYmU4ZGI3 NC4uMDFiMWNlZTNkMzAgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9nZW5hbS5o CisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9nZW5hbS5oCkBAIC0xNCw2ICsxNCw3IEBACiAj aWZuZGVmIEdFTkFNX0gKICNkZWZpbmUgR0VOQU1fSAogCisjaW5jbHVkZSAiYWNjZXNzL2l0 dXAuaCIKICNpbmNsdWRlICJhY2Nlc3Mvc2Rpci5oIgogI2luY2x1ZGUgImFjY2Vzcy9za2V5 LmgiCiAjaW5jbHVkZSAibm9kZXMvdGlkYml0bWFwLmgiCkBAIC0xMzIsNiArMTMzLDggQEAg dHlwZWRlZiBzdHJ1Y3QgSW5kZXhPcmRlckJ5RGlzdGFuY2UKICAqIGdlbmVyYWxpemVkIGlu ZGV4XyBpbnRlcmZhY2Ugcm91dGluZXMgKGluIGluZGV4YW0uYykKICAqLwogCitleHRlcm4g UEdETExJTVBPUlQgYm9vbCBlbmFibGVfaW5kZXhzY2FuX2JhdGNoaW5nOworCiAvKgogICog SW5kZXhTY2FuSXNWYWxpZAogICoJCVRydWUgaWZmIHRoZSBpbmRleCBzY2FuIGlzIHZhbGlk LgpAQCAtMTgyLDYgKzE4NSwyNyBAQCBleHRlcm4gYm9vbCBpbmRleF9nZXRuZXh0X3Nsb3Qo SW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcmVjdGlvbiwKIAkJCQkJCQkg ICBzdHJ1Y3QgVHVwbGVUYWJsZVNsb3QgKnNsb3QpOwogZXh0ZXJuIGludDY0IGluZGV4X2dl dGJpdG1hcChJbmRleFNjYW5EZXNjIHNjYW4sIFRJREJpdG1hcCAqYml0bWFwKTsKIAorZXh0 ZXJuIGJvb2wgaW5kZXhfYmF0Y2hfZ2V0bmV4dChJbmRleFNjYW5EZXNjIHNjYW4sCisJCQkJ CQkJCVNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKK2V4dGVybiBJdGVtUG9pbnRlciBpbmRl eF9iYXRjaF9nZXRuZXh0X3RpZChJbmRleFNjYW5EZXNjIHNjYW4sCisJCQkJCQkJCQkJICAg U2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIGJvb2wgaW5kZXhfYmF0Y2hfZ2V0 bmV4dF9zbG90KEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJCQkJCQkJCSBTY2FuRGlyZWN0aW9u IGRpcmVjdGlvbiwKKwkJCQkJCQkJCSBzdHJ1Y3QgVHVwbGVUYWJsZVNsb3QgKnNsb3QpOwor ZXh0ZXJuIGJvb2wgaW5kZXhfYmF0Y2hfc3VwcG9ydGVkKEluZGV4U2NhbkRlc2Mgc2Nhbiwg U2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIHZvaWQgaW5kZXhfYmF0Y2hfaW5p dChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyZWN0aW9uKTsKK2V4dGVy biB2b2lkIGluZGV4X2JhdGNoX3Jlc2V0KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVj dGlvbiBkaXJlY3Rpb24pOworZXh0ZXJuIGJvb2wgaW5kZXhfYmF0Y2hfYWRkKEluZGV4U2Nh bkRlc2Mgc2NhbiwgSXRlbVBvaW50ZXJEYXRhIHRpZCwgSW5kZXhUdXBsZSBpdHVwKTsKKwor LyoKKyAqIFR5cGVkZWYgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiBh biBpdGVtIGluIGluZGV4IHNjYW4gc2hvdWxkCisgKiBiZSBwcmVmZXRjaGVkLgorICovCit0 eXBlZGVmIGJvb2wgKCppbmRleF9wcmVmZXRjaF9jYWxsYmFjaykgKEluZGV4U2NhbkRlc2Mg c2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJCQkJCQkJIHZvaWQgKmFyZywg aW50IGluZGV4KTsKK2V4dGVybiB2b2lkIGluZGV4X2JhdGNoX3ByZWZldGNoKEluZGV4U2Nh bkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXJlY3Rpb24sCisJCQkJCQkJCSBpbmRleF9w cmVmZXRjaF9jYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqYXJnKTsKKwogZXh0ZXJuIEluZGV4 QnVsa0RlbGV0ZVJlc3VsdCAqaW5kZXhfYnVsa19kZWxldGUoSW5kZXhWYWN1dW1JbmZvICpp bmZvLAogCQkJCQkJCQkJCQkJSW5kZXhCdWxrRGVsZXRlUmVzdWx0ICppc3RhdCwKIAkJCQkJ CQkJCQkJCUluZGV4QnVsa0RlbGV0ZUNhbGxiYWNrIGNhbGxiYWNrLApkaWZmIC0tZ2l0IGEv c3JjL2luY2x1ZGUvYWNjZXNzL25idHJlZS5oIGIvc3JjL2luY2x1ZGUvYWNjZXNzL25idHJl ZS5oCmluZGV4IDlhZjliM2VjZGNjLi5kYjFiYTdlZDY0NyAxMDA2NDQKLS0tIGEvc3JjL2lu Y2x1ZGUvYWNjZXNzL25idHJlZS5oCisrKyBiL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUu aApAQCAtMTE3Miw2ICsxMTcyLDcgQEAgZXh0ZXJuIEluZGV4U2NhbkRlc2MgYnRiZWdpbnNj YW4oUmVsYXRpb24gcmVsLCBpbnQgbmtleXMsIGludCBub3JkZXJieXMpOwogZXh0ZXJuIFNp emUgYnRlc3RpbWF0ZXBhcmFsbGVsc2NhbihpbnQgbmtleXMsIGludCBub3JkZXJieXMpOwog ZXh0ZXJuIHZvaWQgYnRpbml0cGFyYWxsZWxzY2FuKHZvaWQgKnRhcmdldCk7CiBleHRlcm4g Ym9vbCBidGdldHR1cGxlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIp OworZXh0ZXJuIGJvb2wgYnRnZXR0dXBsZWJhdGNoKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bkRpcmVjdGlvbiBkaXIpOwogZXh0ZXJuIGludDY0IGJ0Z2V0Yml0bWFwKEluZGV4U2NhbkRl c2Mgc2NhbiwgVElEQml0bWFwICp0Ym0pOwogZXh0ZXJuIHZvaWQgYnRyZXNjYW4oSW5kZXhT Y2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNjYW5rZXksIGludCBuc2NhbmtleXMsCiAJCQkJCSBT Y2FuS2V5IG9yZGVyYnlzLCBpbnQgbm9yZGVyYnlzKTsKQEAgLTEyNzYsNiArMTI3Nyw5IEBA IGV4dGVybiBPZmZzZXROdW1iZXIgX2J0X2JpbnNyY2hfaW5zZXJ0KFJlbGF0aW9uIHJlbCwg QlRJbnNlcnRTdGF0ZSBpbnNlcnRzdGF0ZSk7CiBleHRlcm4gaW50MzIgX2J0X2NvbXBhcmUo UmVsYXRpb24gcmVsLCBCVFNjYW5JbnNlcnQga2V5LCBQYWdlIHBhZ2UsIE9mZnNldE51bWJl ciBvZmZudW0pOwogZXh0ZXJuIGJvb2wgX2J0X2ZpcnN0KEluZGV4U2NhbkRlc2Mgc2Nhbiwg U2NhbkRpcmVjdGlvbiBkaXIpOwogZXh0ZXJuIGJvb2wgX2J0X25leHQoSW5kZXhTY2FuRGVz YyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitleHRlcm4gYm9vbCBfYnRfZmlyc3RfYmF0 Y2goSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitleHRlcm4gYm9v bCBfYnRfbmV4dF9iYXRjaChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGly KTsKK2V4dGVybiB2b2lkIF9idF9raWxsX2JhdGNoKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBl eHRlcm4gQnVmZmVyIF9idF9nZXRfZW5kcG9pbnQoUmVsYXRpb24gcmVsLCB1aW50MzIgbGV2 ZWwsIGJvb2wgcmlnaHRtb3N0KTsKIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9yZWxzY2FuLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvcmVsc2Nhbi5oCmluZGV4IDUy MTA0MzMwNGFiLi5hNThjMjk0YThlNSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvYWNjZXNz L3JlbHNjYW4uaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvcmVsc2Nhbi5oCkBAIC0xNTEs NiArMTUxLDQ2IEBAIHR5cGVkZWYgc3RydWN0IEluZGV4U2NhbkRlc2NEYXRhCiAKIAlib29s CQl4c19yZWNoZWNrOwkJLyogVCBtZWFucyBzY2FuIGtleXMgbXVzdCBiZSByZWNoZWNrZWQg Ki8KIAorCS8qCisJICogRGF0YSBhYm91dCB0aGUgY3VycmVudCBUSUQgYmF0Y2ggcmV0dXJu ZWQgYnkgdGhlIGluZGV4IEFNLgorCSAqCisJICogWFhYIE1heWJlIHRoaXMgc2hvdWxkIGJl IGEgc2VwYXJhdGUgc3RydWN0IGluc3RlYWQsIGFuZCB0aGUgc2NhbgorCSAqIGRlc2NyaXB0 b3Igd291bGQgaGF2ZSBvbmx5IGEgcG9pbnRlciwgaW5pdGlhbGl6ZWQgb25seSB3aGVuIHRo ZQorCSAqIGJhdGNoaW5nIGlzIGFjdHVhbGx5IHVzZWQ/CisJICoKKwkgKiBYWFggSXQncyBu b3QgcXVpdGUgY2xlYXIgd2hpY2ggcGFydCBvZiB0aGlzIGlzIG1hbmFnZWQgYnkgaW5kZXhh bSBhbmQKKwkgKiB3aGF0J3MgdXAgdG8gdGhlIGFjdHVhbCBpbmRleCBBTSBpbXBsZW1lbnRh dGlvbi4gTmVlZHMgc29tZSBjbGVhcmVyCisJICogYm91bmRhcmllcy4KKwkgKgorCSAqIFhY WCBTaG91bGQgd2UgaGF2ZSBhIHBvaW50ZXIgZm9yIG9wdGlvbmFsIHN0YXRlIG1hbmFnZWQg YnkgdGhlIEFNPyBTb21lCisJICogY3VzdG9tIEFNcyBtYXkgbmVlZCBtb3JlIHBlci1iYXRj aCBpbmZvcm1hdGlvbiwgbm90IGp1c3QgdGhlIGZpZWxkcyB3ZQorCSAqIGhhdmUgaGVyZS4K KwkgKi8KKwlzdHJ1Y3QKKwl7CisJCS8qIGJhdGNoIHNpemUgLSBtYXhpbXVtLCBpbml0aWFs LCBjdXJyZW50ICh3aXRoIHJhbXAgdXApICovCisJCWludAkJCW1heFNpemU7CisJCWludAkJ CWluaXRTaXplOworCQlpbnQJCQljdXJyU2l6ZTsKKworCQkvKiBiYXRjaCBwcmVmZXRjaGlu ZyAqLworCQlpbnQJCQlwcmVmZXRjaFRhcmdldDsgLyogY3VycmVudCBwcmVmZXRjaCBkaXN0 YW5jZSAqLworCQlpbnQJCQlwcmVmZXRjaE1heGltdW07CS8qIG1heGltdW0gcHJlZmV0Y2gg ZGlzdGFuY2UgKi8KKwkJaW50CQkJcHJlZmV0Y2hJbmRleDsJLyogbmV4dCBpdGVtIHRvIHBy ZWZldGNoICovCisKKwkJLyogcmFuZ2Ugb2YgbGVhZiBwYWdlIGl0ZW1zIGNvcGllZCBpbnRv IHRoZSBjdXJyZW50IGJhdGNoICovCisJCWludAkJCWZpcnN0SW5kZXg7CisJCWludAkJCWxh c3RJbmRleDsKKworCQkvKiBiYXRjaCBjb250ZW50cyAoVElEcywgaW5kZXggdHVwbGVzLCBr aWxsIGJpdG1hcCwgLi4uKSAqLworCQlpbnQJCQluaGVhcHRpZHM7CS8qIG51bWJlciBvZiBU SURzIGluIHRoZSBiYXRjaCAqLworCQlpbnQJCQljdXJySW5kZXg7CS8qIGluZGV4IG9mIHRo ZSBjdXJyZW50IGl0ZW0gKi8KKwkJSXRlbVBvaW50ZXJEYXRhICpoZWFwdGlkczsJLyogVElE cyBpbiB0aGUgYmF0Y2ggKi8KKwkJSW5kZXhUdXBsZSAqaXR1cHM7CQkvKiBJbmRleFR1cGxl cywgaWYgcmVxdWVzdGVkICovCisJCWJvb2wJICAgKmtpbGxlZEl0ZW1zOwkvKiBiaXRtYXAg b2YgdHVwbGVzIHRvIGtpbGwgKi8KKwkJRGF0dW0JICAgKnByaXZhdGVEYXRhOwkvKiBwcml2 YXRlIGRhdGEgZm9yIGJhdGNoICovCisJfQkJCXhzX2JhdGNoOworCiAJLyoKIAkgKiBXaGVu IGZldGNoaW5nIHdpdGggYW4gb3JkZXJpbmcgb3BlcmF0b3IsIHRoZSB2YWx1ZXMgb2YgdGhl IE9SREVSIEJZCiAJICogZXhwcmVzc2lvbnMgb2YgdGhlIGxhc3QgcmV0dXJuZWQgdHVwbGUs IGFjY29yZGluZyB0byB0aGUgaW5kZXguICBJZgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv bm9kZXMvZXhlY25vZGVzLmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9leGVjbm9kZXMuaAppbmRl eCBhZjdkOGZkMWU3Mi4uZmZhMDkyM2VkM2MgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25v ZGVzL2V4ZWNub2Rlcy5oCisrKyBiL3NyYy9pbmNsdWRlL25vZGVzL2V4ZWNub2Rlcy5oCkBA IC0xNjQ0LDYgKzE2NDQsNyBAQCB0eXBlZGVmIHN0cnVjdAogICoJCU9yZGVyQnlUeXBCeVZh bHMgICBpcyB0aGUgZGF0YXR5cGUgb2Ygb3JkZXIgYnkgZXhwcmVzc2lvbiBwYXNzLWJ5LXZh bHVlPwogICoJCU9yZGVyQnlUeXBMZW5zCSAgIHR5cGxlbnMgb2YgdGhlIGRhdGF0eXBlcyBv ZiBvcmRlciBieSBleHByZXNzaW9ucwogICoJCVBzY2FuTGVuCQkgICBzaXplIG9mIHBhcmFs bGVsIGluZGV4IHNjYW4gZGVzY3JpcHRvcgorICoJCUNhbkJhdGNoCQkgICBiYXRjaGluZyAo YW5kIHByZWZldGNoaW5nKSBlbmFibGVkCiAgKiAtLS0tLS0tLS0tLS0tLS0tCiAgKi8KIHR5 cGVkZWYgc3RydWN0IEluZGV4U2NhblN0YXRlCkBAIC0xNjcxLDYgKzE2NzIsMTAgQEAgdHlw ZWRlZiBzdHJ1Y3QgSW5kZXhTY2FuU3RhdGUKIAlib29sCSAgICppc3NfT3JkZXJCeVR5cEJ5 VmFsczsKIAlpbnQxNgkgICAqaXNzX09yZGVyQnlUeXBMZW5zOwogCVNpemUJCWlzc19Qc2Nh bkxlbjsKKworCS8qIGJhdGNoaW5nL3ByZWZldGNoaW5nIGVuYWJsZWQ/ICovCisJYm9vbAkJ aXNzX0NhbkJhdGNoOworCiB9IEluZGV4U2NhblN0YXRlOwogCiAvKiAtLS0tLS0tLS0tLS0t LS0tCkBAIC0xNjkyLDYgKzE2OTcsNyBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5TdGF0 ZQogICoJCVBzY2FuTGVuCQkgICBzaXplIG9mIHBhcmFsbGVsIGluZGV4LW9ubHkgc2NhbiBk ZXNjcmlwdG9yCiAgKgkJTmFtZUNTdHJpbmdBdHROdW1zIGF0dG51bXMgb2YgbmFtZSB0eXBl ZCBjb2x1bW5zIHRvIHBhZCB0byBOQU1FREFUQUxFTgogICoJCU5hbWVDU3RyaW5nQ291bnQg ICBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIE5hbWVDU3RyaW5nQXR0TnVtcyBhcnJheQor ICoJCUNhbkJhdGNoCQkgICBiYXRjaGluZyAoYW5kIHByZWZldGNoaW5nKSBlbmFibGVkCiAg KiAtLS0tLS0tLS0tLS0tLS0tCiAgKi8KIHR5cGVkZWYgc3RydWN0IEluZGV4T25seVNjYW5T dGF0ZQpAQCAtMTcxMyw2ICsxNzE5LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgSW5kZXhPbmx5U2Nh blN0YXRlCiAJU2l6ZQkJaW9zc19Qc2NhbkxlbjsKIAlBdHRyTnVtYmVyICppb3NzX05hbWVD U3RyaW5nQXR0TnVtczsKIAlpbnQJCQlpb3NzX05hbWVDU3RyaW5nQ291bnQ7CisJYm9vbAkJ aW9zc19DYW5CYXRjaDsKIH0gSW5kZXhPbmx5U2NhblN0YXRlOwogCiAvKiAtLS0tLS0tLS0t LS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdz Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0CmluZGV4IGZh ZDdmYzNhN2UwLi4xNGIzOGVkNGQ0NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9zeXN2aWV3cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9z eXN2aWV3cy5vdXQKQEAgLTE1Nyw2ICsxNTcsNyBAQCBzZWxlY3QgbmFtZSwgc2V0dGluZyBm cm9tIHBnX3NldHRpbmdzIHdoZXJlIG5hbWUgbGlrZSAnZW5hYmxlJSc7CiAgZW5hYmxlX2lu Y3JlbWVudGFsX3NvcnQgICAgICAgIHwgb24KICBlbmFibGVfaW5kZXhvbmx5c2NhbiAgICAg ICAgICAgfCBvbgogIGVuYWJsZV9pbmRleHNjYW4gICAgICAgICAgICAgICB8IG9uCisgZW5h YmxlX2luZGV4c2Nhbl9iYXRjaGluZyAgICAgIHwgb24KICBlbmFibGVfbWF0ZXJpYWwgICAg ICAgICAgICAgICAgfCBvbgogIGVuYWJsZV9tZW1vaXplICAgICAgICAgICAgICAgICB8IG9u CiAgZW5hYmxlX21lcmdlam9pbiAgICAgICAgICAgICAgIHwgb24KQEAgLTE3MCw3ICsxNzEs NyBAQCBzZWxlY3QgbmFtZSwgc2V0dGluZyBmcm9tIHBnX3NldHRpbmdzIHdoZXJlIG5hbWUg bGlrZSAnZW5hYmxlJSc7CiAgZW5hYmxlX3NlcXNjYW4gICAgICAgICAgICAgICAgIHwgb24K ICBlbmFibGVfc29ydCAgICAgICAgICAgICAgICAgICAgfCBvbgogIGVuYWJsZV90aWRzY2Fu ICAgICAgICAgICAgICAgICB8IG9uCi0oMjIgcm93cykKKygyMyByb3dzKQogCiAtLSBUaGVy ZSBhcmUgYWx3YXlzIHdhaXQgZXZlbnQgZGVzY3JpcHRpb25zIGZvciB2YXJpb3VzIHR5cGVz LiAgSW5qZWN0aW9uUG9pbnQKIC0tIG1heSBiZSBwcmVzZW50IG9yIGFic2VudCwgZGVwZW5k aW5nIG9uIGhpc3Rvcnkgc2luY2UgbGFzdCBwb3N0bWFzdGVyIHN0YXJ0LgotLSAKMi40Ni4w Cgo= --------------qQktLOnZJ105OojbhJsWMB4K--