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 1rC2Ef-00DWZZ-BG for pgsql-hackers@arkaria.postgresql.org; Sat, 09 Dec 2023 18:39:34 +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 1rC2Ed-002VR2-LJ for pgsql-hackers@arkaria.postgresql.org; Sat, 09 Dec 2023 18:39:31 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rC2Ec-002VQt-Fj for pgsql-hackers@lists.postgresql.org; Sat, 09 Dec 2023 18:39:31 +0000 Received: from mail-ua1-x92f.google.com ([2607:f8b0:4864:20::92f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rC2EY-009bdp-Ak for pgsql-hackers@lists.postgresql.org; Sat, 09 Dec 2023 18:39:28 +0000 Received: by mail-ua1-x92f.google.com with SMTP id a1e0cc1a2514c-7c59ac49f12so1713484241.1 for ; Sat, 09 Dec 2023 10:39:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1702147165; x=1702751965; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=7S7U8gLIN6cjqJC0c9sH9LgPfc4byZP/QGaOJcTgGiY=; b=rl/Z9zquzC4EerQ3Jsld5T3ZnXjFzPy9ktcNpddr1M+3MQpeeUCKD1GDKYLpkH8Aba G5wZvO/JXO//5amC/hkFfy9wWtKo1iGTY4BtzxzptzYMSKmK+590dwbiL+KFM6wPdBDP JpoPerFG7lX9GnytuuDNoXyMHMMCYYHSZHWT3vCp5kJOJjLRX8ccYY6ZJ+/TsixmsBiB uE+WqaSsjLkqwK6wvxtkO3shLS53wiG5afroMlH0v+lizvw8ly2A8ZNOidT/VcFzPqnM vd9fbap3/unjnixMTZf85C/+Gdo8UJo33Woze6MrUbAR14QX9YxbFwb8U/Ka/1Vm/2+j 6NYQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1702147165; x=1702751965; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=7S7U8gLIN6cjqJC0c9sH9LgPfc4byZP/QGaOJcTgGiY=; b=u4mkYR0ag+sybR3RxP05mZYF1FGWg4S4sCy7qV9leBTb3PQoSExZZZtMsC+W3UJllH ZUwIjS6sdez2dMv/ycv5fXtodTuCWvqRzP7hTEIMaFcr4COvwg/Ic37fofDlKoNlWpUm n9J+VYTqHLqJTDdO83+K64tfTFdMEvmEz4A4WIaOnI7O/VQ6MsDPgtsXf5ncGTv8/+uZ xPPZdqGBmSHQlGgCOuKPrhb3aF2M+zEyaRJNyfsTM7c2Xq5BOdClCIeKERsovrFsoHGP B+N+cKaljC1pibXvRzQ3/DUAVZ4bXp0yTOy7KqtD1hTgDult44glZSgxtgjdZBjMcWVS 8ppQ== X-Gm-Message-State: AOJu0Yyz1CpO9Vc8uDjvaclZtw2HZkotE0ni2PHxOKgaFnqZUgPfKAWt 1NktRhmwyq8LnMVeMCzlO2j7+c7vehF6qfYbwS9Vdg== X-Google-Smtp-Source: AGHT+IHYKtRbhtOMlA59bKZ6GL0nE1NxNPKU7PM294U59XsDZw+eQ//AUu8CFAsiC9OPU6hN4YgzEkW+vNkNvE9FsHI= X-Received: by 2002:a05:6102:304d:b0:466:101:1849 with SMTP id w13-20020a056102304d00b0046601011849mr1743776vsa.7.1702147164818; Sat, 09 Dec 2023 10:39:24 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Sat, 9 Dec 2023 10:38:57 -0800 Message-ID: Subject: Re: Optimizing nbtree ScalarArrayOp execution, allowing multi-column ordered scans, skip scan To: Matthias van de Meent Cc: PostgreSQL Hackers , Tom Lane , Tomas Vondra , Jeff Davis , benoit , Alexander Korotkov , Heikki Linnakangas Content-Type: multipart/mixed; boundary="0000000000001d893b060c18059d" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000001d893b060c18059d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Nov 20, 2023 at 6:52=E2=80=AFPM Peter Geoghegan wrote: > It should be noted that the patch isn't strictly guaranteed to always > read fewer index pages than master, for a given query plan and index. > This is by design. Though the patch comes close, it's not quite a > certainty. There are known cases where the patch reads the occasional > extra page (relative to what master would have done under the same > circumstances). These are cases where the implementation just cannot > know for sure whether the next/sibling leaf page has key space covered > by any of the scan's array keys (at least not in a way that seems > practical). The implementation has simple heuristics that infer (a > polite word for "make an educated guess") about what will be found on > the next page. Theoretically we could be more conservative in how we > go about this, but that seems like a bad idea to me. It's really easy > to find cases where the maximally conservative approach loses by a > lot, and really hard to show cases where it wins at all. Attached is v8, which pretty much rips all of this stuff out. I definitely had a point when I said that it made sense to be optimistic about finding matches on the next page in respect of any truncated -inf attributes in high keys, though. And so we still do that much in v8. But, there is no reason why we need to go any further than that -- there is no reason why we should *also* be optimistic about *untruncated* high key/finaltup attributes that *aren't* exact matches for any of the scan's required array keys finding exact matches once we move onto the next sibling page. I reached this conclusion when working on a fix for the low cardinality index regression that Tomas' tests brought to my attention [1]. I started out with the intention of just fixing that one case, in a very targeted way, but quickly realized that it made almost no sense to just limit myself to the low cardinality cases. Even with Tomas' problematic low cardinality test cases, I saw untruncated high key attributes that were "close by to matching tuples" -- they just weren't close enough (i.e. exactly on the next leaf page) for us to actually win (so v7 lost). Being almost correct again and again, but still losing again and again is a good sign that certain basic assumptions were faulty (at least if it's realistic, which it was in this instance). To be clear, and to repeat, even in v8 we'll still "make guesses" about -inf truncated attributes. But it's a much more limited form of guessing. If we didn't at least do the -inf thing, then backwards scans would weirdly work better than forward scans in some cases -- a particular concern with queries that have index quals for each of multiple columns. I don't think that this remaining "speculative" behavior needs to be discussed at very much length in code comments, though. That's why v8 is a great deal simpler than v7 was here. No more huge comment block at the end of the new _bt_checkkeys. Notable stuff that *hasn't* changed from v7: I'm posting this v8 having not yet worked through all of Heikki's feedback. In particular, v8 doesn't deal with the relatively hard question of what to do about the optimizations added by Alexander Korotkov's commit e0b1ee17 (should I keep them disabled, selectively re-enable one or both optimizations, or something else?). This is partly due to at least one of the optimizations having problems of their own that are still outstanding [2]. I also wanted to get a revision out before travelling to Prague for PGConf.EU, which will be followed by other Christmas travel. That's likely to keep me away from the patch for weeks (that, plus I'm moving to NYC in early January). So I just ran out of time to do absolutely everything. Other notable changes: * Bug fixes for cases where the array state machine gets confused by a change in the scan direction, plus similar cases involving mark and restore processing. I'm not entirely happy with my approach here (mostly referring to the new code in _bt_steppage here). Feels like it needs to be a little better integrated with mark/restore processing. No doubt Heikki will have his own doubts about this. I've included my test cases for the issues in this area. The problems are really hard to reproduce, and writing these tests took a surprisingly large amount of effort. The tests might not be suitable for commit, but you really need to see the test cases to be able to review the code efficiently. It's just fiddly. * I've managed to make the array state machine just a little more streamlined compared to v7. Minor code polishing, not really worth describing in detail. * Addressed concerns about incomplete opfamilies not working with the patch by updating the error message within _bt_preprocess_array_keys/_bt_sort_array_cmp_setup. It now exactly matches the similar one in _bt_first. I don't think that we need any new opr_sanity tests, since we already have one for this. Making the error message match the one in _bt_first ensures that anybody that runs into a problem here will see the same error message that they'd have seen on earlier versions, anyway. It's a more useful error compared to the one from v7 (in that it names the index and its attribute directly). Plus it's good to be consistent. I don't see any potential for the underlying _bt_sort_array_cmp_setup behavior to be seen as a regression, in terms of our ability to cope with incomplete opfamilies (compared to earlier Postgres versions). Opfamilies that lack a cross-type ORDER proc mixed with queries that use the corresponding cross-type =3D operator were always very dicey. That situation isn't meaningfully different with the patch. (Actually, this isn't 100% true in the case of queries + indexes with non-required arrays specifically -- they'll need a 3-way comparator in _bt_preprocess_array_keys/_bt_sort_array_cmp_setup, and yet *won't* need one moments later, in _bt_first. This is because non-required scan keys don't end up in _bt_first's insertion scan key at all, in general. This distinction just seems pedantic, though. We're talking about a case where things accidentally failed to fail in previous versions, for some queries but not most queries. Now it'll fail in exactly the same way in slightly more cases. In reality, affected opfamilies are practically non-existent, so this is a hypothetical upon a hypothetical.) [1] https://postgr.es/m/CAH2-WzmtV7XEWxf_rP1pw=3DvyDjGLi__zGOy6Me5MovR3e1kf= dg@mail.gmail.com [2] https://postgr.es/m/CAH2-Wzn0LeLcb1PdBnK0xisz8NpHkxRrMr3NWJ+KOK-WZ+QtTQ= @mail.gmail.com -- Peter Geoghegan --0000000000001d893b060c18059d Content-Type: application/octet-stream; name="v8-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Disposition: attachment; filename="v8-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lpydi3u20 RnJvbSA5NDdmNmM5MjcyYWIzNmZmODU4ZWUwNTY4YzFmNTFkMzZiMWMyZjE5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFNh dCwgMTcgSnVuIDIwMjMgMTc6MDM6MzYgLTA3MDAKU3ViamVjdDogW1BBVENIIHY4XSBFbmhhbmNl IG5idHJlZSBTY2FsYXJBcnJheU9wIGV4ZWN1dGlvbi4KCkNvbW1pdCA5ZThkYTBmNyB0YXVnaHQg bmJ0cmVlIHRvIGhhbmRsZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscwpuYXRpdmVseS4gIFRoaXMg d29ya3MgYnkgcHVzaGluZyBkb3duIHRoZSBmdWxsIGNvbnRleHQgKHRoZSBhcnJheSBrZXlzKQp0 byB0aGUgbmJ0cmVlIGluZGV4IEFNLCBlbmFibGluZyBpdCB0byBleGVjdXRlIG11bHRpcGxlIHBy aW1pdGl2ZSBpbmRleApzY2FucyB0aGF0IHRoZSBwbGFubmVyIHRyZWF0cyBhcyBvbmUgY29udGlu dW91cyBpbmRleCBzY2FuL2luZGV4IHBhdGguClRoaXMgZWFybGllciBlbmhhbmNlbWVudCBlbmFi bGVkIG5idHJlZSBTY2FsYXJBcnJheU9wIGluZGV4LW9ubHkgc2NhbnMuCkl0IGFsc28gYWxsb3dl ZCBzY2FucyB3aXRoIFNjYWxhckFycmF5T3AgcXVhbHMgdG8gcmV0dXJuIG9yZGVyZWQgcmVzdWx0 cwood2l0aCBzb21lIG5vdGFibGUgcmVzdHJpY3Rpb25zLCBkZXNjcmliZWQgZnVydGhlciBkb3du KS4KClRha2UgdGhpcyBnZW5lcmFsIGFwcHJvYWNoIGEgbG90IGZ1cnRoZXI6IHRlYWNoIG5idHJl ZSBTQU9QIGluZGV4IHNjYW5zCnRvIGRldGVybWluZSBob3cgYmVzdCB0byBleGVjdXRlIFNjYWxh ckFycmF5T3Agc2NhbnMgKGhvdyBtYW55IHByaW1pdGl2ZQppbmRleCBzY2FucyB0byB1c2UgdW5k ZXIgdGhlIGhvb2QpIGJ5IGFwcGx5aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZQpwaHlzaWNhbCBj aGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGluZGV4IGF0IHJ1bnRpbWUuICBUaGlzIGFwcHJvYWNoIGNh biBiZQpmYXIgbW9yZSBlZmZpY2llbnQuICBNYW55IGNhc2VzIHRoYXQgcHJldmlvdXNseSByZXF1 aXJlZCB0aG91c2FuZHMgb2YKaW5kZXggZGVzY2VudHMgbm93IHJlcXVpcmUgYXMgZmV3IGFzIG9u ZSBzaW5nbGUgaW5kZXggZGVzY2VudC4gIEFuZCwgYWxsClNBT1Agc2NhbnMgcmVsaWFibHkgYXZv aWQgZHVwbGljYXRpdmUgbGVhZiBwYWdlIGFjY2Vzc2VzIChqdXN0IGxpa2UgYW55Cm90aGVyIG5i dHJlZSBpbmRleCBzY2FuKS4KClRoZSBhcnJheSBzdGF0ZSBtYWNoaW5lIG5vdyBhZHZhbmNlcyB1 c2luZyBiaW5hcnkgc2VhcmNoZXMgZm9yIHRoZSBhcnJheQplbGVtZW50IHRoYXQgYmVzdCBtYXRj aGVzIHRoZSBuZXh0IHR1cGxlJ3MgYXR0cmlidXRlIHZhbHVlLiAgVGhpcyB3aG9sZQpwcm9jZXNz IG1ha2VzIHJlcXVpcmVkIHNjYW4ga2V5IGFycmF5cyAoaS5lLiBhcnJheXMgZnJvbSBzY2FuIGtl eXMgdGhhdApjYW4gdGVybWluYXRlIHRoZSBzY2FuKSByYXRjaGV0IGZvcndhcmQgaW4gbG9ja3N0 ZXAgd2l0aCB0aGUgaW5kZXggc2Nhbi4KTm9uLXJlcXVpcmVkIGFycmF5cyAoaS5lLiBhcnJheXMg ZnJvbSBzY2FuIGtleXMgdGhhdCBjYW4gb25seSBleGNsdWRlCm5vbi1tYXRjaGluZyB0dXBsZXMp IGFyZSBmb3IgdGhlIG1vc3QgcGFydCBhZHZhbmNlZCB2aWEgdGhpcyBzYW1lIHNlYXJjaApwcm9j ZXNzLiAgV2UganVzdCBjYW4ndCBhc3N1bWUgYSBmaXhlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiB0 aGUgY3VycmVudAplbGVtZW50IG9mIGFueSBub24tcmVxdWlyZWQgYXJyYXkgYW5kIHRoZSBwcm9n cmVzcyBvZiB0aGUgaW5kZXggc2Nhbgp0aHJvdWdoIHRoZSBpbmRleCdzIGtleSBzcGFjZSAodGhh dCB3b3VsZCBiZSB3cm9uZykuCgpOYXR1cmFsbHksIG9ubHkgcmVxdWlyZWQgU0FPUCBzY2FuIGtl eXMgdHJpZ2dlciBza2lwcGluZyBvdmVyIGxlYWYgcGFnZXMKKG5vbi1yZXF1aXJlZCBhcnJheXMg Y2Fubm90IHNhZmVseSBlbmQgb3Igc3RhcnQgcHJpbWl0aXZlIGluZGV4IHNjYW5zKS4KQ29uc2Vx dWVudGx5LCBpbmRleCBzY2FucyBvZiBhIGNvbXBvc2l0ZSBpbmRleCB3aXRoIChzYXkpIGEgaGln aC1vcmRlcgppbmVxdWFsaXR5IHNjYW4ga2V5ICh3aGljaCB3ZSdsbCBtYXJrIHJlcXVpcmVkKSBh bmQgYSBsb3ctb3JkZXIgU0FPUApzY2FuIGtleSAod2hpY2ggd2UnbGwgbWFyayBub24tcmVxdWly ZWQpIHdpbGwgbm93IHJlbGlhYmx5IG91dHB1dCByb3dzCmluIGluZGV4IG9yZGVyLiAgU3VjaCBz Y2FucyBhcmUgYWx3YXlzIGV4ZWN1dGVkIGFzIG9uZSBsYXJnZSBpbmRleCBzY2FuCnVuZGVyIHRo ZSBob29kLCB3aGljaCBpcyBvYnZpb3VzbHkgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBkbyBp dCwgZm9yCnRoZSB1c3VhbCByZWFzb24gKG5vIG1vcmUgd2FzdGluZyBjeWNsZXMgb24gcmVwZWF0 IGxlYWYgcGFnZSBhY2Nlc3NlcykuCkdlbmVyYWxpemluZyBTQU9QIGV4ZWN1dGlvbiBhbG9uZyB0 aGVzZSBsaW5lcyByZW1vdmVzIGFueSBxdWVzdGlvbiBvZgppbmRleCBzY2FucyBvdXRwdXR0aW5n IHR1cGxlcyBpbiBhbnkgb3JkZXIgdGhhdCBpc24ndCB0aGUgaW5kZXgncyBvcmRlci4KVGhpcyBh bGxvdyB1cyB0byByZW1vdmUgdmFyaW91cyBzcGVjaWFsIGNhc2VzIGZyb20gdGhlIHBsYW5uZXIg LS0gd2hpY2gKaW4gdHVybiBtYWtlcyB0aGUgbmJ0cmVlIHdvcmsgbW9yZSB3aWRlbHkgYXBwbGlj YWJsZSBhbmQgbW9yZSBlZmZlY3RpdmUuCgpCdWdmaXggY29tbWl0IDgwN2E0MGM1IHRhdWdodCB0 aGUgcGxhbm5lciB0byBhdm9pZCBnZW5lcmF0aW5nIHVuc2FmZQpwYXRoIGtleXM6IHBhdGgga2V5 cyBvbiBhIG11bHRpY29sdW1uIGluZGV4IHBhdGgsIHdpdGggYSBTQU9QIGNsYXVzZSBvbgphbnkg YXR0cmlidXRlIGJleW9uZCB0aGUgZmlyc3QvbW9zdCBzaWduaWZpY2FudCBhdHRyaWJ1dGUuICBU aGVzZSBjYXNlcwphcmUgbm93IGFsbCBzYWZlLCBzbyB3ZSBnbyBiYWNrIHRvIGdlbmVyYXRpbmcg cGF0aCBrZXlzIHdpdGhvdXQgcmVnYXJkCmZvciB0aGUgcHJlc2VuY2Ugb2YgU0FPUCBjbGF1c2Vz IChqdXN0IGxpa2Ugd2l0aCBhbnkgb3RoZXIgY2xhdXNlIHR5cGUpLgpBbHNvIHVuZG8gY2hhbmdl cyBmcm9tIGZvbGxvdy11cCBidWdmaXggY29tbWl0IGE0NTIzYzVhLCB3aGljaCB0YXVnaHQKdGhl IHBsYW5uZXIgdG8gcHJvZHVjZSBhbHRlcm5hdGl2ZSBpbmRleCBwYXRocyB3aXRob3V0IGFueSBs b3ctb3JkZXIKU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMgKG1ha2luZyB0aGUgU0FPUCBxdWFscyBp bnRvIGZpbHRlciBxdWFscykuCldlJ2xsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGVzZSBhbHRlcm5h dGl2ZSBwYXRocywgd2hpY2ggY2FuIG5vIGxvbmdlcgpvZmZlciBhbnkgYWR2YW50YWdlIG92ZXIg dGhlIGluZGV4IHF1YWwgcGF0aHMgdGhhdCB3ZSBkbyBzdGlsbCBnZW5lcmF0ZS4KCkFmZmVjdGVk IHF1ZXJpZXMgdGhlcmVieSBhdm9pZCBhbGwgb2YgdGhlIGRpc2FkdmFudGFnZXMgdGhhdCBjb21l IGZyb20KdXNpbmcgZmlsdGVyIHF1YWxzIHdpdGhpbiBpbmRleCBzY2FuIG5vZGVzLiAgSW4gcGFy dGljdWxhciwgdGhleSBjYW4KYXZvaWQgdGhlIGV4dHJhIGhlYXAgcGFnZSBhY2Nlc3NlcyBwcmV2 aW91c2x5IGluY3VycmVkIHdoZW4gdXNpbmcgZmlsdGVyCnF1YWxzIHRvIGV4Y2x1ZGUgbm9uLW1h dGNoaW5nIHR1cGxlcyAoaW5kZXggcXVhbHMgY2FuIGJlIHVzZWQgaW5zdGVhZCkuClRoaXMgc2hp ZnQgaXMgZXhwZWN0ZWQgdG8gYmUgZmFpcmx5IGNvbW1vbiBpbiByZWFsIHdvcmxkIGFwcGxpY2F0 aW9ucywKZXNwZWNpYWxseSB3aXRoIHF1ZXJpZXMgdGhhdCBoYXZlIG11bHRpcGxlIFNBT1BzIHRo YXQgY2FuIG5vdyBhbGwgYmUKdXNlZCBhcyBpbmRleCBxdWFscyB3aGVuIHNjYW5uaW5nIGEgY29t cG9zaXRlIGluZGV4LiAgUXVlcmllcyB3aXRoCmxvdy1vcmRlciBTQU9QcyAoZXNwZWNpYWxseSBu b24tcmVxdWlyZWQgb25lcykgYXJlIGFsc28gbGlrZWx5IHRvIHNlZSBhCnNpZ25pZmljYW50IHJl ZHVjdGlvbiBpbiBoZWFwIHBhZ2UgYWNjZXNzZXMuCgpBdXRob3I6IFBldGVyIEdlb2doZWdhbiA8 cGdAYm93dC5pZT4KUmV2aWV3ZWQtQnk6IEhlaWtraSBMaW5uYWthbmdhcyA8aGxpbm5ha2FAaWtp LmZpPgpSZXZpZXdlZC1CeTogTWF0dGhpYXMgdmFuIGRlIE1lZW50IDxib2VrZXd1cm0rcG9zdGdy ZXNAZ21haWwuY29tPgpSZXZpZXdlZC1CeTogVG9tYXMgVm9uZHJhIDx0b21hcy52b25kcmFAZW50 ZXJwcmlzZWRiLmNvbT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9DQUgyLVd6PWtz dk5fc2pjbkQxK0J0LVd0aWZSQTVvazQ4YURZbnEzcGtLaHhnTVFwY3dAbWFpbC5nbWFpbC5jb20K LS0tCiBzcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmggICAgICAgICAgICAgICAgfCAgIDQ3ICst CiBzcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJlZS5jICAgICAgICAgfCAgIDgwICstCiBz cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jICAgICAgfCAgMTE5ICstCiBzcmMv YmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMgICAgICAgfCAxODE0ICsrKysrKysrKysr KysrKysrKy0tCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jICAgICAgfCAg IDg2ICstCiBzcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYyAgICAgICAgICAgfCAgMTIy ICstCiBkb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sICAgICAgICAgICAgICAgfCAgIDE1ICsK IHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvYnRyZWVfaW5kZXgub3V0ICB8ICA0NzkgKysrKysr CiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQgfCAgIDMxICstCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0ICAgICAgICAgfCAgICA1ICstCiBzcmMv dGVzdC9yZWdyZXNzL3NxbC9idHJlZV9pbmRleC5zcWwgICAgICAgfCAgMTQ3ICsrCiBzcmMvdGVz dC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsICAgICAgfCAgIDEwICstCiAxMiBmaWxlcyBj aGFuZ2VkLCAyNTk5IGluc2VydGlvbnMoKyksIDM1NiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVl LmgKaW5kZXggNWUwODM1OTFhLi5lZTE1YjBmOTMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9uYnRyZWUuaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKQEAgLTk2MCw3 ICs5NjAsNyBAQCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5Qb3NEYXRhCiAJICogbW9yZUxlZnQgYW5k IG1vcmVSaWdodCB0cmFjayB3aGV0aGVyIHdlIHRoaW5rIHRoZXJlIG1heSBiZSBtYXRjaGluZwog CSAqIGluZGV4IGVudHJpZXMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IG9mIHRoZSBjdXJyZW50IHBh Z2UsIHJlc3BlY3RpdmVseS4KIAkgKiBXZSBjYW4gY2xlYXIgdGhlIGFwcHJvcHJpYXRlIG9uZSBv ZiB0aGVzZSBmbGFncyB3aGVuIF9idF9jaGVja2tleXMoKQotCSAqIHJldHVybnMgY29udGludWVz Y2FuID0gZmFsc2UuCisJICogc2V0cyBCVFJlYWRQYWdlU3RhdGUuY29udGludWVzY2FuID0gZmFs c2UuCiAJICovCiAJYm9vbAkJbW9yZUxlZnQ7CiAJYm9vbAkJbW9yZVJpZ2h0OwpAQCAtMTAyNCw3 ICsxMDI0LDYgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRBcnJheUtleUluZm8KIHsKIAlpbnQJCQlzY2Fu X2tleTsJCS8qIGluZGV4IG9mIGFzc29jaWF0ZWQga2V5IGluIGFycmF5S2V5RGF0YSAqLwogCWlu dAkJCWN1cl9lbGVtOwkJLyogaW5kZXggb2YgY3VycmVudCBlbGVtZW50IGluIGVsZW1fdmFsdWVz ICovCi0JaW50CQkJbWFya19lbGVtOwkJLyogaW5kZXggb2YgbWFya2VkIGVsZW1lbnQgaW4gZWxl bV92YWx1ZXMgKi8KIAlpbnQJCQludW1fZWxlbXM7CQkvKiBudW1iZXIgb2YgZWxlbXMgaW4gY3Vy cmVudCBhcnJheSB2YWx1ZSAqLwogCURhdHVtCSAgICplbGVtX3ZhbHVlczsJLyogYXJyYXkgb2Yg bnVtX2VsZW1zIERhdHVtcyAqLwogfSBCVEFycmF5S2V5SW5mbzsKQEAgLTEwMzgsMTMgKzEwMzcs MTQgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRTY2FuT3BhcXVlRGF0YQogCiAJLyogd29ya3NwYWNlIGZv ciBTS19TRUFSQ0hBUlJBWSBzdXBwb3J0ICovCiAJU2NhbktleQkJYXJyYXlLZXlEYXRhOwkvKiBt b2RpZmllZCBjb3B5IG9mIHNjYW4tPmtleURhdGEgKi8KLQlib29sCQlhcnJheXNTdGFydGVkOwkv KiBTdGFydGVkIGFycmF5IGtleXMsIGJ1dCBoYXZlIHlldCB0byAicmVhY2gKLQkJCQkJCQkJICog cGFzdCB0aGUgZW5kIiBvZiBhbGwgYXJyYXlzPyAqLwogCWludAkJCW51bUFycmF5S2V5czsJLyog bnVtYmVyIG9mIGVxdWFsaXR5LXR5cGUgYXJyYXkga2V5cyAoLTEgaWYKIAkJCQkJCQkJICogdGhl cmUgYXJlIGFueSB1bnNhdGlzZmlhYmxlIGFycmF5IGtleXMpICovCi0JaW50CQkJYXJyYXlLZXlD b3VudDsJLyogY291bnQgaW5kaWNhdGluZyBudW1iZXIgb2YgYXJyYXkgc2NhbiBrZXlzCi0JCQkJ CQkJCSAqIHByb2Nlc3NlZCAqLworCVNjYW5EaXJlY3Rpb24gYWR2YW5jZURpcjsJLyogU2NhbiBk aXJlY3Rpb24gd2hlbiBhcnJheXMgbGFzdCBhZHZhbmNlZCAqLworCWJvb2wJCW5lZWRQcmltU2Nh bjsJLyogTmVlZCBwcmltc2NhbiB0byBjb250aW51ZSBpbiBhZHZhbmNlRGlyPyAqLwogCUJUQXJy YXlLZXlJbmZvICphcnJheUtleXM7CS8qIGluZm8gYWJvdXQgZWFjaCBlcXVhbGl0eS10eXBlIGFy cmF5IGtleSAqLworCUZtZ3JJbmZvICAgKm9yZGVyUHJvY3M7CQkvKiBPUkRFUiBwcm9jcyBmb3Ig ZXF1YWxpdHkgY29uc3RyYWludCBrZXlzICovCisJaW50CQkJbnVtUHJpbVNjYW5zOwkvKiBSdW5u aW5nIHRhbGx5IG9mICMgcHJpbWl0aXZlIGluZGV4IHNjYW5zCisJCQkJCQkJCSAqICh1c2VkIHRv IGNvb3JkaW5hdGUgcGFyYWxsZWwgd29ya2VycykgKi8KIAlNZW1vcnlDb250ZXh0IGFycmF5Q29u dGV4dDsgLyogc2Nhbi1saWZlc3BhbiBjb250ZXh0IGZvciBhcnJheSBkYXRhICovCiAKIAkvKiBp bmZvIGFib3V0IGtpbGxlZCBpdGVtcyBpZiBhbnkgKGtpbGxlZEl0ZW1zIGlzIE5VTEwgaWYgbmV2 ZXIgdXNlZCkgKi8KQEAgLTEwNzgsNiArMTA3OCwyOSBAQCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5P cGFxdWVEYXRhCiAKIHR5cGVkZWYgQlRTY2FuT3BhcXVlRGF0YSAqQlRTY2FuT3BhcXVlOwogCisv KgorICogX2J0X3JlYWRwYWdlIHN0YXRlIHVzZWQgYWNyb3NzIF9idF9jaGVja2tleXMgY2FsbHMg Zm9yIGEgcGFnZQorICoKKyAqIFdoZW4gX2J0X3JlYWRwYWdlIGlzIGNhbGxlZCBkdXJpbmcgYSBm b3J3YXJkIHNjYW4gdGhhdCBoYXMgb25lIG9yIG1vcmUKKyAqIGVxdWFsaXR5LXR5cGUgU0tfU0VB UkNIQVJSQVkgc2NhbiBrZXlzLCBpdCBoYXMgYW4gZXh0cmEgcmVzcG9uc2liaWxpdHk6IHRvCisg KiBzZXQgdXAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbmFsIHR1cGxlIGZyb20gdGhlIHBhZ2Uu ICBUaGlzIG11c3QgaGFwcGVuCisgKiBiZWZvcmUgdGhlIGZpcnN0IGNhbGwgdG8gX2J0X2NoZWNr a2V5cy4gIF9idF9jaGVja2tleXMgdXNlcyB0aGUgZmluYWwgdHVwbGUKKyAqIHRvIG1hbmFnZSBh ZHZhbmNlbWVudCBvZiB0aGUgc2NhbidzIGFycmF5IGtleXMgbW9yZSBlZmZpY2llbnRseS4KKyAq LwordHlwZWRlZiBzdHJ1Y3QgQlRSZWFkUGFnZVN0YXRlCit7CisJLyogSW5wdXQgcGFyYW1ldGVy cywgc2V0IGJ5IF9idF9yZWFkcGFnZSAqLworCVNjYW5EaXJlY3Rpb24gZGlyOwkJCS8qIGN1cnJl bnQgc2NhbiBkaXJlY3Rpb24gKi8KKwlJbmRleFR1cGxlCWZpbmFsdHVwOwkJLyogZmluYWwgdHVw bGUgKGhpZ2gga2V5IGZvciBmb3J3YXJkIHNjYW5zKSAqLworCisJLyogT3V0cHV0IHBhcmFtZXRl cnMsIHNldCBieSBfYnRfY2hlY2trZXlzICovCisJYm9vbAkJY29udGludWVzY2FuOwkvKiBUZXJt aW5hdGUgb25nb2luZyAocHJpbWl0aXZlKSBpbmRleCBzY2FuPyAqLworCisJLyogUHJpdmF0ZSBf YnRfY2hlY2trZXlzLW1hbmFnZWQgc3RhdGUgKi8KKwlib29sCQlmaW5hbHR1cGNoZWNrZWQ7CS8q IGZpbmFsIHR1cGxlIGNoZWNrZWQgYWdhaW5zdCBjdXJyZW50CisJCQkJCQkJCQkgKiBTS19TRUFS Q0hBUlJBWSBhcnJheSBrZXlzPyAqLworfSBCVFJlYWRQYWdlU3RhdGU7CisKIC8qCiAgKiBXZSB1 c2Ugc29tZSBwcml2YXRlIHNrX2ZsYWdzIGJpdHMgaW4gcHJlcHJvY2Vzc2VkIHNjYW4ga2V5cy4g IFdlJ3JlIGFsbG93ZWQKICAqIHRvIHVzZSBiaXRzIDE2LTMxIChzZWUgc2tleS5oKS4gIFRoZSB1 cHBlcm1vc3QgYml0cyBhcmUgY29waWVkIGZyb20gdGhlCkBAIC0xMDg1LDYgKzExMDgsNyBAQCB0 eXBlZGVmIEJUU2Nhbk9wYXF1ZURhdGEgKkJUU2Nhbk9wYXF1ZTsKICAqLwogI2RlZmluZSBTS19C VF9SRVFGV0QJMHgwMDAxMDAwMAkvKiByZXF1aXJlZCB0byBjb250aW51ZSBmb3J3YXJkIHNjYW4g Ki8KICNkZWZpbmUgU0tfQlRfUkVRQktXRAkweDAwMDIwMDAwCS8qIHJlcXVpcmVkIHRvIGNvbnRp bnVlIGJhY2t3YXJkIHNjYW4gKi8KKyNkZWZpbmUgU0tfQlRfUkRETkFSUkFZCTB4MDAwNDAwMDAJ LyogcmVkdW5kYW50IGluIGFycmF5IHByZXByb2Nlc3NpbmcgKi8KICNkZWZpbmUgU0tfQlRfSU5E T1BUSU9OX1NISUZUICAyNAkvKiBtdXN0IGNsZWFyIHRoZSBhYm92ZSBiaXRzICovCiAjZGVmaW5l IFNLX0JUX0RFU0MJCQkoSU5ET1BUSU9OX0RFU0MgPDwgU0tfQlRfSU5ET1BUSU9OX1NISUZUKQog I2RlZmluZSBTS19CVF9OVUxMU19GSVJTVAkoSU5ET1BUSU9OX05VTExTX0ZJUlNUIDw8IFNLX0JU X0lORE9QVElPTl9TSElGVCkKQEAgLTExNTUsNyArMTE3OSw3IEBAIGV4dGVybiBib29sIGJ0Y2Fu cmV0dXJuKFJlbGF0aW9uIGluZGV4LCBpbnQgYXR0bm8pOwogZXh0ZXJuIGJvb2wgX2J0X3BhcmFs bGVsX3NlaXplKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgKnBhZ2Vubyk7CiBleHRl cm4gdm9pZCBfYnRfcGFyYWxsZWxfcmVsZWFzZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVt YmVyIHNjYW5fcGFnZSk7CiBleHRlcm4gdm9pZCBfYnRfcGFyYWxsZWxfZG9uZShJbmRleFNjYW5E ZXNjIHNjYW4pOwotZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhJ bmRleFNjYW5EZXNjIHNjYW4pOworZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX25leHRfcHJpbWl0 aXZlX3NjYW4oSW5kZXhTY2FuRGVzYyBzY2FuKTsKIAogLyoKICAqIHByb3RvdHlwZXMgZm9yIGZ1 bmN0aW9ucyBpbiBuYnRkZWR1cC5jCkBAIC0xMjQ4LDEyICsxMjcyLDExIEBAIGV4dGVybiBCVFNj YW5JbnNlcnQgX2J0X21rc2NhbmtleShSZWxhdGlvbiByZWwsIEluZGV4VHVwbGUgaXR1cCk7CiBl eHRlcm4gdm9pZCBfYnRfZnJlZXN0YWNrKEJUU3RhY2sgc3RhY2spOwogZXh0ZXJuIHZvaWQgX2J0 X3ByZXByb2Nlc3NfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pOwogZXh0ZXJuIHZvaWQg X2J0X3N0YXJ0X2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRp cik7Ci1leHRlcm4gYm9vbCBfYnRfYWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2Nh biwgU2NhbkRpcmVjdGlvbiBkaXIpOwotZXh0ZXJuIHZvaWQgX2J0X21hcmtfYXJyYXlfa2V5cyhJ bmRleFNjYW5EZXNjIHNjYW4pOwotZXh0ZXJuIHZvaWQgX2J0X3Jlc3RvcmVfYXJyYXlfa2V5cyhJ bmRleFNjYW5EZXNjIHNjYW4pOworZXh0ZXJuIGJvb2wgX2J0X2FycmF5X2tleXNfcmVtYWluKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpOworZXh0ZXJuIHZvaWQgX2J0X3Jl d2luZF9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBleHRlcm4gdm9pZCBfYnRfcHJl cHJvY2Vzc19rZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbik7Ci1leHRlcm4gYm9vbCBfYnRfY2hlY2tr ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwKLQkJCQkJCSAgaW50IHR1 cG5hdHRzLCBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCAqY29udGludWVzY2FuLAorZXh0ZXJuIGJv b2wgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0 YXRlLAorCQkJCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29sIGZpbmFsdHVwLCBpbnQgdHVwbmF0 dHMsCiAJCQkJCQkgIGJvb2wgcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CiBleHRlcm4gdm9p ZCBfYnRfa2lsbGl0ZW1zKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiBleHRlcm4gQlRDeWNsZUlkIF9i dF92YWN1dW1fY3ljbGVpZChSZWxhdGlvbiByZWwpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv YWNjZXNzL25idHJlZS9uYnRyZWUuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0cmVl LmMKaW5kZXggNmM4Y2Q5M2ZhLi45MTdhZjQ4ZTggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0cmVlLmMKKysrIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRy ZWUuYwpAQCAtNDgsOCArNDgsOCBAQAogICogQlRQQVJBTExFTF9JRExFIGluZGljYXRlcyB0aGF0 IG5vIGJhY2tlbmQgaXMgY3VycmVudGx5IGFkdmFuY2luZyB0aGUgc2NhbgogICogdG8gYSBuZXcg cGFnZTsgc29tZSBwcm9jZXNzIGNhbiBzdGFydCBkb2luZyB0aGF0LgogICoKLSAqIEJUUEFSQUxM RUxfRE9ORSBpbmRpY2F0ZXMgdGhhdCB0aGUgc2NhbiBpcyBjb21wbGV0ZSAoaW5jbHVkaW5nIGVy cm9yIGV4aXQpLgotICogV2UgcmVhY2ggdGhpcyBzdGF0ZSBvbmNlIGZvciBldmVyeSBkaXN0aW5j dCBjb21iaW5hdGlvbiBvZiBhcnJheSBrZXlzLgorICogQlRQQVJBTExFTF9ET05FIGluZGljYXRl cyB0aGF0IHRoZSBwcmltaXRpdmUgaW5kZXggc2NhbiBpcyBjb21wbGV0ZQorICogKGluY2x1ZGlu ZyBlcnJvciBleGl0KS4gIFJlYWNoZWQgb25jZSBwZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4uCiAg Ki8KIHR5cGVkZWYgZW51bQogewpAQCAtNjksOCArNjksOCBAQCB0eXBlZGVmIHN0cnVjdCBCVFBh cmFsbGVsU2NhbkRlc2NEYXRhCiAJQlRQU19TdGF0ZQlidHBzX3BhZ2VTdGF0dXM7CS8qIGluZGlj YXRlcyB3aGV0aGVyIG5leHQgcGFnZSBpcwogCQkJCQkJCQkJICogYXZhaWxhYmxlIGZvciBzY2Fu LiBzZWUgYWJvdmUgZm9yCiAJCQkJCQkJCQkgKiBwb3NzaWJsZSBzdGF0ZXMgb2YgcGFyYWxsZWwg c2Nhbi4gKi8KLQlpbnQJCQlidHBzX2FycmF5S2V5Q291bnQ7IC8qIGNvdW50IGluZGljYXRpbmcg bnVtYmVyIG9mIGFycmF5IHNjYW4KLQkJCQkJCQkJCSAqIGtleXMgcHJvY2Vzc2VkIGJ5IHBhcmFs bGVsIHNjYW4gKi8KKwlpbnQJCQlidHBzX251bVByaW1TY2FuczsJLyogY291bnQgaW5kaWNhdGlu ZyBudW1iZXIgb2YgcHJpbWl0aXZlCisJCQkJCQkJCQkgKiBpbmRleCBzY2FucyAodXNlZCB3aXRo IGFycmF5IGtleXMpICovCiAJc2xvY2tfdAkJYnRwc19tdXRleDsJCS8qIHByb3RlY3RzIGFib3Zl IHZhcmlhYmxlcyAqLwogCUNvbmRpdGlvblZhcmlhYmxlIGJ0cHNfY3Y7CS8qIHVzZWQgdG8gc3lu Y2hyb25pemUgcGFyYWxsZWwgc2NhbiAqLwogfQkJCUJUUGFyYWxsZWxTY2FuRGVzY0RhdGE7CkBA IC0yMzUsNyArMjM1LDcgQEAgYnRnZXR0dXBsZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyKQogCQlfYnRfc3RhcnRfYXJyYXlfa2V5cyhzY2FuLCBkaXIpOwogCX0KIAotCS8q IFRoaXMgbG9vcCBoYW5kbGVzIGFkdmFuY2luZyB0byB0aGUgbmV4dCBhcnJheSBlbGVtZW50cywg aWYgYW55ICovCisJLyogRWFjaCBsb29wIGl0ZXJhdGlvbiBwZXJmb3JtcyBhbm90aGVyIHByaW1p dGl2ZSBpbmRleCBzY2FuICovCiAJZG8KIAl7CiAJCS8qCkBAIC0yNzcsOCArMjc3LDggQEAgYnRn ZXR0dXBsZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogCQkvKiBJZiB3 ZSBoYXZlIGEgdHVwbGUsIHJldHVybiBpdCAuLi4gKi8KIAkJaWYgKHJlcykKIAkJCWJyZWFrOwot CQkvKiAuLi4gb3RoZXJ3aXNlIHNlZSBpZiB3ZSBoYXZlIG1vcmUgYXJyYXkga2V5cyB0byBkZWFs IHdpdGggKi8KLQl9IHdoaWxlIChzby0+bnVtQXJyYXlLZXlzICYmIF9idF9hZHZhbmNlX2FycmF5 X2tleXMoc2NhbiwgZGlyKSk7CisJCS8qIC4uLiBvdGhlcndpc2Ugc2VlIGlmIHdlIG5lZWQgYW5v dGhlciBwcmltaXRpdmUgaW5kZXggc2NhbiAqLworCX0gd2hpbGUgKHNvLT5udW1BcnJheUtleXMg JiYgX2J0X2FycmF5X2tleXNfcmVtYWluKHNjYW4sIGRpcikpOwogCiAJcmV0dXJuIHJlczsKIH0K QEAgLTMwNSw3ICszMDUsNyBAQCBidGdldGJpdG1hcChJbmRleFNjYW5EZXNjIHNjYW4sIFRJREJp dG1hcCAqdGJtKQogCQlfYnRfc3RhcnRfYXJyYXlfa2V5cyhzY2FuLCBGb3J3YXJkU2NhbkRpcmVj dGlvbik7CiAJfQogCi0JLyogVGhpcyBsb29wIGhhbmRsZXMgYWR2YW5jaW5nIHRvIHRoZSBuZXh0 IGFycmF5IGVsZW1lbnRzLCBpZiBhbnkgKi8KKwkvKiBFYWNoIGxvb3AgaXRlcmF0aW9uIHBlcmZv cm1zIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gKi8KIAlkbwogCXsKIAkJLyogRmV0Y2gg dGhlIGZpcnN0IHBhZ2UgJiB0dXBsZSAqLwpAQCAtMzM1LDggKzMzNSw4IEBAIGJ0Z2V0Yml0bWFw KEluZGV4U2NhbkRlc2Mgc2NhbiwgVElEQml0bWFwICp0Ym0pCiAJCQkJbnRpZHMrKzsKIAkJCX0K IAkJfQotCQkvKiBOb3cgc2VlIGlmIHdlIGhhdmUgbW9yZSBhcnJheSBrZXlzIHRvIGRlYWwgd2l0 aCAqLwotCX0gd2hpbGUgKHNvLT5udW1BcnJheUtleXMgJiYgX2J0X2FkdmFuY2VfYXJyYXlfa2V5 cyhzY2FuLCBGb3J3YXJkU2NhbkRpcmVjdGlvbikpOworCQkvKiBOb3cgc2VlIGlmIHdlIG5lZWQg YW5vdGhlciBwcmltaXRpdmUgaW5kZXggc2NhbiAqLworCX0gd2hpbGUgKHNvLT5udW1BcnJheUtl eXMgJiYgX2J0X2FycmF5X2tleXNfcmVtYWluKHNjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uKSk7 CiAKIAlyZXR1cm4gbnRpZHM7CiB9CkBAIC0zNjYsOSArMzY2LDExIEBAIGJ0YmVnaW5zY2FuKFJl bGF0aW9uIHJlbCwgaW50IG5rZXlzLCBpbnQgbm9yZGVyYnlzKQogCQlzby0+a2V5RGF0YSA9IE5V TEw7CiAKIAlzby0+YXJyYXlLZXlEYXRhID0gTlVMTDsJLyogYXNzdW1lIG5vIGFycmF5IGtleXMg Zm9yIG5vdyAqLwotCXNvLT5hcnJheXNTdGFydGVkID0gZmFsc2U7CiAJc28tPm51bUFycmF5S2V5 cyA9IDA7CisJc28tPmFkdmFuY2VEaXIgPSBOb01vdmVtZW50U2NhbkRpcmVjdGlvbjsKKwlzby0+ bmVlZFByaW1TY2FuID0gZmFsc2U7CiAJc28tPmFycmF5S2V5cyA9IE5VTEw7CisJc28tPm9yZGVy UHJvY3MgPSBOVUxMOwogCXNvLT5hcnJheUNvbnRleHQgPSBOVUxMOwogCiAJc28tPmtpbGxlZEl0 ZW1zID0gTlVMTDsJCS8qIHVudGlsIG5lZWRlZCAqLwpAQCAtNDA4LDcgKzQxMCw5IEBAIGJ0cmVz Y2FuKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBzY2Fua2V5LCBpbnQgbnNjYW5rZXlzLAog CX0KIAogCXNvLT5tYXJrSXRlbUluZGV4ID0gLTE7Ci0Jc28tPmFycmF5S2V5Q291bnQgPSAwOwor CXNvLT5hZHZhbmNlRGlyID0gTm9Nb3ZlbWVudFNjYW5EaXJlY3Rpb247CisJc28tPm5lZWRQcmlt U2NhbiA9IGZhbHNlOworCXNvLT5udW1QcmltU2NhbnMgPSAwOwogCXNvLT5maXJzdFBhZ2UgPSBm YWxzZTsKIAlCVFNjYW5Qb3NVbnBpbklmUGlubmVkKHNvLT5tYXJrUG9zKTsKIAlCVFNjYW5Qb3NJ bnZhbGlkYXRlKHNvLT5tYXJrUG9zKTsKQEAgLTUwOCwxMCArNTEyLDYgQEAgYnRtYXJrcG9zKElu ZGV4U2NhbkRlc2Mgc2NhbikKIAkJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+bWFya1Bvcyk7CiAJ CXNvLT5tYXJrSXRlbUluZGV4ID0gLTE7CiAJfQotCi0JLyogQWxzbyByZWNvcmQgdGhlIGN1cnJl bnQgcG9zaXRpb25zIG9mIGFueSBhcnJheSBrZXlzICovCi0JaWYgKHNvLT5udW1BcnJheUtleXMp Ci0JCV9idF9tYXJrX2FycmF5X2tleXMoc2Nhbik7CiB9CiAKIC8qCkBAIC01MjIsMTAgKzUyMiw2 IEBAIGJ0cmVzdHJwb3MoSW5kZXhTY2FuRGVzYyBzY2FuKQogewogCUJUU2Nhbk9wYXF1ZSBzbyA9 IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAotCS8qIFJlc3RvcmUgdGhlIG1hcmtlZCBw b3NpdGlvbnMgb2YgYW55IGFycmF5IGtleXMgKi8KLQlpZiAoc28tPm51bUFycmF5S2V5cykKLQkJ X2J0X3Jlc3RvcmVfYXJyYXlfa2V5cyhzY2FuKTsKLQogCWlmIChzby0+bWFya0l0ZW1JbmRleCA+ PSAwKQogCXsKIAkJLyoKQEAgLTU2NCw2ICs1NjAsOSBAQCBidHJlc3RycG9zKEluZGV4U2NhbkRl c2Mgc2NhbikKIAkJCWlmIChzby0+Y3VyclR1cGxlcykKIAkJCQltZW1jcHkoc28tPmN1cnJUdXBs ZXMsIHNvLT5tYXJrVHVwbGVzLAogCQkJCQkgICBzby0+bWFya1Bvcy5uZXh0VHVwbGVPZmZzZXQp OworCQkJLyogUmV3aW5kIHRoZSBzY2FuJ3MgYXJyYXkga2V5cywgaWYgYW55ICovCisJCQlpZiAo c28tPm51bUFycmF5S2V5cykKKwkJCQlfYnRfcmV3aW5kX2FycmF5X2tleXMoc2Nhbik7CiAJCX0K IAkJZWxzZQogCQkJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+Y3VyclBvcyk7CkBAIC01OTAsNyAr NTg5LDcgQEAgYnRpbml0cGFyYWxsZWxzY2FuKHZvaWQgKnRhcmdldCkKIAlTcGluTG9ja0luaXQo JmJ0X3RhcmdldC0+YnRwc19tdXRleCk7CiAJYnRfdGFyZ2V0LT5idHBzX3NjYW5QYWdlID0gSW52 YWxpZEJsb2NrTnVtYmVyOwogCWJ0X3RhcmdldC0+YnRwc19wYWdlU3RhdHVzID0gQlRQQVJBTExF TF9OT1RfSU5JVElBTElaRUQ7Ci0JYnRfdGFyZ2V0LT5idHBzX2FycmF5S2V5Q291bnQgPSAwOwor CWJ0X3RhcmdldC0+YnRwc19udW1QcmltU2NhbnMgPSAwOwogCUNvbmRpdGlvblZhcmlhYmxlSW5p dCgmYnRfdGFyZ2V0LT5idHBzX2N2KTsKIH0KIApAQCAtNjE2LDcgKzYxNSw3IEBAIGJ0cGFyYWxs ZWxyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuKQogCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5i dHBzX211dGV4KTsKIAlidHNjYW4tPmJ0cHNfc2NhblBhZ2UgPSBJbnZhbGlkQmxvY2tOdW1iZXI7 CiAJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVMX05PVF9JTklUSUFMSVpFRDsK LQlidHNjYW4tPmJ0cHNfYXJyYXlLZXlDb3VudCA9IDA7CisJYnRzY2FuLT5idHBzX251bVByaW1T Y2FucyA9IDA7CiAJU3BpbkxvY2tSZWxlYXNlKCZidHNjYW4tPmJ0cHNfbXV0ZXgpOwogfQogCkBA IC02MjcsNyArNjI2LDExIEBAIGJ0cGFyYWxsZWxyZXNjYW4oSW5kZXhTY2FuRGVzYyBzY2FuKQog ICoKICAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdHJ1ZSBpZiB3ZSBzdWNjZXNzZnVsbHkgc2VpemVk IHRoZSBzY2FuIGFuZCBmYWxzZQogICogaWYgd2UgZGlkIG5vdC4gIFRoZSBsYXR0ZXIgY2FzZSBv Y2N1cnMgaWYgbm8gcGFnZXMgcmVtYWluIGZvciB0aGUgY3VycmVudAotICogc2V0IG9mIHNjYW5r ZXlzLgorICogcHJpbWl0aXZlIGluZGV4IHNjYW4uCisgKgorICogV2hlbiBhcnJheSBzY2FuIGtl eXMgYXJlIGluIHVzZSwgZWFjaCB3b3JrZXIgcHJvY2VzcyBpbmRlcGVuZGVudGx5IGFkdmFuY2Vz CisgKiBpdHMgYXJyYXkga2V5cy4gIEl0J3MgY3J1Y2lhbCB0aGF0IGVhY2ggd29ya2VyIHByb2Nl c3MgbmV2ZXIgYmUgYWxsb3dlZCB0bworICogc2NhbiBhIHBhZ2UgZnJvbSBiZWZvcmUgdGhlIGN1 cnJlbnQgc2NhbiBwb3NpdGlvbi4KICAqCiAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUs ICpwYWdlbm8gcmV0dXJucyB0aGUgbmV4dCBvciBjdXJyZW50IHBhZ2UKICAqIG9mIHRoZSBzY2Fu IChkZXBlbmRpbmcgb24gdGhlIHNjYW4gZGlyZWN0aW9uKS4gIEFuIGludmFsaWQgYmxvY2sgbnVt YmVyCkBAIC02NTgsMTYgKzY2MSwxNyBAQCBfYnRfcGFyYWxsZWxfc2VpemUoSW5kZXhTY2FuRGVz YyBzY2FuLCBCbG9ja051bWJlciAqcGFnZW5vKQogCQlTcGluTG9ja0FjcXVpcmUoJmJ0c2Nhbi0+ YnRwc19tdXRleCk7CiAJCXBhZ2VTdGF0dXMgPSBidHNjYW4tPmJ0cHNfcGFnZVN0YXR1czsKIAot CQlpZiAoc28tPmFycmF5S2V5Q291bnQgPCBidHNjYW4tPmJ0cHNfYXJyYXlLZXlDb3VudCkKKwkJ aWYgKHNvLT5udW1QcmltU2NhbnMgPCBidHNjYW4tPmJ0cHNfbnVtUHJpbVNjYW5zKQogCQl7Ci0J CQkvKiBQYXJhbGxlbCBzY2FuIGhhcyBhbHJlYWR5IGFkdmFuY2VkIHRvIGEgbmV3IHNldCBvZiBz Y2Fua2V5cy4gKi8KKwkJCS8qIFRvcC1sZXZlbCBzY2FuIGFscmVhZHkgbW92ZWQgb24gdG8gbmV4 dCBwcmltaXRpdmUgaW5kZXggc2NhbiAqLwogCQkJc3RhdHVzID0gZmFsc2U7CiAJCX0KIAkJZWxz ZSBpZiAocGFnZVN0YXR1cyA9PSBCVFBBUkFMTEVMX0RPTkUpCiAJCXsKIAkJCS8qCi0JCQkgKiBX ZSdyZSBkb25lIHdpdGggdGhpcyBzZXQgb2Ygc2NhbmtleXMuICBUaGlzIG1heSBiZSB0aGUgZW5k LCBvcgotCQkJICogdGhlcmUgY291bGQgYmUgbW9yZSBzZXRzIHRvIHRyeS4KKwkJCSAqIFdlJ3Jl IGRvbmUgd2l0aCB0aGlzIHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgVGhpcyBtaWdodCBoYXZlCisJ CQkgKiBiZWVuIHRoZSBmaW5hbCBwcmltaXRpdmUgaW5kZXggc2NhbiByZXF1aXJlZCwgb3IgdGhl IHRvcC1sZXZlbAorCQkJICogaW5kZXggc2NhbiBtaWdodCByZXF1aXJlIGFkZGl0aW9uYWwgcHJp bWl0aXZlIHNjYW5zLgogCQkJICovCiAJCQlzdGF0dXMgPSBmYWxzZTsKIAkJfQpAQCAtNjk5LDkg KzcwMywxMiBAQCBfYnRfcGFyYWxsZWxfc2VpemUoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9ja051 bWJlciAqcGFnZW5vKQogdm9pZAogX2J0X3BhcmFsbGVsX3JlbGVhc2UoSW5kZXhTY2FuRGVzYyBz Y2FuLCBCbG9ja051bWJlciBzY2FuX3BhZ2UpCiB7CisJQlRTY2FuT3BhcXVlIHNvIFBHX1VTRURf Rk9SX0FTU0VSVFNfT05MWSA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAlQYXJhbGxl bEluZGV4U2NhbkRlc2MgcGFyYWxsZWxfc2NhbiA9IHNjYW4tPnBhcmFsbGVsX3NjYW47CiAJQlRQ YXJhbGxlbFNjYW5EZXNjIGJ0c2NhbjsKIAorCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisK IAlidHNjYW4gPSAoQlRQYXJhbGxlbFNjYW5EZXNjKSBPZmZzZXRUb1BvaW50ZXIoKHZvaWQgKikg cGFyYWxsZWxfc2NhbiwKIAkJCQkJCQkJCQkJCSAgcGFyYWxsZWxfc2Nhbi0+cHNfb2Zmc2V0KTsK IApAQCAtNzM1LDEyICs3NDIsMTEgQEAgX2J0X3BhcmFsbGVsX2RvbmUoSW5kZXhTY2FuRGVzYyBz Y2FuKQogCQkJCQkJCQkJCQkJICBwYXJhbGxlbF9zY2FuLT5wc19vZmZzZXQpOwogCiAJLyoKLQkg KiBNYXJrIHRoZSBwYXJhbGxlbCBzY2FuIGFzIGRvbmUgZm9yIHRoaXMgY29tYmluYXRpb24gb2Yg c2NhbiBrZXlzLAotCSAqIHVubGVzcyBzb21lIG90aGVyIHByb2Nlc3MgYWxyZWFkeSBkaWQgc28u ICBTZWUgYWxzbwotCSAqIF9idF9hZHZhbmNlX2FycmF5X2tleXMuCisJICogTWFyayB0aGUgcHJp bWl0aXZlIGluZGV4IHNjYW4gYXMgZG9uZSwgdW5sZXNzIHNvbWUgb3RoZXIgcHJvY2VzcworCSAq IGFscmVhZHkgZGlkIHNvLiAgU2VlIGFsc28gX2J0X2FycmF5X2tleXNfcmVtYWluLgogCSAqLwog CVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKLQlpZiAoc28tPmFycmF5S2V5 Q291bnQgPj0gYnRzY2FuLT5idHBzX2FycmF5S2V5Q291bnQgJiYKKwlpZiAoc28tPm51bVByaW1T Y2FucyA+PSBidHNjYW4tPmJ0cHNfbnVtUHJpbVNjYW5zICYmCiAJCWJ0c2Nhbi0+YnRwc19wYWdl U3RhdHVzICE9IEJUUEFSQUxMRUxfRE9ORSkKIAl7CiAJCWJ0c2Nhbi0+YnRwc19wYWdlU3RhdHVz ID0gQlRQQVJBTExFTF9ET05FOwpAQCAtNzU0LDE0ICs3NjAsMTQgQEAgX2J0X3BhcmFsbGVsX2Rv bmUoSW5kZXhTY2FuRGVzYyBzY2FuKQogfQogCiAvKgotICogX2J0X3BhcmFsbGVsX2FkdmFuY2Vf YXJyYXlfa2V5cygpIC0tIEFkdmFuY2VzIHRoZSBwYXJhbGxlbCBzY2FuIGZvciBhcnJheQotICoJ CQlrZXlzLgorICogX2J0X3BhcmFsbGVsX25leHRfcHJpbWl0aXZlX3NjYW4oKSAtLSBBZHZhbmNl cyBwYXJhbGxlbCBwcmltaXRpdmUgc2NhbgorICoJCQljb3VudGVyIHdoZW4gYXJyYXkga2V5cyBh cmUgaW4gdXNlLgogICoKLSAqIFVwZGF0ZXMgdGhlIGNvdW50IG9mIGFycmF5IGtleXMgcHJvY2Vz c2VkIGZvciBib3RoIGxvY2FsIGFuZCBwYXJhbGxlbAorICogVXBkYXRlcyB0aGUgY291bnQgb2Yg cHJpbWl0aXZlIGluZGV4IHNjYW5zIGZvciBib3RoIGxvY2FsIGFuZCBwYXJhbGxlbAogICogc2Nh bnMuCiAgKi8KIHZvaWQKLV9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuKQorX2J0X3BhcmFsbGVsX25leHRfcHJpbWl0aXZlX3NjYW4oSW5kZXhTY2FuRGVz YyBzY2FuKQogewogCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1 ZTsKIAlQYXJhbGxlbEluZGV4U2NhbkRlc2MgcGFyYWxsZWxfc2NhbiA9IHNjYW4tPnBhcmFsbGVs X3NjYW47CkBAIC03NzAsMTMgKzc3NiwxMyBAQCBfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJheV9r ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKIAlidHNjYW4gPSAoQlRQYXJhbGxlbFNjYW5EZXNjKSBP ZmZzZXRUb1BvaW50ZXIoKHZvaWQgKikgcGFyYWxsZWxfc2NhbiwKIAkJCQkJCQkJCQkJCSAgcGFy YWxsZWxfc2Nhbi0+cHNfb2Zmc2V0KTsKIAotCXNvLT5hcnJheUtleUNvdW50Kys7CisJc28tPm51 bVByaW1TY2FucysrOwogCVNwaW5Mb2NrQWNxdWlyZSgmYnRzY2FuLT5idHBzX211dGV4KTsKIAlp ZiAoYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPT0gQlRQQVJBTExFTF9ET05FKQogCXsKIAkJYnRz Y2FuLT5idHBzX3NjYW5QYWdlID0gSW52YWxpZEJsb2NrTnVtYmVyOwogCQlidHNjYW4tPmJ0cHNf cGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfTk9UX0lOSVRJQUxJWkVEOwotCQlidHNjYW4tPmJ0cHNf YXJyYXlLZXlDb3VudCsrOworCQlidHNjYW4tPmJ0cHNfbnVtUHJpbVNjYW5zKys7CiAJfQogCVNw aW5Mb2NrUmVsZWFzZSgmYnRzY2FuLT5idHBzX211dGV4KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0 cmVlL25idHNlYXJjaC5jCmluZGV4IGJlNjFiMzg2OC4uMDRiN2UxZjE1IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJjaC5jCisrKyBiL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9uYnRyZWUvbmJ0c2VhcmNoLmMKQEAgLTkwNyw3ICs5MDcsNyBAQCBfYnRfZmlyc3QoSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAkgKi8KIAlpZiAoIXNvLT5xdWFs X29rKQogCXsKLQkJLyogTm90aWZ5IGFueSBvdGhlciB3b3JrZXJzIHRoYXQgd2UncmUgZG9uZSB3 aXRoIHRoaXMgc2NhbiBrZXkuICovCisJCS8qIE5vdGlmeSBhbnkgb3RoZXIgd29ya2VycyB0aGF0 IHRoaXMgcHJpbWl0aXZlIHNjYW4gaXMgZG9uZSAqLwogCQlfYnRfcGFyYWxsZWxfZG9uZShzY2Fu KTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTE1MjcsMTAgKzE1MjcsMTEgQEAgX2J0X3JlYWRw YWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBv ZmZudW0pCiAJQlRQYWdlT3BhcXVlIG9wYXF1ZTsKIAlPZmZzZXROdW1iZXIgbWlub2ZmOwogCU9m ZnNldE51bWJlciBtYXhvZmY7Ci0JaW50CQkJaXRlbUluZGV4OwotCWJvb2wJCWNvbnRpbnVlc2Nh bjsKKwlCVFJlYWRQYWdlU3RhdGUgcHN0YXRlOworCWludAkJCW51bUFycmF5S2V5cywKKwkJCQlp dGVtSW5kZXg7CiAJaW50CQkJaW5kbmF0dHM7Ci0JYm9vbAkJcmVxdWlyZWRNYXRjaGVkQnlQcmVj aGVjazsKKwlib29sCQlyZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrID0gZmFsc2U7CiAKIAkvKgog CSAqIFdlIG11c3QgaGF2ZSB0aGUgYnVmZmVyIHBpbm5lZCBhbmQgbG9ja2VkLCBidXQgdGhlIHVz dWFsIG1hY3JvIGNhbid0IGJlCkBAIC0xNTUwLDggKzE1NTEsMTMgQEAgX2J0X3JlYWRwYWdlKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0p CiAJCQlfYnRfcGFyYWxsZWxfcmVsZWFzZShzY2FuLCBCdWZmZXJHZXRCbG9ja051bWJlcihzby0+ Y3VyclBvcy5idWYpKTsKIAl9CiAKLQljb250aW51ZXNjYW4gPSB0cnVlOwkJLyogZGVmYXVsdCBh c3N1bXB0aW9uICovCisJcHN0YXRlLmRpciA9IGRpcjsKKwlwc3RhdGUuZmluYWx0dXAgPSBOVUxM OworCXBzdGF0ZS5jb250aW51ZXNjYW4gPSB0cnVlOyAvKiBkZWZhdWx0IGFzc3VtcHRpb24gKi8K Kwlwc3RhdGUuZmluYWx0dXBjaGVja2VkID0gZmFsc2U7CiAJaW5kbmF0dHMgPSBJbmRleFJlbGF0 aW9uR2V0TnVtYmVyT2ZBdHRyaWJ1dGVzKHNjYW4tPmluZGV4UmVsYXRpb24pOworCW51bUFycmF5 S2V5cyA9IHNvLT5udW1BcnJheUtleXM7CisKIAltaW5vZmYgPSBQX0ZJUlNUREFUQUtFWShvcGFx dWUpOwogCW1heG9mZiA9IFBhZ2VHZXRNYXhPZmZzZXROdW1iZXIocGFnZSk7CiAKQEAgLTE1OTks OSArMTYwNSwxMiBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0 aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkgKiB0aGUgbGFzdCBpdGVtIG9uIHRoZSBw YWdlIHdvdWxkIGdpdmUgYSBtb3JlIHByZWNpc2UgYW5zd2VyLgogCSAqCiAJICogV2Ugc2tpcCB0 aGlzIGZvciB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgc2NhbiB0byBldmFkZSB0aGUgcG9zc2libGUK LQkgKiBzbG93ZG93biBvZiB0aGUgcG9pbnQgcXVlcmllcy4KKwkgKiBzbG93ZG93biBvZiBwb2lu dCBxdWVyaWVzLiAgTmV2ZXIgYXBwbHkgdGhlIG9wdGltaXphdGlvbiB3aXRoIGEgc2NhbgorCSAq IHRoYXQgdXNlcyBhcnJheSBrZXlzLCBlaXRoZXIsIHNpbmNlIHRoYXQgYnJlYWtzIGNlcnRhaW4g YXNzdW1wdGlvbnMuCisJICogKE91ciBzZWFyY2gtdHlwZSBzY2FuIGtleXMgY2hhbmdlIHdoZW5l dmVyIF9idF9jaGVja2tleXMgYWR2YW5jZXMgdGhlCisJICogYXJyYXlzLCBpbnZhbGlkYXRpbmcg YW55IHByZWNoZWNrLiAgVHJhY2tpbmcgYWxsIHRoYXQgd291bGQgYmUgdHJpY2t5LikKIAkgKi8K LQlpZiAoIXNvLT5maXJzdFBhZ2UgJiYgbWlub2ZmIDwgbWF4b2ZmKQorCWlmICghc28tPmZpcnN0 UGFnZSAmJiAhbnVtQXJyYXlLZXlzICYmIG1pbm9mZiA8IG1heG9mZikKIAl7CiAJCUl0ZW1JZAkJ aWlkOwogCQlJbmRleFR1cGxlCWl0dXA7CkBAIC0xNjEwLDIyICsxNjE5LDI1IEBAIF9idF9yZWFk cGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIg b2ZmbnVtKQogCQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7CiAK IAkJLyoKLQkJICogRG8gdGhlIHByZWNoZWNrLiAgTm90ZSB0aGF0IHdlIHBhc3MgdGhlIHBvaW50 ZXIgdG8KLQkJICogJ3JlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2snIHRvICdjb250aW51ZXNjYW4n IGFyZ3VtZW50LiAgVGhhdCB3aWxsCi0JCSAqIHNldCBmbGFnIHRvIHRydWUgaWYgYWxsIHJlcXVp cmVkIGtleXMgYXJlIHNhdGlzZmllZCBhbmQgZmFsc2UKLQkJICogb3RoZXJ3aXNlLgorCQkgKiBG bGFnIHZhcmlhYmxlIGlzIHNldCB3aGVuIGFsbCBzY2FuIGtleXMgdGhhdCBhcmUgcmVxdWlyZWQg aW4gdGhlCisJCSAqIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24gYXJlIHNhdGlzZmllZCBieSB0aGUg bGFzdCBpdGVtIG9uIHRoZSBwYWdlCiAJCSAqLwotCQkodm9pZCkgX2J0X2NoZWNra2V5cyhzY2Fu LCBpdHVwLCBpbmRuYXR0cywgZGlyLAotCQkJCQkJCSAmcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVj aywgZmFsc2UpOwotCX0KLQllbHNlCi0JewotCQlzby0+Zmlyc3RQYWdlID0gZmFsc2U7Ci0JCXJl cXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2sgPSBmYWxzZTsKKwkJX2J0X2NoZWNra2V5cyhzY2FuLCAm cHN0YXRlLCBpdHVwLCBmYWxzZSwgaW5kbmF0dHMsIGZhbHNlKTsKKwkJcmVxdWlyZWRNYXRjaGVk QnlQcmVjaGVjayA9IHBzdGF0ZS5jb250aW51ZXNjYW47CisJCXBzdGF0ZS5jb250aW51ZXNjYW4g PSB0cnVlOyAvKiByZXNldCAqLwogCX0KKwlzby0+Zmlyc3RQYWdlID0gZmFsc2U7CiAKIAlpZiAo U2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQogCXsKKwkJLyogU0tfU0VBUkNIQVJSQVkgZm9y d2FyZCBzY2FucyBtdXN0IHByb3ZpZGUgaGlnaCBrZXkgdXAgZnJvbnQgKi8KKwkJaWYgKG51bUFy cmF5S2V5cyAmJiAhUF9SSUdIVE1PU1Qob3BhcXVlKSkKKwkJeworCQkJSXRlbUlkCQlpaWQgPSBQ YWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkpOworCisJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5k ZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwgaWlkKTsKKwkJfQorCiAJCS8qIGxvYWQgaXRlbXNb XSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KIAkJaXRlbUluZGV4ID0gMDsKIApAQCAtMTY1MCw4ICsx NjYyLDggQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBk aXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJ dGVtKHBhZ2UsIGlpZCk7CiAJCQlBc3NlcnQoIUJUcmVlVHVwbGVJc1Bpdm90KGl0dXApKTsKIAot CQkJcGFzc2VzX3F1YWxzID0gX2J0X2NoZWNra2V5cyhzY2FuLCBpdHVwLCBpbmRuYXR0cywgZGly LAotCQkJCQkJCQkJCSAmY29udGludWVzY2FuLCByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsK KwkJCXBhc3Nlc19xdWFscyA9IF9idF9jaGVja2tleXMoc2NhbiwgJnBzdGF0ZSwgaXR1cCwgZmFs c2UsIGluZG5hdHRzLAorCQkJCQkJCQkJCSByZXF1aXJlZE1hdGNoZWRCeVByZWNoZWNrKTsKIAog CQkJLyoKIAkJCSAqIElmIHRoZSByZXN1bHQgb2YgcHJlY2hlY2tpbmcgcmVxdWlyZWQga2V5cyB3 YXMgdHJ1ZSwgdGhlbiBpbgpAQCAtMTY1OSw4ICsxNjcxLDggQEAgX2J0X3JlYWRwYWdlKEluZGV4 U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJ CQkgKiByZXN1bHQgaXMgdGhlIHNhbWUuCiAJCQkgKi8KIAkJCUFzc2VydCghcmVxdWlyZWRNYXRj aGVkQnlQcmVjaGVjayB8fAotCQkJCSAgIHBhc3Nlc19xdWFscyA9PSBfYnRfY2hlY2trZXlzKHNj YW4sIGl0dXAsIGluZG5hdHRzLCBkaXIsCi0JCQkJCQkJCQkJCQkgJmNvbnRpbnVlc2NhbiwgZmFs c2UpKTsKKwkJCQkgICBwYXNzZXNfcXVhbHMgPT0gX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRl LCBpdHVwLCBmYWxzZSwKKwkJCQkJCQkJCQkJCSBpbmRuYXR0cywgZmFsc2UpKTsKIAkJCWlmIChw YXNzZXNfcXVhbHMpCiAJCQl7CiAJCQkJLyogdHVwbGUgcGFzc2VzIGFsbCBzY2FuIGtleSBjb25k aXRpb25zICovCkBAIC0xNjk0LDcgKzE3MDYsNyBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVz YyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJCQl9CiAJ CQl9CiAJCQkvKiBXaGVuICFjb250aW51ZXNjYW4sIHRoZXJlIGNhbid0IGJlIGFueSBtb3JlIG1h dGNoZXMsIHNvIHN0b3AgKi8KLQkJCWlmICghY29udGludWVzY2FuKQorCQkJaWYgKCFwc3RhdGUu Y29udGludWVzY2FuKQogCQkJCWJyZWFrOwogCiAJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJOZXh0 KG9mZm51bSk7CkBAIC0xNzExLDE3ICsxNzIzLDE3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5E ZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkgKiBv bmx5IGFwcGVhciBvbiBub24tcGl2b3QgdHVwbGVzIG9uIHRoZSByaWdodCBzaWJsaW5nIHBhZ2Ug YXJlCiAJCSAqIGNvbW1vbi4KIAkJICovCi0JCWlmIChjb250aW51ZXNjYW4gJiYgIVBfUklHSFRN T1NUKG9wYXF1ZSkpCisJCWlmIChwc3RhdGUuY29udGludWVzY2FuICYmICFQX1JJR0hUTU9TVChv cGFxdWUpKQogCQl7CiAJCQlJdGVtSWQJCWlpZCA9IFBhZ2VHZXRJdGVtSWQocGFnZSwgUF9ISUtF WSk7CiAJCQlJbmRleFR1cGxlCWl0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0ZW0ocGFnZSwg aWlkKTsKIAkJCWludAkJCXRydW5jYXR0OwogCiAJCQl0cnVuY2F0dCA9IEJUcmVlVHVwbGVHZXRO QXR0cyhpdHVwLCBzY2FuLT5pbmRleFJlbGF0aW9uKTsKLQkJCV9idF9jaGVja2tleXMoc2Nhbiwg aXR1cCwgdHJ1bmNhdHQsIGRpciwgJmNvbnRpbnVlc2NhbiwgZmFsc2UpOworCQkJX2J0X2NoZWNr a2V5cyhzY2FuLCAmcHN0YXRlLCBpdHVwLCB0cnVlLCB0cnVuY2F0dCwgZmFsc2UpOwogCQl9CiAK LQkJaWYgKCFjb250aW51ZXNjYW4pCisJCWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCXNv LT5jdXJyUG9zLm1vcmVSaWdodCA9IGZhbHNlOwogCiAJCUFzc2VydChpdGVtSW5kZXggPD0gTWF4 VElEc1BlckJUcmVlUGFnZSk7CkBAIC0xNzMxLDYgKzE3NDMsMTQgQEAgX2J0X3JlYWRwYWdlKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0p CiAJfQogCWVsc2UKIAl7CisJCS8qIFNLX1NFQVJDSEFSUkFZIGJhY2t3YXJkIHNjYW5zIG11c3Qg cHJvdmlkZSBmaW5hbCB0dXBsZSB1cCBmcm9udCAqLworCQlpZiAobnVtQXJyYXlLZXlzICYmIG1p bm9mZiA8PSBtYXhvZmYpCisJCXsKKwkJCUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdl LCBtaW5vZmYpOworCisJCQlwc3RhdGUuZmluYWx0dXAgPSAoSW5kZXhUdXBsZSkgUGFnZUdldEl0 ZW0ocGFnZSwgaWlkKTsKKwkJfQorCiAJCS8qIGxvYWQgaXRlbXNbXSBpbiBkZXNjZW5kaW5nIG9y ZGVyICovCiAJCWl0ZW1JbmRleCA9IE1heFRJRHNQZXJCVHJlZVBhZ2U7CiAKQEAgLTE3NDIsNiAr MTc2Miw3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24g ZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJSW5kZXhUdXBsZQlpdHVwOwogCQkJYm9vbAkJ dHVwbGVfYWxpdmU7CiAJCQlib29sCQlwYXNzZXNfcXVhbHM7CisJCQlib29sCQlmaW5hbHR1cCA9 IChvZmZudW0gPT0gbWlub2ZmKTsKIAogCQkJLyoKIAkJCSAqIElmIHRoZSBzY2FuIHNwZWNpZmll cyBub3QgdG8gcmV0dXJuIGtpbGxlZCB0dXBsZXMsIHRoZW4gd2UKQEAgLTE3NTIsMTIgKzE3NzMs MTggQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0pCiAJCQkgKiB0dXBsZSBvbiB0aGUgcGFnZSwgd2UgZG8gY2hl Y2sgdGhlIGluZGV4IGtleXMsIHRvIHByZXZlbnQKIAkJCSAqIHVzZWxlc3NseSBhZHZhbmNpbmcg dG8gdGhlIHBhZ2UgdG8gdGhlIGxlZnQuICBUaGlzIGlzIHNpbWlsYXIKIAkJCSAqIHRvIHRoZSBo aWdoIGtleSBvcHRpbWl6YXRpb24gdXNlZCBieSBmb3J3YXJkIHNjYW5zLgorCQkJICoKKwkJCSAq IFNlcGFyYXRlbHksIF9idF9jaGVja2tleXMgYWN0dWFsbHkgcmVxdWlyZXMgdGhhdCB3ZSBjYWxs IGl0CisJCQkgKiB3aXRoIHRoZSBmaW5hbCBub24tcGl2b3QgdHVwbGUgZnJvbSB0aGUgcGFnZSwg aWYgdGhlcmUncyBvbmUKKwkJCSAqIChmaW5hbCBwcm9jZXNzZWQgdHVwbGUsIG9yIGZpcnN0IHR1 cGxlIGluIG9mZnNldCBudW1iZXIgdGVybXMpLgorCQkJICogV2UgbXVzdCBpbmRpY2F0ZSB3aGlj aCBwYXJ0aWN1bGFyIHR1cGxlIGNvbWVzIGxhc3QsIHRvby4KIAkJCSAqLwogCQkJaWYgKHNjYW4t Pmlnbm9yZV9raWxsZWRfdHVwbGVzICYmIEl0ZW1JZElzRGVhZChpaWQpKQogCQkJewogCQkJCUFz c2VydChvZmZudW0gPj0gUF9GSVJTVERBVEFLRVkob3BhcXVlKSk7Ci0JCQkJaWYgKG9mZm51bSA+ IFBfRklSU1REQVRBS0VZKG9wYXF1ZSkpCisJCQkJaWYgKCFmaW5hbHR1cCkKIAkJCQl7CisJCQkJ CUFzc2VydChvZmZudW0gPiBtaW5vZmYpOwogCQkJCQlvZmZudW0gPSBPZmZzZXROdW1iZXJQcmV2 KG9mZm51bSk7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KQEAgLTE3NzAsOCArMTc5Nyw4IEBAIF9i dF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXRO dW1iZXIgb2ZmbnVtKQogCQkJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBp aWQpOwogCQkJQXNzZXJ0KCFCVHJlZVR1cGxlSXNQaXZvdChpdHVwKSk7CiAKLQkJCXBhc3Nlc19x dWFscyA9IF9idF9jaGVja2tleXMoc2NhbiwgaXR1cCwgaW5kbmF0dHMsIGRpciwKLQkJCQkJCQkJ CQkgJmNvbnRpbnVlc2NhbiwgcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CisJCQlwYXNzZXNf cXVhbHMgPSBfYnRfY2hlY2trZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAsIGZpbmFsdHVwLAorCQkJ CQkJCQkJCSBpbmRuYXR0cywgcmVxdWlyZWRNYXRjaGVkQnlQcmVjaGVjayk7CiAKIAkJCS8qCiAJ CQkgKiBJZiB0aGUgcmVzdWx0IG9mIHByZWNoZWNraW5nIHJlcXVpcmVkIGtleXMgd2FzIHRydWUs IHRoZW4gaW4KQEAgLTE3NzksOCArMTgwNiw4IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJICogcmVz dWx0IGlzIHRoZSBzYW1lLgogCQkJICovCiAJCQlBc3NlcnQoIXJlcXVpcmVkTWF0Y2hlZEJ5UHJl Y2hlY2sgfHwKLQkJCQkgICBwYXNzZXNfcXVhbHMgPT0gX2J0X2NoZWNra2V5cyhzY2FuLCBpdHVw LCBpbmRuYXR0cywgZGlyLAotCQkJCQkJCQkJCQkJICZjb250aW51ZXNjYW4sIGZhbHNlKSk7CisJ CQkJICAgcGFzc2VzX3F1YWxzID09IF9idF9jaGVja2tleXMoc2NhbiwgJnBzdGF0ZSwgaXR1cCwK KwkJCQkJCQkJCQkJCSBmaW5hbHR1cCwgaW5kbmF0dHMsIGZhbHNlKSk7CiAJCQlpZiAocGFzc2Vz X3F1YWxzICYmIHR1cGxlX2FsaXZlKQogCQkJewogCQkJCS8qIHR1cGxlIHBhc3NlcyBhbGwgc2Nh biBrZXkgY29uZGl0aW9ucyAqLwpAQCAtMTgxOSw3ICsxODQ2LDcgQEAgX2J0X3JlYWRwYWdlKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0p CiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoIWNvbnRpbnVlc2NhbikKKwkJCWlmICghcHN0 YXRlLmNvbnRpbnVlc2NhbikKIAkJCXsKIAkJCQkvKiB0aGVyZSBjYW4ndCBiZSBhbnkgbW9yZSBt YXRjaGVzLCBzbyBzdG9wICovCiAJCQkJc28tPmN1cnJQb3MubW9yZUxlZnQgPSBmYWxzZTsKQEAg LTE5OTQsNiArMjAyMSwyMCBAQCBfYnRfc3RlcHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2Fu RGlyZWN0aW9uIGRpcikKIAkJLyogUmVtZW1iZXIgd2UgbGVmdCBhIHBhZ2Ugd2l0aCBkYXRhICov CiAJCXNvLT5jdXJyUG9zLm1vcmVMZWZ0ID0gdHJ1ZTsKIAorCQkvKgorCQkgKiBJZiB0aGUgc2Nh biBkaXJlY3Rpb24gY2hhbmdlZCBzaW5jZSBvdXIgYXJyYXkga2V5cyAoaWYgYW55KSBsYXN0CisJ CSAqIGFkdmFuY2VkLCB3ZSBjYW5ub3QgdHJ1c3QgX2J0X3JlYWRwYWdlJ3MgZGV0ZXJtaW5hdGlv biB0aGF0IHRoZXJlCisJCSAqIGFyZSBubyBtYXRjaGVzIHRvIGJlIGZvdW5kIHRvIHRoZSByaWdo dAorCQkgKi8KKwkJaWYgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKHNvLT5hZHZhbmNlRGlyKSkK KwkJeworCQkJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCisJCQlzby0+Y3VyclBvcy5tb3Jl UmlnaHQgPSB0cnVlOworCQkJc28tPmFkdmFuY2VEaXIgPSBkaXI7CisJCQlzby0+bmVlZFByaW1T Y2FuID0gZmFsc2U7CisJCX0KKwogCQkvKiByZWxlYXNlIHRoZSBwcmV2aW91cyBidWZmZXIsIGlm IHBpbm5lZCAqLwogCQlCVFNjYW5Qb3NVbnBpbklmUGlubmVkKHNvLT5jdXJyUG9zKTsKIAl9CkBA IC0yMDAyLDYgKzIwNDMsMjAgQEAgX2J0X3N0ZXBwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2Nh bkRpcmVjdGlvbiBkaXIpCiAJCS8qIFJlbWVtYmVyIHdlIGxlZnQgYSBwYWdlIHdpdGggZGF0YSAq LwogCQlzby0+Y3VyclBvcy5tb3JlUmlnaHQgPSB0cnVlOwogCisJCS8qCisJCSAqIElmIHRoZSBz Y2FuIGRpcmVjdGlvbiBjaGFuZ2VkIHNpbmNlIG91ciBhcnJheSBrZXlzIChpZiBhbnkpIGxhc3QK KwkJICogYWR2YW5jZWQsIHdlIGNhbm5vdCB0cnVzdCBfYnRfcmVhZHBhZ2UncyBkZXRlcm1pbmF0 aW9uIHRoYXQgdGhlcmUKKwkJICogYXJlIG5vIG1hdGNoZXMgdG8gYmUgZm91bmQgdG8gdGhlIGxl ZnQKKwkJICovCisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKHNvLT5hZHZhbmNlRGlyKSkK KwkJeworCQkJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCisJCQlzby0+Y3VyclBvcy5tb3Jl TGVmdCA9IHRydWU7CisJCQlzby0+YWR2YW5jZURpciA9IGRpcjsKKwkJCXNvLT5uZWVkUHJpbVNj YW4gPSBmYWxzZTsKKwkJfQorCiAJCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwpCiAJ CXsKIAkJCS8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxz LmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMKaW5kZXggZjI1ZDYyYjA1 Li4xYTA0YTZhMWEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRp bHMuYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHV0aWxzLmMKQEAgLTMzLDcg KzMzLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgQlRTb3J0QXJyYXlDb250ZXh0CiB7Ci0JRm1ncklu Zm8JZmxpbmZvOworCUZtZ3JJbmZvICAgKm9yZGVycHJvYzsKIAlPaWQJCQljb2xsYXRpb247CiAJ Ym9vbAkJcmV2ZXJzZTsKIH0gQlRTb3J0QXJyYXlDb250ZXh0OwpAQCAtNDEsMTUgKzQxLDQyIEBA IHR5cGVkZWYgc3RydWN0IEJUU29ydEFycmF5Q29udGV4dAogc3RhdGljIERhdHVtIF9idF9maW5k X2V4dHJlbWVfZWxlbWVudChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKIAkJCQkJ CQkJCSAgU3RyYXRlZ3lOdW1iZXIgc3RyYXQsCiAJCQkJCQkJCQkgIERhdHVtICplbGVtcywgaW50 IG5lbGVtcyk7CitzdGF0aWMgdm9pZCBfYnRfc29ydF9hcnJheV9jbXBfc2V0dXAoSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuS2V5IHNrZXkpOwogc3RhdGljIGludAlfYnRfc29ydF9hcnJheV9lbGVt ZW50cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKIAkJCQkJCQkJCWJvb2wgcmV2 ZXJzZSwKIAkJCQkJCQkJCURhdHVtICplbGVtcywgaW50IG5lbGVtcyk7CitzdGF0aWMgaW50CV9i dF9tZXJnZV9hcnJheXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksIGJvb2wgcmV2 ZXJzZSwKKwkJCQkJCQkgRGF0dW0gKmVsZW1zX29yaWcsIGludCBuZWxlbXNfb3JpZywKKwkJCQkJ CQkgRGF0dW0gKmVsZW1zX25leHQsIGludCBuZWxlbXNfbmV4dCk7CiBzdGF0aWMgaW50CV9idF9j b21wYXJlX2FycmF5X2VsZW1lbnRzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIsIHZvaWQg KmFyZyk7CitzdGF0aWMgaW5saW5lIGludDMyIF9idF9jb21wYXJlX2FycmF5X3NrZXkoRm1ncklu Zm8gKm9yZGVycHJvYywKKwkJCQkJCQkJCQkgICBEYXR1bSB0dXBkYXR1bSwgYm9vbCB0dXBudWxs LAorCQkJCQkJCQkJCSAgIERhdHVtIGFycmRhdHVtLCBTY2FuS2V5IGN1cik7CitzdGF0aWMgaW50 CV9idF9iaW5zcmNoX2FycmF5X3NrZXkoRm1nckluZm8gKm9yZGVycHJvYywKKwkJCQkJCQkJICAg Ym9vbCBjdXJfZWxlbV9zdGFydCwgU2NhbkRpcmVjdGlvbiBkaXIsCisJCQkJCQkJCSAgIERhdHVt IHR1cGRhdHVtLCBib29sIHR1cG51bGwsCisJCQkJCQkJCSAgIEJUQXJyYXlLZXlJbmZvICphcnJh eSwgU2NhbktleSBjdXIsCisJCQkJCQkJCSAgIGludDMyICpzZXRfZWxlbV9yZXN1bHQpOworc3Rh dGljIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoSW5kZXhTY2FuRGVzYyBz Y2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitzdGF0aWMgYm9vbCBfYnRfdHVwbGVfYmVmb3JlX2Fy cmF5X3NrZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwKKwkJCQkJCQkJCQkgQlRSZWFkUGFnZVN0YXRl ICpwc3RhdGUsCisJCQkJCQkJCQkJIEluZGV4VHVwbGUgdHVwbGUsIGludCBza3RyaWcsCisJCQkJ CQkJCQkJIGJvb2wgdmFsaWR0cmlnKTsKK3N0YXRpYyBib29sIF9idF9hZHZhbmNlX2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBCVFJlYWRQYWdlU3RhdGUgKnBzdGF0ZSwKKwkJCQkJCQkJ ICAgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHNrdHJpZyk7CitzdGF0aWMgdm9pZCBfYnRfdXBkYXRl X2tleXNfd2l0aF9hcnJheWtleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKKyNpZmRlZiBVU0VfQVNT RVJUX0NIRUNLSU5HCitzdGF0aWMgYm9vbCBfYnRfdmVyaWZ5X2tleXNfd2l0aF9hcnJheWtleXMo SW5kZXhTY2FuRGVzYyBzY2FuKTsKKyNlbmRpZgogc3RhdGljIGJvb2wgX2J0X2NvbXBhcmVfc2Nh bmtleV9hcmdzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBvcCwKIAkJCQkJCQkJCSBTY2Fu S2V5IGxlZnRhcmcsIFNjYW5LZXkgcmlnaHRhcmcsCiAJCQkJCQkJCQkgYm9vbCAqcmVzdWx0KTsK IHN0YXRpYyBib29sIF9idF9maXhfc2NhbmtleV9zdHJhdGVneShTY2FuS2V5IHNrZXksIGludDE2 ICppbmRvcHRpb24pOwogc3RhdGljIHZvaWQgX2J0X21hcmtfc2NhbmtleV9yZXF1aXJlZChTY2Fu S2V5IHNrZXkpOworc3RhdGljIGJvb2wgX2J0X2NoZWNrX2NvbXBhcmUoU2NhbkRpcmVjdGlvbiBk aXIsIEJUU2Nhbk9wYXF1ZSBzbywKKwkJCQkJCQkgIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBu YXR0cywgVHVwbGVEZXNjIHR1cGRlc2MsCisJCQkJCQkJICBpbnQgbnVtQXJyYXlLZXlzLCBib29s ICpjb250aW51ZXNjYW4sIGludCAqaWtleSwKKwkJCQkJCQkgIGJvb2wgcmVxdWlyZWRNYXRjaGVk QnlQcmVjaGVjayk7CiBzdGF0aWMgYm9vbCBfYnRfY2hlY2tfcm93Y29tcGFyZShTY2FuS2V5IHNr ZXksCiAJCQkJCQkJCSBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsIFR1cGxlRGVzYyB0 dXBkZXNjLAogCQkJCQkJCQkgU2NhbkRpcmVjdGlvbiBkaXIsIGJvb2wgKmNvbnRpbnVlc2Nhbik7 CkBAIC0xOTAsMTMgKzIxNyw0OCBAQCBfYnRfZnJlZXN0YWNrKEJUU3RhY2sgc3RhY2spCiAgKiBJ ZiB0aGVyZSBhcmUgYW55IFNLX1NFQVJDSEFSUkFZIHNjYW4ga2V5cywgZGVjb25zdHJ1Y3QgdGhl IGFycmF5KHMpIGFuZAogICogc2V0IHVwIEJUQXJyYXlLZXlJbmZvIGluZm8gZm9yIGVhY2ggb25l IHRoYXQgaXMgYW4gZXF1YWxpdHktdHlwZSBrZXkuCiAgKiBQcmVwYXJlIG1vZGlmaWVkIHNjYW4g a2V5cyBpbiBzby0+YXJyYXlLZXlEYXRhLCB3aGljaCB3aWxsIGhvbGQgdGhlIGN1cnJlbnQKLSAq IGFycmF5IGVsZW1lbnRzIGR1cmluZyBlYWNoIHByaW1pdGl2ZSBpbmRleHNjYW4gb3BlcmF0aW9u LiAgRm9yIGluZXF1YWxpdHkKLSAqIGFycmF5IGtleXMsIGl0J3Mgc3VmZmljaWVudCB0byBmaW5k IHRoZSBleHRyZW1lIGVsZW1lbnQgdmFsdWUgYW5kIHJlcGxhY2UKLSAqIHRoZSB3aG9sZSBhcnJh eSB3aXRoIHRoYXQgc2NhbGFyIHZhbHVlLgorICogYXJyYXkgZWxlbWVudHMuCisgKgorICogX2J0 X3ByZXByb2Nlc3Nfa2V5cyB0cmVhdHMgZWFjaCBwcmltaXRpdmUgc2NhbiBhcyBhbiBpbmRlcGVu ZGVudCBwaWVjZSBvZgorICogd29yay4gIFdlIHBlcmZvcm0gYWxsIHByZXByb2Nlc3NpbmcgdGhh dCBtdXN0IHdvcmsgImFjcm9zcyBhcnJheSBrZXlzIi4KKyAqIFRoaXMgZGl2aXNpb24gb2YgbGFi b3IgbWFrZXMgc2Vuc2Ugb25jZSB5b3UgY29uc2lkZXIgdGhhdCB3ZSdyZSBjYWxsZWQgb25seQor ICogb25jZSBwZXIgYnRyZXNjYW4sIHdoZXJlYXMgX2J0X3ByZXByb2Nlc3Nfa2V5cyBpcyBjYWxs ZWQgb25jZSBwZXIgcHJpbWl0aXZlCisgKiBpbmRleCBzY2FuLgorICoKKyAqIEN1cnJlbnRseSB3 ZSBwZXJmb3JtIHR3byBraW5kcyBvZiBwcmVwcm9jZXNzaW5nIHRvIGRlYWwgd2l0aCByZWR1bmRh bmNpZXMuCisgKiBGb3IgaW5lcXVhbGl0eSBhcnJheSBrZXlzLCBpdCdzIHN1ZmZpY2llbnQgdG8g ZmluZCB0aGUgZXh0cmVtZSBlbGVtZW50CisgKiB2YWx1ZSBhbmQgcmVwbGFjZSB0aGUgd2hvbGUg YXJyYXkgd2l0aCB0aGF0IHNjYWxhciB2YWx1ZS4gIFRoaXMgZWxpbWluYXRlcworICogYWxsIGJ1 dCBvbmUgYXJyYXkga2V5IGFzIHJlZHVuZGFudC4gIFNpbWlsYXJseSwgd2UgYXJlIGNhcGFibGUg b2YgIm1lcmdpbmcKKyAqIHRvZ2V0aGVyIiBtdWx0aXBsZSBlcXVhbGl0eSBhcnJheSBrZXlzIGZy b20gdHdvIG9yIG1vcmUgaW5wdXQgc2NhbiBrZXlzCisgKiBpbnRvIGEgc2luZ2xlIG91dHB1dCBz Y2FuIGtleSB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGludGVyc2VjdGluZyBhcnJheQorICogZWxl bWVudHMuICBUaGlzIGNhbiBlbGltaW5hdGUgbWFueSByZWR1bmRhbnQgYXJyYXkgZWxlbWVudHMs IGFzIHdlbGwgYXMKKyAqIGVsaW1pbmF0aW5nIHdob2xlIGFycmF5IHNjYW4ga2V5cyBhcyByZWR1 bmRhbnQuCisgKgorICogTm90ZTogX2J0X3N0YXJ0X2FycmF5X2tleXMgYWN0dWFsbHkgc2V0cyB1 cCB0aGUgY3VyX2VsZW0gY291bnRlcnMgbGF0ZXIgb24sCisgKiBvbmNlIHRoZSBzY2FuIGRpcmVj dGlvbiBpcyBrbm93bi4KICAqCiAgKiBOb3RlOiB0aGUgcmVhc29uIHdlIG5lZWQgc28tPmFycmF5 S2V5RGF0YSwgcmF0aGVyIHRoYW4ganVzdCBzY3JpYmJsaW5nCiAgKiBvbiBzY2FuLT5rZXlEYXRh LCBpcyB0aGF0IGNhbGxlcnMgYXJlIHBlcm1pdHRlZCB0byBjYWxsIGJ0cmVzY2FuIHdpdGhvdXQK ICAqIHN1cHBseWluZyBhIG5ldyBzZXQgb2Ygc2NhbmtleSBkYXRhLgorICoKKyAqIE5vdGU6IF9i dF9wcmVwcm9jZXNzX2tleXMgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZSBzby0+a2V5 RGF0YSBzY2FuCisgKiBrZXlzIHVzZWQgYnkgX2J0X2NoZWNra2V5cy4gIEluZGV4IHNjYW5zIHRo YXQgZG9uJ3QgdXNlIGVxdWFsaXR5IGFycmF5IGtleXMKKyAqIHdpbGwgaGF2ZSBfYnRfcHJlcHJv Y2Vzc19rZXlzIHRyZWF0IHNjYW4tPmtleURhdGEgYXMgaW5wdXQgYW5kIHNvLT5rZXlEYXRhCisg KiBhcyBvdXRwdXQuICBTY2FucyB0aGF0IHVzZSBlcXVhbGl0eSBhcnJheSBrZXlzIGhhdmUgX2J0 X3ByZXByb2Nlc3Nfa2V5cworICogdHJlYXQgc28tPmFycmF5S2V5RGF0YSAod2hpY2ggaXMgb3Vy IG91dHB1dCkgYXMgdGhlaXIgaW5wdXQsIHdoaWxlIChhcyBwZXIKKyAqIHVzdWFsKSBvdXRwdXR0 aW5nIHNvLT5rZXlEYXRhIGZvciBfYnRfY2hlY2trZXlzLiAgVGhpcyBmdW5jdGlvbiBhZGRzIGFu CisgKiBhZGRpdGlvbmFsIGxheWVyIG9mIGluZGlyZWN0aW9uIHRoYXQgYWxsb3dzIF9idF9wcmVw cm9jZXNzX2tleXMgdG8gbW9yZSBvcgorICogbGVzcyBhdm9pZCBkZWFsaW5nIHdpdGggU0tfU0VB UkNIQVJSQVkgYXMgYSBzcGVjaWFsIGNhc2UuCisgKgorICogTm90ZTogX2J0X3VwZGF0ZV9rZXlz X3dpdGhfYXJyYXlrZXlzIHdvcmtzIGJ5IHVwZGF0aW5nIGFscmVhZHktcHJvY2Vzc2VkCisgKiBv dXRwdXQga2V5cyAoc28tPmtleURhdGEpIGluLXBsYWNlLiAgSXQgY2Fubm90IGVsaW1pbmF0ZSBy ZWR1bmRhbnQgb3IKKyAqIGNvbnRyYWRpY3Rvcnkgc2NhbiBrZXlzLiAgVGhpcyBuZWNlc3NpdGF0 ZXMgaGF2aW5nIF9idF9wcmVwcm9jZXNzX2tleXMKKyAqIHVuZGVyc3RhbmQgdGhhdCBpdCBpcyB1 bnNhZmUgdG8gZWxpbWluYXRlICJyZWR1bmRhbnQiIFNLX1NFQVJDSEFSUkFZCisgKiBlcXVhbGl0 eSBzY2FuIGtleXMgb24gdGhlIGJhc2lzIG9mIHdoYXQgaXMgYWN0dWFsbHkganVzdCB0aGUgY3Vy cmVudCBhcnJheQorICoga2V5IHZhbHVlcyAtLSBpdCBtdXN0IGNvbnNlcnZhdGl2ZWx5IGFzc3Vt ZSB0aGF0IHN1Y2ggYSBzY2FuIGtleSBtaWdodCBubworICogbG9uZ2VyIGJlIHJlZHVuZGFudCBh ZnRlciB0aGUgbmV4dCBfYnRfdXBkYXRlX2tleXNfd2l0aF9hcnJheWtleXMgY2FsbC4KKyAqIElk ZWFsbHkgd2UnZCBiZSBhYmxlIHRvIGRlYWwgd2l0aCB0aGF0IGJ5IGVsaW1pbmF0aW5nIGEgc3Vi c2V0IG9mIHRydWx5CisgKiByZWR1bmRhbnQgYXJyYXkga2V5cyB1cC1mcm9udCwgYnV0IGl0IGRv ZXNuJ3Qgc2VlbSB3b3J0aCB0aGUgdHJvdWJsZS4KICAqLwogdm9pZAogX2J0X3ByZXByb2Nlc3Nf YXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCkBAIC0yMDQsNyArMjY2LDEwIEBAIF9idF9w cmVwcm9jZXNzX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCUJUU2Nhbk9wYXF1ZSBz byA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAlpbnQJCQludW1iZXJPZktleXMgPSBz Y2FuLT5udW1iZXJPZktleXM7CiAJaW50MTYJICAgKmluZG9wdGlvbiA9IHNjYW4tPmluZGV4UmVs YXRpb24tPnJkX2luZG9wdGlvbjsKKwlpbnQxNgkJbmtleWF0dHMgPSBJbmRleFJlbGF0aW9uR2V0 TnVtYmVyT2ZLZXlBdHRyaWJ1dGVzKHNjYW4tPmluZGV4UmVsYXRpb24pOwogCWludAkJCW51bUFy cmF5S2V5czsKKwlpbnQJCQlsYXN0RXF1YWxpdHlBcnJheUF0dCA9IC0xOworCU9pZAkJCWxhc3RP cmRlclByb2MgPSBJbnZhbGlkT2lkOwogCVNjYW5LZXkJCWN1cjsKIAlpbnQJCQlpOwogCU1lbW9y eUNvbnRleHQgb2xkQ29udGV4dDsKQEAgLTI1Nyw2ICszMjIsOCBAQCBfYnRfcHJlcHJvY2Vzc19h cnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKIAogCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBw ZXItYXJyYXkgZGF0YSBpbiB0aGUgd29ya3NwYWNlIGNvbnRleHQgKi8KIAlzby0+YXJyYXlLZXlz ID0gKEJUQXJyYXlLZXlJbmZvICopIHBhbGxvYzAobnVtQXJyYXlLZXlzICogc2l6ZW9mKEJUQXJy YXlLZXlJbmZvKSk7CisJc28tPm9yZGVyUHJvY3MgPSAoRm1nckluZm8gKikgcGFsbG9jMChua2V5 YXR0cyAqIHNpemVvZihGbWdySW5mbykpOworCXNvLT5hZHZhbmNlRGlyID0gTm9Nb3ZlbWVudFNj YW5EaXJlY3Rpb247CiAKIAkvKiBOb3cgcHJvY2VzcyBlYWNoIGFycmF5IGtleSAqLwogCW51bUFy cmF5S2V5cyA9IDA7CkBAIC0yNzMsNiArMzQwLDE2IEBAIF9idF9wcmVwcm9jZXNzX2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogCQlpbnQJCQlqOwogCiAJCWN1ciA9ICZzby0+YXJyYXlL ZXlEYXRhW2ldOworCisJCS8qCisJCSAqIEF0dHJpYnV0ZXMgd2l0aCBlcXVhbGl0eS10eXBlIHNj YW4ga2V5cyAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZAorCQkgKiB0byBhcnJheSBzY2FuIGtl eXMpIHdpbGwgbmVlZCBhIDMtd2F5IGNvbXBhcmlzb24gZnVuY3Rpb24uICAgU2V0CisJCSAqIHRo YXQgdXAgbm93LiAgKEF2b2lkcyByZXBlYXRpbmcgd29yayBmb3IgdGhlIHNhbWUgYXR0cmlidXRl LikKKwkJICovCisJCWlmIChjdXItPnNrX3N0cmF0ZWd5ID09IEJURXF1YWxTdHJhdGVneU51bWJl ciAmJgorCQkJIU9pZElzVmFsaWQoc28tPm9yZGVyUHJvY3NbY3VyLT5za19hdHRubyAtIDFdLmZu X29pZCkpCisJCQlfYnRfc29ydF9hcnJheV9jbXBfc2V0dXAoc2NhbiwgY3VyKTsKKwogCQlpZiAo IShjdXItPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJSQVkpKQogCQkJY29udGludWU7CiAKQEAgLTM0 OSw2ICs0MjYsNDYgQEAgX2J0X3ByZXByb2Nlc3NfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNj YW4pCiAJCQkJCQkJCQkJCShpbmRvcHRpb25bY3VyLT5za19hdHRubyAtIDFdICYgSU5ET1BUSU9O X0RFU0MpICE9IDAsCiAJCQkJCQkJCQkJCWVsZW1fdmFsdWVzLCBudW1fbm9ubnVsbHMpOwogCisJ CS8qCisJCSAqIElmIHRoaXMgc2NhbiBrZXkgaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8g YSBwcmV2aW91cyBlcXVhbGl0eQorCQkgKiBvcGVyYXRvciBhcnJheSBzY2FuIGtleSwgbWVyZ2Ug dGhlIHR3byBhcnJheXMgdG9nZXRoZXIgdG8gZWxpbWluYXRlCisJCSAqIHJlZHVuZGFudCBub24t aW50ZXJzZWN0aW5nIGVsZW1lbnRzIChhbmQgcmVkdW5kYW50IHdob2xlIHNjYW4ga2V5cykKKwkJ ICovCisJCWlmIChsYXN0RXF1YWxpdHlBcnJheUF0dCA9PSBjdXItPnNrX2F0dG5vICYmCisJCQls YXN0T3JkZXJQcm9jID09IGN1ci0+c2tfZnVuYy5mbl9vaWQpCisJCXsKKwkJCUJUQXJyYXlLZXlJ bmZvICpwcmV2ID0gJnNvLT5hcnJheUtleXNbbnVtQXJyYXlLZXlzIC0gMV07CisKKwkJCUFzc2Vy dChzby0+YXJyYXlLZXlEYXRhW3ByZXYtPnNjYW5fa2V5XS5za19zdWJ0eXBlID09CisJCQkJICAg Y3VyLT5za19zdWJ0eXBlKTsKKworCQkJbnVtX2VsZW1zID0gX2J0X21lcmdlX2FycmF5cyhzY2Fu LCBjdXIsCisJCQkJCQkJCQkJIChpbmRvcHRpb25bY3VyLT5za19hdHRubyAtIDFdICYgSU5ET1BU SU9OX0RFU0MpICE9IDAsCisJCQkJCQkJCQkJIHByZXYtPmVsZW1fdmFsdWVzLCBwcmV2LT5udW1f ZWxlbXMsCisJCQkJCQkJCQkJIGVsZW1fdmFsdWVzLCBudW1fZWxlbXMpOworCisJCQlwZnJlZShl bGVtX3ZhbHVlcyk7CisKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBhcmUgbm8gaW50ZXJzZWN0aW5n IGVsZW1lbnRzIGxlZnQgZnJvbSBtZXJnaW5nIHRoaXMKKwkJCSAqIGFycmF5IGludG8gdGhlIHBy ZXZpb3VzIGFycmF5IG9uIHRoZSBzYW1lIGF0dHJpYnV0ZSwgdGhlIHNjYW4KKwkJCSAqIHF1YWwg aXMgdW5zYXRpc2ZpYWJsZQorCQkJICovCisJCQlpZiAobnVtX2VsZW1zID09IDApCisJCQl7CisJ CQkJbnVtQXJyYXlLZXlzID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBM b3dlciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZyb20gdGhlIHByZXZpb3VzIGFycmF5LCBhbmQg bWFyaworCQkJICogdGhpcyBzY2FuIGtleS9hcnJheSBhcyByZWR1bmRhbnQgZm9yIGV2ZXJ5IHBy aW1pdGl2ZSBpbmRleCBzY2FuCisJCQkgKi8KKwkJCXByZXYtPm51bV9lbGVtcyA9IG51bV9lbGVt czsKKwkJCWN1ci0+c2tfZmxhZ3MgfD0gU0tfQlRfUkRETkFSUkFZOworCQkJY29udGludWU7CisJ CX0KKwogCQkvKgogCQkgKiBBbmQgc2V0IHVwIHRoZSBCVEFycmF5S2V5SW5mbyBkYXRhLgogCQkg Ki8KQEAgLTM1Niw2ICs0NzMsOCBAQCBfYnRfcHJlcHJvY2Vzc19hcnJheV9rZXlzKEluZGV4U2Nh bkRlc2Mgc2NhbikKIAkJc28tPmFycmF5S2V5c1tudW1BcnJheUtleXNdLm51bV9lbGVtcyA9IG51 bV9lbGVtczsKIAkJc28tPmFycmF5S2V5c1tudW1BcnJheUtleXNdLmVsZW1fdmFsdWVzID0gZWxl bV92YWx1ZXM7CiAJCW51bUFycmF5S2V5cysrOworCQlsYXN0RXF1YWxpdHlBcnJheUF0dCA9IGN1 ci0+c2tfYXR0bm87CisJCWxhc3RPcmRlclByb2MgPSBjdXItPnNrX2Z1bmMuZm5fb2lkOwogCX0K IAogCXNvLT5udW1BcnJheUtleXMgPSBudW1BcnJheUtleXM7CkBAIC00MjksMjYgKzU0OCwyOCBA QCBfYnRfZmluZF9leHRyZW1lX2VsZW1lbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNr ZXksCiB9CiAKIC8qCi0gKiBfYnRfc29ydF9hcnJheV9lbGVtZW50cygpIC0tIHNvcnQgYW5kIGRl LWR1cCBhcnJheSBlbGVtZW50cworICogX2J0X3NvcnRfYXJyYXlfY21wX3NldHVwKCkgLS0gTG9v ayB1cCBhcnJheSBjb21wYXJpc29uIGZ1bmN0aW9uCiAgKgotICogVGhlIGFycmF5IGVsZW1lbnRz IGFyZSBzb3J0ZWQgaW4tcGxhY2UsIGFuZCB0aGUgbmV3IG51bWJlciBvZiBlbGVtZW50cwotICog YWZ0ZXIgZHVwbGljYXRlIHJlbW92YWwgaXMgcmV0dXJuZWQuCi0gKgotICogc2NhbiBhbmQgc2tl eSBpZGVudGlmeSB0aGUgaW5kZXggY29sdW1uLCB3aG9zZSBvcGZhbWlseSBkZXRlcm1pbmVzIHRo ZQotICogY29tcGFyaXNvbiBzZW1hbnRpY3MuICBJZiByZXZlcnNlIGlzIHRydWUsIHdlIHNvcnQg aW4gZGVzY2VuZGluZyBvcmRlci4KKyAqIFNldHMgc28tPm9yZGVyUHJvY3NbXSBmb3Igc2NhbiBr ZXkncyBhdHRyaWJ1dGUuICBUaGlzIGlzIHVzZWQgdG8gc29ydCBhbmQKKyAqIGRlZHVwbGljYXRl IHRoZSBhdHRyaWJ1dGUncyBhcnJheSAoaWYgYW55KS4gIEl0J3MgYWxzbyB1c2VkIGR1cmluZyBi aW5hcnkKKyAqIHNlYXJjaGVzIG9mIHRoZSBuZXh0IGFycmF5IGtleSBtYXRjaGluZyBpbmRleCB0 dXBsZXMganVzdCBiZXlvbmQgdGhlIHJhbmdlCisgKiBvZiB0aGUgc2NhbidzIGN1cnJlbnQgc2V0 IG9mIGFycmF5IGtleXMuCiAgKi8KLXN0YXRpYyBpbnQKLV9idF9zb3J0X2FycmF5X2VsZW1lbnRz KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5LAotCQkJCQkJYm9vbCByZXZlcnNlLAot CQkJCQkJRGF0dW0gKmVsZW1zLCBpbnQgbmVsZW1zKQorc3RhdGljIHZvaWQKK19idF9zb3J0X2Fy cmF5X2NtcF9zZXR1cChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSkKIHsKKwlCVFNj YW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJUmVsYXRpb24JcmVs ID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKIAlPaWQJCQllbGVtdHlwZTsKIAlSZWdQcm9jZWR1cmUg Y21wX3Byb2M7Ci0JQlRTb3J0QXJyYXlDb250ZXh0IGN4dDsKKwlGbWdySW5mbyAgICpvcmRlcnBy b2MgPSAmc28tPm9yZGVyUHJvY3Nbc2tleS0+c2tfYXR0bm8gLSAxXTsKIAotCWlmIChuZWxlbXMg PD0gMSkKLQkJcmV0dXJuIG5lbGVtczsJCQkvKiBubyB3b3JrIHRvIGRvICovCisJLyoKKwkgKiBT aG91bGQgZG8gdGhpcyBmb3IgYWxsIGVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5cyBvbmx5IChp bmNsdWRpbmcKKwkgKiB0aG9zZSB3aXRob3V0IGFueSBhcnJheSkuICBTZWUgX2J0X2FkdmFuY2Vf YXJyYXlfa2V5cyBmb3IgZGV0YWlscyBvZgorCSAqIHdoeSB3ZSBuZWVkIGFuIE9SREVSIHByb2Mg Zm9yIG5vbi1hcnJheSBlcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXMuCisJICovCisJQXNzZXJ0 KHNrZXktPnNrX3N0cmF0ZWd5ID09IEJURXF1YWxTdHJhdGVneU51bWJlcik7CiAKIAkvKgogCSAq IERldGVybWluZSB0aGUgbm9taW5hbCBkYXRhdHlwZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuICBX ZSBoYXZlIHRvCkBAIC00NjIsMjIgKzU4Myw0NCBAQCBfYnRfc29ydF9hcnJheV9lbGVtZW50cyhJ bmRleFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKIAkvKgogCSAqIExvb2sgdXAgdGhlIGFw cHJvcHJpYXRlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdGhlIG9wZmFtaWx5LgogCSAqCi0JICog Tm90ZTogaXQncyBwb3NzaWJsZSB0aGF0IHRoaXMgd291bGQgZmFpbCwgaWYgdGhlIG9wZmFtaWx5 IGlzCi0JICogaW5jb21wbGV0ZSwgYnV0IGl0IHNlZW1zIHF1aXRlIHVubGlrZWx5IHRoYXQgYW4g b3BmYW1pbHkgd291bGQgb21pdAotCSAqIG5vbi1jcm9zcy10eXBlIHN1cHBvcnQgZnVuY3Rpb25z IGZvciBhbnkgZGF0YXR5cGUgdGhhdCBpdCBzdXBwb3J0cyBhdAotCSAqIGFsbC4KKwkgKiBOb3Rl OiBpdCdzIHBvc3NpYmxlIHRoYXQgdGhpcyB3b3VsZCBmYWlsLCBpZiB0aGUgb3BmYW1pbHkgbGFj a3MgdGhlCisJICogcmVxdWlyZWQgY3Jvc3MtdHlwZSBPUkRFUiBwcm9jLiAgQnV0IHRoaXMgaXMg bm8gZGlmZmVyZW50IHRvIHRoZSBjYXNlCisJICogd2hlcmUgX2J0X2ZpcnN0IGZhaWxzIHRvIGZp bmQgYW4gT1JERVIgcHJvYyBmb3IgaXRzIGluc2VydGlvbiBzY2FuIGtleS4KIAkgKi8KIAljbXBf cHJvYyA9IGdldF9vcGZhbWlseV9wcm9jKHJlbC0+cmRfb3BmYW1pbHlbc2tleS0+c2tfYXR0bm8g LSAxXSwKLQkJCQkJCQkJIGVsZW10eXBlLAotCQkJCQkJCQkgZWxlbXR5cGUsCisJCQkJCQkJCSBy ZWwtPnJkX29wY2ludHlwZVtza2V5LT5za19hdHRubyAtIDFdLCBlbGVtdHlwZSwKIAkJCQkJCQkJ IEJUT1JERVJfUFJPQyk7CiAJaWYgKCFSZWdQcm9jZWR1cmVJc1ZhbGlkKGNtcF9wcm9jKSkKLQkJ ZWxvZyhFUlJPUiwgIm1pc3Npbmcgc3VwcG9ydCBmdW5jdGlvbiAlZCgldSwldSkgaW4gb3BmYW1p bHkgJXUiLAotCQkJIEJUT1JERVJfUFJPQywgZWxlbXR5cGUsIGVsZW10eXBlLAotCQkJIHJlbC0+ cmRfb3BmYW1pbHlbc2tleS0+c2tfYXR0bm8gLSAxXSk7CisJCWVsb2coRVJST1IsICJtaXNzaW5n IHN1cHBvcnQgZnVuY3Rpb24gJWQoJXUsJXUpIGZvciBhdHRyaWJ1dGUgJWQgb2YgaW5kZXggXCIl c1wiIiwKKwkJCSBCVE9SREVSX1BST0MsIHJlbC0+cmRfb3BjaW50eXBlW3NrZXktPnNrX2F0dG5v IC0gMV0sIGVsZW10eXBlLAorCQkJIHNrZXktPnNrX2F0dG5vLCBSZWxhdGlvbkdldFJlbGF0aW9u TmFtZShyZWwpKTsKKworCS8qIFNhdmUgaW4gb3JkZXJwcm9jIGVudHJ5IGZvciBhdHRyaWJ1dGUg Ki8KKwlmbWdyX2luZm9fY3h0KGNtcF9wcm9jLCBvcmRlcnByb2MsIHNvLT5hcnJheUNvbnRleHQp OworfQorCisvKgorICogX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoKSAtLSBzb3J0IGFuZCBkZS1k dXAgYXJyYXkgZWxlbWVudHMKKyAqCisgKiBUaGUgYXJyYXkgZWxlbWVudHMgYXJlIHNvcnRlZCBp bi1wbGFjZSwgYW5kIHRoZSBuZXcgbnVtYmVyIG9mIGVsZW1lbnRzCisgKiBhZnRlciBkdXBsaWNh dGUgcmVtb3ZhbCBpcyByZXR1cm5lZC4KKyAqCisgKiBzY2FuIGFuZCBza2V5IGlkZW50aWZ5IHRo ZSBpbmRleCBjb2x1bW4sIHdob3NlIG9wZmFtaWx5IGRldGVybWluZXMgdGhlCisgKiBjb21wYXJp c29uIHNlbWFudGljcy4gIElmIHJldmVyc2UgaXMgdHJ1ZSwgd2Ugc29ydCBpbiBkZXNjZW5kaW5n IG9yZGVyLgorICovCitzdGF0aWMgaW50CitfYnRfc29ydF9hcnJheV9lbGVtZW50cyhJbmRleFNj YW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKKwkJCQkJCWJvb2wgcmV2ZXJzZSwKKwkJCQkJCURh dHVtICplbGVtcywgaW50IG5lbGVtcykKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3Bh cXVlKSBzY2FuLT5vcGFxdWU7CisJQlRTb3J0QXJyYXlDb250ZXh0IGN4dDsKKworCWlmIChuZWxl bXMgPD0gMSkKKwkJcmV0dXJuIG5lbGVtczsJCQkvKiBubyB3b3JrIHRvIGRvICovCiAKIAkvKiBT b3J0IHRoZSBhcnJheSBlbGVtZW50cyAqLwotCWZtZ3JfaW5mbyhjbXBfcHJvYywgJmN4dC5mbGlu Zm8pOworCWN4dC5vcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3Nbc2tleS0+c2tfYXR0bm8gLSAx XTsKIAljeHQuY29sbGF0aW9uID0gc2tleS0+c2tfY29sbGF0aW9uOwogCWN4dC5yZXZlcnNlID0g cmV2ZXJzZTsKIAlxc29ydF9hcmcoZWxlbXMsIG5lbGVtcywgc2l6ZW9mKERhdHVtKSwKQEAgLTQ4 OCw2ICs2MzEsNDggQEAgX2J0X3NvcnRfYXJyYXlfZWxlbWVudHMoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuS2V5IHNrZXksCiAJCQkJCSAgIF9idF9jb21wYXJlX2FycmF5X2VsZW1lbnRzLCAmY3h0 KTsKIH0KIAorLyoKKyAqIF9idF9tZXJnZV9hcnJheXMoKSAtLSBtZXJnZSB0b2dldGhlciBkdXBs aWNhdGUgYXJyYXkga2V5cworICoKKyAqIEJvdGggc2NhbiBrZXlzIGhhdmUgYXJyYXkgZWxlbWVu dHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzb3J0ZWQgYW5kCisgKiBkZWR1cGxpY2F0ZWQuCisg Ki8KK3N0YXRpYyBpbnQKK19idF9tZXJnZV9hcnJheXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2Fu S2V5IHNrZXksIGJvb2wgcmV2ZXJzZSwKKwkJCQkgRGF0dW0gKmVsZW1zX29yaWcsIGludCBuZWxl bXNfb3JpZywKKwkJCQkgRGF0dW0gKmVsZW1zX25leHQsIGludCBuZWxlbXNfbmV4dCkKK3sKKwlC VFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJQlRTb3J0QXJy YXlDb250ZXh0IGN4dDsKKwlEYXR1bQkgICAqbWVyZ2VkID0gcGFsbG9jKHNpemVvZihEYXR1bSkg KiBNaW4obmVsZW1zX29yaWcsIG5lbGVtc19uZXh0KSk7CisJaW50CQkJbWVyZ2VkX25lbGVtcyA9 IDA7CisKKwkvKgorCSAqIEluY3JlbWVudGFsbHkgY29weSB0aGUgb3JpZ2luYWwgYXJyYXkgaW50 byBhIHRlbXAgYnVmZmVyLCBza2lwcGluZyBvdmVyCisJICogYW55IGl0ZW1zIHRoYXQgYXJlIG1p c3NpbmcgZnJvbSB0aGUgIm5leHQiIGFycmF5CisJICovCisJY3h0Lm9yZGVycHJvYyA9ICZzby0+ b3JkZXJQcm9jc1tza2V5LT5za19hdHRubyAtIDFdOworCWN4dC5jb2xsYXRpb24gPSBza2V5LT5z a19jb2xsYXRpb247CisJY3h0LnJldmVyc2UgPSByZXZlcnNlOworCWZvciAoaW50IGkgPSAwOyBp IDwgbmVsZW1zX29yaWc7IGkrKykKKwl7CisJCURhdHVtCSAgICplbGVtID0gZWxlbXNfb3JpZyAr IGk7CisKKwkJaWYgKGJzZWFyY2hfYXJnKGVsZW0sIGVsZW1zX25leHQsIG5lbGVtc19uZXh0LCBz aXplb2YoRGF0dW0pLAorCQkJCQkJX2J0X2NvbXBhcmVfYXJyYXlfZWxlbWVudHMsICZjeHQpKQor CQkJbWVyZ2VkW21lcmdlZF9uZWxlbXMrK10gPSAqZWxlbTsKKwl9CisKKwkvKgorCSAqIE92ZXJ3 cml0ZSB0aGUgb3JpZ2luYWwgYXJyYXkgd2l0aCB0ZW1wIGJ1ZmZlciBzbyB0aGF0IHdlJ3JlIG9u bHkgbGVmdAorCSAqIHdpdGggaW50ZXJzZWN0aW5nIGFycmF5IGVsZW1lbnRzCisJICovCisJbWVt Y3B5KGVsZW1zX29yaWcsIG1lcmdlZCwgbWVyZ2VkX25lbGVtcyAqIHNpemVvZihEYXR1bSkpOwor CXBmcmVlKG1lcmdlZCk7CisKKwlyZXR1cm4gbWVyZ2VkX25lbGVtczsKK30KKwogLyoKICAqIHFz b3J0X2FyZyBjb21wYXJhdG9yIGZvciBzb3J0aW5nIGFycmF5IGVsZW1lbnRzCiAgKi8KQEAgLTQ5 OSw3ICs2ODQsNyBAQCBfYnRfY29tcGFyZV9hcnJheV9lbGVtZW50cyhjb25zdCB2b2lkICphLCBj b25zdCB2b2lkICpiLCB2b2lkICphcmcpCiAJQlRTb3J0QXJyYXlDb250ZXh0ICpjeHQgPSAoQlRT b3J0QXJyYXlDb250ZXh0ICopIGFyZzsKIAlpbnQzMgkJY29tcGFyZTsKIAotCWNvbXBhcmUgPSBE YXR1bUdldEludDMyKEZ1bmN0aW9uQ2FsbDJDb2xsKCZjeHQtPmZsaW5mbywKKwljb21wYXJlID0g RGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29sbChjeHQtPm9yZGVycHJvYywKIAkJCQkJCQkJ CQkJICBjeHQtPmNvbGxhdGlvbiwKIAkJCQkJCQkJCQkJICBkYSwgZGIpKTsKIAlpZiAoY3h0LT5y ZXZlcnNlKQpAQCAtNTA3LDYgKzY5MiwxNTkgQEAgX2J0X2NvbXBhcmVfYXJyYXlfZWxlbWVudHMo Y29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQogCXJldHVybiBjb21wYXJl OwogfQogCisvKgorICogX2J0X2NvbXBhcmVfYXJyYXlfc2tleSgpIC0tIGFwcGx5IGFycmF5IGNv bXBhcmlzb24gZnVuY3Rpb24KKyAqCisgKiBDb21wYXJlcyBjYWxsZXIncyB0dXBsZSBhdHRyaWJ1 dGUgdmFsdWUgdG8gYSBzY2FuIGtleS9hcnJheSBlbGVtZW50LgorICogSGVscGVyIGZ1bmN0aW9u IHVzZWQgZHVyaW5nIGJpbmFyeSBzZWFyY2hlcyBvZiBTS19TRUFSQ0hBUlJBWSBhcnJheXMuCisg KgorICoJCVRoaXMgcm91dGluZSByZXR1cm5zOgorICoJCQk8MCBpZiB0dXBkYXR1bSA8IGFycmRh dHVtOworICoJCQkgMCBpZiB0dXBkYXR1bSA9PSBhcnJkYXR1bTsKKyAqCQkJPjAgaWYgdHVwZGF0 dW0gPiBhcnJkYXR1bS4KKyAqCisgKiBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzYW1lIGludGVy ZmFjZSBhcyBfYnRfY29tcGFyZTogYm90aCBmdW5jdGlvbnMKKyAqIGNvbXBhcmUgdGhlIHZhbHVl IHRoYXQgdGhleSdyZSBzZWFyY2hpbmcgZm9yIHRvIGEgYmluYXJ5IHNlYXJjaCBwaXZvdC4KKyAq IEhvd2V2ZXIsIHVubGlrZSBfYnRfY29tcGFyZSwgdGhpcyBmdW5jdGlvbidzICJ0dXBsZSBhcmd1 bWVudCIgY29tZXMgZmlyc3QsCisgKiB3aGlsZSBpdHMgImFycmF5L3NjYW5rZXkgYXJndW1lbnQi IGNvbWVzIHNlY29uZC4KKyovCitzdGF0aWMgaW5saW5lIGludDMyCitfYnRfY29tcGFyZV9hcnJh eV9za2V5KEZtZ3JJbmZvICpvcmRlcnByb2MsCisJCQkJCSAgIERhdHVtIHR1cGRhdHVtLCBib29s IHR1cG51bGwsCisJCQkJCSAgIERhdHVtIGFycmRhdHVtLCBTY2FuS2V5IGN1cikKK3sKKwlpbnQz MgkJcmVzdWx0ID0gMDsKKworCUFzc2VydChjdXItPnNrX3N0cmF0ZWd5ID09IEJURXF1YWxTdHJh dGVneU51bWJlcik7CisKKwlpZiAodHVwbnVsbCkJCQkJLyogTlVMTCB0dXBkYXR1bSAqLworCXsK KwkJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19JU05VTEwpCisJCQlyZXN1bHQgPSAwOwkJCS8qIE5V TEwgIj0iIE5VTEwgKi8KKwkJZWxzZSBpZiAoY3VyLT5za19mbGFncyAmIFNLX0JUX05VTExTX0ZJ UlNUKQorCQkJcmVzdWx0ID0gLTE7CQkvKiBOVUxMICI8IiBOT1RfTlVMTCAqLworCQllbHNlCisJ CQlyZXN1bHQgPSAxOwkJCS8qIE5VTEwgIj4iIE5PVF9OVUxMICovCisJfQorCWVsc2UgaWYgKGN1 ci0+c2tfZmxhZ3MgJiBTS19JU05VTEwpIC8qIE5PVF9OVUxMIHR1cGRhdHVtLCBOVUxMIGFycmRh dHVtICovCisJeworCQlpZiAoY3VyLT5za19mbGFncyAmIFNLX0JUX05VTExTX0ZJUlNUKQorCQkJ cmVzdWx0ID0gMTsJCQkvKiBOT1RfTlVMTCAiPiIgTlVMTCAqLworCQllbHNlCisJCQlyZXN1bHQg PSAtMTsJCS8qIE5PVF9OVUxMICI8IiBOVUxMICovCisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAq IExpa2UgX2J0X2NvbXBhcmUsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBjcm9zcy10eXBlIGNv bXBhcmlzb25zLAorCQkgKiBzbyB0aGUgbGVmdCB2YWx1ZSBoYXMgdG8gYmUgdGhlIHZhbHVlIHRo YXQgY2FtZSBmcm9tIGFuIGluZGV4IHR1cGxlCisJCSAqLworCQlyZXN1bHQgPSBEYXR1bUdldElu dDMyKEZ1bmN0aW9uQ2FsbDJDb2xsKG9yZGVycHJvYywgY3VyLT5za19jb2xsYXRpb24sCisJCQkJ CQkJCQkJCQkgdHVwZGF0dW0sIGFycmRhdHVtKSk7CisKKwkJLyoKKwkJICogV2UgZmxpcCB0aGUg c2lnbiBieSBmb2xsb3dpbmcgdGhlIG9idmlvdXMgcnVsZTogZmxpcCB3aGVuZXZlciB0aGUKKwkJ ICogY29sdW1uIGlzIGEgREVTQyBjb2x1bW4uCisJCSAqCisJCSAqIF9idF9jb21wYXJlIGRvZXMg aXQgdGhlIHdyb25nIHdheSBhcm91bmQgKGZsaXAgd2hlbiAqQVNDKikgaW4gb3JkZXIKKwkJICog dG8gY29tcGVuc2F0ZSBmb3IgcGFzc2luZyBpdHMgb3JkZXJwcm9jIGFyZ3VtZW50cyBiYWNrd2Fy ZHMuICBXZQorCQkgKiBkb24ndCBuZWVkIHRvIHBsYXkgdGhlc2UgZ2FtZXMgYmVjYXVzZSB3ZSBm aW5kIGl0IG5hdHVyYWwgdG8gcGFzcworCQkgKiB0dXBkYXR1bSBhcyB0aGUgbGVmdCB2YWx1ZSAo YW5kIGFycmRhdHVtIGFzIHRoZSByaWdodCB2YWx1ZSkuCisJCSAqLworCQlpZiAoY3VyLT5za19m bGFncyAmIFNLX0JUX0RFU0MpCisJCQlJTlZFUlRfQ09NUEFSRV9SRVNVTFQocmVzdWx0KTsKKwl9 CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogX2J0X2JpbnNyY2hfYXJyYXlfc2tleSgp IC0tIEJpbmFyeSBzZWFyY2ggZm9yIG5leHQgbWF0Y2hpbmcgYXJyYXkga2V5CisgKgorICogUmV0 dXJucyBhbiBpbmRleCB0byB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCA+PSBjYWxsZXIncyB0dXBk YXR1bSBhcmd1bWVudC4KKyAqIFRoaXMgY29udmVudGlvbiBpcyBtb3JlIG5hdHVyYWwgZm9yIGZv cndhcmRzIHNjYW4gY2FsbGVycywgYnV0IHRoYXQgY2FuJ3QKKyAqIHJlYWxseSBtYXR0ZXIgdG8g YmFja3dhcmRzIHNjYW4gY2FsbGVycy4gIEJvdGggY2FsbGVycyByZXF1aXJlIGhhbmRsaW5nIGZv cgorICogdGhlIGNhc2Ugd2hlcmUgdGhlIG1hdGNoIHdlIHJldHVybiBpcyA8IHR1cGRhdHVtLCBh bmQgc3ltbWV0cmljIGhhbmRsaW5nCisgKiBmb3IgdGhlIGNhc2Ugd2hlcmUgb3VyIGJlc3QgbWF0 Y2ggaXMgPiB0dXBkYXR1bS4KKyAqCisgKiBBbHNvIHNldHMgKnNldF9lbGVtX3Jlc3VsdCB0byB3 aGF0ZXZlciBfYnRfY29tcGFyZV9hcnJheV9za2V5IHJldHVybmVkIHdoZW4KKyAqIHdlIGNvbXBh cmVkIHRoZSByZXR1cm5lZCBhcnJheSBlbGVtZW50IHRvIGNhbGxlcidzIHR1cGRhdHVtIGFyZ3Vt ZW50LiAgVGhpcworICogaGVscHMgb3VyIGNhbGxlciB0byBkZXRlcm1pbmUgaG93IGFkdmFuY2lu ZyBpdHMgYXJyYXkgKHRvIHRoZSBlbGVtZW50IHdlJ2xsCisgKiByZXR1cm4gYW4gb2Zmc2V0IHRv KSBtaWdodCBuZWVkIHRvIGNhcnJ5IHRvIGhpZ2hlciBvcmRlciBhcnJheXMuCisgKgorICogY3Vy X2VsZW1fc3RhcnQgaW5kaWNhdGVzIGlmIHRoZSBiaW5hcnkgc2VhcmNoIHNob3VsZCBiZWdpbiBh dCB0aGUgYXJyYXkncworICogY3VycmVudCBlbGVtZW50IChvciBoYXZlIHRoZSBjdXJyZW50IGVs ZW1lbnQgYXMgYW4gdXBwZXIgYm91bmQgaWYgaXQncyBhCisgKiBiYWNrd2FyZCBzY2FuKS4gIEl0 J3Mgc2FmZSBmb3Igc2VhcmNoZXMgYWdhaW5zdCByZXF1aXJlZCBzY2FuIGtleSBhcnJheXMgdG8K KyAqIHJldXNlIGVhcmxpZXIgc2VhcmNoIGJvdW5kcyBsaWtlIHRoaXMgYmVjYXVzZSBzdWNoIGFy cmF5cyBhbHdheXMgYWR2YW5jZSBpbgorICogbG9ja3N0ZXAgd2l0aCB0aGUgaW5kZXggc2Nhbidz IHByb2dyZXNzIHRocm91Z2ggdGhlIGluZGV4J3Mga2V5IHNwYWNlLgorICovCitzdGF0aWMgaW50 CitfYnRfYmluc3JjaF9hcnJheV9za2V5KEZtZ3JJbmZvICpvcmRlcnByb2MsCisJCQkJCSAgIGJv b2wgY3VyX2VsZW1fc3RhcnQsIFNjYW5EaXJlY3Rpb24gZGlyLAorCQkJCQkgICBEYXR1bSB0dXBk YXR1bSwgYm9vbCB0dXBudWxsLAorCQkJCQkgICBCVEFycmF5S2V5SW5mbyAqYXJyYXksIFNjYW5L ZXkgY3VyLAorCQkJCQkgICBpbnQzMiAqc2V0X2VsZW1fcmVzdWx0KQoreworCWludAkJCWxvd19l bGVtLAorCQkJCW1pZF9lbGVtLAorCQkJCWhpZ2hfZWxlbSwKKwkJCQlyZXN1bHQgPSAwOworCisJ QXNzZXJ0KGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSk7CisJQXNzZXJ0KGN1ci0+c2tf c3RyYXRlZ3kgPT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKTsKKworCWxvd19lbGVtID0gMDsKKwlt aWRfZWxlbSA9IC0xOworCWhpZ2hfZWxlbSA9IGFycmF5LT5udW1fZWxlbXMgLSAxOworCWlmIChj dXJfZWxlbV9zdGFydCkKKwl7CisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJ CQlsb3dfZWxlbSA9IGFycmF5LT5jdXJfZWxlbTsKKwkJZWxzZQorCQkJaGlnaF9lbGVtID0gYXJy YXktPmN1cl9lbGVtOworCX0KKworCXdoaWxlIChoaWdoX2VsZW0gPiBsb3dfZWxlbSkKKwl7CisJ CURhdHVtCQlhcnJkYXR1bTsKKworCQltaWRfZWxlbSA9IGxvd19lbGVtICsgKChoaWdoX2VsZW0g LSBsb3dfZWxlbSkgLyAyKTsKKwkJYXJyZGF0dW0gPSBhcnJheS0+ZWxlbV92YWx1ZXNbbWlkX2Vs ZW1dOworCisJCXJlc3VsdCA9IF9idF9jb21wYXJlX2FycmF5X3NrZXkob3JkZXJwcm9jLCB0dXBk YXR1bSwgdHVwbnVsbCwKKwkJCQkJCQkJCQlhcnJkYXR1bSwgY3VyKTsKKworCQlpZiAocmVzdWx0 ID09IDApCisJCXsKKwkJCS8qCisJCQkgKiBFYWNoIGFycmF5IHdhcyBkZWR1cGxpY2F0ZWQgZHVy aW5nIGluaXRpYWwgcHJlcHJvY2Vzc2luZywgc28KKwkJCSAqIGl0J3Mgc2FmZSB0byBxdWl0IGFz IHNvb24gYXMgd2Ugc2VlIGFuIGVxdWFsIGFycmF5IGVsZW1lbnQuCisJCQkgKiBUaGlzIG9mdGVu IHNhdmVzIGFuIGV4dHJhIGNvbXBhcmlzb24gb3IgdHdvLi4uCisJCQkgKi8KKwkJCWxvd19lbGVt ID0gbWlkX2VsZW07CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZXN1bHQgPiAwKQorCQkJbG93 X2VsZW0gPSBtaWRfZWxlbSArIDE7CisJCWVsc2UKKwkJCWhpZ2hfZWxlbSA9IG1pZF9lbGVtOwor CX0KKworCS8qCisJICogLi4uYnV0IG91ciBjYWxsZXIgYWxzbyBjYXJlcyBhYm91dCBob3cgaXRz IHNlYXJjaGVkLWZvciB0dXBsZSBkYXR1bQorCSAqIGNvbXBhcmVzIHRvIHRoZSBhcnJheSBlbGVt ZW50IHdlJ2xsIHJldHVybi4gIFNldCAqc2V0X2VsZW1fcmVzdWx0IHdpdGgKKwkgKiB0aGUgcmVz dWx0IG9mIHRoYXQgY29tcGFyaXNvbiBzcGVjaWZpY2FsbHkuCisJICovCisJaWYgKGxvd19lbGVt ICE9IG1pZF9lbGVtKQorCQlyZXN1bHQgPSBfYnRfY29tcGFyZV9hcnJheV9za2V5KG9yZGVycHJv YywgdHVwZGF0dW0sIHR1cG51bGwsCisJCQkJCQkJCQkJYXJyYXktPmVsZW1fdmFsdWVzW2xvd19l bGVtXSwgY3VyKTsKKworCSpzZXRfZWxlbV9yZXN1bHQgPSByZXN1bHQ7CisKKwlyZXR1cm4gbG93 X2VsZW07Cit9CisKIC8qCiAgKiBfYnRfc3RhcnRfYXJyYXlfa2V5cygpIC0tIEluaXRpYWxpemUg YXJyYXkga2V5cyBhdCBzdGFydCBvZiBhIHNjYW4KICAqCkBAIC01MzIsMjkgKzg3MCw0MCBAQCBf YnRfc3RhcnRfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGly KQogCQlza2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tjdXJBcnJh eUtleS0+Y3VyX2VsZW1dOwogCX0KIAotCXNvLT5hcnJheXNTdGFydGVkID0gdHJ1ZTsKKwlzby0+ YWR2YW5jZURpciA9IGRpcjsKIH0KIAogLyoKLSAqIF9idF9hZHZhbmNlX2FycmF5X2tleXMoKSAt LSBBZHZhbmNlIHRvIG5leHQgc2V0IG9mIGFycmF5IGVsZW1lbnRzCisgKiBfYnRfYWR2YW5jZV9h cnJheV9rZXlzX2luY3JlbWVudCgpIC0tIEFkdmFuY2UgdG8gbmV4dCBzZXQgb2YgYXJyYXkgZWxl bWVudHMKKyAqCisgKiBBZHZhbmNlcyB0aGUgYXJyYXkga2V5cyBieSBhIHNpbmdsZSBpbmNyZW1l bnQgaW4gdGhlIGN1cnJlbnQgc2NhbgorICogZGlyZWN0aW9uLiAgV2hlbiB0aGVyZSBhcmUgbXVs dGlwbGUgYXJyYXkga2V5cyB0aGlzIGNhbiByb2xsIG92ZXIgZnJvbSB0aGUKKyAqIGxvd2VzdCBv cmRlciBhcnJheSB0byBoaWdoZXIgb3JkZXIgYXJyYXlzLgogICoKICAqIFJldHVybnMgdHJ1ZSBp ZiB0aGVyZSBpcyBhbm90aGVyIHNldCBvZiB2YWx1ZXMgdG8gY29uc2lkZXIsIGZhbHNlIGlmIG5v dC4KICAqIE9uIHRydWUgcmVzdWx0LCB0aGUgc2NhbmtleXMgYXJlIGluaXRpYWxpemVkIHdpdGgg dGhlIG5leHQgc2V0IG9mIHZhbHVlcy4KKyAqIE9uIGZhbHNlIHJlc3VsdCwgdGhlIHNjYW5rZXlz IHN0YXkgdGhlIHNhbWUsIGFuZCB0aGUgYXJyYXkga2V5cyBhcmUgbm90CisgKiBhZHZhbmNlZCAo ZXZlcnkgYXJyYXkgcmVtYWlucyBhdCBpdHMgZmluYWwgZWxlbWVudCBmb3Igc2NhbiBkaXJlY3Rp b24pLgorICoKKyAqIE5vdGU6IHJvdXRpbmUgb25seSBpbml0aWFsaXplcyBzby0+YXJyYXlLZXlE YXRhW10gc2NhbmtleXMuICBDYWxsZXIgbXVzdAorICogZWl0aGVyIGNhbGwgX2J0X3VwZGF0ZV9r ZXlzX3dpdGhfYXJyYXlrZXlzIG9yIGNhbGwgX2J0X3ByZXByb2Nlc3Nfa2V5cyB0bworICogdXBk YXRlIHRoZSBzY2FuJ3Mgc2VhcmNoLXR5cGUgc2NhbmtleXMuCiAgKi8KLWJvb2wKLV9idF9hZHZh bmNlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3N0 YXRpYyBib29sCitfYnRfYWR2YW5jZV9hcnJheV9rZXlzX2luY3JlbWVudChJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQogewogCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5P cGFxdWUpIHNjYW4tPm9wYXF1ZTsKIAlib29sCQlmb3VuZCA9IGZhbHNlOwotCWludAkJCWk7CisK KwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOwogCiAJLyoKIAkgKiBXZSBtdXN0IGFkdmFuY2Ug dGhlIGxhc3QgYXJyYXkga2V5IG1vc3QgcXVpY2tseSwgc2luY2UgaXQgd2lsbAogCSAqIGNvcnJl c3BvbmQgdG8gdGhlIGxvd2VzdC1vcmRlciBpbmRleCBjb2x1bW4gYW1vbmcgdGhlIGF2YWlsYWJs ZQotCSAqIHF1YWxpZmljYXRpb25zLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgY29ycmVj dCBvcmRlcmluZyBvZiBvdXRwdXQKLQkgKiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBhcnJheSBr ZXlzLgorCSAqIHF1YWxpZmljYXRpb25zLiAgUm9sbGluZyBvdmVyIGxpa2UgdGhpcyBpcyBuZWNl c3NhcnkgdG8gZW5zdXJlIGNvcnJlY3QKKwkgKiBvcmRlcmluZyBvZiBvdXRwdXQgd2hlbiB0aGVy ZSBhcmUgbXVsdGlwbGUgYXJyYXkga2V5cy4KIAkgKi8KLQlmb3IgKGkgPSBzby0+bnVtQXJyYXlL ZXlzIC0gMTsgaSA+PSAwOyBpLS0pCisJZm9yIChpbnQgaSA9IHNvLT5udW1BcnJheUtleXMgLSAx OyBpID49IDA7IGktLSkKIAl7CiAJCUJUQXJyYXlLZXlJbmZvICpjdXJBcnJheUtleSA9ICZzby0+ YXJyYXlLZXlzW2ldOwogCQlTY2FuS2V5CQlza2V5ID0gJnNvLT5hcnJheUtleURhdGFbY3VyQXJy YXlLZXktPnNjYW5fa2V5XTsKQEAgLTU4OCw4NSArOTM3LDk4OSBAQCBfYnRfYWR2YW5jZV9hcnJh eV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJCQlicmVhazsK IAl9CiAKLQkvKiBhZHZhbmNlIHBhcmFsbGVsIHNjYW4gKi8KLQlpZiAoc2Nhbi0+cGFyYWxsZWxf c2NhbiAhPSBOVUxMKQotCQlfYnRfcGFyYWxsZWxfYWR2YW5jZV9hcnJheV9rZXlzKHNjYW4pOwor CWlmIChmb3VuZCkKKwkJcmV0dXJuIHRydWU7CiAKIAkvKgotCSAqIFdoZW4gbm8gbmV3IGFycmF5 IGtleXMgd2VyZSBmb3VuZCwgdGhlIHNjYW4gaXMgInBhc3QgdGhlIGVuZCIgb2YgdGhlCi0JICog YXJyYXkga2V5cy4gIF9idF9zdGFydF9hcnJheV9rZXlzIGNhbiBzdGlsbCAicmVzdGFydCIgdGhl IGFycmF5IGtleXMgaWYKLQkgKiBhIHJlc2NhbiBpcyByZXF1aXJlZC4KKwkgKiBEb24ndCBhbGxv dyB0aGUgZW50aXJlIHNldCBvZiBhcnJheSBrZXlzIHRvIHJvbGwgb3ZlcjogcmVzdG9yZSB0aGUK KwkgKiBhcnJheSBrZXlzIHRvIHRoZSBzdGF0ZSB0aGV5IHdlcmUgaW4gYmVmb3JlIHdlIHdlcmUg Y2FsbGVkLgorCSAqCisJICogVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGFycmF5IGtleXMgb25seSBy YXRjaGV0IGZvcndhcmQgKG9yIGJhY2t3YXJkcyBpbgorCSAqIHRoZSBjYXNlIG9mIGJhY2t3YXJk IHNjYW5zKS4gIE91ciAic28tPmFycmF5S2V5RGF0YVtdIiBzY2FuIGtleXMgc2hvdWxkCisJICog YWx3YXlzIG1hdGNoIHRoZSBjdXJyZW50ICJzby0+a2V5RGF0YVtdIiBzZWFyY2gtdHlwZSBzY2Fu IGtleXMgKGV4Y2VwdAorCSAqIGZvciBhIGJyaWVmIG1vbWVudCBkdXJpbmcgYXJyYXkga2V5IGFk dmFuY2VtZW50KS4KIAkgKi8KLQlpZiAoIWZvdW5kKQotCQlzby0+YXJyYXlzU3RhcnRlZCA9IGZh bHNlOwotCi0JcmV0dXJuIGZvdW5kOwotfQotCi0vKgotICogX2J0X21hcmtfYXJyYXlfa2V5cygp IC0tIEhhbmRsZSBhcnJheSBrZXlzIGR1cmluZyBidG1hcmtwb3MKLSAqCi0gKiBTYXZlIHRoZSBj dXJyZW50IHN0YXRlIG9mIHRoZSBhcnJheSBrZXlzIGFzIHRoZSAibWFyayIgcG9zaXRpb24uCi0g Ki8KLXZvaWQKLV9idF9tYXJrX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQotewotCUJU U2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKLQlpbnQJCQlpOwot Ci0JZm9yIChpID0gMDsgaSA8IHNvLT5udW1BcnJheUtleXM7IGkrKykKKwlmb3IgKGludCBpID0g MDsgaSA8IHNvLT5udW1BcnJheUtleXM7IGkrKykKIAl7Ci0JCUJUQXJyYXlLZXlJbmZvICpjdXJB cnJheUtleSA9ICZzby0+YXJyYXlLZXlzW2ldOworCQlCVEFycmF5S2V5SW5mbyAqcm9sbGFycmF5 ID0gJnNvLT5hcnJheUtleXNbaV07CisJCVNjYW5LZXkJCXNrZXkgPSAmc28tPmFycmF5S2V5RGF0 YVtyb2xsYXJyYXktPnNjYW5fa2V5XTsKIAotCQljdXJBcnJheUtleS0+bWFya19lbGVtID0gY3Vy QXJyYXlLZXktPmN1cl9lbGVtOworCQlpZiAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSkK KwkJCXJvbGxhcnJheS0+Y3VyX2VsZW0gPSAwOworCQllbHNlCisJCQlyb2xsYXJyYXktPmN1cl9l bGVtID0gcm9sbGFycmF5LT5udW1fZWxlbXMgLSAxOworCQlza2V5LT5za19hcmd1bWVudCA9IHJv bGxhcnJheS0+ZWxlbV92YWx1ZXNbcm9sbGFycmF5LT5jdXJfZWxlbV07CiAJfQorCisJcmV0dXJu IGZhbHNlOwogfQogCiAvKgotICogX2J0X3Jlc3RvcmVfYXJyYXlfa2V5cygpIC0tIEhhbmRsZSBh cnJheSBrZXlzIGR1cmluZyBidHJlc3RycG9zCisgKiBfYnRfcmV3aW5kX2FycmF5X2tleXMoKSAt LSBIYW5kbGUgYXJyYXkga2V5cyBkdXJpbmcgYnRyZXN0cnBvcwogICoKLSAqIFJlc3RvcmUgdGhl IGFycmF5IGtleXMgdG8gd2hlcmUgdGhleSB3ZXJlIHdoZW4gdGhlIG1hcmsgd2FzIHNldC4KKyAq IFJlc3RvcmUgdGhlIGFycmF5IGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBrZXkgc3BhY2UgZm9y IHRoZSBjdXJyZW50IHNjYW4KKyAqIGRpcmVjdGlvbi4KICAqLwogdm9pZAotX2J0X3Jlc3RvcmVf YXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCitfYnRfcmV3aW5kX2FycmF5X2tleXMoSW5k ZXhTY2FuRGVzYyBzY2FuKQogewogCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNj YW4tPm9wYXF1ZTsKIAlib29sCQljaGFuZ2VkID0gZmFsc2U7Ci0JaW50CQkJaTsKIAotCS8qIFJl c3RvcmUgZWFjaCBhcnJheSBrZXkgdG8gaXRzIHBvc2l0aW9uIHdoZW4gdGhlIG1hcmsgd2FzIHNl dCAqLwotCWZvciAoaSA9IDA7IGkgPCBzby0+bnVtQXJyYXlLZXlzOyBpKyspCisJQXNzZXJ0KHNv LT5hZHZhbmNlRGlyICE9IE5vTW92ZW1lbnRTY2FuRGlyZWN0aW9uKTsKKworCS8qCisJICogUmVz dG9yZSBlYWNoIGFycmF5IGtleSB0byBpdHMgaW5pdGlhbCBwb3NpdGlvbiBmb3IgdGhlIGN1cnJl bnQgc2NhbgorCSAqIGRpcmVjdGlvbiBhcyBvZiB0aGUgbGFzdCB0aW1lIHRoZSBhcnJheXMgYWR2 YW5jZWQKKwkgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8IHNvLT5udW1BcnJheUtleXM7IGkrKykK IAl7CiAJCUJUQXJyYXlLZXlJbmZvICpjdXJBcnJheUtleSA9ICZzby0+YXJyYXlLZXlzW2ldOwog CQlTY2FuS2V5CQlza2V5ID0gJnNvLT5hcnJheUtleURhdGFbY3VyQXJyYXlLZXktPnNjYW5fa2V5 XTsKLQkJaW50CQkJbWFya19lbGVtID0gY3VyQXJyYXlLZXktPm1hcmtfZWxlbTsKKwkJaW50CQkJ Zmlyc3RfZWxlbV9kaXI7CiAKLQkJaWYgKGN1ckFycmF5S2V5LT5jdXJfZWxlbSAhPSBtYXJrX2Vs ZW0pCisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKHNvLT5hZHZhbmNlRGlyKSkKKwkJCWZp cnN0X2VsZW1fZGlyID0gMDsKKwkJZWxzZQorCQkJZmlyc3RfZWxlbV9kaXIgPSBjdXJBcnJheUtl eS0+bnVtX2VsZW1zIC0gMTsKKworCQlpZiAoY3VyQXJyYXlLZXktPmN1cl9lbGVtICE9IGZpcnN0 X2VsZW1fZGlyKQogCQl7Ci0JCQljdXJBcnJheUtleS0+Y3VyX2VsZW0gPSBtYXJrX2VsZW07Ci0J CQlza2V5LT5za19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1ttYXJrX2VsZW1d OworCQkJY3VyQXJyYXlLZXktPmN1cl9lbGVtID0gZmlyc3RfZWxlbV9kaXI7CisJCQlza2V5LT5z a19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tmaXJzdF9lbGVtX2Rpcl07CiAJ CQljaGFuZ2VkID0gdHJ1ZTsKIAkJfQogCX0KIAorCWlmIChjaGFuZ2VkKQorCQlfYnRfdXBkYXRl X2tleXNfd2l0aF9hcnJheWtleXMoc2Nhbik7CisKKwlBc3NlcnQoX2J0X3ZlcmlmeV9rZXlzX3dp dGhfYXJyYXlrZXlzKHNjYW4pKTsKKwogCS8qCi0JICogSWYgd2UgY2hhbmdlZCBhbnkga2V5cywg d2UgbXVzdCByZWRvIF9idF9wcmVwcm9jZXNzX2tleXMuICBUaGF0IG1pZ2h0Ci0JICogc291bmQg bGlrZSBvdmVya2lsbCwgYnV0IGluIGNhc2VzIHdpdGggbXVsdGlwbGUga2V5cyBwZXIgaW5kZXgg Y29sdW1uCi0JICogaXQgc2VlbXMgbmVjZXNzYXJ5IHRvIGRvIHRoZSBmdWxsIHNldCBvZiBwdXNo dXBzLgorCSAqIEludmVydCB0aGUgc2NhbiBkaXJlY3Rpb24gYXMgb2YgdGhlIGxhc3QgdGltZSB0 aGUgYXJyYXkga2V5cyBhZHZhbmNlZC4KIAkgKgotCSAqIEFsc28gZG8gdGhpcyB3aGVuZXZlciB0 aGUgc2NhbidzIHNldCBvZiBhcnJheSBrZXlzICJ3cmFwcGVkIGFyb3VuZCIgYXQKLQkgKiB0aGUg ZW5kIG9mIHRoZSBsYXN0IHByaW1pdGl2ZSBpbmRleCBzY2FuLiAgVGhlcmUgd29uJ3QgaGF2ZSBi ZWVuIGEgY2FsbAotCSAqIHRvIF9idF9wcmVwcm9jZXNzX2tleXMgZnJvbSBzb21lIG90aGVyIHBs YWNlIGZvbGxvd2luZyB3cmFwIGFyb3VuZCwgc28KLQkgKiB3ZSBkbyBpdCBmb3Igb3Vyc2VsdmVz LgorCSAqIFRoaXMgcHJldmVudHMgX2J0X3N0ZXBwYWdlIGZyb20gZnVsbHkgdHJ1c3RpbmcgY3Vy clBvcy5tb3JlUmlnaHQgYW5kCisJICogY3VyclBvcy5tb3JlTGVmdCBpbiBjYXNlcyB3aGVyZSBf YnRfcmVhZHBhZ2UvX2J0X2NoZWNra2V5cyBkb24ndCBnZXQKKwkgKiB0aGUgb3Bwb3J0dW5pdHkg dG8gY29uc2lkZXIgYWR2YW5jaW5nIHRoZSBhcnJheSBrZXlzIGFzIGV4cGVjdGVkLgogCSAqLwot CWlmIChjaGFuZ2VkIHx8ICFzby0+YXJyYXlzU3RhcnRlZCkKLQl7Ci0JCV9idF9wcmVwcm9jZXNz X2tleXMoc2Nhbik7Ci0JCS8qIFRoZSBtYXJrIHNob3VsZCBoYXZlIGJlZW4gc2V0IG9uIGEgY29u c2lzdGVudCBzZXQgb2Yga2V5cy4uLiAqLwotCQlBc3NlcnQoc28tPnF1YWxfb2spOwotCX0KKwlp ZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChzby0+YWR2YW5jZURpcikpCisJCXNvLT5hZHZhbmNl RGlyID0gQmFja3dhcmRTY2FuRGlyZWN0aW9uOworCWVsc2UKKwkJc28tPmFkdmFuY2VEaXIgPSBG b3J3YXJkU2NhbkRpcmVjdGlvbjsKIH0KIAorLyoKKyAqIF9idF90dXBsZV9iZWZvcmVfYXJyYXlf c2tleXMoKSAtLSBfYnRfY2hlY2trZXlzIGFycmF5IGhlbHBlciBmdW5jdGlvbgorICoKKyAqIFJv dXRpbmUgdG8gZGV0ZXJtaW5lIGlmIGEgY29udGludWVzY2FuPWZhbHNlIHR1cGxlIChzZXQgdGhh dCB3YXkgYnkgYW4KKyAqIGluaXRpYWwgY2FsbCB0byBfYnRfY2hlY2tfY29tcGFyZSkgbXVzdCBh ZHZhbmNlIHRoZSBzY2FuJ3MgYXJyYXkga2V5cy4KKyAqIE9ubHkgY2FsbCBoZXJlIHdoZW4gX2J0 X2NoZWNrX2NvbXBhcmUgYWxyZWFkeSBzZXQgY29udGludWVzY2FuPWZhbHNlLgorICoKKyAqIFJl dHVybnMgdHJ1ZSB3aGVuIGNhbGxlciBwYXNzZXMgYSB0dXBsZSB0aGF0IGlzIDwgdGhlIGN1cnJl bnQgc2V0IG9mIGFycmF5CisgKiBrZXlzIGZvciB0aGUgbW9zdCBzaWduaWZpY2FudCBub24tZXF1 YWwgY29sdW1uL3NjYW4ga2V5IChvciA+IGZvciBiYWNrd2FyZHMKKyAqIHNjYW5zKS4gIFRoaXMg bWVhbnMgdGhhdCBpdCBjYW5ub3QgcG9zc2libHkgYmUgdGltZSB0byBhZHZhbmNlIHRoZSBhcnJh eQorICoga2V5cyBqdXN0IHlldC4gIF9idF9jaGVja2tleXMgY2FsbGVyIHNob3VsZCBzdXBwcmVz cyBpdHMgX2J0X2NoZWNrX2NvbXBhcmUKKyAqIGNhbGwsIGFuZCByZXR1cm4gLS0gdGhlIHR1cGxl IGlzIHRyZWF0ZWQgYXMgbm90IHNhdGlzZnlpbmcgb3VyIGluZGV4cXVhbHMuCisgKgorICogUmV0 dXJucyBmYWxzZSB3aGVuIGNhbGxlcidzIHR1cGxlIGlzID49IHRoZSBjdXJyZW50IGFycmF5IGtl eXMgKG9yIDw9LCBpbgorICogdGhlIGNhc2Ugb2YgYmFja3dhcmRzIHNjYW5zKS4gIFRoaXMgbWVh bnMgdGhhdCBpdCBpcyBub3cgdGltZSBmb3Igb3VyCisgKiBjYWxsZXIgdG8gYWR2YW5jZSB0aGUg YXJyYXkga2V5cyAodW5sZXNzIGNhbGxlciBicm9rZSB0aGUgcnVsZXMgYnkgbm90CisgKiBjaGVj a2luZyB3aXRoIF9idF9jaGVja19jb21wYXJlIGJlZm9yZSBjYWxsaW5nIGhlcmUpLgorICoKKyAq IE5vdGU6IGFkdmFuY2luZyB0aGUgYXJyYXkga2V5cyBtYXkgYmUgcmVxdWlyZWQgd2hlbiBldmVy eSBhdHRyaWJ1dGUgdmFsdWUKKyAqIGZyb20gY2FsbGVyJ3MgdHVwbGUgaXMgZXF1YWwgdG8gY29y cmVzcG9uZGluZyBzY2FuIGtleS9hcnJheSBkYXR1bXMuICBTZWUKKyAqIF9idF9hZHZhbmNlX2Fy cmF5X2tleXMgYW5kIGl0cyBoYW5kbGluZyBvZiBpbmVxdWFsaXRpZXMgZm9yIGRldGFpbHMuCisg KgorICogTm90ZTogY2FsbGVyIHBhc3NlcyBfYnRfY2hlY2tfY29tcGFyZS1zZXQgc2t0cmlnIHZh bHVlIHRvIGluZGljYXRlIHdoaWNoCisgKiBzY2FuIGtleSB0cmlnZ2VyZWQgdGhlIGNhbGwuICBJ ZiB0aGlzIGlzIGZvciBhbnkgc2NhbiBrZXkgdGhhdCBpc24ndCBhCisgKiByZXF1aXJlZCBlcXVh bGl0eSBzdHJhdGVneSBzY2FuIGtleSwgY2FsbGluZyBoZXJlIGlzIGEgbm8tb3AsIG1lYW5pbmcg dGhhdAorICogd2UnbGwgaW52YXJpYWJseSByZXR1cm4gZmFsc2UuICBXZSBqdXN0IGFjY2VwdCB3 aGF0ZXZlciBfYnRfY2hlY2tfY29tcGFyZQorICogaW5kaWNhdGVkIGFib3V0IHRoZSBzY2FuIHdo ZW4gaXQgaW52b2x2ZXMgYSByZXF1aXJlZCBpbmVxdWFsaXR5IHNjYW4ga2V5LgorICogV2UgbmV2 ZXIgY2FyZSBhYm91dCBub25yZXF1aXJlZCBzY2FuIGtleXMsIGluY2x1ZGluZyBlcXVhbGl0eSBz dHJhdGVneQorICogYXJyYXkgc2NhbiBrZXlzICh0aG91Z2ggX2J0X2NoZWNrX2NvbXBhcmUgY2Fu IHRlbXBvcmFyaWx5IGVuZCB0aGUgc2NhbiB0bworICogYWR2YW5jZSB0aGVpciBhcnJheXMgaW4g X2J0X2FkdmFuY2VfYXJyYXlfa2V5cywgd2hpY2ggd2UnbGwgbmV2ZXIgcHJldmVudCkuCisgKi8K K3N0YXRpYyBib29sCitfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzKEluZGV4U2NhbkRlc2Mg c2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJCQkJIEluZGV4VHVwbGUgdHVwbGUs IGludCBza3RyaWcsIGJvb2wgdmFsaWR0cmlnKQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNj YW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsKKwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0 aW9uOworCVNjYW5EaXJlY3Rpb24gZGlyID0gcHN0YXRlLT5kaXI7CisJVHVwbGVEZXNjCWl0dXBk ZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOworCVNjYW5LZXkJCWN1cjsKKwlpbnQJCQludHVw YXR0cyA9IEJUcmVlVHVwbGVHZXROQXR0cyh0dXBsZSwgcmVsKSwKKwkJCQlpa2V5OworCisJQXNz ZXJ0KHNvLT5udW1BcnJheUtleXMgPiAwKTsKKwlBc3NlcnQoc28tPm51bWJlck9mS2V5cyA+IDAp OworCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisKKwlmb3IgKGN1ciA9IHNvLT5rZXlEYXRh ICsgc2t0cmlnLCBpa2V5ID0gc2t0cmlnOworCQkgaWtleSA8IHNvLT5udW1iZXJPZktleXM7CisJ CSBjdXIrKywgaWtleSsrKQorCXsKKwkJaW50CQkJYXR0bnVtID0gY3VyLT5za19hdHRubzsKKwkJ Rm1nckluZm8gICAqb3JkZXJwcm9jOworCQlEYXR1bQkJdHVwZGF0dW07CisJCWJvb2wJCXR1cG51 bGw7CisJCWludDMyCQlyZXN1bHQ7CisKKwkJLyoKKwkJICogVW5saWtlIF9idF9jaGVja19jb21w YXJlIGFuZCBfYnRfYWR2YW5jZV9hcnJheV9rZXlzLCB3ZSBuZXZlciBkZWFsCisJCSAqIHdpdGgg aW5lcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXMgKGV2ZW4gdGhvc2UgbWFya2VkIHJlcXVpcmVk KS4gV2UKKwkJICogYWxzbyBkb24ndCBkZWFsIHdpdGggbm9uLXJlcXVpcmVkIGVxdWFsaXR5IGtl eXMgLS0gZXZlbiB3aGVuIHRoZXkKKwkJICogaGFwcGVuIHRvIGhhdmUgYXJyYXlzIHRoYXQgbWln aHQgbmVlZCB0byBiZSBhZHZhbmNlZC4KKwkJICoKKwkJICogTm90ZTogY2Fubm90ICJicmVhayIg aGVyZSBkdWUgdG8gY29ybmVyIGNhc2VzIGludm9sdmluZyByZWR1bmRhbnQKKwkJICogc2NhbiBr ZXlzIHRoYXQgd2VyZW4ndCBlbGltaW5hdGVkIHdpdGhpbiBfYnRfcHJlcHJvY2Vzc19rZXlzLgor CQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyIHx8 CisJCQkoY3VyLT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkgPT0gMCkKKwkJCWNvbnRpbnVlOwor CisJCS8qIFJlcXVpcmVkIGVxdWFsaXR5IHNjYW4ga2V5cyBhbHdheXMgcmVxdWlyZWQgaW4gYm90 aCBkaXJlY3Rpb25zICovCisJCUFzc2VydCgoY3VyLT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkg JiYKKwkJCSAgIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRQktXRCkpOworCisJCWlmIChhdHRu dW0gPiBudHVwYXR0cykKKwkJeworCQkJQXNzZXJ0KCF2YWxpZHRyaWcpOworCisJCQkvKgorCQkJ ICogV2hlbiB3ZSByZWFjaCBhIGhpZ2gga2V5J3MgdHJ1bmNhdGVkIGF0dHJpYnV0ZSwgYXNzdW1l IHRoYXQgdGhlCisJCQkgKiB0dXBsZSBhdHRyaWJ1dGUncyB2YWx1ZSBpcyA+PSB0aGUgc2Nhbidz IGVxdWFsaXR5IGNvbnN0cmFpbnQKKwkJCSAqIHNjYW4ga2V5cywgZm9yY2luZyBhbm90aGVyIF9i dF9hZHZhbmNlX2FycmF5X2tleXMgY2FsbC4KKwkJCSAqCisJCQkgKiBZb3UgbWlnaHQgd29uZGVy IHdoeSB3ZSBkb24ndCB0cmVhdCB0cnVuY2F0ZWQgYXR0cmlidXRlcyBhcworCQkJICogaGF2aW5n IHZhbHVlcyA8IG91ciBlcXVhbGl0eSBjb25zdHJhaW50cyBpbnN0ZWFkOyB3ZSdyZSBub3QKKwkJ CSAqIHRyZWF0aW5nIHRoZSB0cnVuY2F0ZWQgYXR0cmlidXRlcyBhcyBoYXZpbmcgLWluZiB2YWx1 ZXMgaGVyZSwKKwkJCSAqIHdoaWNoIGlzIGhvdyB0aGluZ3MgYXJlIGRvbmUgaW4gX2J0X2NvbXBh cmUuCisJCQkgKgorCQkJICogV2UncmUgb2Z0ZW4gY2FsbGVkIGR1cmluZyBmaW5hbHR1cCBwcmVj aGVja3MsIHdoZXJlIHdlIGhlbHAgb3VyCisJCQkgKiBjYWxsZXIgdG8gZGVjaWRlIHdoZXRoZXIg b3Igbm90IGl0IHNob3VsZCB0ZXJtaW5hdGUgdGhlIGN1cnJlbnQKKwkJCSAqIHByaW1pdGl2ZSBp bmRleCBzY2FuLiAgT3VyIGJlaGF2aW9yIGhlcmUgaW1wbGVtZW50cyBhIHBvbGljeSBvZgorCQkJ ICogYmVpbmcgc2xpZ2h0bHkgb3B0aW1pc3RpYyBhYm91dCB3aGF0IHdpbGwgYmUgZm91bmQgb24g dGhlIG5leHQKKwkJCSAqIHBhZ2Ugd2hlbiB0aGUgY3VycmVudCBwcmltaXRpdmUgc2NhbiBjb250 aW51ZXMgb250byB0aGF0IHBhZ2UuCisJCQkgKiAoVGhpcyBpcyBhbHNvIGNsb3Nlc3QgdG8gd2hh dCBfYnRfY2hlY2tfY29tcGFyZSBkb2VzLikKKwkJCSAqLworCQkJcmV0dXJuIGZhbHNlOworCQl9 CisKKwkJdHVwZGF0dW0gPSBpbmRleF9nZXRhdHRyKHR1cGxlLCBhdHRudW0sIGl0dXBkZXNjLCAm dHVwbnVsbCk7CisKKwkJb3JkZXJwcm9jID0gJnNvLT5vcmRlclByb2NzW2F0dG51bSAtIDFdOwor CQlyZXN1bHQgPSBfYnRfY29tcGFyZV9hcnJheV9za2V5KG9yZGVycHJvYywgdHVwZGF0dW0sIHR1 cG51bGwsCisJCQkJCQkJCQkJY3VyLT5za19hcmd1bWVudCwgY3VyKTsKKworCQkvKgorCQkgKiBE b2VzIHRoaXMgY29tcGFyaXNvbiBpbmRpY2F0ZSB0aGF0IGNhbGxlciBtdXN0IF9ub3RfIGFkdmFu Y2UgdGhlCisJCSAqIHNjYW4ncyBhcnJheXMganVzdCB5ZXQ/ICAoVGhpcyBpbXBsZW1lbnRzIHRo ZSBsaW5lYXIgc2VhcmNoIHByb2Nlc3MKKwkJICogZGVzY3JpYmVkIGluIF9idF9hZHZhbmNlX2Fy cmF5X2tleXMuKQorCQkgKi8KKwkJaWYgKChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgJiYg cmVzdWx0IDwgMCkgfHwKKwkJCShTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpICYmIHJlc3Vs dCA+IDApKQorCQkJcmV0dXJuIHRydWU7CisKKwkJLyoKKwkJICogRG9lcyB0aGlzIGNvbXBhcmlz b24gaW5kaWNhdGUgdGhhdCBjYWxsZXIgc2hvdWxkIG5vdyBhZHZhbmNlIHRoZQorCQkgKiBzY2Fu J3MgYXJyYXlzPworCQkgKi8KKwkJaWYgKHZhbGlkdHJpZyB8fCByZXN1bHQgIT0gMCkKKwkJewor CQkJQXNzZXJ0KHJlc3VsdCAhPSAwKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qCisJ CSAqIEluY29uY3VzaXZlIC0tIG5lZWQgdG8gY2hlY2sgbGF0ZXIgc2NhbiBrZXlzLCB0b28uCisJ CSAqCisJCSAqIFRoaXMgbXVzdCBiZSBhIGZpbmFsdHVwIHByZWNoZWNrLCBvciBwZXJoYXBzIGEg Y2FsbCBtYWRlIGZyb20gYW4KKwkJICogYXNzZXJ0aW9uLgorCQkgKi8KKwkJQXNzZXJ0KHJlc3Vs dCA9PSAwKTsKKwkJQXNzZXJ0KCF2YWxpZHRyaWcpOworCX0KKworCS8qCisJICogRGVmYXVsdCBh c3N1bXB0aW9uIGlzIHRoYXQgY2FsbGVyIG11c3Qgbm93IGFkdmFuY2UgdGhlIGFycmF5IGtleXMu CisJICoKKwkgKiBOb3RlIHRoYXQgd2UnbGwgYWx3YXlzIGVuZCB1cCBoZXJlIHdoZW4gc2t0cmln IGNvcnJlc3BvbmRzIHRvIHNvbWUKKwkgKiBub24tcmVxdWlyZWQgYXJyYXkgdHlwZSBzY2FuIGtl eSB0aGF0IF9idF9jaGVja19jb21wYXJlIHNhdyB3YXNuJ3QKKwkgKiBzYXRpc2ZpZWQgYnkgY2Fs bGVyJ3MgdHVwbGUuCisJICovCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogX2J0X2FycmF5 X2tleXNfcmVtYWluKCkgLS0gc3RhcnQgc2NoZWR1bGVkIHByaW1pdGl2ZSBpbmRleCBzY2FuPwor ICoKKyAqIFJldHVybnMgdHJ1ZSBpZiBfYnRfY2hlY2trZXlzIHNjaGVkdWxlZCBhbm90aGVyIHBy aW1pdGl2ZSBpbmRleCBzY2FuLCBqdXN0CisgKiBhcyB0aGUgbGFzdCBvbmUgZW5kZWQuICBPdGhl cndpc2UgcmV0dXJucyBmYWxzZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBhcnJheQorICoga2V5cyBh cmUgbm93IGZ1bGx5IGV4aGF1c3RlZC4KKyAqCisgKiBPbmx5IGNhbGwgaGVyZSBkdXJpbmcgc2Nh bnMgd2l0aCBvbmUgb3IgbW9yZSBlcXVhbGl0eSB0eXBlIGFycmF5IHNjYW4ga2V5cy4KKyAqLwor Ym9vbAorX2J0X2FycmF5X2tleXNfcmVtYWluKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVj dGlvbiBkaXIpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3Bh cXVlOworCisJQXNzZXJ0KHNvLT5udW1BcnJheUtleXMpOworCUFzc2VydChzby0+YWR2YW5jZURp ciA9PSBkaXIpOworCisJLyoKKwkgKiBBcnJheSBrZXlzIGFyZSBhZHZhbmNlZCB3aXRoaW4gX2J0 X2NoZWNra2V5cyB3aGVuIHRoZSBzY2FuIHJlYWNoZXMgdGhlCisJICogbGVhZiBsZXZlbCAobW9y ZSBwcmVjaXNlbHksIHRoZXkncmUgYWR2YW5jZWQgd2hlbiB0aGUgc2NhbiByZWFjaGVzIHRoZQor CSAqIGVuZCBvZiBlYWNoIGRpc3RpbmN0IHNldCBvZiBhcnJheSBlbGVtZW50cykuICBUaGlzIHBy b2Nlc3MgYXZvaWRzCisJICogcmVwZWF0IGFjY2VzcyB0byBsZWFmIHBhZ2VzIChhY3Jvc3MgbXVs dGlwbGUgcHJpbWl0aXZlIGluZGV4IHNjYW5zKSBieQorCSAqIGFkdmFuY2luZyB0aGUgc2Nhbidz IGFycmF5IGtleXMgd2hlbiBpdCBhbGxvd3MgdGhlIHByaW1pdGl2ZSBpbmRleCBzY2FuCisJICog dG8gZmluZCBuZWFyYnkgbWF0Y2hpbmcgdHVwbGVzIChvciB3aGVuIGl0IGVsaW1pbmF0ZXMgcmFu Z2VzIG9mIGFycmF5CisJICoga2V5IHNwYWNlIHRoYXQgY2FuJ3QgcG9zc2libHkgYmUgc2F0aXNm aWVkIGJ5IGFueSBpbmRleCB0dXBsZSkuCisJICoKKwkgKiBfYnRfY2hlY2trZXlzIHNldHMgYSBz aW1wbGUgZmxhZyB2YXJpYWJsZSB0byBzY2hlZHVsZSBhbm90aGVyIHByaW1pdGl2ZQorCSAqIGlu ZGV4IHNjYW4uICBUaGlzIHRlbGxzIHVzIHdoYXQgdG8gZG8uICBXZSBjYW5ub3QgcmVseSBvbiBf YnRfZmlyc3QKKwkgKiBhbHdheXMgcmVhY2hpbmcgX2J0X2NoZWNra2V5cywgdGhvdWdoLiAgVGhl cmUgYXJlIHZhcmlvdXMgY2FzZXMgd2hlcmUKKwkgKiB0aGF0IHdvbid0IGhhcHBlbi4gIEZvciBl eGFtcGxlLCBpZiB0aGUgaW5kZXggaXMgY29tcGxldGVseSBlbXB0eSwgdGhlbgorCSAqIF9idF9m aXJzdCB3b24ndCBnZXQgYXMgZmFyIGFzIGNhbGxpbmcgX2J0X3JlYWRwYWdlL19idF9jaGVja2tl eXMuCisJICoKKwkgKiBXZSBhbHNvIGRvbid0IGV4cGVjdCBfYnRfY2hlY2trZXlzIHRvIGJlIHJl YWNoZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGEKKwkgKiBub24tZXhpc3RlbnQgdmFsdWUgdGhhdCBo YXBwZW5zIHRvIGJlIGhpZ2hlciB0aGFuIGFueSBleGlzdGluZyB2YWx1ZSBpbgorCSAqIHRoZSBp bmRleC4gIE5vIF9idF9jaGVja2tleXMgYXJlIGV4cGVjdGVkIHdoZW4gX2J0X3JlYWRwYWdlIHJl YWRzIHRoZQorCSAqIHJpZ2h0bW9zdCBwYWdlIGR1cmluZyBzdWNoIGEgc2NhbiAtLSBldmVuIGEg X2J0X2NoZWNra2V5cyBjYWxsIGFnYWluc3QKKwkgKiB0aGUgaGlnaCBrZXkgd29uJ3QgaGFwcGVu LiAgVGhlcmUgaXMgYW4gYW5hbG9nb3VzIGlzc3VlIGZvciBiYWNrd2FyZHMKKwkgKiBzY2FucyB0 aGF0IHNlYXJjaCBmb3IgYSB2YWx1ZSBsb3dlciB0aGFuIGFsbCBleGlzdGluZyBpbmRleCB0dXBs ZXMuCisJICoKKwkgKiBXZSBkb24ndCBhY3R1YWxseSByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcg Zm9yIHRoZXNlIGNhc2VzIC0tIHdlIGRvbid0CisJICogbmVlZCB0byBiZSBleHBsaWNpdGx5IGlu c3RydWN0ZWQgdG8gX25vdF8gcGVyZm9ybSBhbm90aGVyIHByaW1pdGl2ZQorCSAqIGluZGV4IHNj YW4uICBUaGlzIGlzIGNvcnJlY3QgZm9yIGFsbCBvZiB0aGUgY2FzZXMgd2UndmUgbGlzdGVkIHNv IGZhciwKKwkgKiB3aGljaCBhbGwgaW52b2x2ZSBwcmltaXRpdmUgaW5kZXggc2NhbnMgdGhhdCBh Y2Nlc3MgcGFnZXMgIm5lYXIgdGhlCisJICogYm91bmRhcmllcyBvZiB0aGUga2V5IHNwYWNlIiAo dGhlIGxlZnRtb3N0IHBhZ2UsIHRoZSByaWdodG1vc3QgcGFnZSwgb3IKKwkgKiBhbiBpbWFnaW5h cnkgZW1wdHkgbGVhZiByb290IHBhZ2UpLiAgSWYgX2J0X2NoZWNra2V5cyBjYW5ub3QgYmUgcmVh Y2hlZAorCSAqIGJ5IGEgcHJpbWl0aXZlIGluZGV4IHNjYW4gZm9yIG9uZSBzZXQgb2YgYXJyYXkg a2V5cywgaXQgZm9sbG93cyB0aGF0IGl0CisJICogYWxzbyB3b24ndCBiZSByZWFjaGVkIGZvciBh bnkgbGF0ZXIgc2V0IG9mIGFycmF5IGtleXMuLi4KKwkgKi8KKwlpZiAoIXNvLT5xdWFsX29rKQor CXsKKwkJLyoKKwkJICogLi4udGhvdWdoIHRoZXJlIGlzIG9uZSBleGNlcHRpb246IF9idF9maXJz dCdzIF9idF9wcmVwcm9jZXNzX2tleXMKKwkJICogY2FsbCBjYW4gZGV0ZXJtaW5lIHRoYXQgdGhl IHNjYW4ncyBpbnB1dCBzY2FuIGtleXMgY2FuIG5ldmVyIGJlCisJCSAqIHNhdGlzZmllZC4gIFRo YXQgbWlnaHQgYmUgdHJ1ZSBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBidXQgbm90CisJCSAq IHRoZSBuZXh0IHNldC4KKwkJICoKKwkJICogSGFuZGxlIHRoaXMgYnkgYWR2YW5jaW5nIHRoZSBh cnJheSBrZXlzIGluY3JlbWVudGFsbHkgb3Vyc2VsdmVzLgorCQkgKiBXaGVuIHRoaXMgc3VjY2Vl ZHMsIHN0YXJ0IGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4uCisJCSAqLworCQlDSEVDS19G T1JfSU5URVJSVVBUUygpOworCisJCUFzc2VydCghc28tPm5lZWRQcmltU2Nhbik7CisJCWlmIChf YnRfYWR2YW5jZV9hcnJheV9rZXlzX2luY3JlbWVudChzY2FuLCBkaXIpKQorCQkJcmV0dXJuIHRy dWU7CisKKwkJLyogQXJyYXkga2V5cyBhcmUgbm93IGV4aGF1c3RlZCAqLworCX0KKworCS8qCisJ ICogSGFzIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNjYW4gYmVlbiBzY2hlZHVsZWQgYnkgX2J0 X2NoZWNra2V5cz8KKwkgKi8KKwlpZiAoc28tPm5lZWRQcmltU2NhbikKKwl7CisJCS8qIFllcyAt LSB0ZWxsIGNhbGxlciB0byBjYWxsIF9idF9maXJzdCBvbmNlIGFnYWluICovCisJCXNvLT5uZWVk UHJpbVNjYW4gPSBmYWxzZTsKKwkJaWYgKHNjYW4tPnBhcmFsbGVsX3NjYW4gIT0gTlVMTCkKKwkJ CV9idF9wYXJhbGxlbF9uZXh0X3ByaW1pdGl2ZV9zY2FuKHNjYW4pOworCisJCXJldHVybiB0cnVl OworCX0KKworCS8qCisJICogTm8gbW9yZSBwcmltaXRpdmUgaW5kZXggc2NhbnMuICBUZXJtaW5h dGUgdGhlIHRvcC1sZXZlbCBzY2FuLgorCSAqLworCWlmIChzY2FuLT5wYXJhbGxlbF9zY2FuICE9 IE5VTEwpCisJCV9idF9wYXJhbGxlbF9kb25lKHNjYW4pOworCisJcmV0dXJuIGZhbHNlOworfQor CisvKgorICogX2J0X2FkdmFuY2VfYXJyYXlfa2V5cygpIC0tIEFkdmFuY2UgYXJyYXkgZWxlbWVu dHMgdXNpbmcgYSB0dXBsZQorICoKKyAqIExpa2UgX2J0X2NoZWNrX2NvbXBhcmUsIG91ciByZXR1 cm4gdmFsdWUgaW5kaWNhdGVzIGlmIHR1cGxlIHNhdGlzZmllZCB0aGUKKyAqIHF1YWwgKHNwZWNp ZmljYWxseSBvdXIgbmV3IHF1YWwpLiAgVGhlcmUgbXVzdCBiZSBhIG5ldyBxdWFsIHdoZW5ldmVy IHdlJ3JlCisgKiBjYWxsZWQgKHVubGVzcyB0aGUgdG9wLWxldmVsIHNjYW4gdGVybWluYXRlcyku ICBBZnRlciB3ZSByZXR1cm4sIGFsbCBsYXRlcgorICogY2FsbHMgdG8gX2J0X2NoZWNrX2NvbXBh cmUgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBuZXcgcXVhbCAoYSBxdWFsIHdpdGggdGhlCisgKiBu ZXdseSBhZHZhbmNlZCBhcnJheSBrZXkgdmFsdWVzIHRoYXQgd2VyZSBzZXQgaGVyZSBieSB1cyku CisgKgorICogV2UnbGwgYWxzbyBzZXQgcHN0YXRlLmNvbnRpbnVlc2NhbiBmb3IgY2FsbGVyLiAg V2hlbiB0aGlzIGlzIHNldCB0byBmYWxzZSwKKyAqIGl0IHVzdWFsbHkganVzdCBlbmRzIHRoZSBv bmdvaW5nIHByaW1pdGl2ZSBpbmRleCBzY2FuICh3ZSdsbCBoYXZlIHNjaGVkdWxlZAorICogYW5v dGhlciBvbmUgaW4gcGFzc2luZykuICBCdXQgd2hlbiBhbGwgcmVxdWlyZWQgYXJyYXkga2V5cyB3 ZXJlIGV4aGF1c3RlZCwKKyAqIHNldHRpbmcgcHN0YXRlLmNvbnRpbnVlc2Nhbj1mYWxzZSBoZXJl IGVuZHMgdGhlIHRvcC1sZXZlbCBpbmRleCBzY2FuIChzaW5jZQorICogbm8gbmV3IHByaW1pdGl2 ZSBzY2FuIHdpbGwgaGF2ZSBiZWVuIHNjaGVkdWxlZCkuICBNb3N0IGNhbGxzIGhlcmUgd2lsbCBo YXZlCisgKiB1cyBzZXQgcHN0YXRlLmNvbnRpbnVlc2Nhbj10cnVlLCB3aGljaCBqdXN0IGluZGlj YXRlcyB0aGF0IHRoZSBzY2FuIHNob3VsZAorICogcHJvY2VlZCBvbnRvIHRoZSBuZXh0IHR1cGxl IChqdXN0IGxpa2Ugd2hlbiBfYnRfY2hlY2tfY29tcGFyZSBkb2VzIGl0KS4KKyAqCisgKiBfYnRf dHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyBp ZiB0aGUgY3VycmVudAorICogcGxhY2UgaW4gdGhlIHNjYW4gaXMgPj0gdGhlIGN1cnJlbnQgYXJy YXkga2V5cy4gIENhbGxpbmcgaGVyZSBiZWZvcmUgdGhhdAorICogcG9pbnQgd2lsbCBwcmVtYXR1 cmVseSBhZHZhbmNlIHRoZSBhcnJheSBrZXlzLCBsZWFkaW5nIHRvIHdyb25nIHF1ZXJ5CisgKiBy ZXN1bHRzLgorICoKKyAqIFdlJ3JlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IGNhbGxl cidzIHR1cGxlIGlzIDw9IGN1cnJlbnQvbmV3bHkKKyAqIGFkdmFuY2VkIHJlcXVpcmVkIGFycmF5 IGtleXMgb25jZSB3ZSByZXR1cm4uICBXZSB0cnkgdG8gZmluZCBhbiBleGFjdAorICogbWF0Y2gs IGJ1dCBmYWlsaW5nIHRoYXQgd2UnbGwgYWR2YW5jZSB0aGUgYXJyYXkga2V5cyB0byB3aGF0ZXZl ciBzZXQgb2YKKyAqIGFycmF5IGVsZW1lbnRzIGNvbWVzIG5leHQgaW4gdGhlIGtleSBzcGFjZSBm b3IgdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24uCisgKiBSZXF1aXJlZCBhcnJheSBrZXlzICJy YXRjaGV0IGZvcndhcmRzIi4gIFRoZXkgY2FuIG9ubHkgYWR2YW5jZSBhcyB0aGUgc2NhbgorICog aXRzZWxmIGFkdmFuY2VzIHRocm91Z2ggdGhlIGluZGV4L2tleSBzcGFjZS4KKyAqCisgKiAoVGhl IGludmFyaWFudHMgYXJlIHRoZSBzYW1lIGZvciBiYWNrd2FyZHMgc2NhbnMsIGV4Y2VwdCB0aGF0 IHRoZSBvcGVyYXRvcnMKKyAqIGFyZSBmbGlwcGVkOiBqdXN0IHJlcGxhY2UgdGhlIHByZWNvbmRp dGlvbidzID49IG9wZXJhdG9yIHdpdGggYSA8PSwgYW5kIHRoZQorICogcG9zdGNvbmRpdGlvbidz IDw9IG9wZXJhdG9yIHdpdGggd2l0aCBhID49LiAgSW4gb3RoZXIgd29yZHMsIGp1c3Qgc3dhcCB0 aGUKKyAqIHByZWNvbmRpdGlvbiB3aXRoIHRoZSBwb3N0Y29uZGl0aW9uLikKKyAqCisgKiBXZSBh bHNvIGRlYWwgd2l0aCAiYWR2YW5jaW5nIiBub24tcmVxdWlyZWQgYXJyYXlzIGhlcmUuICBTb21l dGltZXMgdGhhdCdsbAorICogYmUgdGhlIHNvbGUgcmVhc29uIGZvciBjYWxsaW5nIGhlcmUuICBU aGVzZSBjYWxscyBhcmUgdGhlIG9ubHkgZXhjZXB0aW9uIHRvCisgKiB0aGUgZ2VuZXJhbCBydWxl IGFib3V0IGFsd2F5cyBhZHZhbmNpbmcgcmVxdWlyZWQgYXJyYXkga2V5cyAoc2luY2UgdGhleSdy ZQorICogdGhlIG9ubHkgY2FzZSB3aGVyZSB3ZSBzaW1wbHkgZG9uJ3QgbmVlZCB0byB0b3VjaCBh bnkgcmVxdWlyZWQgYXJyYXksIHdoaWNoCisgKiBtdXN0IGFscmVhZHkgYmUgc2F0aXNmaWVkIGJ5 IGNhbGxlcidzIHR1cGxlKS4gIENhbGxzIHRyaWdnZXJlZCBieSBhbnkgc2NhbgorICoga2V5IHRo YXQncyByZXF1aXJlZCBpbiB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbiBhcmUgc3RyaWN0bHkg Z3VhcmFudGVlZAorICogdG8gYWR2YW5jZSB0aGUgcmVxdWlyZWQgYXJyYXkga2V5cyAob3IgZW5k IHRoZSB0b3AtbGV2ZWwgc2NhbiksIHRob3VnaC4KKyAqCisgKiBOb3RlIHRoYXQgd2UgZGVhbCB3 aXRoIGFsbCByZXF1aXJlZCBlcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleXMgaGVyZTsgaXQncwor ICogbm90IGxpbWl0ZWQgdG8gYXJyYXkgc2NhbiBrZXlzLiAgVGhleSdyZSBlcXVhbGl0eSBjb25z dHJhaW50cyBmb3Igb3VyCisgKiBwdXJwb3NlcywgYW5kIHNvIGFyZSBoYW5kbGVkIGFzIGRlZ2Vu ZXJhdGUgc2luZ2xlIGVsZW1lbnQgYXJyYXlzIGhlcmUuCisgKiBPYnZpb3VzbHksIHRoZXkgY2Fu IG5ldmVyIHJlYWxseSBhZHZhbmNlIGluIHRoZSB3YXkgdGhhdCByZWFsIGFycmF5cyBjYW4sCisg KiBidXQgdGhleSBtdXN0IHN0aWxsIGFmZmVjdCBob3cgd2UgYWR2YW5jZSByZWFsIGFycmF5IHNj YW4ga2V5cywganVzdCBsaWtlCisgKiBhbnkgb3RoZXIgZXF1YWxpdHkgY29uc3RyYWludC4gIFdl IGhhdmUgdG8ga2VlcCBhcm91bmQgYSAzLXdheSBPUkRFUiBwcm9jCisgKiBmb3IgdGhlc2UgKGp1 c3QgdXNpbmcgdGhlICI9IiBvcGVyYXRvciB3b24ndCBkbyksIHNpbmNlIGluIGdlbmVyYWwgd2hl dGhlcgorICogdGhlIHR1cGxlIGlzIDwgb3IgPiBzb21lIG5vbi1hcnJheSBlcXVhbGl0eSBrZXkg bWlnaHQgaW5mbHVlbmNlIGFkdmFuY2VtZW50CisgKiBvZiBhbnkgb2YgdGhlIHNjYW4ncyBhY3R1 YWwgYXJyYXlzLiAgVGhlIHRvcC1sZXZlbCBzY2FuIGNhbiBvbmx5IHRlcm1pbmF0ZQorICogYWZ0 ZXIgaXQgaGFzIHByb2Nlc3NlZCB0aGUga2V5IHNwYWNlIGNvdmVyZWQgYnkgdGhlIHByb2R1Y3Qg b2YgZWFjaCBhbmQKKyAqIGV2ZXJ5IGVxdWFsaXR5IGNvbnN0cmFpbnQsIGluY2x1ZGluZyBib3Ro IG5vbi1hcnJheXMgYW5kIChyZXF1aXJlZCkgYXJyYXlzLgorICoKKyAqIE5vdGUgYWxzbyB0aGF0 IHdlIG1heSBzb21ldGltZXMgbmVlZCB0byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIHdoZW4gdGhl CisgKiBleGlzdGluZyBhcnJheSBrZXlzIGFyZSBhbHJlYWR5IGFuIGV4YWN0IG1hdGNoIGZvciBl dmVyeSBjb3JyZXNwb25kaW5nCisgKiB2YWx1ZSBmcm9tIGNhbGxlcidzIHR1cGxlIGFjY29yZGlu ZyB0byBfYnRfY2hlY2tfY29tcGFyZS4gIFRoaXMgaXMgaG93IHdlCisgKiBkZWFsIHdpdGggaW5l cXVhbGl0aWVzIHRoYXQgYXJlIHJlcXVpcmVkIGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9u LgorICogVGhleSBjYW4gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyBoZXJlLCBldmVuIHRob3VnaCB0 aGV5IGRvbid0IGluZmx1ZW5jZSB0aGUKKyAqIGluaXRpYWwgcG9zaXRpb25pbmcgc3RyYXRlZ3kg d2l0aGluIF9idF9maXJzdCAob25seSBpbmVxdWFsaXRpZXMgcmVxdWlyZWQKKyAqIGluIHRoZSBf b3Bwb3NpdGVfIGRpcmVjdGlvbiB0byB0aGUgc2NhbiBpbmZsdWVuY2UgX2J0X2ZpcnN0IGluIHRo aXMgd2F5KS4KKyAqCisgKiBBcyBkaXNjdXNzZWQgYWxyZWFkeSwgd2UgZ3VhcmFudGVlIHRoYXQg dGhlIGFycmF5IGtleXMgd2lsbCBlaXRoZXIgYmUKKyAqIGFkdmFuY2VkIHN1Y2ggdGhhdCBjYWxs ZXIncyB0dXBsZSBpcyA8PSB0aGUgbmV3IGFycmF5IGtleXMgaW4gcmVzcGVjdCBvZgorICogcmVx dWlyZWQgYXJyYXkga2V5cyAocGx1cyBhbnkgb3RoZXIgcmVxdWlyZWQgZXF1YWxpdHkgc3RyYXRl Z3kgc2NhbiBrZXlzKQorICogd2hlbiB3ZSByZXR1cm4gKHVubGVzcyB0aGUgYXJyYXlzIGFyZSB0 b3RhbGx5IGV4aGF1c3RlZCBpbnN0ZWFkKS4gIFRoZSByZWFsCisgKiBndWFyYW50ZWUgaXMgYWN0 dWFsbHkgc2xpZ2h0bHkgc3Ryb25nZXIgdGhhbiB0aGF0LCB0aG91Z2ggaXQgb25seSBtYXR0ZXJz CisgKiB0byBzY2FucyB0aGF0IGhhdmUgcmVxdWlyZWQgaW5lcXVhbGl0eSBzdHJhdGVneSBzY2Fu IGtleXMuICBUaGUgcHJlY2lzZQorICogcHJvbWlzZSB3ZSBtYWtlIGlzIHRoYXQgdGhlIGFycmF5 IGtleXMgd2lsbCBhbHdheXMgYWR2YW5jZSB0byB0aGUgbWF4aW11bQorICogcG9zc2libGUgZXh0 ZW50IHRoYXQgd2UgY2FuIGtub3cgdG8gYmUgc2FmZSBiYXNlZCBvbiBjYWxsZXIncyB0dXBsZSBh bG9uZS4KKyAqIE5vdGUgdGhhdCBpdCdzIGp1c3QgYWJvdXQgcG9zc2libGUgdGhhdCBldmVyeSBy ZXF1aXJlZCBlcXVhbGl0eSBzdHJhdGVneQorICogc2NhbiBrZXkgd2lsbCBiZSBzYXRpc2ZpZWQg KG9yIGNvdWxkIGJlIHNhdGlzZmllZCBieSBhZHZhbmNpbmcgdGhlIGFycmF5CisgKiBrZXlzKSwg eWV0IHdlIG1pZ2h0IGFkdmFuY2UgdGhlIGFycmF5IGtleXMgX2JleW9uZF8gb3VyIGV4YWN0bHkt bWF0Y2hpbmcKKyAqIGVsZW1lbnQgdmFsdWVzIGR1ZSB0byBhIHN0aWxsLXVuc2F0aXNmaWVkIGlu ZXF1YWxpdHkgc3RyYXRlZ3kgc2NhbiBrZXkuCisgKi8KK3N0YXRpYyBib29sCitfYnRfYWR2YW5j ZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUs CisJCQkJCSAgIEluZGV4VHVwbGUgdHVwbGUsIGludCBza3RyaWcpCit7CisJQlRTY2FuT3BhcXVl IHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOworCVJlbGF0aW9uCXJlbCA9IHNjYW4t PmluZGV4UmVsYXRpb247CisJU2NhbkRpcmVjdGlvbiBkaXIgPSBwc3RhdGUtPmRpcjsKKwlUdXBs ZURlc2MJaXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CisJU2NhbktleQkJY3VyOwor CWludAkJCWlrZXksCisJCQkJYXJyYXlpZHggPSAwLAorCQkJCW50dXBhdHRzID0gQlRyZWVUdXBs ZUdldE5BdHRzKHR1cGxlLCByZWwpOworCWJvb2wJCWFycmF5c19hZHZhbmNlZCA9IGZhbHNlLAor CQkJCWFycmF5c19leGhhdXN0ZWQsCisJCQkJc2t0cmlncmVxdWlyZWQgPSBmYWxzZSwKKwkJCQli ZXlvbmRfZW5kX2FkdmFuY2UgPSBmYWxzZSwKKwkJCQlmb3VuZFJlcXVpcmVkT3Bwb3NpdGVEaXJP bmx5ID0gZmFsc2UsCisJCQkJYWxsX2FycmF5bGlrZV9za19zYXRpc2ZpZWQgPSB0cnVlLAorCQkJ CWFsbF9yZXF1aXJlZF9za19zYXRpc2ZpZWQgPSB0cnVlOworCisJQXNzZXJ0KF9idF92ZXJpZnlf a2V5c193aXRoX2FycmF5a2V5cyhzY2FuKSk7CisKKwkvKgorCSAqIEl0ZXJhdGUgdGhyb3VnaCB0 aGUgc2NhbidzIHNlYXJjaC10eXBlIHNjYW5rZXlzIChzby0+a2V5RGF0YVtdKSwgYW5kCisJICog c2V0IGlucHV0IHNjYW4ga2V5cyAoc28tPmFycmF5S2V5RGF0YVtdKSB0byBuZXcgYXJyYXkgdmFs dWVzCisJICovCisJZm9yIChjdXIgPSBzby0+a2V5RGF0YSwgaWtleSA9IDA7IGlrZXkgPCBzby0+ bnVtYmVyT2ZLZXlzOyBjdXIrKywgaWtleSsrKQorCXsKKwkJQlRBcnJheUtleUluZm8gKmFycmF5 ID0gTlVMTDsKKwkJU2NhbktleQkJc2tleWFycmF5ID0gTlVMTDsKKwkJRm1nckluZm8gICAqb3Jk ZXJwcm9jOworCQlpbnQJCQlhdHRudW0gPSBjdXItPnNrX2F0dG5vOworCQlEYXR1bQkJdHVwZGF0 dW07CisJCWJvb2wJCXJlcXVpcmVkU2FtZURpciA9IGZhbHNlLAorCQkJCQlyZXF1aXJlZE9wcG9z aXRlRGlyT25seSA9IGZhbHNlLAorCQkJCQl0dXBudWxsOworCQlpbnQzMgkJcmVzdWx0OworCQlp bnQJCQlzZXRfZWxlbSA9IDA7CisKKwkJLyoKKwkJICogU2V0IHVwIE9SREVSIDMtd2F5IGNvbXBh cmlzb24gZnVuY3Rpb24gYW5kIGFycmF5IHN0YXRlCisJCSAqLworCQlvcmRlcnByb2MgPSAmc28t Pm9yZGVyUHJvY3NbYXR0bnVtIC0gMV07CisJCWlmIChjdXItPnNrX2ZsYWdzICYgU0tfU0VBUkNI QVJSQVkgJiYKKwkJCWN1ci0+c2tfc3RyYXRlZ3kgPT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQor CQl7CisJCQlBc3NlcnQoYXJyYXlpZHggPCBzby0+bnVtQXJyYXlLZXlzKTsKKwkJCWFycmF5ID0g JnNvLT5hcnJheUtleXNbYXJyYXlpZHgrK107CisJCQlza2V5YXJyYXkgPSAmc28tPmFycmF5S2V5 RGF0YVthcnJheS0+c2Nhbl9rZXldOworCQkJQXNzZXJ0KHNrZXlhcnJheS0+c2tfYXR0bm8gPT0g YXR0bnVtKTsKKwkJfQorCisJCWlmICgoKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9SRVFGV0QpICYm IFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSkgfHwKKwkJCSgoY3VyLT5za19mbGFncyAmIFNL X0JUX1JFUUJLV0QpICYmIFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikpKQorCQkJcmVxdWly ZWRTYW1lRGlyID0gdHJ1ZTsKKwkJZWxzZSBpZiAoKChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVR RldEKSAmJiBTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpKSB8fAorCQkJCSAoKGN1ci0+c2tf ZmxhZ3MgJiBTS19CVF9SRVFCS1dEKSAmJiBTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpKQor CQkJcmVxdWlyZWRPcHBvc2l0ZURpck9ubHkgPSB0cnVlOworCisJCS8qCisJCSAqIE9wdGltaXph dGlvbjogU2tpcCBvdmVyIGtub3duLXNhdGlzZmllZCBzY2FuIGtleXMKKwkJICovCisJCWlmIChp a2V5IDwgc2t0cmlnKQorCQkJY29udGludWU7CisJCWlmIChpa2V5ID09IHNrdHJpZykKKwkJCXNr dHJpZ3JlcXVpcmVkID0gcmVxdWlyZWRTYW1lRGlyOworCisJCS8qCisJCSAqIFdoZW4gd2UgY29t ZSBhY3Jvc3MgYW4gaW5lcXVhbGl0eSBzY2FuIGtleSB0aGF0J3MgcmVxdWlyZWQgaW4gdGhlCisJ CSAqIG9wcG9zaXRlIGRpcmVjdGlvbiBvbmx5LCBhbmQgdGhhdCBtaWdodCBhZmZlY3Qgd2hlcmUg b3VyIHNjYW4gZW5kcywKKwkJICogcmVtZW1iZXIgaXQuICBXZSdsbCBvbmx5IG5lZWQgdGhpcyBp bmZvcm1hdGlvbiB3aGVuIGFsbCBwcmlvcgorCQkgKiBlcXVhbGl0eSBjb25zdHJhaW50cyBhcmUg c2F0aXNmaWVkLgorCQkgKi8KKwkJaWYgKHJlcXVpcmVkT3Bwb3NpdGVEaXJPbmx5ICYmIHNrdHJp Z3JlcXVpcmVkICYmCisJCQlhbGxfYXJyYXlsaWtlX3NrX3NhdGlzZmllZCkKKwkJeworCQkJQXNz ZXJ0KGN1ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKTsKKwkJCUFzc2Vy dChhbGxfcmVxdWlyZWRfc2tfc2F0aXNmaWVkKTsKKwkJCUFzc2VydCghZm91bmRSZXF1aXJlZE9w cG9zaXRlRGlyT25seSk7CisKKwkJCWZvdW5kUmVxdWlyZWRPcHBvc2l0ZURpck9ubHkgPSB0cnVl OworCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIE90aGVyIHRoYW4gdGhhdCwgd2Un cmUgbm90IGludGVyZXN0ZWQgaW4gc2NhbiBrZXlzIHRoYXQgYXJlbid0CisJCSAqIHJlcXVpcmVk IGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uICh1bmxlc3MgdGhleSdyZSBub24tcmVxdWly ZWQKKwkJICogYXJyYXkgZXF1YWxpdHkgc2NhbiBrZXlzLCB3aGljaCBzdGlsbCBuZWVkIHRvIGJl IGFkdmFuY2VkIGJ5IHVzKQorCQkgKi8KKwkJaWYgKCFyZXF1aXJlZFNhbWVEaXIgJiYgIWFycmF5 KQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSGFuZGxlIGEgcmVxdWlyZWQgbm9uLWFycmF5 IHNjYW4ga2V5IHRoYXQgdGhlIGluaXRpYWwgY2FsbCB0bworCQkgKiBfYnRfY2hlY2tfY29tcGFy ZSBpbmRpY2F0ZWQgdHJpZ2dlcmVkIGFycmF5IGFkdmFuY2VtZW50LCBpZiBhbnkuCisJCSAqCisJ CSAqIFRoZSBub24tYXJyYXkgc2NhbiBrZXkncyBzdHJhdGVneSB3aWxsIGJlIDwsIDw9LCBvciA9 IGR1cmluZyBhCisJCSAqIGZvcndhcmRzIHNjYW4gKG9yIGFueSBvbmUgb2YgPSwgPj0sIG9yID4g ZHVyaW5nIGEgYmFja3dhcmRzIHNjYW4pLgorCQkgKiBJdCBmb2xsb3dzIHRoYXQgdGhlIGNvcnJl c3BvbmRpbmcgdHVwbGUgYXR0cmlidXRlJ3MgdmFsdWUgbXVzdCBub3cKKwkJICogYmUgZWl0aGVy ID4gb3IgPj0gdGhlIHNjYW4ga2V5IHZhbHVlIChmb3IgYmFja3dhcmRzIHNjYW5zIGl0IG11c3QK KwkJICogYmUgZWl0aGVyIDwgb3IgPD0gdGhhdCB2YWx1ZSkuCisJCSAqCisJCSAqIElmIHRoaXMg aXMgYSByZXF1aXJlZCBlcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleSwgdGhpcyBpcyBqdXN0IGFu CisJCSAqIG9wdGltaXphdGlvbjsgX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyBhbHJlYWR5 IGNvbmZpcm1lZCB0aGF0CisJCSAqIHRoaXMgc2NhbiBrZXkgcGxhY2VzIHVzIGFoZWFkIG9mIGNh bGxlcidzIHR1cGxlLiAgVGhlcmUncyBubyBuZWVkCisJCSAqIHRvIHJlcGVhdCB0aGF0IHdvcmsg bm93LiAoV2Ugb25seSBkbyBjb21wYXJpc29ucyBvZiBhbnkgcmVxdWlyZWQKKwkJICogbm9uLWFy cmF5IGVxdWFsaXR5IHNjYW4ga2V5cyB0aGF0IGNvbWUgYWZ0ZXIgdGhlIHRyaWdnZXJpbmcga2V5 LikKKwkJICoKKwkJICogSWYgdGhpcyBpcyBhIHJlcXVpcmVkIGluZXF1YWxpdHkgc3RyYXRlZ3kg c2NhbiBrZXksIHdlIF9tdXN0XyByZWx5CisJCSAqIG9uIF9idF9jaGVja19jb21wYXJlIGxpa2Ug dGhpczsgaXQga25vd3MgYWxsIHRoZSBpbnRyaWNhY2llcyBhcm91bmQKKwkJICogZXZhbHVhdGlu ZyBpbmVxdWFsaXR5IHN0cmF0ZWd5IHNjYW4ga2V5cyAoZS5nLiwgcm93IGNvbXBhcmlzb25zKS4K KwkJICogVGhlcmUgaXMgbm8gc2ltcGxlIG1hcHBpbmcgb250byB0aGUgb3BjbGFzcyBPUkRFUiBw cm9jIHdlIGNhbiB1c2UuCisJCSAqIEJ1dCBvbmNlIHdlIGtub3cgdGhhdCB3ZSBoYXZlIGFuIHVu c2F0aXNmaWVkIGluZXF1YWxpdHksIHdlIGNhbgorCQkgKiB0cmVhdCBpdCBpbiB0aGUgc2FtZSB3 YXkgYXMgYW4gdW5zYXRpc2ZpZWQgZXF1YWxpdHkgYXQgdGhpcyBwb2ludC4KKwkJICogKFdlIGRv bid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbGF0ZXIgcmVxdWlyZWQgaW5lcXVhbGl0aWVzLCBzaW5j ZQorCQkgKiB0aGVyZSBjYW4ndCBiZSBhbnkgYWZ0ZXIgdGhlIGZpcnN0IG9uZS4gIFdoaWxlIGl0 J3MgcG9zc2libGUgdGhhdAorCQkgKiBfYnRfcHJlcHJvY2Vzc19rZXlzIGZhaWxlZCB0byBkZXRl cm1pbmUgd2hpY2ggb2Ygc2V2ZXJhbCAicmVxdWlyZWQiCisJCSAqIHNjYW4ga2V5cyBmb3IgdGhp cyBzYW1lIGF0dHJpYnV0ZSBhbmQgc2FtZSBzY2FuIGRpcmVjdGlvbiBhcmUgdHJ1bHkKKwkJICog cmVxdWlyZWQsIHRoYXQgY2hhbmdlcyBub3RoaW5nLCByZWFsbHkuICBFdmVuIGluIHRoaXMgY29y bmVyIGNhc2UsCisJCSAqIHdlIGNhbiBzYWZlbHkgYXNzdW1lIHRoYXQgYW55IG90aGVyICJyZXF1 aXJlZCIgaW5lcXVhbGl0eSB0aGF0IGlzCisJCSAqIHN0aWxsIHNhdGlzZmllZCBtdXN0IGhhdmUg YmVlbiByZWR1bmRhbnQgYWxsIGFsb25nLikKKwkJICoKKwkJICogVGhlIGFycmF5cyBhZHZhbmNl IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzIGJlY2F1c2UgYm90aCBpbnZvbHZlIHRoZQorCQkgKiBz Y2FuIHJlYWNoaW5nIHRoZSBlbmQgb2YgdGhlIGtleSBzcGFjZSBmb3IgYSBoaWdoZXIgb3JkZXIg YXJyYXkga2V5CisJCSAqIChvciBzb21lIGRpc3RpbmN0IHNldCBvZiBoaWdoZXItb3JkZXIgYXJy YXkga2V5cywgdGFrZW4gdG9nZXRoZXIpLgorCQkgKiBUaGUgb25seSByZWFsIGRpZmZlcmVuY2Ug aXMgdGhhdCBpbiB0aGUgZXF1YWxpdHkgY2FzZSB0aGUgZW5kIGlzCisJCSAqICJzdHJpY3RseSBh dCB0aGUgZW5kIG9mIGFuIGFycmF5IGtleSIsIHdoZXJlYXMgaW4gdGhlIGluZXF1YWxpdHkKKwkJ ICogY2FzZSBpdCdzICJ3aXRoaW4gYW4gYXJyYXkga2V5Ii4gIEVpdGhlciB3YXkgd2UnbGwgaW5j cmVtZW50IGhpZ2hlcgorCQkgKiBvcmRlciBhcnJheXMgYnkgb25lIGluY3JlbWVudCAodGhlIG5l eHQtaGlnaGVzdCBhcnJheSBtaWdodCBuZWVkIHRvCisJCSAqIHJvbGwgb3ZlciB0byB0aGUgbmV4 dC1uZXh0IGhpZ2hlc3QgYXJyYXkgaW4gdHVybiwgYW5kIHNvIG9uKS4KKwkJICoKKwkJICogU2Vl IGJlbG93IGZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgImJleW9uZCBlbmQiIGFkdmFuY2VtZW50 LgorCQkgKi8KKwkJaWYgKGlrZXkgPT0gc2t0cmlnICYmICFhcnJheSkKKwkJeworCQkJQXNzZXJ0 KHJlcXVpcmVkU2FtZURpcik7CisJCQlBc3NlcnQoIWFycmF5c19hZHZhbmNlZCk7CisKKwkJCWJl eW9uZF9lbmRfYWR2YW5jZSA9IHRydWU7CisJCQlhbGxfYXJyYXlsaWtlX3NrX3NhdGlzZmllZCA9 IGFsbF9yZXF1aXJlZF9za19zYXRpc2ZpZWQgPSBmYWxzZTsKKworCQkJY29udGludWU7CisJCX0K KworCQkvKgorCQkgKiBOb3RoaW5nIGZvciB1cyB0byBkbyB3aXRoIGEgcmVxdWlyZWQgaW5lcXVh bGl0eSBzdHJhdGVneSBzY2FuIGtleQorCQkgKiB0aGF0IHdhc24ndCB0aGUgb25lIHRoYXQgX2J0 X2NoZWNrX2NvbXBhcmUgc3RvcHBlZCBvbgorCQkgKi8KKwkJaWYgKGN1ci0+c2tfc3RyYXRlZ3kg IT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogSGVy ZSB3ZSBwZXJmb3JtIHN0ZXBzIGZvciBhbGwgYXJyYXkgc2NhbiBrZXlzIGFmdGVyIGEgcmVxdWly ZWQKKwkJICogYXJyYXkgc2NhbiBrZXkgd2hvc2UgYmluYXJ5IHNlYXJjaCB0cmlnZ2VyZWQgImJl eW9uZCBlbmQgb2YgYXJyYXkKKwkJICogZWxlbWVudCIgYXJyYXkgYWR2YW5jZW1lbnQgZHVlIHRv IGVuY291bnRlcmluZyBhIHR1cGxlIGF0dHJpYnV0ZQorCQkgKiB2YWx1ZSA+IHRoZSBjbG9zZXN0 IG1hdGNoaW5nIGFycmF5IGtleSAob3IgPCBmb3IgYmFja3dhcmRzIHNjYW5zKS4KKwkJICoKKwkJ ICogU2VlIGJlbG93IGZvciBhIGZ1bGwgZXhwbGFuYXRpb24gb2YgImJleW9uZCBlbmQiIGFkdmFu Y2VtZW50LgorCQkgKgorCQkgKiBOQjogV2UgbXVzdCBkbyB0aGlzIGZvciBhbGwgYXJyYXlzIC0t IG5vdCBqdXN0IHJlcXVpcmVkIGFycmF5cy4KKwkJICogT3RoZXJ3aXNlIHRoZSBpbmNyZW1lbnRh bCBhcnJheSBhZHZhbmNlbWVudCBzdGVwIHdvbid0ICJjYXJyeSIuCisJCSAqLworCQlpZiAoYmV5 b25kX2VuZF9hZHZhbmNlKQorCQl7CisJCQlpbnQJCQlmaW5hbF9lbGVtX2RpcjsKKworCQkJaWYg KFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikgfHwgIWFycmF5KQorCQkJCWZpbmFsX2VsZW1f ZGlyID0gMDsKKwkJCWVsc2UKKwkJCQlmaW5hbF9lbGVtX2RpciA9IGFycmF5LT5udW1fZWxlbXMg LSAxOworCisJCQlpZiAoYXJyYXkgJiYgYXJyYXktPmN1cl9lbGVtICE9IGZpbmFsX2VsZW1fZGly KQorCQkJeworCQkJCWFycmF5LT5jdXJfZWxlbSA9IGZpbmFsX2VsZW1fZGlyOworCQkJCXNrZXlh cnJheS0+c2tfYXJndW1lbnQgPSBhcnJheS0+ZWxlbV92YWx1ZXNbZmluYWxfZWxlbV9kaXJdOwor CQkJCWFycmF5c19hZHZhbmNlZCA9IHRydWU7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJLyoKKwkJICogSGVyZSB3ZSBwZXJmb3JtIHN0ZXBzIGZvciBhbnkgcmVxdWlyZWQgc2NhbiBr ZXlzIGFmdGVyIHRoZSBmaXJzdAorCQkgKiByZXF1aXJlZCBzY2FuIGtleSB3aG9zZSB0dXBsZSBh dHRyaWJ1dGUgd2FzIDwgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcKKwkJICogYXJyYXkga2V5IHdoZW4g d2UgZGVhbHQgd2l0aCBpdCAob3IgPiBmb3IgYmFja3dhcmRzIHNjYW5zKS4KKwkJICoKKwkJICog VGhpcyBlYXJsaWVyIHJlcXVpcmVkIGFycmF5IGtleSBhbHJlYWR5IHB1dHMgdXMgYWhlYWQgb2Yg Y2FsbGVyJ3MKKwkJICogdHVwbGUgaW4gdGhlIGtleSBzcGFjZSAoZm9yIHRoZSBjdXJyZW50IHNj YW4gZGlyZWN0aW9uKS4gIFdlIG11c3QKKwkJICogbWFrZSBzdXJlIHRoYXQgc3Vic2VxdWVudCBs b3dlci1vcmRlciBhcnJheSBrZXlzIGRvIG5vdCBwdXQgdXMgdG9vCisJCSAqIGZhciBhaGVhZCAo YWhlYWQgb2YgdHVwbGVzIHRoYXQgaGF2ZSB5ZXQgdG8gYmUgc2VlbiBieSBvdXIgY2FsbGVyKS4K KwkJICogRm9yIGV4YW1wbGUsIHdoZW4gYSB0dXBsZSAiKGEsIGIpID0gKDQyLCA1KSIgYWR2YW5j ZXMgdGhlIGFycmF5CisJCSAqIGtleXMgb24gImEiIGZyb20gNDAgdG8gNDUsIHdlIG11c3QgYWxz byBzZXQgImIiIHRvIHdoYXRldmVyIHRoZQorCQkgKiBmaXJzdCBhcnJheSBlbGVtZW50IGZvciAi YiIgaXMuICBJdCB3b3VsZCBiZSB3cm9uZyB0byBhbGxvdyAiYiIgdG8KKwkJICogYmUgc2V0IGJh c2VkIG9uIHRoZSB0dXBsZSB2YWx1ZS4KKwkJICoKKwkJICogUGVyZm9ybSB0aGUgc2FtZSBzdGVw cyB3aXRoIHRydW5jYXRlZCBoaWdoIGtleSBhdHRyaWJ1dGVzLiAgWW91IGNhbgorCQkgKiB0aGlu ayBvZiB0aGlzIGFzIGEgImJpbmFyeSBzZWFyY2giIGZvciB0aGUgZWxlbWVudCBjbG9zZXN0IHRv IHRoZQorCQkgKiB2YWx1ZSAtaW5mLiAgQWdhaW4sIHRoZSBhcnJheXMgbXVzdCBuZXZlciBnZXQg YWhlYWQgb2YgdGhlIHNjYW4uCisJCSAqLworCQlpZiAoIWFsbF9hcnJheWxpa2Vfc2tfc2F0aXNm aWVkIHx8IGF0dG51bSA+IG50dXBhdHRzKQorCQl7CisJCQlpbnQJCQlmaXJzdF9lbGVtX2RpcjsK KworCQkJaWYgKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSB8fCAhYXJyYXkpCisJCQkJZmly c3RfZWxlbV9kaXIgPSAwOworCQkJZWxzZQorCQkJCWZpcnN0X2VsZW1fZGlyID0gYXJyYXktPm51 bV9lbGVtcyAtIDE7CisKKwkJCWlmIChhcnJheSAmJiBhcnJheS0+Y3VyX2VsZW0gIT0gZmlyc3Rf ZWxlbV9kaXIpCisJCQl7CisJCQkJYXJyYXktPmN1cl9lbGVtID0gZmlyc3RfZWxlbV9kaXI7CisJ CQkJc2tleWFycmF5LT5za19hcmd1bWVudCA9IGFycmF5LT5lbGVtX3ZhbHVlc1tmaXJzdF9lbGVt X2Rpcl07CisJCQkJYXJyYXlzX2FkdmFuY2VkID0gdHJ1ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAq IFRydW5jYXRlZCAtaW5mIHZhbHVlIHdpbGwgYWx3YXlzIGJlIGFzc3VtZWQgdG8gc2F0aXNmeSBh bnkKKwkJCSAqIHJlcXVpcmVkIGVxdWFsaXR5IHNjYW4ga2V5cyBhY2NvcmRpbmcgdG8gX2J0X2No ZWNrX2NvbXBhcmUuCisJCQkgKiBUaGlzIGF2b2lkcyBhIGxhdGVyIF9idF9jaGVja19jb21wYXJl IHJlY2hlY2suCisJCQkgKgorCQkJICogRGVsaWJlcmF0ZWx5IGRvbid0IHVuc2V0IGFsbF9yZXF1 aXJlZF9za19zYXRpc2ZpZWQgaGVyZS4gIFRoaXMKKwkJCSAqIGZvbGxvd3MgX2J0X3R1cGxlX2Jl Zm9yZV9hcnJheV9za2V5cydzIGV4YW1wbGUuICBXZSBkb24ndCB3YW50CisJCQkgKiB0byB0cmVh dCAtaW5mIGFzIGEgbm9uLW1hdGNoIHdoZW4gbWFraW5nIGEgZmluYWwgZGVjaXNpb24gb24KKwkJ CSAqIHdoZXRoZXIgdG8gbW92ZSB0byB0aGUgbmV4dCBwYWdlLiAgVGhpcyBpbXBsZW1lbnRzIGEg cG9saWN5IG9mCisJCQkgKiBiZWluZyBvcHRpbWlzdGljIGFib3V0IGZpbmRpbmcgcmVhbCBtYXRj aGVzIGZvciBsb3dlci1vcmRlcgorCQkJICogcmVxdWlyZWQgYXR0cmlidXRlcyB0aGF0IGFyZSB0 cnVuY2F0ZWQgdG8gLWluZiBpbiBmaW5hbHR1cC4KKwkJCSAqLworCQkJYWxsX2FycmF5bGlrZV9z a19zYXRpc2ZpZWQgPSBmYWxzZTsKKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBT ZWFyY2ggaW4gc2NhbmtleSdzIGFycmF5IGZvciB0aGUgY29ycmVzcG9uZGluZyB0dXBsZSBhdHRy aWJ1dGUKKwkJICogdmFsdWUgZnJvbSBjYWxsZXIncyB0dXBsZQorCQkgKi8KKwkJdHVwZGF0dW0g PSBpbmRleF9nZXRhdHRyKHR1cGxlLCBhdHRudW0sIGl0dXBkZXNjLCAmdHVwbnVsbCk7CisKKwkJ aWYgKGFycmF5KQorCQl7CisJCQlib29sCQlyYXRjaGV0cyA9IChyZXF1aXJlZFNhbWVEaXIgJiYg IWFycmF5c19hZHZhbmNlZCk7CisKKwkJCS8qCisJCQkgKiBCaW5hcnkgc2VhcmNoIGZvciBjbG9z ZXN0IG1hdGNoIHRoYXQncyBhdmFpbGFibGUgZnJvbSB0aGUgYXJyYXkKKwkJCSAqLworCQkJc2V0 X2VsZW0gPSBfYnRfYmluc3JjaF9hcnJheV9za2V5KG9yZGVycHJvYywgcmF0Y2hldHMsIGRpciwK KwkJCQkJCQkJCQkJICB0dXBkYXR1bSwgdHVwbnVsbCwKKwkJCQkJCQkJCQkJICBhcnJheSwgY3Vy LCAmcmVzdWx0KTsKKworCQkJLyoKKwkJCSAqIFJlcXVpcmVkIGFycmF5cyBvbmx5IGV2ZXIgcmF0 Y2hldCBmb3J3YXJkcyAoYmFja3dhcmRzKS4KKwkJCSAqCisJCQkgKiBUaGlzIGNvbmRpdGlvbiBt YWtlcyBpdCBzYWZlIGZvciBiaW5hcnkgc2VhcmNoZXMgdG8gc2tpcCBvdmVyCisJCQkgKiBhcnJh eSBlbGVtZW50cyB0aGF0IHRoZSBzY2FuIG11c3QgYWxyZWFkeSBiZSBhaGVhZCBvZiBieSBub3cu CisJCQkgKiBUaGF0IGlzIHN0cmljdGx5IGFuIG9wdGltaXphdGlvbi4gIE91ciBhc3NlcnRpb24g dmVyaWZpZXMgdGhhdAorCQkJICogdGhlIGNvbmRpdGlvbiBob2xkcywgd2hpY2ggZG9lc24ndCBk ZXBlbmQgb24gdGhlIG9wdGltaXphdGlvbi4KKwkJCSAqLworCQkJQXNzZXJ0KCFyYXRjaGV0cyB8 fAorCQkJCSAgICgoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpICYmIHNldF9lbGVtID49IGFy cmF5LT5jdXJfZWxlbSkgfHwKKwkJCQkJKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikgJiYg c2V0X2VsZW0gPD0gYXJyYXktPmN1cl9lbGVtKSkpOworCQkJQXNzZXJ0KHNldF9lbGVtID49IDAg JiYgc2V0X2VsZW0gPCBhcnJheS0+bnVtX2VsZW1zKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUFz c2VydChyZXF1aXJlZFNhbWVEaXIpOworCisJCQkvKgorCQkJICogVGhpcyBpcyBhIHJlcXVpcmVk IG5vbi1hcnJheSBlcXVhbGl0eSBzdHJhdGVneSBzY2FuIGtleSwgd2hpY2gKKwkJCSAqIHdlJ2xs IHRyZWF0IGFzIGEgZGVnZW5lcmF0ZSBzaW5nbGUgdmFsdWUgYXJyYXkuCisJCQkgKgorCQkJICog V2UgcmVhbGx5IGRvIG5lZWQgYW4gT1JERVIgcHJvYyBmb3IgdGhpcyAod2UgY2FuJ3QganVzdCBy ZWx5IG9uCisJCQkgKiB0aGUgc2NhbiBrZXkncyBlcXVhbGl0eSBvcGVyYXRvcikuICBXZSBuZWVk IHRvIGtub3cgd2hldGhlciB0aGUKKwkJCSAqIHR1cGxlIGFzIGEgd2hvbGUgaXMgZWl0aGVyIGJl aGluZCBvciBhaGVhZCBvZiAob3IgY292ZXJlZCBieSkKKwkJCSAqIHRoZSBrZXkgc3BhY2UgcmVw cmVzZW50ZWQgYnkgb3VyIHJlcXVpcmVkIGFycmF5cyBhcyBhIGdyb3VwLgorCQkJICoKKwkJCSAq IFRoaXMgc2NhbiBrZXkncyBpbWFnaW5hcnkgImFycmF5IiBjYW4ndCByZWFsbHkgYWR2YW5jZSwg YnV0IGl0CisJCQkgKiBjYW4gc3RpbGwgcm9sbCBvdmVyIGxpa2UgYW55IG90aGVyIGFycmF5LiAg KEFjdHVhbGx5LCB0aGlzIGlzCisJCQkgKiBubyBkaWZmZXJlbnQgdG8gcmVhbCBzaW5nbGUgdmFs dWUgYXJyYXlzLCB3aGljaCBuZXZlciBhZHZhbmNlCisJCQkgKiB3aXRob3V0IHJvbGxpbmcgb3Zl ciAtLSB0aGV5IGNhbiBuZXZlciB0cnVseSBhZHZhbmNlLCBlaXRoZXIuKQorCQkJICovCisJCQly ZXN1bHQgPSBfYnRfY29tcGFyZV9hcnJheV9za2V5KG9yZGVycHJvYywgdHVwZGF0dW0sIHR1cG51 bGwsCisJCQkJCQkJCQkJCWN1ci0+c2tfYXJndW1lbnQsIGN1cik7CisJCX0KKworCQkvKgorCQkg KiBDb25zaWRlciAiYmV5b25kIGVuZCBvZiBhcnJheSBlbGVtZW50IiBhcnJheSBhZHZhbmNlbWVu dC4KKwkJICoKKwkJICogV2hlbiB0aGUgdHVwbGUgYXR0cmlidXRlIHZhbHVlIGlzID4gdGhlIGNs b3Nlc3QgbWF0Y2hpbmcgYXJyYXkga2V5CisJCSAqIChvciA8IGluIHRoZSBiYWNrd2FyZHMgc2Nh biBjYXNlKSwgd2UgbmVlZCB0byByYXRjaGV0IHRoaXMgYXJyYXkKKwkJICogZm9yd2FyZCAoYmFj a3dhcmQpIGJ5IG9uZSBpbmNyZW1lbnQsIHNvIHRoYXQgY2FsbGVyJ3MgdHVwbGUgZW5kcyB1cAor CQkgKiBiZWluZyA8IGZpbmFsIGFycmF5IHZhbHVlIGluc3RlYWQgKG9yID4gZmluYWwgYXJyYXkg dmFsdWUgaW5zdGVhZCkuCisJCSAqIFRoaXMgcHJvY2VzcyBoYXMgdG8gd29yayBmb3IgYWxsIG9m IHRoZSBhcnJheXMsIG5vdCBqdXN0IHRoaXMgb25lOgorCQkgKiBpdCBtdXN0ICJjYXJyeSIgdG8g aGlnaGVyLW9yZGVyIGFycmF5cyB3aGVuIHRoZSBzZXRfZWxlbSB0aGF0IHdlCisJCSAqIGp1c3Qg Zm91bmQgaGFwcGVucyB0byBiZSB0aGUgZmluYWwgb25lIGZvciB0aGUgc2NhbidzIGRpcmVjdGlv bi4KKwkJICogSW5jcmVtZW50aW5nIChkZWNyZW1lbnRpbmcpIHNldF9lbGVtIGl0c2VsZiBpc24n dCBnb29kIGVub3VnaC4KKwkJICoKKwkJICogT3VyIGFwcHJvYWNoIGlzIHRvIHByb3Zpc2lvbmFs bHkgdXNlIHNldF9lbGVtIGFzIGlmIGl0IHdhcyBhbiBleGFjdAorCQkgKiBtYXRjaCBub3csIHRo ZW4gc2V0IGVhY2ggbGF0ZXIvbGVzcyBzaWduaWZpY2FudCBhcnJheSB0byB3aGF0ZXZlcgorCQkg KiBpdHMgZmluYWwgZWxlbWVudCBpcy4gIE9uY2Ugb3V0c2lkZSB0aGUgbG9vcCB3ZSdsbCB0aGVu ICJpbmNyZW1lbnQKKwkJICogdGhpcyBhcnJheSdzIHNldF9lbGVtIiBieSBjYWxsaW5nIF9idF9h ZHZhbmNlX2FycmF5X2tleXNfaW5jcmVtZW50LgorCQkgKiBUaGF0IHdheSB0aGUgcHJvY2VzcyBy b2xscyBvdmVyIHRvIGhpZ2hlciBvcmRlciBhcnJheXMgYXMgbmVlZGVkLgorCQkgKgorCQkgKiBV bmRlciB0aGlzIHNjaGVtZSBhbnkgcmVxdWlyZWQgYXJyYXlzIG9ubHkgZXZlciByYXRjaGV0IGZv cndhcmRzCisJCSAqIChvciBiYWNrd2FyZHMpLCBhbmQgYWx3YXlzIGRvIHNvIHRvIHRoZSBtYXhp bXVtIHBvc3NpYmxlIGV4dGVudAorCQkgKiB0aGF0IHdlIGNhbiBrbm93IHdpbGwgYmUgc2FmZSB3 aXRob3V0IHNlZWluZyB0aGUgc2NhbidzIG5leHQgdHVwbGUuCisJCSAqIFdlIGRvbid0IG5lZWQg YW55IHNwZWNpYWwgaGFuZGxpbmcgb2YgcmVxdWlyZWQgZXF1YWxpdHkgc2NhbiBrZXlzCisJCSAq IHRoYXQgbGFjayBhIHJlYWwgYXJyYXkgZm9yIHVzIHRvIGFkdmFuY2UsIGVpdGhlci4gIEl0IGFs c28gd29uJ3QKKwkJICogbWF0dGVyIGlmIGFsbCBvZiB0aGUgc2NhbidzIHJlYWwgYXJyYXlzIGFy ZSBub24tcmVxdWlyZWQgYXJyYXlzLgorCQkgKi8KKwkJaWYgKHJlcXVpcmVkU2FtZURpciAmJgor CQkJKChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgJiYgcmVzdWx0ID4gMCkgfHwKKwkJCSAo U2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSAmJiByZXN1bHQgPCAwKSkpCisJCQliZXlvbmRf ZW5kX2FkdmFuY2UgPSB0cnVlOworCisJCS8qCisJCSAqIEFsc28gdHJhY2sgd2hldGhlciBhbGwg cmVsZXZhbnQgYXR0cmlidXRlcyBmcm9tIGNhbGxlcidzIHR1cGxlIHdpbGwKKwkJICogYmUgZXF1 YWwgdG8gdGhlIHNjYW4ncyBhcnJheSBrZXlzIG9uY2Ugd2UncmUgZG9uZSB3aXRoIGl0CisJCSAq LworCQlpZiAocmVzdWx0ICE9IDApCisJCXsKKwkJCWFsbF9hcnJheWxpa2Vfc2tfc2F0aXNmaWVk ID0gZmFsc2U7CisJCQlpZiAocmVxdWlyZWRTYW1lRGlyKQorCQkJCWFsbF9yZXF1aXJlZF9za19z YXRpc2ZpZWQgPSBmYWxzZTsKKwkJfQorCisJCS8qCisJCSAqIE9wdGltaXphdGlvbjogSWYgdGhp cyBjYWxsIHdhcyB0cmlnZ2VyZWQgYnkgYSBub24tcmVxdWlyZWQgYXJyYXksCisJCSAqIGFuZCB3 ZSBrbm93IHRoYXQgdHVwbGUgd29uJ3Qgc2F0aXNmeSB0aGUgcXVhbCwgd2UgZ2l2ZSB1cCByaWdo dAorCQkgKiBhd2F5LiAgVGhpcyBvZnRlbiBhdm9pZHMgYWR2YW5jaW5nIHRoZSBhcnJheSBrZXlz LCB3aGljaCB3aWxsIHNhdmUKKwkJICogd2FzdGVkIGN5Y2xlcyBmcm9tIGNhbGxpbmcgX2J0X3Vw ZGF0ZV9rZXlzX3dpdGhfYXJyYXlrZXlzIGJlbG93LgorCQkgKi8KKwkJaWYgKCFhbGxfYXJyYXls aWtlX3NrX3NhdGlzZmllZCAmJiAhc2t0cmlncmVxdWlyZWQpCisJCXsKKwkJCUFzc2VydCghcmVx dWlyZWRTYW1lRGlyICYmICFmb3VuZFJlcXVpcmVkT3Bwb3NpdGVEaXJPbmx5KTsKKwkJCUFzc2Vy dCghYmV5b25kX2VuZF9hZHZhbmNlKTsKKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBBZHZhbmNl IGFycmF5IGtleXMsIGV2ZW4gaWYgc2V0X2VsZW0gaXNuJ3QgYW4gZXhhY3QgbWF0Y2ggKi8KKwkJ aWYgKGFycmF5ICYmIGFycmF5LT5jdXJfZWxlbSAhPSBzZXRfZWxlbSkKKwkJeworCQkJYXJyYXkt PmN1cl9lbGVtID0gc2V0X2VsZW07CisJCQlza2V5YXJyYXktPnNrX2FyZ3VtZW50ID0gYXJyYXkt PmVsZW1fdmFsdWVzW3NldF9lbGVtXTsKKwkJCWFycmF5c19hZHZhbmNlZCA9IHRydWU7CisJCX0K Kwl9CisKKwkvKgorCSAqIENvbnNpZGVyIGlmIHdlIG5lZWQgdG8gYWR2YW5jZSB0aGUgYXJyYXkg a2V5cyBpbmNyZW1lbnRhbGx5IHRvIGZpbmlzaAorCSAqIG9mZiAiYmV5b25kIGVuZCBvZiBhcnJh eSBlbGVtZW50IiBhcnJheSBhZHZhbmNlbWVudC4gIFRoaXMgaXMgdGhlIG9ubHkKKwkgKiB3YXkg dGhhdCB0aGUgYXJyYXkga2V5cyBjYW4gYmUgZXhoYXVzdGVkLCB3aGljaCBpcyB0aGUgb25seSB3 YXkgdGhhdAorCSAqIHRoZSB0b3AtbGV2ZWwgaW5kZXggc2NhbiBjYW4gYmUgdGVybWluYXRlZCBo ZXJlIGJ5IHVzLgorCSAqLworCWFycmF5c19leGhhdXN0ZWQgPSBmYWxzZTsKKwlpZiAoYmV5b25k X2VuZF9hZHZhbmNlKQorCXsKKwkJLyogTm9uLXJlcXVpcmVkIHNjYW4ga2V5cyBuZXZlciBleGhh dXN0IGFycmF5cy9lbmQgdG9wLWxldmVsIHNjYW4gKi8KKwkJQXNzZXJ0KHNrdHJpZ3JlcXVpcmVk ICYmICFhbGxfcmVxdWlyZWRfc2tfc2F0aXNmaWVkKTsKKworCQlpZiAoIV9idF9hZHZhbmNlX2Fy cmF5X2tleXNfaW5jcmVtZW50KHNjYW4sIGRpcikpCisJCQlhcnJheXNfZXhoYXVzdGVkID0gdHJ1 ZTsKKwkJZWxzZQorCQkJYXJyYXlzX2FkdmFuY2VkID0gdHJ1ZTsKKwl9CisKKwlpZiAoYXJyYXlz X2FkdmFuY2VkKQorCXsKKwkJLyoKKwkJICogV2UgYWR2YW5jZWQgdGhlIGFycmF5IGtleXMuICBG aW5hbGl6ZSBldmVyeXRoaW5nIGJ5IHBlcmZvcm1pbmcgYW4KKwkJICogaW4tcGxhY2UgdXBkYXRl IG9mIHRoZSBzY2FuJ3Mgc2VhcmNoLXR5cGUgc2NhbiBrZXlzLgorCQkgKgorCQkgKiBJZiB3ZSBt aXNzZWQgdGhpcyBmaW5hbCBzdGVwIHRoZW4gYW55IGNhbGwgdG8gX2J0X2NoZWNrX2NvbXBhcmUK KwkJICogd291bGQgdXNlIHN0YWxlIGFycmF5IGtleXMgdW50aWwgc3VjaCB0aW1lIGFzIF9idF9w cmVwcm9jZXNzX2tleXMKKwkJICogd2FzIG9uY2UgYWdhaW4gY2FsbGVkIGJ5IF9idF9maXJzdC4K KwkJICovCisJCV9idF91cGRhdGVfa2V5c193aXRoX2FycmF5a2V5cyhzY2FuKTsKKwkJc28tPmFk dmFuY2VEaXIgPSBkaXI7CisKKwkJLyoKKwkJICogSWYgYW55IHJlcXVpcmVkIGFycmF5IGtleXMg d2VyZSBhZHZhbmNlZCwgYmUgcHJlcGFyZWQgdG8gcmVjaGVjaworCQkgKiB0aGUgZmluYWwgdHVw bGUgYWdhaW5zdCB0aGUgbmV3IGFycmF5IGtleXMgKGFzIGFuIG9wdGltaXphdGlvbikKKwkJICov CisJCWlmIChza3RyaWdyZXF1aXJlZCkKKwkJCXBzdGF0ZS0+ZmluYWx0dXBjaGVja2VkID0gZmFs c2U7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgYXJyYXkga2V5cyBhcmUgbm93IGV4aGF1c3RlZCwg ZW5kIHRoZSB0b3AtbGV2ZWwgaW5kZXggc2NhbgorCSAqLworCUFzc2VydCghc28tPm5lZWRQcmlt U2Nhbik7CisJQXNzZXJ0KF9idF92ZXJpZnlfa2V5c193aXRoX2FycmF5a2V5cyhzY2FuKSk7CisJ aWYgKGFycmF5c19leGhhdXN0ZWQpCisJeworCQlBc3NlcnQoc2t0cmlncmVxdWlyZWQgJiYgIWFs bF9yZXF1aXJlZF9za19zYXRpc2ZpZWQpOworCisJCXBzdGF0ZS0+Y29udGludWVzY2FuID0gZmFs c2U7CisKKwkJLyogQ2FsbGVyJ3MgdHVwbGUgY2FuJ3QgbWF0Y2ggbmV3IHF1YWwgKGlmIGFueSks IGVpdGhlciAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBQb3N0Y29uZGl0aW9u IGFzc2VydGlvbnMgKHNlZSBoZWFkZXIgY29tbWVudHMgZm9yIGEgZnVsbCBleHBsYW5hdGlvbiku CisJICoKKwkgKiBUdXBsZSBtdXN0IG5vdyBiZSA8PSBjdXJyZW50L25ld2x5IGFkdmFuY2VkIHJl cXVpcmVkIGFycmF5IGtleXMuICBTYW1lCisJICogZ29lcyBmb3Igb3RoZXIgcmVxdWlyZWQgZXF1 YWxpdHkgdHlwZSBzY2FuIGtleXMsIHdoaWNoIGFyZSAiZGVnZW5lcmF0ZQorCSAqIHNpbmdsZSB2 YWx1ZSBhcnJheXMiIGZvciBvdXIgcHVycG9zZXMuICAoQXMgdXN1YWwgdGhlIHJ1bGUgaXMgdGhl IHNhbWUKKwkgKiBmb3IgYmFja3dhcmRzIHNjYW5zIG9uY2UgdGhlIG9wZXJhdG9ycyBhcmUgZmxp cHBlZCBhcm91bmQuKQorCSAqCisJICogRXZlcnkgY2FsbCBoZXJlIGlzIGd1YXJhbnRlZWQgdG8g YWR2YW5jZSAob3IgZXhoYXVzdCkgYWxsIHJlcXVpcmVkCisJICogYXJyYXlzLCB3aXRoIHRoZSBz b2xlIGV4Y2VwdGlvbiBvZiBjYWxscyBfYnRfY2hlY2tfY29tcGFyZSB0cmlnZ2VycworCSAqIHdo ZW4gaXQgZW5jb3VudGVycyBhbiB1bnNhdGlzZmllZCBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBr ZXkuCisJICovCisJQXNzZXJ0KF9idF90dXBsZV9iZWZvcmVfYXJyYXlfc2tleXMoc2NhbiwgcHN0 YXRlLCB0dXBsZSwgMCwgZmFsc2UpID09CisJCSAgICFhbGxfcmVxdWlyZWRfc2tfc2F0aXNmaWVk KTsKKwlBc3NlcnQoYXJyYXlzX2FkdmFuY2VkIHx8ICFza3RyaWdyZXF1aXJlZCk7CisJQXNzZXJ0 KHNrdHJpZ3JlcXVpcmVkIHx8IGFsbF9yZXF1aXJlZF9za19zYXRpc2ZpZWQpOworCisJLyoKKwkg KiBUaGUgYXJyYXkga2V5cyBhcmVuJ3QgZXhoYXVzdGVkLCBzbyBwcm92aXNpb25hbGx5IGFzc3Vt ZSB0aGF0IHRoZQorCSAqIGN1cnJlbnQgcHJpbWl0aXZlIGluZGV4IHNjYW4gd2lsbCBjb250aW51 ZQorCSAqLworCXBzdGF0ZS0+Y29udGludWVzY2FuID0gdHJ1ZTsKKworCS8qCisJICogRG9lcyBj YWxsZXIncyB0dXBsZSBub3cgbWF0Y2ggdGhlIG5ldyBxdWFsPyAgQ2FsbCBfYnRfY2hlY2tfY29t cGFyZSBhCisJICogc2Vjb25kIHRpbWUgdG8gZmluZCBvdXQgKHVubGVzcyBpdCdzIGFscmVhZHkg Y2xlYXIgdGhhdCBpdCBjYW4ndCkuCisJICovCisJaWYgKGFsbF9hcnJheWxpa2Vfc2tfc2F0aXNm aWVkICYmIGFycmF5c19hZHZhbmNlZCkKKwl7CisJCWJvb2wJCWNvbnRpbnVlc2NhbjsKKwkJaW50 CQkJaW5za3RyaWcgPSBza3RyaWcgKyAxOworCisJCWlmIChsaWtlbHkoX2J0X2NoZWNrX2NvbXBh cmUoZGlyLCBzbywgdHVwbGUsIG50dXBhdHRzLCBpdHVwZGVzYywKKwkJCQkJCQkJCSBzby0+bnVt QXJyYXlLZXlzLCAmY29udGludWVzY2FuLAorCQkJCQkJCQkJICZpbnNrdHJpZywgZmFsc2UpKSkK KwkJCXJldHVybiB0cnVlOworCisJCS8qCisJCSAqIEhhbmRsZSBpbmVxdWFsaXRpZXMgbWFya2Vk IHJlcXVpcmVkIGluIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uLgorCQkgKgorCQkgKiBJdCdz IGp1c3QgYWJvdXQgcG9zc2libGUgdGhhdCBvdXIgX2J0X2NoZWNrX2NvbXBhcmUgY2FsbCBpbmRp Y2F0ZXMKKwkJICogdGhhdCB0aGUgc2NhbiBzaG91bGQgYmUgdGVybWluYXRlZCBkdWUgdG8gYW4g dW5zYXRpc2ZpZWQgaW5lcXVhbGl0eQorCQkgKiB0aGF0IHdhc24ndCBpbml0aWFsbHkgcmVjb2du aXplZCBhcyBzdWNoIGJ5IHVzLiAgSGFuZGxlIHRoaXMgYnkKKwkJICogY2FsbGluZyBvdXJzZWx2 ZXMgcmVjdXJzaXZlbHkgd2hpbGUgaW5kaWNhdGluZyB0aGF0IHRoZSB0cmlnZ2VyIGlzCisJCSAq IG5vdyB0aGUgaW5lcXVhbGl0eSB0aGF0IHdlIG1pc3NlZCBmaXJzdCB0aW1lIGFyb3VuZC4KKwkJ ICoKKwkJICogTm90ZTogd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW4gY2FzZXMgd2hlcmUgdGhl IGluaXRpYWwgY2FsbCB0bworCQkgKiBfYnRfY2hlY2tfY29tcGFyZSAodGhhdCBsZWQgdG8gY2Fs bGluZyBoZXJlKSBnYXZlIHVwIHVwb24gZmluZGluZworCQkgKiBhbiB1bnNhdGlzZmllZCByZXF1 aXJlZCBlcXVhbGl0eS9hcnJheSBzY2FuIGtleSBiZWZvcmUgaXQgY291bGQKKwkJICogcmVhY2gg dGhlIGluZXF1YWxpdHkuICBUaGUgc2Vjb25kIF9idF9jaGVja19jb21wYXJlIGNhbGwgdG9vayBw bGFjZQorCQkgKiBhZnRlciB0aGUgYXJyYXkga2V5cyB3ZXJlIGFkdmFuY2VkICh0byBhcnJheSBr ZXlzIHRoYXQgZGVmaW5pdGVseQorCQkgKiBtYXRjaCB0aGUgdHVwbGUpLCBzbyBpdCBjYW4ndCBo YXZlIGJlZW4gb3Zlcmxvb2tlZCBhIHNlY29uZCB0aW1lLgorCQkgKgorCQkgKiBOb3RlOiB0aGlz IGlzIHVzZWZ1bCBiZWNhdXNlIHdlIHdvbid0IGhhdmUgdG8gd2FpdCB1bnRpbCB0aGUgbmV4dAor CQkgKiB0dXBsZSB0byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIGEgc2Vjb25kIHRpbWUgKHRvIHZh bHVlcyB0aGF0J2xsCisJCSAqIHB1dCB0aGUgc2NhbiBhaGVhZCBvZiB0aGlzIHR1cGxlKS4gIEhh bmRsaW5nIHRoaXMgb3Vyc2VsdmVzIGlzbid0CisJCSAqIHRydWx5IHJlcXVpcmVkLiAgQnV0IGl0 IGF2b2lkcyBjb21wbGljYXRpbmcgb3VyIGNvbnRyYWN0LiAgVGhlIG9ubHkKKwkJICogYWx0ZXJu YXRpdmUgaXMgdG8gYWxsb3cgYW4gYXdrd2FyZCBleGNlcHRpb24gdG8gdGhlIGdlbmVyYWwgcnVs ZQorCQkgKiAodGhlIHJ1bGUgYWJvdXQgYWx3YXlzIGFkdmFuY2luZyB0aGUgYXJyYXlzIHRvIHRo ZSBtYXhpbXVtIHBvc3NpYmxlCisJCSAqIGV4dGVudCB0aGF0IGNhbGxlcidzIHR1cGxlIGNhbiBz YWZlbHkgYWxsb3cpLgorCQkgKi8KKwkJaWYgKCFjb250aW51ZXNjYW4pCisJCXsKKwkJCVNjYW5L ZXkJCWluZXF1YWwgUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZID0gc28tPmtleURhdGEgKyBpbnNr dHJpZzsKKworCQkJQXNzZXJ0KHNrdHJpZ3JlcXVpcmVkICYmIGFsbF9yZXF1aXJlZF9za19zYXRp c2ZpZWQpOworCQkJQXNzZXJ0KGluZXF1YWwtPnNrX3N0cmF0ZWd5ICE9IEJURXF1YWxTdHJhdGVn eU51bWJlcik7CisJCQlBc3NlcnQoKChpbmVxdWFsLT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkg JiYKKwkJCQkJU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKSB8fAorCQkJCSAgICgoaW5lcXVh bC0+c2tfZmxhZ3MgJiBTS19CVF9SRVFCS1dEKSAmJgorCQkJCQlTY2FuRGlyZWN0aW9uSXNCYWNr d2FyZChkaXIpKSk7CisKKwkJCXJldHVybiBfYnRfYWR2YW5jZV9hcnJheV9rZXlzKHNjYW4sIHBz dGF0ZSwgdHVwbGUsIGluc2t0cmlnKTsKKwkJfQorCX0KKworCS8qCisJICogSGFuZGxlIGluZXF1 YWxpdGllcyBtYXJrZWQgcmVxdWlyZWQgaW4gdGhlIG9wcG9zaXRlIHNjYW4gZGlyZWN0aW9uLgor CSAqCisJICogSWYgd2UgYWR2YW5jZWQgdGhlIGFycmF5IGtleXMgKHdoaWNoIGlzIG5vdyBjZXJ0 YWluIGV4Y2VwdCBpbiB0aGUgY2FzZQorCSAqIHdoZXJlIHdlIG9ubHkgbmVlZGVkIHRvIGRlYWwg d2l0aCBub24tcmVxdWlyZWQgYXJyYXlzKSwgaXQncyBwb3NzaWJsZQorCSAqIHRoYXQgdGhlIHNj YW4gaXMgbm93IGF0IHRoZSBzdGFydCBvZiAibWF0Y2hpbmciIHR1cGxlcyAoYXQgbGVhc3QgYnkg dGhlCisJICogZGVmaW5pdGlvbiB1c2VkIGJ5IF9idF90dXBsZV9iZWZvcmVfYXJyYXlfc2tleXMp LCBidXQgaXMgbmV2ZXJ0aGVsZXNzCisJICogc3RpbGwgbWFueSBsZWFmIHBhZ2VzIGJlZm9yZSB0 aGUgcG9zaXRpb24gdGhhdCBfYnRfZmlyc3QgaXMgY2FwYWJsZSBvZgorCSAqIHJlcG9zaXRpb25p bmcgdGhlIHNjYW4gdG8uCisJICoKKwkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiB3ZSBoYXZlIGFu IGluZXF1YWxpdHkgc2NhbiBrZXkgcmVxdWlyZWQgaW4gdGhlCisJICogb3Bwb3NpdGUgZGlyZWN0 aW9uIG9ubHksIHRoYXQncyBsZXNzIHNpZ25pZmljYW50IHRoYW4gdGhlIHNjYW4ga2V5IHRoYXQK KwkgKiB0cmlnZ2VyZWQgYXJyYXkgYWR2YW5jZW1lbnQgZHVyaW5nIG91ciBpbml0aWFsIF9idF9j aGVja19jb21wYXJlIGNhbGwuCisJICogSWYgZXZlbiBmaW5hbHR1cCBkb2Vzbid0IHNhdGlzZnkg dGhpcyBsZXNzIHNpZ25pZmljYW50IGluZXF1YWxpdHkgc2NhbgorCSAqIGtleSBvbmNlIHdlIHRl bXBvcmFyaWx5IGZsaXAgdGhlIHNjYW4gZGlyZWN0aW9uLCB0aGF0IGluZGljYXRlcyB0aGF0CisJ ICogZXZlbiBmaW5hbHR1cCBpcyBiZWZvcmUgdGhlIF9idF9maXJzdC13aXNlIGluaXRpYWwgcG9z aXRpb24gZm9yIHRoZXNlCisJICogbmV3bHkgYWR2YW5jZWQgYXJyYXkga2V5cy4KKwkgKi8KKwlp ZiAoYWxsX3JlcXVpcmVkX3NrX3NhdGlzZmllZCAmJiBmb3VuZFJlcXVpcmVkT3Bwb3NpdGVEaXJP bmx5ICYmCisJCXBzdGF0ZS0+ZmluYWx0dXApCisJeworCQlpbnQJCQluZmluYWx0dXBhdHRzID0g QlRyZWVUdXBsZUdldE5BdHRzKHBzdGF0ZS0+ZmluYWx0dXAsIHJlbCk7CisJCVNjYW5EaXJlY3Rp b24gZmxpcHBlZCA9IC1kaXI7CisJCWJvb2wJCWNvbnRpbnVlc2NhbjsKKwkJaW50CQkJb3Bza3Ry aWcgPSAwOworCisJCUFzc2VydChza3RyaWdyZXF1aXJlZCAmJiBhcnJheXNfYWR2YW5jZWQpOwor CisJCV9idF9jaGVja19jb21wYXJlKGZsaXBwZWQsIHNvLCBwc3RhdGUtPmZpbmFsdHVwLCBuZmlu YWx0dXBhdHRzLAorCQkJCQkJICBpdHVwZGVzYywgc28tPm51bUFycmF5S2V5cywgJmNvbnRpbnVl c2NhbiwKKwkJCQkJCSAgJm9wc2t0cmlnLCBmYWxzZSk7CisKKwkJaWYgKCFjb250aW51ZXNjYW4g JiYgb3Bza3RyaWcgPiBza3RyaWcpCisJCXsKKwkJCVNjYW5LZXkJCWluZXF1YWwgPSBzby0+a2V5 RGF0YSArIG9wc2t0cmlnOworCisJCQlpZiAoKChpbmVxdWFsLT5za19mbGFncyAmIFNLX0JUX1JF UUZXRCkgJiYKKwkJCQkgU2NhbkRpcmVjdGlvbklzRm9yd2FyZChmbGlwcGVkKSkgfHwKKwkJCQko KGluZXF1YWwtPnNrX2ZsYWdzICYgU0tfQlRfUkVRQktXRCkgJiYKKwkJCQkgU2NhbkRpcmVjdGlv bklzQmFja3dhcmQoZmxpcHBlZCkpKQorCQkJeworCQkJCUFzc2VydChpbmVxdWFsLT5za19zdHJh dGVneSAhPSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpOworCisJCQkJLyoKKwkJCQkgKiBDb250aW51 aW5nIHRoZSBvbmdvaW5nIHByaW1pdGl2ZSBpbmRleCBzY2FuIGFzLWlzIHJpc2tzCisJCQkJICog dXNlbGVzc2x5IHNjYW5uaW5nIGEgaHVnZSBudW1iZXIgb2YgbGVhZiBwYWdlcyBmcm9tIGJlZm9y ZQorCQkJCSAqIHRoZSBwYWdlIHRoYXQgd2UnbGwgcXVpY2tseSBqdW1wIHRvIGJ5IGRlc2NlbmRp bmcgdGhlIGluZGV4CisJCQkJICogYW5ldy4KKwkJCQkgKgorCQkJCSAqIFBsYXkgaXQgc2FmZTog c3RhcnQgYSBuZXcgcHJpbWl0aXZlIGluZGV4IHNjYW4uICBfYnRfZmlyc3QKKwkJCQkgKiBpcyBn dWFyYW50ZWVkIHRvIGF0IGxlYXN0IG1vdmUgdGhlIHNjYW4gdG8gdGhlIG5leHQgbGVhZgorCQkJ CSAqIHBhZ2UuCisJCQkJICovCisJCQkJcHN0YXRlLT5jb250aW51ZXNjYW4gPSBmYWxzZTsKKwkJ CQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKworCQkJCXJldHVybiBmYWxzZTsKKwkJCX0KKwkJ fQorCisJCS8qCisJCSAqIENhbGxlcidzIHR1cGxlIG1pZ2h0IHN0aWxsIGJlIGJlZm9yZSB0aGUg X2J0X2ZpcnN0LXdpc2Ugc3RhcnQgb2YKKwkJICogbWF0Y2hlcyBmb3IgdGhlIG5ldyBhcnJheSBr ZXlzLCBidXQgYXQgbGVhc3QgZmluYWx0dXAgaXMgYXQgb3IKKwkJICogYWhlYWQgb2YgdGhhdCBw b3NpdGlvbi4gIFRoYXQncyBnb29kIGVub3VnaDsgY29udGludWUgYXMtaXMuCisJCSAqLworCX0K KworCS8qCisJICogQ2FsbGVyJ3MgdHVwbGUgaXMgPCB0aGUgbmV3bHkgYWR2YW5jZWQgYXJyYXkg a2V5cyAob3IgPiB3aGVuIHRoaXMgaXMgYQorCSAqIGJhY2t3YXJkcyBzY2FuKS4KKwkgKgorCSAq IEl0J3MgcG9zc2libGUgdGhhdCBsYXRlciB0dXBsZXMgd2lsbCBhbHNvIHR1cm4gb3V0IHRvIGhh dmUgdmFsdWVzIHRoYXQKKwkgKiBhcmUgc3RpbGwgPCB0aGUgbm93LWN1cnJlbnQgYXJyYXkga2V5 cyAob3IgPiB0aGUgY3VycmVudCBhcnJheSBrZXlzKS4KKwkgKiBPdXIgY2FsbGVyIHdpbGwgaGFu ZGxlIHRoaXMgYnkgcGVyZm9ybWluZyB3aGF0IGFtb3VudHMgdG8gYSBsaW5lYXIKKwkgKiBzZWFy Y2ggb2YgdGhlIHBhZ2UsIGltcGxlbWVudGVkIGJ5IGNhbGxpbmcgX2J0X2NoZWNrX2NvbXBhcmUg YW5kIHRoZW4KKwkgKiBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlzIGZvciBlYWNoIHR1cGxl LiAgT3VyIGNhbGxlciBzaG91bGQgbG9jYXRlCisJICogdGhlIGZpcnN0IHR1cGxlID49IHRoZSBh cnJheSBrZXlzIGJlZm9yZSBsb25nIChvciBsb2NhdGUgdGhlIGZpcnN0CisJICogdHVwbGUgPD0g dGhlIGFycmF5IGtleXMgYmVmb3JlIGxvbmcpLgorCSAqCisJICogVGhpcyBhcHByb2FjaCBoYXMg dmFyaW91cyBhZHZhbnRhZ2VzIG92ZXIgYSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBwYWdlLgorCSAq IFdlIGV4cGVjdCB0aGF0IG91ciBjYWxsZXIgd2lsbCBlaXRoZXIgcXVpY2tseSBkaXNjb3ZlciB0 aGUgbmV4dCB0dXBsZQorCSAqIGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgYXJyYXkga2V5cywgb3Ig cXVpY2tseSBkaXNjb3ZlciB0aGF0IGl0IG5lZWRzCisJICogYW5vdGhlciBwcmltaXRpdmUgaW5k ZXggc2NhbiAodXNpbmcgaXRzIGZpbmFsdHVwIHByZWNoZWNrKSBpbnN0ZWFkLgorCSAqIEVpdGhl ciB3YXksIGEgYmluYXJ5IHNlYXJjaCBpcyB1bmxpa2VseSB0byBiZWF0IGEgc2ltcGxlIGxpbmVh ciBzZWFyY2guCisJICoKKwkgKiBJdCdzIGFsc28gbm90IGNsZWFyIHRoYXQgYSBiaW5hcnkgc2Vh cmNoIHdpbGwgYmUgYW55IGZhc3RlciB3aGVuIHdlCisJICogcmVhbGx5IGRvIGhhdmUgdG8gc2Vh cmNoIHRocm91Z2ggaHVuZHJlZHMgb2YgdHVwbGVzIGJleW9uZCB0aGlzIG9uZS4KKwkgKiBTZXZl cmFsIGJpbmFyeSBzZWFyY2hlcyAob25lIHBlciBhcnJheSBhZHZhbmNlbWVudCkgbWlnaHQgYmUg cmVxdWlyZWQKKwkgKiB3aGlsZSByZWFkaW5nIHRocm91Z2ggYSBzaW5nbGUgcGFnZS4gIE91ciBs aW5lYXIgc2VhcmNoIGlzIHN0cnVjdHVyZWQKKwkgKiBhcyBvbmUgY29udGludW91cyBzZWFyY2gg dGhhdCBqdXN0IGFkdmFuY2VzIHRoZSBhcnJheXMgaW4gcGFzc2luZywgYW5kCisJICogdGhhdCBv bmx5IG5lZWRzIGEgbGl0dGxlIGV4dHJhIGxvZ2ljIHRvIGRlYWwgd2l0aCBpbmVxdWFsaXR5IHNj YW4ga2V5cy4KKwkgKi8KKwlpZiAoIWFsbF9yZXF1aXJlZF9za19zYXRpc2ZpZWQgJiYgdHVwbGUg PT0gcHN0YXRlLT5maW5hbHR1cCkKKwl7CisJCS8qCisJCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRp b246IHdoZW4gdGhlIHBhZ2UncyBmaW5hbCB0dXBsZSBhZHZhbmNlcyB0aGUKKwkJICogYXJyYXkg a2V5cyB3aXRob3V0IGV4YWN0bHkgbWF0Y2hpbmcga2V5cyBmb3IgYW55IHJlcXVpcmVkIGFycmF5 cywKKwkJICogc3RhcnQgYSBuZXcgcHJpbWl0aXZlIGluZGV4IHNjYW4gLS0gZG9uJ3QgbGV0IG91 ciBjYWxsZXIgY29udGludWUKKwkJICogdG8gdGhlIG5leHQgbGVhZiBwYWdlLgorCQkgKgorCQkg KiBJbiB0aGUgZm9yd2FyZCBzY2FuIGNhc2UsIGZpbmFsdHVwIGlzIHRoZSBwYWdlIGhpZ2gga2V5 LiAgV2UgZG9uJ3QKKwkJICogaW5zaXN0IG9uIGhhdmluZyBhbiBleGFjdCBtYXRjaCBmb3IgdHJ1 bmNhdGVkIC1pbmYgYXR0cmlidXRlcy4KKwkJICogVGhleSdyZSBuZXZlciBleGFjdGx5IGVxdWFs IHRvIGFueSByZWFsIGFycmF5IGtleSwgYnV0IGl0IG1ha2VzCisJCSAqIHNlbnNlIHRvIGJlIG9w dGltaXN0aWMgYWJvdXQgZmluZGluZyBtYXRjaGVzIG9uIHRoZSBuZXh0IHBhZ2UuCisJCSAqLwor CQlBc3NlcnQoc2t0cmlncmVxdWlyZWQgJiYgYXJyYXlzX2FkdmFuY2VkKTsKKworCQlwc3RhdGUt PmNvbnRpbnVlc2NhbiA9IGZhbHNlOworCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKwl9CisK KwkvKiBJbiBhbnkgY2FzZSwgdGhpcyBpbmRleHR1cGxlIGRvZXNuJ3QgbWF0Y2ggdGhlIHF1YWwg Ki8KKwlyZXR1cm4gZmFsc2U7Cit9CiAKIC8qCiAgKglfYnRfcHJlcHJvY2Vzc19rZXlzKCkgLS0g UHJlcHJvY2VzcyBzY2FuIGtleXMKQEAgLTc0MSw2ICsxOTk0LDE5IEBAIF9idF9yZXN0b3JlX2Fy cmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKQogICogQWdhaW4sIG1pc3NpbmcgY3Jvc3MtdHlw ZSBvcGVyYXRvcnMgbWlnaHQgY2F1c2UgdXMgdG8gZmFpbCB0byBwcm92ZSB0aGUKICAqIHF1YWxz IGNvbnRyYWRpY3Rvcnkgd2hlbiB0aGV5IHJlYWxseSBhcmUsIGJ1dCB0aGUgc2NhbiB3aWxsIHdv cmsgY29ycmVjdGx5LgogICoKKyAqIEluZGV4IHNjYW5zIHdpdGggYXJyYXkga2V5cyBuZWVkIHRv IGJlIGFibGUgdG8gYWR2YW5jZSBlYWNoIGFycmF5J3Mga2V5cworICogYW5kIG1ha2UgdGhlbSB0 aGUgY3VycmVudCBzZWFyY2gtdHlwZSBzY2FuIGtleXMgd2l0aG91dCBjYWxsaW5nIGhlcmUuICBU aGV5CisgKiBleHBlY3QgdG8gYmUgYWJsZSB0byBjYWxsIF9idF91cGRhdGVfa2V5c193aXRoX2Fy cmF5a2V5cyBpbnN0ZWFkLiAgV2UgbmVlZAorICogdG8gYmUgY2FyZWZ1bCBhYm91dCB0aGF0IGNh c2Ugd2hlbiB3ZSBkZXRlcm1pbmUgcmVkdW5kYW5jeTsgZXF1YWxpdHkgcXVhbHMKKyAqIG11c3Qg bm90IGJlIGVsaW1pbmF0ZWQgYXMgcmVkdW5kYW50IG9uIHRoZSBiYXNpcyBvZiBhcnJheSBpbnB1 dCBrZXlzIHRoYXQKKyAqIG1pZ2h0IGNoYW5nZSBiZWZvcmUgYW5vdGhlciBjYWxsIGhlcmUgY2Fu IHRha2UgcGxhY2UuCisgKgorICogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgcHJlc2VuY2Ugb2Yg YW4gYXJyYXkgc2NhbiBrZXkgZG9lc24ndCBhZmZlY3QgaG93IHdlCisgKiBkZXRlcm1pbmUgaWYg aW5kZXggcXVhbHMgYXJlIGNvbnRyYWRpY3RvcnkuICBDb250cmFkaWN0b3J5IHF1YWwgc2NhbnMg bW92ZQorICogb24gdG8gdGhlIG5leHQgcHJpbWl0aXZlIGluZGV4IHNjYW4gcmlnaHQgYXdheSwg YnkgaW5jcmVtZW50aW5nIHRoZSBzY2FuJ3MKKyAqIGFycmF5IGtleXMgb25jZSBjb250cm9sIHJl YWNoZXMgX2J0X2FycmF5X2tleXNfcmVtYWluLiAgVGhlcmUgd29uJ3QgYmUgYQorICogY2FsbCB0 byBfYnRfdXBkYXRlX2tleXNfd2l0aF9hcnJheWtleXMsIHNvIHRoZXJlJ3Mgbm90aGluZyBmb3Ig dXMgdG8gYnJlYWsuCisgKgogICogUm93IGNvbXBhcmlzb24ga2V5cyBhcmUgY3VycmVudGx5IGFs c28gdHJlYXRlZCB3aXRob3V0IGFueSBzbWFydHM6CiAgKiB3ZSBqdXN0IHRyYW5zZmVyIHRoZW0g aW50byB0aGUgcHJlcHJvY2Vzc2VkIGFycmF5IHdpdGhvdXQgYW55CiAgKiBlZGl0b3JpYWxpemF0 aW9uLiAgV2UgY2FuIHRyZWF0IHRoZW0gdGhlIHNhbWUgYXMgYW4gb3JkaW5hcnkgaW5lcXVhbGl0 eQpAQCAtODg3LDggKzIxNTMsMTEgQEAgX2J0X3ByZXByb2Nlc3Nfa2V5cyhJbmRleFNjYW5EZXNj IHNjYW4pCiAJCQkJCQkJc28tPnF1YWxfb2sgPSBmYWxzZTsKIAkJCQkJCQlyZXR1cm47CiAJCQkJ CQl9Ci0JCQkJCQkvKiBlbHNlIGRpc2NhcmQgdGhlIHJlZHVuZGFudCBub24tZXF1YWxpdHkga2V5 ICovCi0JCQkJCQl4Zm9ybVtqXSA9IE5VTEw7CisJCQkJCQllbHNlIGlmICghKGVxLT5za19mbGFn cyAmIFNLX1NFQVJDSEFSUkFZKSkKKwkJCQkJCXsKKwkJCQkJCQkvKiBlbHNlIGRpc2NhcmQgdGhl IHJlZHVuZGFudCBub24tZXF1YWxpdHkga2V5ICovCisJCQkJCQkJeGZvcm1bal0gPSBOVUxMOwor CQkJCQkJfQogCQkJCQl9CiAJCQkJCS8qIGVsc2UsIGNhbm5vdCBkZXRlcm1pbmUgcmVkdW5kYW5j eSwga2VlcCBib3RoIGtleXMgKi8KIAkJCQl9CkBAIC05NzgsNiArMjI0NywyMiBAQCBfYnRfcHJl cHJvY2Vzc19rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkJCWNvbnRpbnVlOwogCQl9CiAKKwkJ LyoKKwkJICogSXMgdGhpcyBhbiBhcnJheSBzY2FuIGtleSB0aGF0IF9idF9wcmVwcm9jZXNzX2Fy cmF5X2tleXMgbWVyZ2VkCisJCSAqIHdpdGggc29tZSBlYXJsaWVyIGFycmF5IGtleSBkdXJpbmcg aXRzIGluaXRpYWwgcHJlcHJvY2Vzc2luZyBwYXNzPworCQkgKi8KKwkJaWYgKGN1ci0+c2tfZmxh Z3MgJiBTS19CVF9SREROQVJSQVkpCisJCXsKKwkJCS8qCisJCQkgKiBrZXkgaXMgcmVkdW5kYW50 IGZvciB0aGlzIHByaW1pdGl2ZSBpbmRleCBzY2FuIChhbmQgd2lsbCBiZQorCQkJICogcmVkdW5k YW50IGR1cmluZyBhbGwgc3Vic2VxdWVudCBwcmltaXRpdmUgaW5kZXggc2NhbnMpCisJCQkgKi8K KwkJCUFzc2VydChjdXItPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJSQVkpOworCQkJQXNzZXJ0KGog PT0gKEJURXF1YWxTdHJhdGVneU51bWJlciAtIDEpKTsKKwkJCUFzc2VydChzby0+bnVtQXJyYXlL ZXlzID4gMCk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCS8qIGhhdmUgd2Ugc2VlbiBvbmUgb2Yg dGhlc2UgYmVmb3JlPyAqLwogCQlpZiAoeGZvcm1bal0gPT0gTlVMTCkKIAkJewpAQCAtOTkxLDcg KzIyNzYsMjYgQEAgX2J0X3ByZXByb2Nlc3Nfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJCQkJ CQkJCQkJICZ0ZXN0X3Jlc3VsdCkpCiAJCQl7CiAJCQkJaWYgKHRlc3RfcmVzdWx0KQotCQkJCQl4 Zm9ybVtqXSA9IGN1cjsKKwkJCQl7CisJCQkJCWlmIChqID09IChCVEVxdWFsU3RyYXRlZ3lOdW1i ZXIgLSAxKSAmJgorCQkJCQkJKCh4Zm9ybVtqXS0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSkg fHwKKwkJCQkJCSAoY3VyLT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKSkpCisJCQkJCXsKKwkJ CQkJCS8qCisJCQkJCQkgKiBNdXN0IG5ldmVyIHJlcGxhY2UgYW4gPSBhcnJheSBvcGVyYXRvciBv dXJzZWx2ZXMsCisJCQkJCQkgKiBub3IgY2FuIHdlIGV2ZXIgZmFpbCB0byByZW1lbWJlciBhbiA9 IGFycmF5CisJCQkJCQkgKiBvcGVyYXRvci4gIF9idF91cGRhdGVfa2V5c193aXRoX2FycmF5a2V5 cyBleHBlY3RzCisJCQkJCQkgKiB0aGlzLgorCQkJCQkJICovCisJCQkJCQlTY2FuS2V5CQlvdXRr ZXkgPSAmb3V0a2V5c1tuZXdfbnVtYmVyT2ZLZXlzKytdOworCisJCQkJCQltZW1jcHkob3V0a2V5 LCBjdXIsIHNpemVvZihTY2FuS2V5RGF0YSkpOworCQkJCQkJaWYgKG51bWJlck9mRXF1YWxDb2xz ID09IGF0dG5vIC0gMSkKKwkJCQkJCQlfYnRfbWFya19zY2Fua2V5X3JlcXVpcmVkKG91dGtleSk7 CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQkJeGZvcm1bal0gPSBjdXI7CisJCQkJfQogCQkJCWVs c2UgaWYgKGogPT0gKEJURXF1YWxTdHJhdGVneU51bWJlciAtIDEpKQogCQkJCXsKIAkJCQkJLyog a2V5ID09IGEgJiYga2V5ID09IGIsIGJ1dCBhICE9IGIgKi8KQEAgLTEwMTksNiArMjMyMyw5NSBA QCBfYnRfcHJlcHJvY2Vzc19rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKIAlzby0+bnVtYmVyT2ZL ZXlzID0gbmV3X251bWJlck9mS2V5czsKIH0KIAorLyoKKyAqCV9idF91cGRhdGVfa2V5c193aXRo X2FycmF5a2V5cygpIC0tIEZpbmFsaXplIGFkdmFuY2luZyBhcnJheSBrZXlzCisgKgorICogVHJh bnNmZXJzIG5ld2x5IGFkdmFuY2VkIGFycmF5IGtleXMgdGhhdCB3ZXJlIHNldCBpbiAic28tPmFy cmF5S2V5RGF0YVtdIgorICogb3ZlciB0byBjb3JyZXNwb25kaW5nICJzby0+a2V5RGF0YVtdIiBz Y2FuIGtleXMuICBSZXVzZXMgbW9zdCBvZiB0aGUgd29yaworICogdGhhdCB0b29rIHBsYWNlIHdp dGhpbiBfYnRfcHJlcHJvY2Vzc19rZXlzLCBvbmx5IGNoYW5naW5nIHRoZSBhcnJheSBrZXlzLgor ICoKKyAqIEl0J3Mgc2FmZSB0byBjYWxsIGhlcmUgd2hpbGUgaG9sZGluZyBhIGJ1ZmZlciBsb2Nr LCB3aGljaCBpc24ndCBzb21ldGhpbmcKKyAqIHRoYXQgX2J0X3ByZXByb2Nlc3Nfa2V5cyBjYW4g Z3VhcmFudGVlLgorICovCitzdGF0aWMgdm9pZAorX2J0X3VwZGF0ZV9rZXlzX3dpdGhfYXJyYXlr ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3Bh cXVlKSBzY2FuLT5vcGFxdWU7CisJU2NhbktleQkJY3VyOworCWludAkJCWlrZXksCisJCQkJYXJy YXlpZHggPSAwOworCisJQXNzZXJ0KHNvLT5xdWFsX29rKTsKKworCWZvciAoY3VyID0gc28tPmtl eURhdGEsIGlrZXkgPSAwOyBpa2V5IDwgc28tPm51bWJlck9mS2V5czsgY3VyKyssIGlrZXkrKykK Kwl7CisJCUJUQXJyYXlLZXlJbmZvICphcnJheTsKKwkJU2NhbktleQkJc2tleWFycmF5OworCisJ CUFzc2VydCgoY3VyLT5za19mbGFncyAmIFNLX0JUX1JERE5BUlJBWSkgPT0gMCk7CisKKwkJLyog SnVzdCB1cGRhdGUgZXF1YWxpdHkgYXJyYXkgc2NhbiBrZXlzICovCisJCWlmIChjdXItPnNrX3N0 cmF0ZWd5ICE9IEJURXF1YWxTdHJhdGVneU51bWJlciB8fAorCQkJIShjdXItPnNrX2ZsYWdzICYg U0tfU0VBUkNIQVJSQVkpKQorCQkJY29udGludWU7CisKKwkJYXJyYXkgPSAmc28tPmFycmF5S2V5 c1thcnJheWlkeCsrXTsKKwkJc2tleWFycmF5ID0gJnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNj YW5fa2V5XTsKKworCQkvKiBVcGRhdGUgdGhlIHNjYW4ga2V5J3MgYXJndW1lbnQgKi8KKwkJQXNz ZXJ0KGN1ci0+c2tfYXR0bm8gPT0gc2tleWFycmF5LT5za19hdHRubyk7CisJCWN1ci0+c2tfYXJn dW1lbnQgPSBza2V5YXJyYXktPnNrX2FyZ3VtZW50OworCX0KKworCUFzc2VydChhcnJheWlkeCA9 PSBzby0+bnVtQXJyYXlLZXlzKTsKK30KKworLyoKKyAqIFZlcmlmeSB0aGF0IHRoZSBzY2FuJ3Mg InNvLT5hcnJheUtleURhdGFbXSIgc2NhbiBrZXlzIGFyZSBpbiBhZ3JlZW1lbnQgd2l0aAorICog dGhlIGN1cnJlbnQgInNvLT5rZXlEYXRhW10iIHNlYXJjaC10eXBlIHNjYW4ga2V5cy4gIFVzZWQg d2l0aGluIGFzc2VydGlvbnMuCisgKi8KKyNpZmRlZiBVU0VfQVNTRVJUX0NIRUNLSU5HCitzdGF0 aWMgYm9vbAorX2J0X3ZlcmlmeV9rZXlzX3dpdGhfYXJyYXlrZXlzKEluZGV4U2NhbkRlc2Mgc2Nh bikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJ U2NhbktleQkJY3VyOworCWludAkJCWlrZXksCisJCQkJYXJyYXlpZHggPSAwOworCisJaWYgKCFz by0+cXVhbF9vaykKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChjdXIgPSBzby0+a2V5RGF0YSwg aWtleSA9IDA7IGlrZXkgPCBzby0+bnVtYmVyT2ZLZXlzOyBjdXIrKywgaWtleSsrKQorCXsKKwkJ QlRBcnJheUtleUluZm8gKmFycmF5OworCQlTY2FuS2V5CQlza2V5YXJyYXk7CisKKwkJaWYgKGN1 ci0+c2tfc3RyYXRlZ3kgIT0gQlRFcXVhbFN0cmF0ZWd5TnVtYmVyIHx8CisJCQkhKGN1ci0+c2tf ZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSkpCisJCQljb250aW51ZTsKKworCQlhcnJheSA9ICZzby0+ YXJyYXlLZXlzW2FycmF5aWR4KytdOworCQlza2V5YXJyYXkgPSAmc28tPmFycmF5S2V5RGF0YVth cnJheS0+c2Nhbl9rZXldOworCisJCS8qIFZlcmlmeSBzby0+YXJyYXlLZXlEYXRhW10gaW5wdXQg a2V5IGhhcyBleHBlY3RlZCBza19hcmd1bWVudCAqLworCQlpZiAoc2tleWFycmF5LT5za19hcmd1 bWVudCAhPSBhcnJheS0+ZWxlbV92YWx1ZXNbYXJyYXktPmN1cl9lbGVtXSkKKwkJCXJldHVybiBm YWxzZTsKKworCQkvKiBWZXJpZnkgc28tPmFycmF5S2V5RGF0YVtdIGlucHV0IGtleSBhZ3JlZXMg d2l0aCBvdXRwdXQga2V5ICovCisJCWlmIChjdXItPnNrX2F0dG5vICE9IHNrZXlhcnJheS0+c2tf YXR0bm8pCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChjdXItPnNrX2FyZ3VtZW50ICE9IHNrZXlh cnJheS0+c2tfYXJndW1lbnQpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGFycmF5aWR4 ICE9IHNvLT5udW1BcnJheUtleXMpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOwor fQorI2VuZGlmCisKIC8qCiAgKiBDb21wYXJlIHR3byBzY2Fua2V5IHZhbHVlcyB1c2luZyBhIHNw ZWNpZmllZCBvcGVyYXRvci4KICAqCkBAIC0xMzUyLDU4ICsyNzQ1LDIxMCBAQCBfYnRfbWFya19z Y2Fua2V5X3JlcXVpcmVkKFNjYW5LZXkgc2tleSkKICAqCiAgKiBSZXR1cm4gdHJ1ZSBpZiBzbywg ZmFsc2UgaWYgbm90LiAgSWYgdGhlIHR1cGxlIGZhaWxzIHRvIHBhc3MgdGhlIHF1YWwsCiAgKiB3 ZSBhbHNvIGRldGVybWluZSB3aGV0aGVyIHRoZXJlJ3MgYW55IG5lZWQgdG8gY29udGludWUgdGhl IHNjYW4gYmV5b25kCi0gKiB0aGlzIHR1cGxlLCBhbmQgc2V0ICpjb250aW51ZXNjYW4gYWNjb3Jk aW5nbHkuICBTZWUgY29tbWVudHMgZm9yCisgKiB0aGlzIHR1cGxlLCBhbmQgc2V0IHBzdGF0ZS5j b250aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBTZWUgY29tbWVudHMgZm9yCiAgKiBfYnRfcHJlcHJv Y2Vzc19rZXlzKCksIGFib3ZlLCBhYm91dCBob3cgdGhpcyBpcyBkb25lLgogICoKLSAqIEZvcndh cmQgc2NhbiBjYWxsZXJzIGNhbiBwYXNzIGEgaGlnaCBrZXkgdHVwbGUgaW4gdGhlIGhvcGVzIG9m IGhhdmluZwotICogdXMgc2V0ICpjb250aW51ZXNjYW4gdG8gZmFsc2UsIGFuZCBhdm9pZGluZyBh biB1bm5lY2Vzc2FyeSB2aXNpdCB0bwotICogdGhlIHBhZ2UgdG8gdGhlIHJpZ2h0LgorICogRm9y d2FyZCBzY2FuIGNhbGxlcnMgY2FsbCB3aXRoIGEgaGlnaCBrZXkgdHVwbGUgbGFzdCBpbiB0aGUg aG9wZXMgb2YgaGF2aW5nCisgKiB1cyBzZXQgcHN0YXRlLmNvbnRpbnVlc2NhbiB0byBmYWxzZSwg YW5kIGF2b2lkaW5nIGFuIHVubmVjZXNzYXJ5IHZpc2l0IHRvCisgKiB0aGUgcGFnZSB0byB0aGUg cmlnaHQuICBQYXNzIGZpbmFsdHVwPXRydWUgZm9yIHRoZXNlIGhpZ2gga2V5IGNhbGxzLgorICog QmFja3dhcmRzIHNjYW4gY2FsbGVycyBzaG91bGRuJ3QgZG8gdGhpcywgYnV0IHNob3VsZCBzdGls bCBsZXQgdXMga25vdworICogd2hpY2ggdHVwbGUgaXMgbGFzdCBieSBwYXNzaW5nIGZpbmFsdHVw PXRydWUgZm9yIHRoZSBmaW5hbCBub24tcGl2b3QgdHVwbGUKKyAqICh0aGUgbm9uLXBpdm90IHR1 cGxlIGF0IHBhZ2Ugb2Zmc2V0IG51bWJlciBvbmUpLgorICoKKyAqIENhbGxlcnMgd2l0aCBlcXVh bGl0eSBzdHJhdGVneSBhcnJheSBzY2FuIGtleXMgbXVzdCBzZXQgdXAgcGFnZSBzdGF0ZSB0aGF0 CisgKiBoZWxwcyB1cyBrbm93IHdoZW4gdG8gc3RhcnQgb3Igc3RvcCBwcmltaXRpdmUgaW5kZXgg c2NhbnMgb24gdGhlaXIgYmVoYWxmLgorICogVGhlIGZpbmFsdHVwIHR1cGxlIHNob3VsZCBiZSBz dGFzaGVkIGluIHBzdGF0ZS5maW5hbHR1cCwgc28gd2UgZG9uJ3QgaGF2ZQorICogdG8gd2FpdCB1 bnRpbCB0aGUgZmluYWx0dXAgY2FsbCB0byBiZSBhYmxlIHRvIHNlZSB3aGF0J3MgdXAgd2l0aCB0 aGUgcGFnZS4KKyAqCisgKiBBZHZhbmNlcyB0aGUgc2NhbidzIGFycmF5IGtleXMgaW4gcGFzc2lu ZyB3aGVuIHJlcXVpcmVkLiAgTm90ZSB0aGF0IHdlIHJlbHkKKyAqIG9uIF9idF9yZWFkcGFnZSBj YWxsaW5nIGhlcmUgaW4gcGFnZSBvZmZzZXQgbnVtYmVyIG9yZGVyIChmb3IgdGhlIGN1cnJlbnQK KyAqIHNjYW4gZGlyZWN0aW9uKS4gIEFueSBvdGhlciBvcmRlciBjb25mdXNlcyBhcnJheSBhZHZh bmNlbWVudC4KICAqCiAgKiBzY2FuOiBpbmRleCBzY2FuIGRlc2NyaXB0b3IgKGNvbnRhaW5pbmcg YSBzZWFyY2gtdHlwZSBzY2Fua2V5KQorICogcHN0YXRlOiBQYWdlIGxldmVsIGlucHV0IGFuZCBv dXRwdXQgcGFyYW1ldGVycwogICogdHVwbGU6IGluZGV4IHR1cGxlIHRvIHRlc3QKKyAqIGZpbmFs dHVwOiBJcyB0dXBsZSB0aGUgZmluYWwgb25lIHdlJ2xsIGJlIGNhbGxlZCB3aXRoIGZvciB0aGlz IHBhZ2U/CiAgKiB0dXBuYXR0czogbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gdHVwbmF0dHMgKGhp Z2gga2V5IG1heSBiZSB0cnVuY2F0ZWQpCi0gKiBkaXI6IGRpcmVjdGlvbiB3ZSBhcmUgc2Nhbm5p bmcgaW4KLSAqIGNvbnRpbnVlc2Nhbjogb3V0cHV0IHBhcmFtZXRlciAod2lsbCBiZSBzZXQgY29y cmVjdGx5IGluIGFsbCBjYXNlcykKICAqIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2s6IGluZGlj YXRlcyB0aGF0IHNjYW4ga2V5cyByZXF1aXJlZCBmb3IKICAqIAkJCQkJCQkgIGRpcmVjdGlvbiBz Y2FuIGFyZSBhbHJlYWR5IG1hdGNoZWQKICAqLwogYm9vbAotX2J0X2NoZWNra2V5cyhJbmRleFNj YW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKLQkJCSAgU2NhbkRp cmVjdGlvbiBkaXIsIGJvb2wgKmNvbnRpbnVlc2NhbiwKK19idF9jaGVja2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuLCBCVFJlYWRQYWdlU3RhdGUgKnBzdGF0ZSwKKwkJCSAgSW5kZXhUdXBsZSB0dXBs ZSwgYm9vbCBmaW5hbHR1cCwgaW50IHR1cG5hdHRzLAogCQkJICBib29sIHJlcXVpcmVkTWF0Y2hl ZEJ5UHJlY2hlY2spCiB7Ci0JVHVwbGVEZXNjCXR1cGRlc2M7Ci0JQlRTY2FuT3BhcXVlIHNvOwot CWludAkJCWtleXN6OwotCWludAkJCWlrZXk7Ci0JU2NhbktleQkJa2V5OworCVR1cGxlRGVzYwl0 dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihzY2FuLT5pbmRleFJlbGF0aW9uKTsKKwlCVFNjYW5P cGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJaW50CQkJbnVtQXJyYXlL ZXlzID0gc28tPm51bUFycmF5S2V5czsKKwlpbnQJCQlpa2V5ID0gMDsKKwlib29sCQlyZXM7CiAK IAlBc3NlcnQoQlRyZWVUdXBsZUdldE5BdHRzKHR1cGxlLCBzY2FuLT5pbmRleFJlbGF0aW9uKSA9 PSB0dXBuYXR0cyk7CisJQXNzZXJ0KHBzdGF0ZS0+Y29udGludWVzY2FuKTsKKwlBc3NlcnQoIW51 bUFycmF5S2V5cyB8fCBzby0+YWR2YW5jZURpciA9PSBwc3RhdGUtPmRpcik7CisJQXNzZXJ0KCFz by0+bmVlZFByaW1TY2FuKTsKKworCXJlcyA9IF9idF9jaGVja19jb21wYXJlKHBzdGF0ZS0+ZGly LCBzbywgdHVwbGUsIHR1cG5hdHRzLCB0dXBkZXNjLAorCQkJCQkJCW51bUFycmF5S2V5cywgJnBz dGF0ZS0+Y29udGludWVzY2FuLCAmaWtleSwKKwkJCQkJCQlyZXF1aXJlZE1hdGNoZWRCeVByZWNo ZWNrKTsKKworCS8qCisJICogT25seSBvbmUgX2J0X2NoZWNrX2NvbXBhcmUgY2FsbCBpcyByZXF1 aXJlZCBpbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUKKwkgKiB0aGVyZSBhcmUgbm8gZXF1YWxpdHkt dHlwZSBhcnJheSBzY2FuIGtleXMuICBPdGhlcndpc2Ugd2UgY2FuIG9ubHkKKwkgKiBhY2NlcHQg X2J0X2NoZWNrX2NvbXBhcmUncyBhbnN3ZXIgdW5yZXNlcnZlZGx5IHdoZW4gaXQgZGlkbid0IHNl dAorCSAqIGNvbnRpbnVlc2Nhbj1mYWxzZS4KKwkgKi8KKwlpZiAoIW51bUFycmF5S2V5cyB8fCBw c3RhdGUtPmNvbnRpbnVlc2NhbikKKwkJcmV0dXJuIHJlczsKKworCS8qCisJICogX2J0X2NoZWNr X2NvbXBhcmUgY2FsbCBzZXQgY29udGludWVzY2FuPWZhbHNlIGluIHRoZSBwcmVzZW5jZSBvZgor CSAqIGVxdWFsaXR5IHR5cGUgYXJyYXkga2V5cy4KKwkgKgorCSAqIFdoaWxlIHdlIG1pZ2h0IHJl YWxseSBuZWVkIHRvIGVuZCB0aGUgdG9wLWxldmVsIGluZGV4IHNjYW4sIG1vc3Qgb2YgdGhlCisJ ICogdGltZSB0aGlzIGp1c3QgbWVhbnMgdGhhdCB0aGUgc2NhbiBuZWVkcyB0byByZWNvbnNpZGVy IGl0cyBhcnJheSBrZXlzLgorCSAqLworCWlmIChfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlz KHNjYW4sIHBzdGF0ZSwgdHVwbGUsIGlrZXksIHRydWUpKQorCXsKKwkJLyoKKwkJICogQ3VycmVu dCB0dXBsZSBpcyA8IHRoZSBjdXJyZW50IGFycmF5IHNjYW4ga2V5cy9lcXVhbGl0eSBjb25zdHJh aW50cworCQkgKiAob3IgPiBpbiB0aGUgYmFja3dhcmQgc2NhbiBjYXNlKS4gIERvbid0IG5lZWQg dG8gYWR2YW5jZSB0aGUgYXJyYXkKKwkJICoga2V5cy4gIE11c3QgZGVjaWRlIHdoZXRoZXIgdG8g c3RhcnQgYSBuZXcgcHJpbWl0aXZlIHNjYW4gaW5zdGVhZC4KKwkJICoKKwkJICogSWYgdGhpcyB0 dXBsZSBpc24ndCB0aGUgZmluYWx0dXAgZm9yIHRoZSBwYWdlLCB0aGVuIHJlY2hlY2sgdGhlCisJ CSAqIGZpbmFsdHVwIHN0YXNoZWQgaW4gcHN0YXRlIGFzIGFuIG9wdGltaXphdGlvbi4gIFRoYXQg YWxsb3dzIHVzIHRvCisJCSAqIHF1aXQgc2Nhbm5pbmcgdGhpcyBwYWdlIGVhcmx5IHdoZW4gaXQn cyBjbGVhcmx5IGhvcGVsZXNzICh3ZSBkb24ndAorCQkgKiBuZWVkIHRvIHdhaXQgZm9yIHRoZSBm aW5hbHR1cCBjYWxsIHRvIGdpdmUgdXAgb24gYSBwcmltaXRpdmUgc2NhbikuCisJCSAqLworCQlp ZiAoZmluYWx0dXAgfHwgKCFwc3RhdGUtPmZpbmFsdHVwY2hlY2tlZCAmJiBwc3RhdGUtPmZpbmFs dHVwICYmCisJCQkJCQkgX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9za2V5cyhzY2FuLCBwc3RhdGUs CisJCQkJCQkJCQkJCQkJICBwc3RhdGUtPmZpbmFsdHVwLAorCQkJCQkJCQkJCQkJCSAgMCwgZmFs c2UpKSkKKwkJeworCQkJLyoKKwkJCSAqIEdpdmUgdXAgb24gdGhlIG9uZ29pbmcgcHJpbWl0aXZl IGluZGV4IHNjYW4uCisJCQkgKgorCQkJICogRXZlbiB0aGUgZmluYWwgdHVwbGUgKHRoZSBoaWdo IGtleSBmb3IgZm9yd2FyZCBzY2Fucywgb3IgdGhlCisJCQkgKiB0dXBsZSBmcm9tIHBhZ2Ugb2Zm c2V0IG51bWJlciAxIGZvciBiYWNrd2FyZCBzY2FucykgaXMgYmVmb3JlCisJCQkgKiB0aGUgY3Vy cmVudCBhcnJheSBrZXlzLiAgVGhhdCBzdHJvbmdseSBzdWdnZXN0cyB0aGF0IGNvbnRpbnVpbmcK KwkJCSAqIHRoaXMgcHJpbWl0aXZlIHNjYW4gd291bGQgYmUgbGVzcyBlZmZpY2llbnQgdGhhbiBz dGFydGluZyBhbmV3LgorCQkJICoKKwkJCSAqIFNlZSBhbHNvOiBfYnRfYWR2YW5jZV9hcnJheV9r ZXlzJ3MgaGFuZGxpbmcgb2YgdGhlIGNhc2Ugd2hlcmUKKwkJCSAqIGZpbmFsdHVwIGl0c2VsZiBh ZHZhbmNlcyB0aGUgYXJyYXkga2V5cyB0byBub24tbWF0Y2hpbmcgdmFsdWVzLgorCQkJICovCisJ CQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IGZhbHNlOworCisJCQkvKgorCQkJICogU2V0IHVwIGEg bmV3IHByaW1pdGl2ZSBpbmRleCBzY2FuIHRoYXQgd2lsbCByZXBvc2l0aW9uIHRoZQorCQkJICog dG9wLWxldmVsIHNjYW4gdG8gdGhlIGZpcnN0IGxlYWYgcGFnZSB3aG9zZSBrZXkgc3BhY2UgaXMK KwkJCSAqIGNvdmVyZWQgYnkgb3VyIGFycmF5IGtleXMuICBUaGUgdG9wLWxldmVsIHNjYW4gd2ls bCAic2tpcCIgYQorCQkJICogcGFydCBvZiB0aGUgaW5kZXggdGhhdCBjYW4gb25seSBjb250YWlu IG5vbi1tYXRjaGluZyB0dXBsZXMuCisJCQkgKgorCQkJICogTm90ZTogdGhlIG5leHQgcHJpbWl0 aXZlIGluZGV4IHNjYW4gaXMgZ3VhcmFudGVlZCB0byBsYW5kIG9uCisJCQkgKiBzb21lIGxhdGVy IGxlYWYgcGFnZSAoaWRlYWxseSBpdCB3b24ndCBiZSB0aGlzIHBhZ2UncyBzaWJsaW5nKS4KKwkJ CSAqIEl0IGZvbGxvd3MgdGhhdCB0aGUgdG9wLWxldmVsIHNjYW4gY2FuIG5ldmVyIGFjY2VzcyB0 aGUgc2FtZQorCQkJICogbGVhZiBwYWdlIG1vcmUgdGhhbiBvbmNlICh1bmxlc3MgdGhlIHNjYW4g Y2hhbmdlcyBkaXJlY3Rpb24gb3IKKwkJCSAqIGJ0cmVzdHJwb3MgaXMgY2FsbGVkKS4gIGJ0Y29z dGVzdGltYXRlIHJlbGllcyBvbiB0aGlzLgorCQkJICovCisJCQlzby0+bmVlZFByaW1TY2FuID0g dHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKiBTdGljayB3aXRoIHRoZSBvbmdv aW5nIHByaW1pdGl2ZSBpbmRleCBzY2FuLCBmb3Igbm93IChvdmVycmlkZQorCQkJICogX2J0X2No ZWNrX2NvbXBhcmUncyBzdWdnZXN0aW9uIHRoYXQgd2UgZW5kIHRoZSBzY2FuKS4KKwkJCSAqCisJ CQkgKiBOb3RlOiB3ZSB3aWxsIGVuZCB1cCBoZXJlIGFnYWluIGFuZCBhZ2FpbiBnaXZlbiBhIGdy b3VwIG9mCisJCQkgKiB0dXBsZXMgPiB0aGUgcHJldmlvdXMgYXJyYXkga2V5cyBhbmQgPCB0aGUg bm93LWN1cnJlbnQga2V5cworCQkJICogKHRob3VnaCBvbmx5IGFmdGVyIGFuIGluaXRpYWwgZmlu YWx0dXAgcHJlY2hlY2sgZGV0ZXJtaW5lZCB0aGF0CisJCQkgKiB0aGlzIHBhZ2UgZGVmaW5pdGVs eSBjb3ZlcnMga2V5IHNwYWNlIGZyb20gYm90aCBhcnJheSBrZXlzZXRzKS4KKwkJCSAqIEluIGVm ZmVjdCwgd2UgcGVyZm9ybSBhIGxpbmVhciBzZWFyY2ggb2YgdGhlIHBhZ2UncyByZW1haW5pbmcK KwkJCSAqIHVuc2Nhbm5lZCB0dXBsZXMgZXZlcnkgdGltZSB0aGUgYXJyYXlzIGFkdmFuY2UgcGFz dCB0aGUga2V5CisJCQkgKiBzcGFjZSBvZiB0aGUgc2NhbidzIHRoZW4tY3VycmVudCB0dXBsZS4K KwkJCSAqLworCQkJcHN0YXRlLT5jb250aW51ZXNjYW4gPSB0cnVlOworCisJCQkvKgorCQkJICog T3VyIGZpbmFsdHVwIHByZWNoZWNrIGRldGVybWluZWQgdGhhdCBpdCBpcyA+PSB0aGUgY3VycmVu dCBrZXlzCisJCQkgKiAodGhvdWdoIHRoZSBfY3VycmVudF8gdHVwbGUgaXMgc3RpbGwgPCB0aGUg Y3VycmVudCBhcnJheSBrZXlzKS4KKwkJCSAqCisJCQkgKiBSZW1lbWJlciB0aGF0IGZhY3QgaW4g cHN0YXRlIG5vdy4gIFRoaXMgYXZvaWRzIHdhc3RpbmcgY3ljbGVzCisJCQkgKiBvbiByZXBlYXRp bmcgdGhlIHNhbWUgcHJlY2hlY2sgc3RlcCAoY2hlY2tpbmcgdGhlIHNhbWUgZmluYWx0dXAKKwkJ CSAqIGFnYWluc3QgdGhlIHNhbWUgYXJyYXkga2V5cykgZHVyaW5nIGxhdGVyIGNhbGxzIGhlcmUg Zm9yIGxhdGVyCisJCQkgKiB0dXBsZXMgZnJvbSB0aGlzIHNhbWUgbGVhZiBwYWdlLgorCQkJICov CisJCQlwc3RhdGUtPmZpbmFsdHVwY2hlY2tlZCA9IHRydWU7CisJCX0KKworCQkvKiBJbiBhbnkg Y2FzZSwgdGhpcyBpbmRleHR1cGxlIGRvZXNuJ3QgbWF0Y2ggdGhlIHF1YWwgKi8KKwkJcmV0dXJu IGZhbHNlOworCX0KKworCS8qCisJICogQ2FsbGVyJ3MgdHVwbGUgaXMgPj0gdGhlIGN1cnJlbnQg c2V0IG9mIGFycmF5IGtleXMgYW5kIG90aGVyIGVxdWFsaXR5CisJICogY29uc3RyYWludCBzY2Fu IGtleXMgKG9yIDw9IGlmIHRoaXMgaXMgYSBiYWNrd2FyZHMgc2NhbnMpLiAgSXQncyBub3cKKwkg KiBjbGVhciB0aGF0IHdlIF9tdXN0XyBhZHZhbmNlIGFueSByZXF1aXJlZCBhcnJheSBrZXlzIGlu IGxvY2tzdGVwIHdpdGgKKwkgKiB0aGUgc2NhbiAodW5sZXNzIHRoZSByZXF1aXJlZCBhcnJheSBr ZXlzIGJlY29tZSBleGhhdXN0ZWQgaW5zdGVhZCwgb3IKKwkgKiB1bmxlc3MgdGhlIGlrZXkgdHJp Z2dlciBjb3JyZXNwb25kcyB0byBhIG5vbi1yZXF1aXJlZCBhcnJheSBzY2FuIGtleSkuCisJICoK KwkgKiBOb3RlOiB3ZSBtaWdodCBldmVuIGFkdmFuY2UgdGhlIHJlcXVpcmVkIGFycmF5cyB3aGVu IGFsbCBleGlzdGluZyBrZXlzCisJICogYXJlIGFscmVhZHkgZXF1YWwgdG8gdGhlIHZhbHVlcyBm cm9tIHRoZSB0dXBsZSBhdCB0aGlzIHBvaW50LiAgU2VlIHRoZQorCSAqIGNvbW1lbnRzIGFib3Zl IF9idF9hZHZhbmNlX2FycmF5X2tleXMgYWJvdXQgcmVxdWlyZWQtaW5lcXVhbGl0eS1kcml2ZW4K KwkgKiBhcnJheSBhZHZhbmNlbWVudC4KKwkgKgorCSAqIE5vdGU6IHdlIF93b24ndF8gYWR2YW5j ZSBhbnkgcmVxdWlyZWQgYXJyYXlzIHdoZW4gdGhlIGlrZXkvdHJpZ2dlciBzY2FuCisJICoga2V5 IGNvcnJlc3BvbmRzIHRvIGEgbm9uLXJlcXVpcmVkIGFycmF5IGZvdW5kIHRvIGJlIHVuc2F0aXNm aWVkIGJ5IHRoZQorCSAqIGN1cnJlbnQga2V5cy4gIChXZSBtaWdodCBub3QgZXZlbiAiYWR2YW5j ZSIgdGhlIG5vbi1yZXF1aXJlZCBhcnJheS4pCisJICovCisJcmV0dXJuIF9idF9hZHZhbmNlX2Fy cmF5X2tleXMoc2NhbiwgcHN0YXRlLCB0dXBsZSwgaWtleSk7Cit9CisKKy8qCisgKiBUZXN0IHdo ZXRoZXIgYW4gaW5kZXh0dXBsZSBzYXRpc2ZpZXMgY3VycmVudCBzY2FuIGNvbmRpdGlvbi4KKyAq CisgKiBSZXR1cm4gdHJ1ZSBpZiBzbywgZmFsc2UgaWYgbm90LiAgSWYgbm90LCBhbHNvIGNsZWFy ICpjb250aW51ZXNjYW4gaWYKKyAqIGl0J3Mgbm90IHBvc3NpYmxlIGZvciBhbnkgZnV0dXJlIHR1 cGxlcyBpbiB0aGUgY3VycmVudCBzY2FuIGRpcmVjdGlvbiB0bworICogcGFzcyB0aGUgcXVhbCB3 aXRoIHRoZSBjdXJyZW50IHNldCBvZiBhcnJheSBrZXlzLgorICoKKyAqIFRoaXMgaXMgYSBzdWJy b3V0aW5lIGZvciBfYnRfY2hlY2trZXlzLiAgSXQgaXMgd3JpdHRlbiB3aXRoIHRoZSBhc3N1bXB0 aW9uCisgKiB0aGF0IHJlYWNoaW5nIHRoZSBlbmQgb2YgZWFjaCBkaXN0aW5jdCBzZXQgb2YgYXJy YXkga2V5cyB0ZXJtaW5hdGVzIHRoZQorICogb25nb2luZyBwcmltaXRpdmUgaW5kZXggc2Nhbi4g IEl0IGlzIHVwIHRvIG91ciBjYWxsZXIgKHdoaWNoIGhhcyBtb3JlIGhpZ2gKKyAqIGxldmVsIGNv bnRleHQgdGhhbiB1cykgdG8gb3ZlcnJpZGUgdGhhdCBpbml0aWFsIGRldGVybWluYXRpb24gd2hl biBpdCBtYWtlcworICogbW9yZSBzZW5zZSB0byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIGFuZCBj b250aW51ZSB3aXRoIGZ1cnRoZXIgdHVwbGVzIGZyb20KKyAqIHRoZSBzYW1lIGxlYWYgcGFnZS4K KyAqLworc3RhdGljIGJvb2wKK19idF9jaGVja19jb21wYXJlKFNjYW5EaXJlY3Rpb24gZGlyLCBC VFNjYW5PcGFxdWUgc28sCisJCQkJICBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsIFR1 cGxlRGVzYyB0dXBkZXNjLAorCQkJCSAgaW50IG51bUFycmF5S2V5cywgYm9vbCAqY29udGludWVz Y2FuLCBpbnQgKmlrZXksCisJCQkJICBib29sIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spCit7 CisJU2NhbktleQkJa2V5OworCWludAkJCWtleXN6OworCisJQXNzZXJ0KCFudW1BcnJheUtleXMg fHwgIXJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hlY2spOwogCiAJKmNvbnRpbnVlc2NhbiA9IHRydWU7 CQkvKiBkZWZhdWx0IGFzc3VtcHRpb24gKi8KLQotCXR1cGRlc2MgPSBSZWxhdGlvbkdldERlc2Ny KHNjYW4tPmluZGV4UmVsYXRpb24pOwotCXNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVl OwogCWtleXN6ID0gc28tPm51bWJlck9mS2V5czsKIAotCWZvciAoa2V5ID0gc28tPmtleURhdGEs IGlrZXkgPSAwOyBpa2V5IDwga2V5c3o7IGtleSsrLCBpa2V5KyspCisJZm9yIChrZXkgPSBzby0+ a2V5RGF0YSArICppa2V5OyAqaWtleSA8IGtleXN6OyBrZXkrKywgKCppa2V5KSsrKQogCXsKIAkJ RGF0dW0JCWRhdHVtOwogCQlib29sCQlpc051bGw7CiAJCURhdHVtCQl0ZXN0OwogCQlib29sCQly ZXF1aXJlZFNhbWVEaXIgPSBmYWxzZSwKLQkJCQkJcmVxdWlyZWRPcHBvc2l0ZURpciA9IGZhbHNl OworCQkJCQlyZXF1aXJlZE9wcG9zaXRlRGlyT25seSA9IGZhbHNlOwogCiAJCS8qCi0JCSAqIENo ZWNrIGlmIHRoZSBrZXkgaXMgcmVxdWlyZWQgZm9yIG9yZGVyZWQgc2NhbiBpbiB0aGUgc2FtZSBv cgotCQkgKiBvcHBvc2l0ZSBkaXJlY3Rpb24uICBTYXZlIGFzIGZsYWcgdmFyaWFibGVzIGZvciBm dXR1cmUgdXNhZ2UuCisJCSAqIENoZWNrIGlmIHRoZSBrZXkgaXMgcmVxdWlyZWQgaW4gdGhlIGN1 cnJlbnQgc2NhbiBkaXJlY3Rpb24sIGluIHRoZQorCQkgKiBvcHBvc2l0ZSBzY2FuIGRpcmVjdGlv biBfb25seV8sIG9yIGluIG5laXRoZXIgZGlyZWN0aW9uCiAJCSAqLwogCQlpZiAoKChrZXktPnNr X2ZsYWdzICYgU0tfQlRfUkVRRldEKSAmJiBTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpIHx8 CiAJCQkoKGtleS0+c2tfZmxhZ3MgJiBTS19CVF9SRVFCS1dEKSAmJiBTY2FuRGlyZWN0aW9uSXNC YWNrd2FyZChkaXIpKSkKIAkJCXJlcXVpcmVkU2FtZURpciA9IHRydWU7CiAJCWVsc2UgaWYgKCgo a2V5LT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkgJiYgU2NhbkRpcmVjdGlvbklzQmFja3dhcmQo ZGlyKSkgfHwKIAkJCQkgKChrZXktPnNrX2ZsYWdzICYgU0tfQlRfUkVRQktXRCkgJiYgU2NhbkRp cmVjdGlvbklzRm9yd2FyZChkaXIpKSkKLQkJCXJlcXVpcmVkT3Bwb3NpdGVEaXIgPSB0cnVlOwor CQkJcmVxdWlyZWRPcHBvc2l0ZURpck9ubHkgPSB0cnVlOwogCiAJCS8qCiAJCSAqIElzIHRoZSBr ZXkgcmVxdWlyZWQgZm9yIHNjYW5uaW5nIGZvciBlaXRoZXIgZm9yd2FyZCBvciBiYWNrd2FyZApA QCAtMTQxMSw3ICsyOTU2LDcgQEAgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIElu ZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKIAkJICoga25vd24gdG8gYmUgbWF0Y2hlZCwg c2tpcCB0aGUgY2hlY2suICBFeGNlcHQgZm9yIHRoZSByb3cga2V5cywKIAkJICogd2hlcmUgTlVM THMgY291bGQgYmUgZm91bmQgaW4gdGhlIG1pZGRsZSBvZiBtYXRjaGluZyB2YWx1ZXMuCiAJCSAq LwotCQlpZiAoKHJlcXVpcmVkU2FtZURpciB8fCByZXF1aXJlZE9wcG9zaXRlRGlyKSAmJgorCQlp ZiAoKHJlcXVpcmVkU2FtZURpciB8fCByZXF1aXJlZE9wcG9zaXRlRGlyT25seSkgJiYKIAkJCSEo a2V5LT5za19mbGFncyAmIFNLX1JPV19IRUFERVIpICYmIHJlcXVpcmVkTWF0Y2hlZEJ5UHJlY2hl Y2spCiAJCQljb250aW51ZTsKIApAQCAtMTQyMyw3ICsyOTY4LDYgQEAgX2J0X2NoZWNra2V5cyhJ bmRleFNjYW5EZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKIAkJCSAq IHJpZ2h0IGNvdWxkIGJlIGFueSBwb3NzaWJsZSB2YWx1ZS4gIEFzc3VtZSB0aGF0IHRydW5jYXRl ZAogCQkJICogYXR0cmlidXRlIHBhc3NlcyB0aGUgcXVhbC4KIAkJCSAqLwotCQkJQXNzZXJ0KFNj YW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSk7CiAJCQlBc3NlcnQoQlRyZWVUdXBsZUlzUGl2b3Qo dHVwbGUpKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xNTE0LDExICszMDU4LDI4IEBAIF9idF9j aGVja2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0 dHMsCiAKIAkJLyoKIAkJICogQXBwbHkgdGhlIGtleSBjaGVja2luZyBmdW5jdGlvbi4gIFdoZW4g dGhlIGtleSBpcyByZXF1aXJlZCBmb3IKLQkJICogb3Bwb3NpdGUgZGlyZWN0aW9uIHNjYW4sIGl0 IG11c3QgYmUgYWxyZWFkeSBzYXRpc2ZpZWQgYnkKLQkJICogX2J0X2ZpcnN0KCkgZXhjZXB0IGZv ciB0aGUgTlVMTHMgY2hlY2tpbmcsIHdoaWNoIGhhdmUgYWxyZWFkeSBkb25lCi0JCSAqIGFib3Zl LgorCQkgKiBvcHBvc2l0ZS1kaXJlY3Rpb24gc2NhbnMgaXQgbXVzdCBiZSBhbiBpbmVxdWFsaXR5 IHNhdGlzZmllZCBieQorCQkgKiBfYnRfZmlyc3QoKSwgYmFycmluZyBOVUxMcywgd2hpY2ggd2Ug anVzdCBjaGVja2VkIGEgbW9tZW50IGFnby4KKwkJICoKKwkJICogKEFsc28gY2FuJ3QgYXBwbHkg dGhpcyBvcHRpbWl6YXRpb24gd2l0aCBzY2FucyB0aGF0IHVzZSBhcnJheXMsCisJCSAqIHNpbmNl IF9idF9hZHZhbmNlX2FycmF5X2tleXMoKSBzb21ldGltZXMgYWxsb3dzIHRoZSBzY2FuIHRvIHNl ZSBhCisJCSAqIGZldyB0dXBsZXMgZnJvbSBiZWZvcmUgdGhlIHdvdWxkLWJlIF9idF9maXJzdCgp IHN0YXJ0aW5nIHBvc2l0aW9uCisJCSAqIGZvciB0aGUgc2NhbidzIGp1c3QtYWR2YW5jZWQgYXJy YXkga2V5cy4pCisJCSAqCisJCSAqIEV2ZW4gcmVxdWlyZWQgZXF1YWxpdHkgcXVhbHMgKHRoYXQg Y2FuJ3QgdXNlIHRoaXMgb3B0aW1pemF0aW9uIGR1ZQorCQkgKiB0byBiZWluZyByZXF1aXJlZCBp biBib3RoIHNjYW4gZGlyZWN0aW9ucykgcmVseSBvbiB0aGUgYXNzdW1wdGlvbgorCQkgKiB0aGF0 IF9idF9maXJzdCgpIHdpbGwgYWx3YXlzIHVzZSB0aGUgcXVhbHMgZm9yIGluaXRpYWwgcG9zaXRp b25pbmcKKwkJICogcHVycG9zZXMuICBXZSBzdG9wIHRoZSBzY2FuIGFzIHNvb24gYXMgYW55IHJl cXVpcmVkIGVxdWFsaXR5IHF1YWwKKwkJICogZmFpbHMsIHNvIGl0IGhhZCBiZXR0ZXIgb25seSBo YXBwZW4gYXQgdGhlIGVuZCBvZiBlcXVhbCB0dXBsZXMgaW4KKwkJICogdGhlIGN1cnJlbnQgc2Nh biBkaXJlY3Rpb24gKG5ldmVyIGF0IHRoZSBzdGFydCBvZiBlcXVhbCB0dXBsZXMpLgorCQkgKiBT ZWUgY29tbWVudHMgaW4gX2J0X2ZpcnN0KCkuCisJCSAqCisJCSAqIChUaGUgcmVxdWlyZWQgZXF1 YWxpdHkgcXVhbHMgaXNzdWUgYWxzbyBoYXMgc3BlY2lmaWMgaW1wbGljYXRpb25zCisJCSAqIGZv ciBzY2FucyB0aGF0IHVzZSBhcnJheXMuICBUaGV5IHNvbWV0aW1lcyBwZXJmb3JtIGEgbGluZWFy IHNlYXJjaAorCQkgKiBvZiByZW1haW5pbmcgdW5zY2FubmVkIHR1cGxlcywgZm9yY2luZyB0aGUg cHJpbWl0aXZlIGluZGV4IHNjYW4gdG8KKwkJICogY29udGludWUgdW50aWwgaXQgbG9jYXRlcyB0 dXBsZXMgPj0gdGhlIHNjYW4ncyBuZXcgYXJyYXkga2V5cy4pCiAJCSAqLwotCQlpZiAoIXJlcXVp cmVkT3Bwb3NpdGVEaXIpCisJCWlmICghcmVxdWlyZWRPcHBvc2l0ZURpck9ubHkgfHwgbnVtQXJy YXlLZXlzKQogCQl7CiAJCQl0ZXN0ID0gRnVuY3Rpb25DYWxsMkNvbGwoJmtleS0+c2tfZnVuYywg a2V5LT5za19jb2xsYXRpb24sCiAJCQkJCQkJCQkgZGF0dW0sIGtleS0+c2tfYXJndW1lbnQpOwpA QCAtMTUzNiwxNSArMzA5NywyNSBAQCBfYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2Nhbiwg SW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLAogCQkJICogVHVwbGUgZmFpbHMgdGhpcyBx dWFsLiAgSWYgaXQncyBhIHJlcXVpcmVkIHF1YWwgZm9yIHRoZSBjdXJyZW50CiAJCQkgKiBzY2Fu IGRpcmVjdGlvbiwgdGhlbiB3ZSBjYW4gY29uY2x1ZGUgbm8gZnVydGhlciB0dXBsZXMgd2lsbAog CQkJICogcGFzcywgZWl0aGVyLgotCQkJICoKLQkJCSAqIE5vdGU6IGJlY2F1c2Ugd2Ugc3RvcCB0 aGUgc2NhbiBhcyBzb29uIGFzIGFueSByZXF1aXJlZCBlcXVhbGl0eQotCQkJICogcXVhbCBmYWls cywgaXQgaXMgY3JpdGljYWwgdGhhdCBlcXVhbGl0eSBxdWFscyBiZSB1c2VkIGZvciB0aGUKLQkJ CSAqIGluaXRpYWwgcG9zaXRpb25pbmcgaW4gX2J0X2ZpcnN0KCkgd2hlbiB0aGV5IGFyZSBhdmFp bGFibGUuIFNlZQotCQkJICogY29tbWVudHMgaW4gX2J0X2ZpcnN0KCkuCiAJCQkgKi8KIAkJCWlm IChyZXF1aXJlZFNhbWVEaXIpCiAJCQkJKmNvbnRpbnVlc2NhbiA9IGZhbHNlOwogCisJCQkvKgor CQkJICogQWx3YXlzIHNldCBjb250aW51ZXNjYW49ZmFsc2UgZm9yIGVxdWFsaXR5LXR5cGUgYXJy YXkga2V5cyB0aGF0CisJCQkgKiBkb24ndCBwYXNzIC0tIGV2ZW4gZm9yIGFuIGFycmF5IHNjYW4g a2V5IG5vdCBtYXJrZWQgcmVxdWlyZWQuCisJCQkgKgorCQkJICogQSBub24tcmVxdWlyZWQgc2Nh biBrZXkgKGFycmF5IG9yIG90aGVyd2lzZSkgY2FuIG5ldmVyIGFjdHVhbGx5CisJCQkgKiB0ZXJt aW5hdGUgdGhlIHNjYW4uICBJdCdzIGp1c3QgY29udmVuaWVudCBmb3IgY2FsbGVycyB0byB0cmVh dAorCQkJICogY29udGludWVzY2FuPWZhbHNlIGFzIGEgc2lnbmFsIHRoYXQgaXQgbWlnaHQgYmUg dGltZSB0byBhZHZhbmNlCisJCQkgKiB0aGUgYXJyYXkga2V5cywgaW5kZXBlbmRlbnQgb2Ygd2hl dGhlciB0aGV5J3JlIHJlcXVpcmVkIG9yIG5vdC4KKwkJCSAqIChFdmVuIHNldHRpbmcgY29udGlu dWVzY2FuPWZhbHNlIHdpdGggYSByZXF1aXJlZCBzY2FuIGtleSB3b24ndAorCQkJICogdXN1YWxs eSBlbmQgYSBzY2FuIHRoYXQgdXNlcyBhcnJheXMuKQorCQkJICovCisJCQlpZiAobnVtQXJyYXlL ZXlzICYmIChrZXktPnNrX2ZsYWdzICYgU0tfU0VBUkNIQVJSQVkpICYmCisJCQkJa2V5LT5za19z dHJhdGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpCisJCQkJKmNvbnRpbnVlc2NhbiA9IGZh bHNlOworCiAJCQkvKgogCQkJICogSW4gYW55IGNhc2UsIHRoaXMgaW5kZXh0dXBsZSBkb2Vzbid0 IG1hdGNoIHRoZSBxdWFsLgogCQkJICovCkBAIC0xNTYzLDcgKzMxMzQsNyBAQCBfYnRfY2hlY2tr ZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLAog ICogaXQncyBub3QgcG9zc2libGUgZm9yIGFueSBmdXR1cmUgdHVwbGVzIGluIHRoZSBjdXJyZW50 IHNjYW4gZGlyZWN0aW9uCiAgKiB0byBwYXNzIHRoZSBxdWFsLgogICoKLSAqIFRoaXMgaXMgYSBz dWJyb3V0aW5lIGZvciBfYnRfY2hlY2trZXlzLCB3aGljaCBzZWUgZm9yIG1vcmUgaW5mby4KKyAq IFRoaXMgaXMgYSBzdWJyb3V0aW5lIGZvciBfYnRfY2hlY2trZXlzL19idF9jaGVja19jb21wYXJl LgogICovCiBzdGF0aWMgYm9vbAogX2J0X2NoZWNrX3Jvd2NvbXBhcmUoU2NhbktleSBza2V5LCBJ bmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMsCkBAIC0xNTkyLDcgKzMxNjMsNiBAQCBfYnRf Y2hlY2tfcm93Y29tcGFyZShTY2FuS2V5IHNrZXksIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBu YXR0cywKIAkJCSAqIHJpZ2h0IGNvdWxkIGJlIGFueSBwb3NzaWJsZSB2YWx1ZS4gIEFzc3VtZSB0 aGF0IHRydW5jYXRlZAogCQkJICogYXR0cmlidXRlIHBhc3NlcyB0aGUgcXVhbC4KIAkJCSAqLwot CQkJQXNzZXJ0KFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSk7CiAJCQlBc3NlcnQoQlRyZWVU dXBsZUlzUGl2b3QodHVwbGUpKTsKIAkJCWNtcHJlc3VsdCA9IDA7CiAJCQlpZiAoc3Via2V5LT5z a19mbGFncyAmIFNLX1JPV19FTkQpCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGF0aC9pbmR4cGF0aC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpp bmRleCAwM2E1ZmJkYzYuLmUzNzU5N2MyNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3BhdGgvaW5keHBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4 cGF0aC5jCkBAIC0xMDYsOCArMTA2LDcgQEAgc3RhdGljIExpc3QgKmJ1aWxkX2luZGV4X3BhdGhz KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJCQkJICAgSW5kZXhPcHRJ bmZvICppbmRleCwgSW5kZXhDbGF1c2VTZXQgKmNsYXVzZXMsCiAJCQkJCQkJICAgYm9vbCB1c2Vm dWxfcHJlZGljYXRlLAogCQkJCQkJCSAgIFNjYW5UeXBlQ29udHJvbCBzY2FudHlwZSwKLQkJCQkJ CQkgICBib29sICpza2lwX25vbm5hdGl2ZV9zYW9wLAotCQkJCQkJCSAgIGJvb2wgKnNraXBfbG93 ZXJfc2FvcCk7CisJCQkJCQkJICAgYm9vbCAqc2tpcF9ub25uYXRpdmVfc2FvcCk7CiBzdGF0aWMg TGlzdCAqYnVpbGRfcGF0aHNfZm9yX09SKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpy ZWwsCiAJCQkJCQkJCUxpc3QgKmNsYXVzZXMsIExpc3QgKm90aGVyX2NsYXVzZXMpOwogc3RhdGlj IExpc3QgKmdlbmVyYXRlX2JpdG1hcF9vcl9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsLApAQCAtNzA2LDggKzcwNSw2IEBAIGVjbGFzc19hbHJlYWR5X3VzZWQoRXF1aXZh bGVuY2VDbGFzcyAqcGFyZW50X2VjLCBSZWxpZHMgb2xkcmVsaWRzLAogICogaW5kZXggQU0gc3Vw cG9ydHMgdGhlbSBuYXRpdmVseSwgd2Ugc2hvdWxkIGp1c3QgaW5jbHVkZSB0aGVtIGluIHNpbXBs ZQogICogaW5kZXggcGF0aHMuICBJZiBub3QsIHdlIHNob3VsZCBleGNsdWRlIHRoZW0gd2hpbGUg YnVpbGRpbmcgc2ltcGxlIGluZGV4CiAgKiBwYXRocywgYW5kIHRoZW4gbWFrZSBhIHNlcGFyYXRl IGF0dGVtcHQgdG8gaW5jbHVkZSB0aGVtIGluIGJpdG1hcCBwYXRocy4KLSAqIEZ1cnRoZXJtb3Jl LCB3ZSBzaG91bGQgY29uc2lkZXIgZXhjbHVkaW5nIGxvd2VyLW9yZGVyIFNjYWxhckFycmF5T3BF eHByCi0gKiBxdWFscyBzbyBhcyB0byBjcmVhdGUgb3JkZXJlZCBwYXRocy4KICAqLwogc3RhdGlj IHZvaWQKIGdldF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs LApAQCAtNzE2LDM3ICs3MTMsMTcgQEAgZ2V0X2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290 LCBSZWxPcHRJbmZvICpyZWwsCiB7CiAJTGlzdAkgICAqaW5kZXhwYXRoczsKIAlib29sCQlza2lw X25vbm5hdGl2ZV9zYW9wID0gZmFsc2U7Ci0JYm9vbAkJc2tpcF9sb3dlcl9zYW9wID0gZmFsc2U7 CiAJTGlzdENlbGwgICAqbGM7CiAKIAkvKgogCSAqIEJ1aWxkIHNpbXBsZSBpbmRleCBwYXRocyB1 c2luZyB0aGUgY2xhdXNlcy4gIEFsbG93IFNjYWxhckFycmF5T3BFeHByCi0JICogY2xhdXNlcyBv bmx5IGlmIHRoZSBpbmRleCBBTSBzdXBwb3J0cyB0aGVtIG5hdGl2ZWx5LCBhbmQgc2tpcCBhbnkg c3VjaAotCSAqIGNsYXVzZXMgZm9yIGluZGV4IGNvbHVtbnMgYWZ0ZXIgdGhlIGZpcnN0IChzbyB0 aGF0IHdlIHByb2R1Y2Ugb3JkZXJlZAotCSAqIHBhdGhzIGlmIHBvc3NpYmxlKS4KKwkgKiBjbGF1 c2VzIG9ubHkgaWYgdGhlIGluZGV4IEFNIHN1cHBvcnRzIHRoZW0gbmF0aXZlbHkuCiAJICovCiAJ aW5kZXhwYXRocyA9IGJ1aWxkX2luZGV4X3BhdGhzKHJvb3QsIHJlbCwKIAkJCQkJCQkJICAgaW5k ZXgsIGNsYXVzZXMsCiAJCQkJCQkJCSAgIGluZGV4LT5wcmVkT0ssCiAJCQkJCQkJCSAgIFNUX0FO WVNDQU4sCi0JCQkJCQkJCSAgICZza2lwX25vbm5hdGl2ZV9zYW9wLAotCQkJCQkJCQkgICAmc2tp cF9sb3dlcl9zYW9wKTsKLQotCS8qCi0JICogSWYgd2Ugc2tpcHBlZCBhbnkgbG93ZXItb3JkZXIg U2NhbGFyQXJyYXlPcEV4cHJzIG9uIGFuIGluZGV4IHdpdGggYW4gQU0KLQkgKiB0aGF0IHN1cHBv cnRzIHRoZW0sIHRoZW4gdHJ5IGFnYWluIGluY2x1ZGluZyB0aG9zZSBjbGF1c2VzLiAgVGhpcyB3 aWxsCi0JICogcHJvZHVjZSBwYXRocyB3aXRoIG1vcmUgc2VsZWN0aXZpdHkgYnV0IG5vIG9yZGVy aW5nLgotCSAqLwotCWlmIChza2lwX2xvd2VyX3Nhb3ApCi0JewotCQlpbmRleHBhdGhzID0gbGlz dF9jb25jYXQoaW5kZXhwYXRocywKLQkJCQkJCQkJIGJ1aWxkX2luZGV4X3BhdGhzKHJvb3QsIHJl bCwKLQkJCQkJCQkJCQkJCSAgIGluZGV4LCBjbGF1c2VzLAotCQkJCQkJCQkJCQkJICAgaW5kZXgt PnByZWRPSywKLQkJCQkJCQkJCQkJCSAgIFNUX0FOWVNDQU4sCi0JCQkJCQkJCQkJCQkgICAmc2tp cF9ub25uYXRpdmVfc2FvcCwKLQkJCQkJCQkJCQkJCSAgIE5VTEwpKTsKLQl9CisJCQkJCQkJCSAg ICZza2lwX25vbm5hdGl2ZV9zYW9wKTsKIAogCS8qCiAJICogU3VibWl0IGFsbCB0aGUgb25lcyB0 aGF0IGNhbiBmb3JtIHBsYWluIEluZGV4U2NhbiBwbGFucyB0byBhZGRfcGF0aC4gKEEKQEAgLTc4 NCw3ICs3NjEsNiBAQCBnZXRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKnJlbCwKIAkJCQkJCQkJCSAgIGluZGV4LCBjbGF1c2VzLAogCQkJCQkJCQkJICAgZmFsc2Us CiAJCQkJCQkJCQkgICBTVF9CSVRNQVBTQ0FOLAotCQkJCQkJCQkJICAgTlVMTCwKIAkJCQkJCQkJ CSAgIE5VTEwpOwogCQkqYml0aW5kZXhwYXRocyA9IGxpc3RfY29uY2F0KCpiaXRpbmRleHBhdGhz LCBpbmRleHBhdGhzKTsKIAl9CkBAIC04MTcsMjcgKzc5MywxOSBAQCBnZXRfaW5kZXhfcGF0aHMo UGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKICAqIHRvIHRydWUgaWYgd2UgZm91 bmQgYW55IHN1Y2ggY2xhdXNlcyAoY2FsbGVyIG11c3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUK ICAqIHRvIGZhbHNlKS4gIElmIGl0J3MgTlVMTCwgd2UgZG8gbm90IGlnbm9yZSBTY2FsYXJBcnJh eU9wRXhwciBjbGF1c2VzLgogICoKLSAqIElmIHNraXBfbG93ZXJfc2FvcCBpcyBub24tTlVMTCwg d2UgaWdub3JlIFNjYWxhckFycmF5T3BFeHByIGNsYXVzZXMgZm9yCi0gKiBub24tZmlyc3QgaW5k ZXggY29sdW1ucywgYW5kIHdlIHNldCAqc2tpcF9sb3dlcl9zYW9wIHRvIHRydWUgaWYgd2UgZm91 bmQKLSAqIGFueSBzdWNoIGNsYXVzZXMgKGNhbGxlciBtdXN0IGluaXRpYWxpemUgdGhlIHZhcmlh YmxlIHRvIGZhbHNlKS4gIElmIGl0J3MKLSAqIE5VTEwsIHdlIGRvIG5vdCBpZ25vcmUgbm9uLWZp cnN0IFNjYWxhckFycmF5T3BFeHByIGNsYXVzZXMsIGJ1dCB0aGV5IHdpbGwKLSAqIHJlc3VsdCBp biBjb25zaWRlcmluZyB0aGUgc2NhbidzIG91dHB1dCB0byBiZSB1bm9yZGVyZWQuCi0gKgogICog J3JlbCcgaXMgdGhlIGluZGV4J3MgaGVhcCByZWxhdGlvbgogICogJ2luZGV4JyBpcyB0aGUgaW5k ZXggZm9yIHdoaWNoIHdlIHdhbnQgdG8gZ2VuZXJhdGUgcGF0aHMKICAqICdjbGF1c2VzJyBpcyB0 aGUgY29sbGVjdGlvbiBvZiBpbmRleGFibGUgY2xhdXNlcyAoSW5kZXhDbGF1c2Ugbm9kZXMpCiAg KiAndXNlZnVsX3ByZWRpY2F0ZScgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluZGV4IGhhcyBhIHVz ZWZ1bCBwcmVkaWNhdGUKICAqICdzY2FudHlwZScgaW5kaWNhdGVzIHdoZXRoZXIgd2UgbmVlZCBw bGFpbiBvciBiaXRtYXAgc2NhbiBzdXBwb3J0CiAgKiAnc2tpcF9ub25uYXRpdmVfc2FvcCcgaW5k aWNhdGVzIHdoZXRoZXIgdG8gYWNjZXB0IFNBT1AgaWYgaW5kZXggQU0gZG9lc24ndAotICogJ3Nr aXBfbG93ZXJfc2FvcCcgaW5kaWNhdGVzIHdoZXRoZXIgdG8gYWNjZXB0IG5vbi1maXJzdC1jb2x1 bW4gU0FPUAogICovCiBzdGF0aWMgTGlzdCAqCiBidWlsZF9pbmRleF9wYXRocyhQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCSAgSW5kZXhPcHRJbmZvICppbmRleCwgSW5k ZXhDbGF1c2VTZXQgKmNsYXVzZXMsCiAJCQkJICBib29sIHVzZWZ1bF9wcmVkaWNhdGUsCiAJCQkJ ICBTY2FuVHlwZUNvbnRyb2wgc2NhbnR5cGUsCi0JCQkJICBib29sICpza2lwX25vbm5hdGl2ZV9z YW9wLAotCQkJCSAgYm9vbCAqc2tpcF9sb3dlcl9zYW9wKQorCQkJCSAgYm9vbCAqc2tpcF9ub25u YXRpdmVfc2FvcCkKIHsKIAlMaXN0CSAgICpyZXN1bHQgPSBOSUw7CiAJSW5kZXhQYXRoICAqaXBh dGg7CkBAIC04NDgsNyArODE2LDYgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKIAlMaXN0CSAgICpvcmRlcmJ5Y2xhdXNlY29sczsKIAlMaXN0 CSAgICppbmRleF9wYXRoa2V5czsKIAlMaXN0CSAgICp1c2VmdWxfcGF0aGtleXM7Ci0JYm9vbAkJ Zm91bmRfbG93ZXJfc2FvcF9jbGF1c2U7CiAJYm9vbAkJcGF0aGtleXNfcG9zc2libHlfdXNlZnVs OwogCWJvb2wJCWluZGV4X2lzX29yZGVyZWQ7CiAJYm9vbAkJaW5kZXhfb25seV9zY2FuOwpAQCAt ODgwLDE5ICs4NDcsMTEgQEAgYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJl bE9wdEluZm8gKnJlbCwKIAkgKiBvbiBieSBidHJlZSBhbmQgcG9zc2libHkgb3RoZXIgcGxhY2Vz LikgIFRoZSBsaXN0IGNhbiBiZSBlbXB0eSwgaWYgdGhlCiAJICogaW5kZXggQU0gYWxsb3dzIHRo YXQuCiAJICoKLQkgKiBmb3VuZF9sb3dlcl9zYW9wX2NsYXVzZSBpcyBzZXQgdHJ1ZSBpZiB3ZSBh Y2NlcHQgYSBTY2FsYXJBcnJheU9wRXhwcgotCSAqIGluZGV4IGNsYXVzZSBmb3IgYSBub24tZmly c3QgaW5kZXggY29sdW1uLiAgVGhpcyBwcmV2ZW50cyB1cyBmcm9tCi0JICogYXNzdW1pbmcgdGhh dCB0aGUgc2NhbiByZXN1bHQgaXMgb3JkZXJlZC4gIChBY3R1YWxseSwgdGhlIHJlc3VsdCBpcwot CSAqIHN0aWxsIG9yZGVyZWQgaWYgdGhlcmUgYXJlIGVxdWFsaXR5IGNvbnN0cmFpbnRzIGZvciBh bGwgZWFybGllcgotCSAqIGNvbHVtbnMsIGJ1dCBpdCBzZWVtcyB0b28gZXhwZW5zaXZlIGFuZCBu b24tbW9kdWxhciBmb3IgdGhpcyBjb2RlIHRvIGJlCi0JICogYXdhcmUgb2YgdGhhdCByZWZpbmVt ZW50LikKLQkgKgogCSAqIFdlIGFsc28gYnVpbGQgYSBSZWxpZHMgc2V0IHNob3dpbmcgd2hpY2gg b3V0ZXIgcmVscyBhcmUgcmVxdWlyZWQgYnkgdGhlCiAJICogc2VsZWN0ZWQgY2xhdXNlcy4gIEFu eSBsYXRlcmFsX3JlbGlkcyBhcmUgaW5jbHVkZWQgaW4gdGhhdCwgYnV0IG5vdAogCSAqIG90aGVy d2lzZSBhY2NvdW50ZWQgZm9yLgogCSAqLwogCWluZGV4X2NsYXVzZXMgPSBOSUw7Ci0JZm91bmRf bG93ZXJfc2FvcF9jbGF1c2UgPSBmYWxzZTsKIAlvdXRlcl9yZWxpZHMgPSBibXNfY29weShyZWwt PmxhdGVyYWxfcmVsaWRzKTsKIAlmb3IgKGluZGV4Y29sID0gMDsgaW5kZXhjb2wgPCBpbmRleC0+ bmtleWNvbHVtbnM7IGluZGV4Y29sKyspCiAJewpAQCAtOTAzLDMwICs4NjIsMjAgQEAgYnVpbGRf aW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCUluZGV4 Q2xhdXNlICppY2xhdXNlID0gKEluZGV4Q2xhdXNlICopIGxmaXJzdChsYyk7CiAJCQlSZXN0cmlj dEluZm8gKnJpbmZvID0gaWNsYXVzZS0+cmluZm87CiAKLQkJCS8qIFdlIG1pZ2h0IG5lZWQgdG8g b21pdCBTY2FsYXJBcnJheU9wRXhwciBjbGF1c2VzICovCi0JCQlpZiAoSXNBKHJpbmZvLT5jbGF1 c2UsIFNjYWxhckFycmF5T3BFeHByKSkKKwkJCS8qCisJCQkgKiBXZSBtaWdodCBuZWVkIHRvIG9t aXQgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcyB3aGVuIGluZGV4IEFNCisJCQkgKiBsYWNrcyBu YXRpdmUgc3VwcG9ydAorCQkJICovCisJCQlpZiAoIWluZGV4LT5hbXNlYXJjaGFycmF5ICYmIElz QShyaW5mby0+Y2xhdXNlLCBTY2FsYXJBcnJheU9wRXhwcikpCiAJCQl7Ci0JCQkJaWYgKCFpbmRl eC0+YW1zZWFyY2hhcnJheSkKKwkJCQlpZiAoc2tpcF9ub25uYXRpdmVfc2FvcCkKIAkJCQl7Ci0J CQkJCWlmIChza2lwX25vbm5hdGl2ZV9zYW9wKQotCQkJCQl7Ci0JCQkJCQkvKiBJZ25vcmUgYmVj YXVzZSBub3Qgc3VwcG9ydGVkIGJ5IGluZGV4ICovCi0JCQkJCQkqc2tpcF9ub25uYXRpdmVfc2Fv cCA9IHRydWU7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkvKiBDYWxsZXIgaGFkIGJl dHRlciBpbnRlbmQgdGhpcyBvbmx5IGZvciBiaXRtYXAgc2NhbiAqLwotCQkJCQlBc3NlcnQoc2Nh bnR5cGUgPT0gU1RfQklUTUFQU0NBTik7Ci0JCQkJfQotCQkJCWlmIChpbmRleGNvbCA+IDApCi0J CQkJewotCQkJCQlpZiAoc2tpcF9sb3dlcl9zYW9wKQotCQkJCQl7Ci0JCQkJCQkvKiBDYWxsZXIg ZG9lc24ndCB3YW50IHRvIGxvc2UgaW5kZXggb3JkZXJpbmcgKi8KLQkJCQkJCSpza2lwX2xvd2Vy X3Nhb3AgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZm91bmRfbG93ZXJf c2FvcF9jbGF1c2UgPSB0cnVlOworCQkJCQkvKiBJZ25vcmUgYmVjYXVzZSBub3Qgc3VwcG9ydGVk IGJ5IGluZGV4ICovCisJCQkJCSpza2lwX25vbm5hdGl2ZV9zYW9wID0gdHJ1ZTsKKwkJCQkJY29u dGludWU7CiAJCQkJfQorCQkJCS8qIENhbGxlciBoYWQgYmV0dGVyIGludGVuZCB0aGlzIG9ubHkg Zm9yIGJpdG1hcCBzY2FuICovCisJCQkJQXNzZXJ0KHNjYW50eXBlID09IFNUX0JJVE1BUFNDQU4p OwogCQkJfQogCiAJCQkvKiBPSyB0byBpbmNsdWRlIHRoaXMgY2xhdXNlICovCkBAIC05NTYsMTEg KzkwNSw5IEBAIGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwsCiAJLyoKIAkgKiAyLiBDb21wdXRlIHBhdGhrZXlzIGRlc2NyaWJpbmcgaW5kZXgncyBv cmRlcmluZywgaWYgYW55LCB0aGVuIHNlZSBob3cKIAkgKiBtYW55IG9mIHRoZW0gYXJlIGFjdHVh bGx5IHVzZWZ1bCBmb3IgdGhpcyBxdWVyeS4gIFRoaXMgaXMgbm90IHJlbGV2YW50Ci0JICogaWYg d2UgYXJlIG9ubHkgdHJ5aW5nIHRvIGJ1aWxkIGJpdG1hcCBpbmRleHNjYW5zLCBub3IgaWYgd2Ug aGF2ZSB0bwotCSAqIGFzc3VtZSB0aGUgc2NhbiBpcyB1bm9yZGVyZWQuCisJICogaWYgd2UgYXJl IG9ubHkgdHJ5aW5nIHRvIGJ1aWxkIGJpdG1hcCBpbmRleHNjYW5zLgogCSAqLwogCXBhdGhrZXlz X3Bvc3NpYmx5X3VzZWZ1bCA9IChzY2FudHlwZSAhPSBTVF9CSVRNQVBTQ0FOICYmCi0JCQkJCQkJ CSFmb3VuZF9sb3dlcl9zYW9wX2NsYXVzZSAmJgogCQkJCQkJCQloYXNfdXNlZnVsX3BhdGhrZXlz KHJvb3QsIHJlbCkpOwogCWluZGV4X2lzX29yZGVyZWQgPSAoaW5kZXgtPnNvcnRvcGZhbWlseSAh PSBOVUxMKTsKIAlpZiAoaW5kZXhfaXNfb3JkZXJlZCAmJiBwYXRoa2V5c19wb3NzaWJseV91c2Vm dWwpCkBAIC0xMjEyLDcgKzExNTksNiBAQCBidWlsZF9wYXRoc19mb3JfT1IoUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCSAgIGluZGV4LCAmY2xhdXNlc2V0LAog CQkJCQkJCQkJICAgdXNlZnVsX3ByZWRpY2F0ZSwKIAkJCQkJCQkJCSAgIFNUX0JJVE1BUFNDQU4s Ci0JCQkJCQkJCQkgICBOVUxMLAogCQkJCQkJCQkJICAgTlVMTCk7CiAJCXJlc3VsdCA9IGxpc3Rf Y29uY2F0KHJlc3VsdCwgaW5kZXhwYXRocyk7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3NlbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVuY3MuYwpp bmRleCBlMTFkMDIyODIuLmY5NmM3YjVkYyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKQEAg LTY1MTQsOCArNjUxNCw2IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3Qs CiAJZG91YmxlCQludW1JbmRleFR1cGxlczsKIAlkb3VibGUJCXNwY19yYW5kb21fcGFnZV9jb3N0 OwogCWRvdWJsZQkJbnVtX3NhX3NjYW5zOwotCWRvdWJsZQkJbnVtX291dGVyX3NjYW5zOwotCWRv dWJsZQkJbnVtX3NjYW5zOwogCWRvdWJsZQkJcXVhbF9vcF9jb3N0OwogCWRvdWJsZQkJcXVhbF9h cmdfY29zdDsKIAlMaXN0CSAgICpzZWxlY3Rpdml0eVF1YWxzOwpAQCAtNjUzMCw3ICs2NTI4LDcg QEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCS8qCiAJICogQ2hl Y2sgZm9yIFNjYWxhckFycmF5T3BFeHByIGluZGV4IHF1YWxzLCBhbmQgZXN0aW1hdGUgdGhlIG51 bWJlciBvZgotCSAqIGluZGV4IHNjYW5zIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQuCisJICogcHJp bWl0aXZlIGluZGV4IHNjYW5zIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQgZm9yIGNhbGxlcgogCSAq LwogCW51bV9zYV9zY2FucyA9IDE7CiAJZm9yZWFjaChsLCBpbmRleFF1YWxzKQpAQCAtNjU2MCwx OSArNjU1OCw4IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsCiAJICov CiAJbnVtSW5kZXhUdXBsZXMgPSBjb3N0cy0+bnVtSW5kZXhUdXBsZXM7CiAJaWYgKG51bUluZGV4 VHVwbGVzIDw9IDAuMCkKLQl7CiAJCW51bUluZGV4VHVwbGVzID0gaW5kZXhTZWxlY3Rpdml0eSAq IGluZGV4LT5yZWwtPnR1cGxlczsKIAotCQkvKgotCQkgKiBUaGUgYWJvdmUgY2FsY3VsYXRpb24g Y291bnRzIGFsbCB0aGUgdHVwbGVzIHZpc2l0ZWQgYWNyb3NzIGFsbAotCQkgKiBzY2FucyBpbmR1 Y2VkIGJ5IFNjYWxhckFycmF5T3BFeHByIG5vZGVzLiAgV2Ugd2FudCB0byBjb25zaWRlciB0aGUK LQkJICogYXZlcmFnZSBwZXItaW5kZXhzY2FuIG51bWJlciwgc28gYWRqdXN0LiAgVGhpcyBpcyBh IGhhbmR5IHBsYWNlIHRvCi0JCSAqIHJvdW5kIHRvIGludGVnZXIsIHRvby4gIChJZiBjYWxsZXIg c3VwcGxpZWQgdHVwbGUgZXN0aW1hdGUsIGl0J3MKLQkJICogcmVzcG9uc2libGUgZm9yIGhhbmRs aW5nIHRoZXNlIGNvbnNpZGVyYXRpb25zLikKLQkJICovCi0JCW51bUluZGV4VHVwbGVzID0gcmlu dChudW1JbmRleFR1cGxlcyAvIG51bV9zYV9zY2Fucyk7Ci0JfQotCiAJLyoKIAkgKiBXZSBjYW4g Ym91bmQgdGhlIG51bWJlciBvZiB0dXBsZXMgYnkgdGhlIGluZGV4IHNpemUgaW4gYW55IGNhc2Uu IEFsc28sCiAJICogYWx3YXlzIGVzdGltYXRlIGF0IGxlYXN0IG9uZSB0dXBsZSBpcyB0b3VjaGVk LCBldmVuIHdoZW4KQEAgLTY2MTAsMjcgKzY1OTcsMzEgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQ bGFubmVySW5mbyAqcm9vdCwKIAkgKgogCSAqIFRoZSBhYm92ZSBjYWxjdWxhdGlvbnMgYXJlIGFs bCBwZXItaW5kZXgtc2Nhbi4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBpbiBhCiAJICogbmVzdGxvb3Ag aW5uZXIgc2Nhbiwgd2UgY2FuIGV4cGVjdCB0aGUgc2NhbiB0byBiZSByZXBlYXRlZCAod2l0aAot CSAqIGRpZmZlcmVudCBzZWFyY2gga2V5cykgZm9yIGVhY2ggcm93IG9mIHRoZSBvdXRlciByZWxh dGlvbi4gIExpa2V3aXNlLAotCSAqIFNjYWxhckFycmF5T3BFeHByIHF1YWxzIHJlc3VsdCBpbiBt dWx0aXBsZSBpbmRleCBzY2Fucy4gIFRoaXMgY3JlYXRlcwotCSAqIHRoZSBwb3RlbnRpYWwgZm9y IGNhY2hlIGVmZmVjdHMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZGlzayBwYWdlCi0JICogZmV0 Y2hlcyBuZWVkZWQuICBXZSB3YW50IHRvIGVzdGltYXRlIHRoZSBhdmVyYWdlIHBlci1zY2FuIEkv TyBjb3N0IGluCi0JICogdGhlIHByZXNlbmNlIG9mIGNhY2hpbmcuCisJICogZGlmZmVyZW50IHNl YXJjaCBrZXlzKSBmb3IgZWFjaCByb3cgb2YgdGhlIG91dGVyIHJlbGF0aW9uLiAgVGhpcworCSAq IGNyZWF0ZXMgdGhlIHBvdGVudGlhbCBmb3IgY2FjaGUgZWZmZWN0cyB0byByZWR1Y2UgdGhlIG51 bWJlciBvZiBkaXNrCisJICogcGFnZSBmZXRjaGVzIG5lZWRlZC4gIFdlIHdhbnQgdG8gZXN0aW1h dGUgdGhlIGF2ZXJhZ2UgcGVyLXNjYW4gSS9PIGNvc3QKKwkgKiBpbiB0aGUgcHJlc2VuY2Ugb2Yg Y2FjaGluZy4KIAkgKgogCSAqIFdlIHVzZSB0aGUgTWFja2VydC1Mb2htYW4gZm9ybXVsYSAoc2Vl IGNvc3RzaXplLmMgZm9yIGRldGFpbHMpIHRvCiAJICogZXN0aW1hdGUgdGhlIHRvdGFsIG51bWJl ciBvZiBwYWdlIGZldGNoZXMgdGhhdCBvY2N1ci4gIFdoaWxlIHRoaXMKIAkgKiB3YXNuJ3Qgd2hh dCBpdCB3YXMgZGVzaWduZWQgZm9yLCBpdCBzZWVtcyBhIHJlYXNvbmFibGUgbW9kZWwgYW55d2F5 LgogCSAqIE5vdGUgdGhhdCB3ZSBhcmUgY291bnRpbmcgcGFnZXMgbm90IHR1cGxlcyBhbnltb3Jl LCBzbyB3ZSB0YWtlIE4gPSBUID0KIAkgKiBpbmRleCBzaXplLCBhcyBpZiB0aGVyZSB3ZXJlIG9u ZSAidHVwbGUiIHBlciBwYWdlLgorCSAqCisJICogTm90ZTogd2UgYXNzdW1lIHRoYXQgdGhlcmUg d2lsbCBiZSBubyByZXBlYXQgaW5kZXggcGFnZSBmZXRjaGVzIGFjcm9zcworCSAqIFNjYWxhckFy cmF5T3BFeHByIHByaW1pdGl2ZSBzY2FucyBmcm9tIHRoZSBzYW1lIGxvZ2ljYWwgaW5kZXggc2Nh bi4KKwkgKiBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgdHJ1ZSBmb3IgYnRyZWUgaW5kZXhlcywg YnV0IGlzIHZlcnkgb3B0aW1pc3RpYworCSAqIHdpdGggaW5kZXggQU1zIHRoYXQgY2Fubm90IG5h dGl2ZWx5IGV4ZWN1dGUgU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMuCisJICogSG93ZXZlciwgdGhl c2Ugc2FtZSBpbmRleCBBTXMgYWxzbyBhY2NlcHQgb3VyIGRlZmF1bHQgcGVzc2ltaXN0aWMKKwkg KiBhcHByb2FjaCB0byBjb3VudGluZyBudW1fc2Ffc2NhbnMgKGJ0cmVlIGNhbGxlciBjYXBzIHRo aXMpLCBzbyB3ZSBkb24ndAorCSAqIGV4cGVjdCB0aGUgZmluYWwgaW5kZXhUb3RhbENvc3QgdG8g YmUgd2lsZGx5IG92ZXItb3B0aW1pc3RpYy4KIAkgKi8KLQludW1fb3V0ZXJfc2NhbnMgPSBsb29w X2NvdW50OwotCW51bV9zY2FucyA9IG51bV9zYV9zY2FucyAqIG51bV9vdXRlcl9zY2FuczsKLQot CWlmIChudW1fc2NhbnMgPiAxKQorCWlmIChsb29wX2NvdW50ID4gMSkKIAl7CiAJCWRvdWJsZQkJ cGFnZXNfZmV0Y2hlZDsKIAogCQkvKiB0b3RhbCBwYWdlIGZldGNoZXMgaWdub3JpbmcgY2FjaGUg ZWZmZWN0cyAqLwotCQlwYWdlc19mZXRjaGVkID0gbnVtSW5kZXhQYWdlcyAqIG51bV9zY2FuczsK KwkJcGFnZXNfZmV0Y2hlZCA9IG51bUluZGV4UGFnZXMgKiBsb29wX2NvdW50OwogCiAJCS8qIHVz ZSBNYWNrZXJ0IGFuZCBMb2htYW4gZm9ybXVsYSB0byBhZGp1c3QgZm9yIGNhY2hlIGVmZmVjdHMg Ki8KIAkJcGFnZXNfZmV0Y2hlZCA9IGluZGV4X3BhZ2VzX2ZldGNoZWQocGFnZXNfZmV0Y2hlZCwK QEAgLTY2NDAsMTEgKzY2MzEsOSBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpy b290LAogCiAJCS8qCiAJCSAqIE5vdyBjb21wdXRlIHRoZSB0b3RhbCBkaXNrIGFjY2VzcyBjb3N0 LCBhbmQgdGhlbiByZXBvcnQgYSBwcm8tcmF0ZWQKLQkJICogc2hhcmUgZm9yIGVhY2ggb3V0ZXIg c2Nhbi4gIChEb24ndCBwcm8tcmF0ZSBmb3IgU2NhbGFyQXJyYXlPcEV4cHIsCi0JCSAqIHNpbmNl IHRoYXQncyBpbnRlcm5hbCB0byB0aGUgaW5kZXhzY2FuLikKKwkJICogc2hhcmUgZm9yIGVhY2gg b3V0ZXIgc2NhbgogCQkgKi8KLQkJaW5kZXhUb3RhbENvc3QgPSAocGFnZXNfZmV0Y2hlZCAqIHNw Y19yYW5kb21fcGFnZV9jb3N0KQotCQkJLyBudW1fb3V0ZXJfc2NhbnM7CisJCWluZGV4VG90YWxD b3N0ID0gKHBhZ2VzX2ZldGNoZWQgKiBzcGNfcmFuZG9tX3BhZ2VfY29zdCkgLyBsb29wX2NvdW50 OwogCX0KIAllbHNlCiAJewpAQCAtNjY2MCwxMCArNjY0OSw4IEBAIGdlbmVyaWNjb3N0ZXN0aW1h dGUoUGxhbm5lckluZm8gKnJvb3QsCiAJICogZXZhbHVhdGVkIG9uY2UgYXQgdGhlIHN0YXJ0IG9m IHRoZSBzY2FuIHRvIHJlZHVjZSB0aGVtIHRvIHJ1bnRpbWUga2V5cwogCSAqIHRvIHBhc3MgdG8g dGhlIGluZGV4IEFNIChzZWUgbm9kZUluZGV4c2Nhbi5jKS4gIFdlIG1vZGVsIHRoZSBwZXItdHVw bGUKIAkgKiBDUFUgY29zdHMgYXMgY3B1X2luZGV4X3R1cGxlX2Nvc3QgcGx1cyBvbmUgY3B1X29w ZXJhdG9yX2Nvc3QgcGVyCi0JICogaW5kZXhxdWFsIG9wZXJhdG9yLiAgQmVjYXVzZSB3ZSBoYXZl IG51bUluZGV4VHVwbGVzIGFzIGEgcGVyLXNjYW4KLQkgKiBudW1iZXIsIHdlIGhhdmUgdG8gbXVs dGlwbHkgYnkgbnVtX3NhX3NjYW5zIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQKLQkgKiBmb3Ig U2NhbGFyQXJyYXlPcEV4cHIgY2FzZXMuICBTaW1pbGFybHkgYWRkIGluIGNvc3RzIGZvciBhbnkg aW5kZXgKLQkgKiBPUkRFUiBCWSBleHByZXNzaW9ucy4KKwkgKiBpbmRleHF1YWwgb3BlcmF0b3Iu ICBTaW1pbGFybHkgYWRkIGluIGNvc3RzIGZvciBhbnkgaW5kZXggT1JERVIgQlkKKwkgKiBleHBy ZXNzaW9ucy4KIAkgKgogCSAqIE5vdGU6IHRoaXMgbmVnbGVjdHMgdGhlIHBvc3NpYmxlIGNvc3Rz IG9mIHJlY2hlY2tpbmcgbG9zc3kgb3BlcmF0b3JzLgogCSAqIERldGVjdGluZyB0aGF0IHRoYXQg bWlnaHQgYmUgbmVlZGVkIHNlZW1zIG1vcmUgZXhwZW5zaXZlIHRoYW4gaXQncwpAQCAtNjY3Niw3 ICs2NjYzLDcgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCWlu ZGV4U3RhcnR1cENvc3QgPSBxdWFsX2FyZ19jb3N0OwogCWluZGV4VG90YWxDb3N0ICs9IHF1YWxf YXJnX2Nvc3Q7Ci0JaW5kZXhUb3RhbENvc3QgKz0gbnVtSW5kZXhUdXBsZXMgKiBudW1fc2Ffc2Nh bnMgKiAoY3B1X2luZGV4X3R1cGxlX2Nvc3QgKyBxdWFsX29wX2Nvc3QpOworCWluZGV4VG90YWxD b3N0ICs9IG51bUluZGV4VHVwbGVzICogKGNwdV9pbmRleF90dXBsZV9jb3N0ICsgcXVhbF9vcF9j b3N0KTsKIAogCS8qCiAJICogR2VuZXJpYyBhc3N1bXB0aW9uIGFib3V0IGluZGV4IGNvcnJlbGF0 aW9uOiB0aGVyZSBpc24ndCBhbnkuCkBAIC02NzU0LDcgKzY3NDEsNiBAQCBidGNvc3Rlc3RpbWF0 ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwK IAlib29sCQllcVF1YWxIZXJlOwogCWJvb2wJCWZvdW5kX3Nhb3A7CiAJYm9vbAkJZm91bmRfaXNf bnVsbF9vcDsKLQlkb3VibGUJCW51bV9zYV9zY2FuczsKIAlMaXN0Q2VsbCAgICpsYzsKIAogCS8q CkBAIC02NzY5LDE3ICs2NzU1LDEyIEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290 LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCSAqCiAJICogRm9yIGEgUm93 Q29tcGFyZUV4cHIsIHdlIGNvbnNpZGVyIG9ubHkgdGhlIGZpcnN0IGNvbHVtbiwganVzdCBhcwog CSAqIHJvd2NvbXBhcmVzZWwoKSBkb2VzLgotCSAqCi0JICogSWYgdGhlcmUncyBhIFNjYWxhckFy cmF5T3BFeHByIGluIHRoZSBxdWFscywgd2UnbGwgYWN0dWFsbHkgcGVyZm9ybSBOCi0JICogaW5k ZXggc2NhbnMgbm90IG9uZSwgYnV0IHRoZSBTY2FsYXJBcnJheU9wRXhwcidzIG9wZXJhdG9yIGNh biBiZQotCSAqIGNvbnNpZGVyZWQgdG8gYWN0IHRoZSBzYW1lIGFzIGl0IG5vcm1hbGx5IGRvZXMu CiAJICovCiAJaW5kZXhCb3VuZFF1YWxzID0gTklMOwogCWluZGV4Y29sID0gMDsKIAllcVF1YWxI ZXJlID0gZmFsc2U7CiAJZm91bmRfc2FvcCA9IGZhbHNlOwogCWZvdW5kX2lzX251bGxfb3AgPSBm YWxzZTsKLQludW1fc2Ffc2NhbnMgPSAxOwogCWZvcmVhY2gobGMsIHBhdGgtPmluZGV4Y2xhdXNl cykKIAl7CiAJCUluZGV4Q2xhdXNlICppY2xhdXNlID0gbGZpcnN0X25vZGUoSW5kZXhDbGF1c2Us IGxjKTsKQEAgLTY4MTksMTQgKzY4MDAsOSBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAq cm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkJCWVsc2UgaWYgKElz QShjbGF1c2UsIFNjYWxhckFycmF5T3BFeHByKSkKIAkJCXsKIAkJCQlTY2FsYXJBcnJheU9wRXhw ciAqc2FvcCA9IChTY2FsYXJBcnJheU9wRXhwciAqKSBjbGF1c2U7Ci0JCQkJTm9kZQkgICAqb3Ro ZXJfb3BlcmFuZCA9IChOb2RlICopIGxzZWNvbmQoc2FvcC0+YXJncyk7Ci0JCQkJaW50CQkJYWxl bmd0aCA9IGVzdGltYXRlX2FycmF5X2xlbmd0aChvdGhlcl9vcGVyYW5kKTsKIAogCQkJCWNsYXVz ZV9vcCA9IHNhb3AtPm9wbm87CiAJCQkJZm91bmRfc2FvcCA9IHRydWU7Ci0JCQkJLyogY291bnQg bnVtYmVyIG9mIFNBIHNjYW5zIGluZHVjZWQgYnkgaW5kZXhCb3VuZFF1YWxzIG9ubHkgKi8KLQkJ CQlpZiAoYWxlbmd0aCA+IDEpCi0JCQkJCW51bV9zYV9zY2FucyAqPSBhbGVuZ3RoOwogCQkJfQog CQkJZWxzZSBpZiAoSXNBKGNsYXVzZSwgTnVsbFRlc3QpKQogCQkJewpAQCAtNjg4NiwxMyArNjg2 Miw2IEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgs IGRvdWJsZSBsb29wX2NvdW50LAogCQkJCQkJCQkJCQkJICBKT0lOX0lOTkVSLAogCQkJCQkJCQkJ CQkJICBOVUxMKTsKIAkJbnVtSW5kZXhUdXBsZXMgPSBidHJlZVNlbGVjdGl2aXR5ICogaW5kZXgt PnJlbC0+dHVwbGVzOwotCi0JCS8qCi0JCSAqIEFzIGluIGdlbmVyaWNjb3N0ZXN0aW1hdGUoKSwg d2UgaGF2ZSB0byBhZGp1c3QgZm9yIGFueQotCQkgKiBTY2FsYXJBcnJheU9wRXhwciBxdWFscyBp bmNsdWRlZCBpbiBpbmRleEJvdW5kUXVhbHMsIGFuZCB0aGVuIHJvdW5kCi0JCSAqIHRvIGludGVn ZXIuCi0JCSAqLwotCQludW1JbmRleFR1cGxlcyA9IHJpbnQobnVtSW5kZXhUdXBsZXMgLyBudW1f c2Ffc2NhbnMpOwogCX0KIAogCS8qCkBAIC02OTAyLDYgKzY4NzEsNDggQEAgYnRjb3N0ZXN0aW1h dGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxvb3BfY291bnQs CiAKIAlnZW5lcmljY29zdGVzdGltYXRlKHJvb3QsIHBhdGgsIGxvb3BfY291bnQsICZjb3N0cyk7 CiAKKwkvKgorCSAqIE5vdyBjb21wZW5zYXRlIGZvciBidHJlZSdzIGFiaWxpdHkgdG8gZWZmaWNp ZW50bHkgZXhlY3V0ZSBzY2FucyB3aXRoCisJICogU0FPUCBjbGF1c2VzLgorCSAqCisJICogYnRy ZWUgYXV0b21hdGljYWxseSBjb21iaW5lcyBpbmRpdmlkdWFsIFNjYWxhckFycmF5T3BFeHByIHBy aW1pdGl2ZQorCSAqIGluZGV4IHNjYW5zIHdoZW5ldmVyIHRoZSB0dXBsZXMgY292ZXJlZCBieSB0 aGUgbmV4dCBzZXQgb2YgYXJyYXkga2V5cworCSAqIGFyZSBjbG9zZSB0byB0dXBsZXMgY292ZXJl ZCBieSB0aGUgY3VycmVudCBzZXQuICBUaGlzIG1ha2VzIHRoZSBmaW5hbAorCSAqIG51bWJlciBv ZiBkZXNjZW50cyBwYXJ0aWN1bGFybHkgZGlmZmljdWx0IHRvIGVzdGltYXRlLiAgSG93ZXZlciwg YnRyZWUKKwkgKiBzY2FucyBuZXZlciB2aXNpdCBhbnkgc2luZ2xlIGxlYWYgcGFnZSBtb3JlIHRo YW4gb25jZS4gIFRoYXQgcHV0cyBhCisJICogbmF0dXJhbCBmbG9vciB1bmRlciB0aGUgd29yc3Qg Y2FzZSBudW1iZXIgb2YgZGVzY2VudHMuCisJICoKKwkgKiBJdCdzIHBhcnRpY3VsYXJseSBpbXBv cnRhbnQgdGhhdCB3ZSBub3Qgd2lsZGx5IG92ZXJlc3RpbWF0ZSB0aGUgbnVtYmVyCisJICogb2Yg ZGVzY2VudHMgbmVlZGVkIGZvciBhIGNsYXVzZSBsaXN0IHdpdGggc2V2ZXJhbCBTQU9QcyAtLSB0 aGUgY29zdHMKKwkgKiByZWFsbHkgYXJlbid0IG11bHRpcGxpY2F0aXZlIGluIHRoZSB3YXkgZ2Vu ZXJpY2Nvc3Rlc3RpbWF0ZSBleHBlY3RzLiBJbgorCSAqIGdlbmVyYWwsIG1vc3QgZGlzdGluY3Qg Y29tYmluYXRpb25zIG9mIFNBT1Aga2V5cyB3aWxsIHRlbmQgdG8gbm90IGZpbmQKKwkgKiBhbnkg bWF0Y2hpbmcgdHVwbGVzLiAgRnVydGhlcm1vcmUsIGJ0cmVlIHNjYW5zIHNlYXJjaCBmb3IgdGhl IG5leHQgc2V0CisJICogb2YgYXJyYXkga2V5cyB1c2luZyB0aGUgbmV4dCB0dXBsZSBpbiBsaW5l LCBhbmQgc28gd29uJ3QgZXZlbiBuZWVkIGEKKwkgKiBkaXJlY3QgY29tcGFyaXNvbiB0byBlbGlt aW5hdGUgbW9zdCBub24tbWF0Y2hpbmcgc2V0cyBvZiBhcnJheSBrZXlzLgorCSAqCisJICogQ2xh bXAgdGhlIG51bWJlciBvZiBkZXNjZW50cyB0byB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBsZWFm IHBhZ2UKKwkgKiB2aXNpdHMuICBUaGlzIGlzIHN0aWxsIGZhaXJseSBwZXNzaW1pc3RpYywgYnV0 IHRlbmRzIHRvIHJlc3VsdCBpbiBtb3JlCisJICogYWNjdXJhdGUgY29zdGluZyBvZiBzY2FucyB3 aXRoIHNldmVyYWwgU0FPUCBjbGF1c2VzIC0tIGVzcGVjaWFsbHkgd2hlbgorCSAqIGVhY2ggYXJy YXkgaGFzIG1vcmUgdGhhbiBhIGZldyBlbGVtZW50cy4gIFRoZSBjb3N0IG9mIGFkZGluZyBhZGRp dGlvbmFsCisJICogYXJyYXkgY29uc3RhbnRzIHRvIGEgbG93LW9yZGVyIFNBT1AgY29sdW1uIHNo b3VsZCBzYXR1cmF0ZSBwYXN0IGEKKwkgKiBjZXJ0YWluIHBvaW50IChleGNlcHQgd2hlcmUgc2Vs ZWN0aXZpdHkgZXN0aW1hdGVzIGNvbnRpbnVlIHRvIHNoaWZ0KS4KKwkgKgorCSAqIEFsc28gY2xh bXAgdGhlIG51bWJlciBvZiBkZXNjZW50cyB0byAxLzMgdGhlIG51bWJlciBvZiBpbmRleCBwYWdl cy4KKwkgKiBUaGlzIGF2b2lkcyBpbXBsYXVzaWJseSBoaWdoIGVzdGltYXRlcyB3aXRoIGxvdyBz ZWxlY3Rpdml0eSBwYXRocywKKwkgKiB3aGVyZSBzY2FucyBmcmVxdWVudGx5IHJlcXVpcmUgbm8g bW9yZSB0aGFuIG9uZSBvciB0d28gZGVzY2VudHMuCisJICoKKwkgKiBYWFggSWRlYWxseSwgd2Un ZCBhbHNvIGFjY291bnQgZm9yIHRoZSBmYWN0IHRoYXQgbm9uLWJvdW5kYXJ5IFNBT1AKKwkgKiBj bGF1c2UgcXVhbHMgKHdoaWNoIHRoZSBCLVRyZWUgY29kZSB1c2VzICJub24tcmVxdWlyZWQiIHNj YW4ga2V5cyBmb3IpCisJICogd29uJ3QgYWN0dWFsbHkgY29udHJpYnV0ZSB0byB0aGUgdG90YWwg bnVtYmVyIG9mIGRlc2NlbnRzIG9mIHRoZSBpbmRleC4KKwkgKiBUaGlzIHdvdWxkIHJlcXVpcmUg cHVzaGluZyBkb3duIG1vcmUgY29udGV4dCBpbnRvIGdlbmVyaWNjb3N0ZXN0aW1hdGUuCisJICov CisJaWYgKGNvc3RzLm51bV9zYV9zY2FucyA+IDEpCisJeworCQljb3N0cy5udW1fc2Ffc2NhbnMg PSBNaW4oY29zdHMubnVtX3NhX3NjYW5zLCBjb3N0cy5udW1JbmRleFBhZ2VzKTsKKwkJY29zdHMu bnVtX3NhX3NjYW5zID0gTWluKGNvc3RzLm51bV9zYV9zY2FucywgaW5kZXgtPnBhZ2VzIC8gMyk7 CisJCWNvc3RzLm51bV9zYV9zY2FucyA9IE1heChjb3N0cy5udW1fc2Ffc2NhbnMsIDEpOworCX0K KwogCS8qCiAJICogQWRkIGEgQ1BVLWNvc3QgY29tcG9uZW50IHRvIHJlcHJlc2VudCB0aGUgY29z dHMgb2YgaW5pdGlhbCBidHJlZQogCSAqIGRlc2NlbnQuICBXZSBkb24ndCBjaGFyZ2UgYW55IEkv TyBjb3N0IGZvciB0b3VjaGluZyB1cHBlciBidHJlZSBsZXZlbHMsCkBAIC02OTA5LDkgKzY5MjAs OSBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBk b3VibGUgbG9vcF9jb3VudCwKIAkgKiBjb21wYXJpc29ucyB0byBkZXNjZW5kIGEgYnRyZWUgb2Yg TiBsZWFmIHR1cGxlcy4gIFdlIGNoYXJnZSBvbmUKIAkgKiBjcHVfb3BlcmF0b3JfY29zdCBwZXIg Y29tcGFyaXNvbi4KIAkgKgotCSAqIElmIHRoZXJlIGFyZSBTY2FsYXJBcnJheU9wRXhwcnMsIGNo YXJnZSB0aGlzIG9uY2UgcGVyIFNBIHNjYW4uICBUaGUKLQkgKiBvbmVzIGFmdGVyIHRoZSBmaXJz dCBvbmUgYXJlIG5vdCBzdGFydHVwIGNvc3Qgc28gZmFyIGFzIHRoZSBvdmVyYWxsCi0JICogcGxh biBpcyBjb25jZXJuZWQsIHNvIGFkZCB0aGVtIG9ubHkgdG8gInRvdGFsIiBjb3N0LgorCSAqIElm IHRoZXJlIGFyZSBTY2FsYXJBcnJheU9wRXhwcnMsIGNoYXJnZSB0aGlzIG9uY2UgcGVyIGVzdGlt YXRlZAorCSAqIHByaW1pdGl2ZSBTQSBzY2FuLiAgVGhlIG9uZXMgYWZ0ZXIgdGhlIGZpcnN0IG9u ZSBhcmUgbm90IHN0YXJ0dXAgY29zdAorCSAqIHNvIGZhciBhcyB0aGUgb3ZlcmFsbCBwbGFuIGdv ZXMsIHNvIGp1c3QgYWRkIHRoZW0gdG8gInRvdGFsIiBjb3N0LgogCSAqLwogCWlmIChpbmRleC0+ dHVwbGVzID4gMSkJCS8qIGF2b2lkIGNvbXB1dGluZyBsb2coMCkgKi8KIAl7CkBAIC02OTI4LDcg KzY5MzksOCBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpw YXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkgKiBpbiBjYXNlcyB3aGVyZSBvbmx5IGEgc2luZ2xl IGxlYWYgcGFnZSBpcyBleHBlY3RlZCB0byBiZSB2aXNpdGVkLiAgVGhpcwogCSAqIGNvc3QgaXMg c29tZXdoYXQgYXJiaXRyYXJpbHkgc2V0IGF0IDUweCBjcHVfb3BlcmF0b3JfY29zdCBwZXIgcGFn ZQogCSAqIHRvdWNoZWQuICBUaGUgbnVtYmVyIG9mIHN1Y2ggcGFnZXMgaXMgYnRyZWUgdHJlZSBo ZWlnaHQgcGx1cyBvbmUgKGllLAotCSAqIHdlIGNoYXJnZSBmb3IgdGhlIGxlYWYgcGFnZSB0b28p LiAgQXMgYWJvdmUsIGNoYXJnZSBvbmNlIHBlciBTQSBzY2FuLgorCSAqIHdlIGNoYXJnZSBmb3Ig dGhlIGxlYWYgcGFnZSB0b28pLiAgQXMgYWJvdmUsIGNoYXJnZSBvbmNlIHBlciBlc3RpbWF0ZWQK KwkgKiBwcmltaXRpdmUgU0Egc2Nhbi4KIAkgKi8KIAlkZXNjZW50Q29zdCA9IChpbmRleC0+dHJl ZV9oZWlnaHQgKyAxKSAqIERFRkFVTFRfUEFHRV9DUFVfTVVMVElQTElFUiAqIGNwdV9vcGVyYXRv cl9jb3N0OwogCWNvc3RzLmluZGV4U3RhcnR1cENvc3QgKz0gZGVzY2VudENvc3Q7CmRpZmYgLS1n aXQgYS9kb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sIGIvZG9jL3NyYy9zZ21sL21vbml0b3Jp bmcuc2dtbAppbmRleCA0MjUwOTA0MmEuLjM4NTIzYjgzMiAxMDA2NDQKLS0tIGEvZG9jL3NyYy9z Z21sL21vbml0b3Jpbmcuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sCkBA IC00MDM1LDYgKzQwMzUsMjEgQEAgZGVzY3JpcHRpb24gfCBXYWl0aW5nIGZvciBhIG5ld2x5IGlu aXRpYWxpemVkIFdBTCBmaWxlIHRvIHJlYWNoIGR1cmFibGUgc3RvcmFnZQogICAgPC9wYXJhPgog ICA8L25vdGU+CiAKKyAgPG5vdGU+CisgICA8cGFyYT4KKyAgICBFdmVyeSB0aW1lIGFuIGluZGV4 IGlzIHNlYXJjaGVkLCB0aGUgaW5kZXgncworICAgIDxzdHJ1Y3RuYW1lPnBnX3N0YXRfYWxsX2lu ZGV4ZXM8L3N0cnVjdG5hbWU+LjxzdHJ1Y3RmaWVsZD5pZHhfc2Nhbjwvc3RydWN0ZmllbGQ+Cisg ICAgZmllbGQgaXMgaW5jcmVtZW50ZWQuICBUaGlzIHVzdWFsbHkgaGFwcGVucyBvbmNlIHBlciBp bmRleCBzY2FuIG5vZGUKKyAgICBleGVjdXRpb24sIGJ1dCBtaWdodCB0YWtlIHBsYWNlIHNldmVy YWwgdGltZXMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBhIHNjYW4KKyAgICB0aGF0IHNlYXJjaGVzIGZv ciBtdWx0aXBsZSB2YWx1ZXMgdG9nZXRoZXIuICBRdWVyaWVzIHRoYXQgdXNlIGNlcnRhaW4KKyAg ICA8YWNyb255bT5TUUw8L2Fjcm9ueW0+IGNvbnN0cnVjdHMgdG8gc2VhcmNoIGZvciByb3dzIG1h dGNoaW5nIGFueSB2YWx1ZQorICAgIG91dCBvZiBhIGxpc3QgKG9yIGFuIGFycmF5KSBvZiBtdWx0 aXBsZSBzY2FsYXIgdmFsdWVzIG1pZ2h0IHBlcmZvcm0KKyAgICBtdWx0aXBsZSA8cXVvdGU+cHJp bWl0aXZlPC9xdW90ZT4gaW5kZXggc2NhbnMgKHVwIHRvIG9uZSBwcmltaXRpdmUgc2NhbgorICAg IHBlciBzY2FsYXIgdmFsdWUpIGF0IHJ1bnRpbWUuICBTZWUgPHhyZWYgbGlua2VuZD0iZnVuY3Rp b25zLWNvbXBhcmlzb25zIi8+CisgICAgZm9yIGRldGFpbHMuCisgICA8L3BhcmE+CisgIDwvbm90 ZT4KKwogIDwvc2VjdDI+CiAKICA8c2VjdDIgaWQ9Im1vbml0b3JpbmctcGctc3RhdGlvLWFsbC10 YWJsZXMtdmlldyI+CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2J0cmVl X2luZGV4Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvYnRyZWVfaW5kZXgub3V0Cmlu ZGV4IDgzMTFhMDNjMy4uZDE1OTA5MWFiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL2J0cmVlX2luZGV4Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2J0 cmVlX2luZGV4Lm91dApAQCAtNDM0LDMgKzQzNCw0ODIgQEAgQUxURVIgSU5ERVggYnRyZWVfcGFy dF9pZHggQUxURVIgQ09MVU1OIGlkIFNFVCAobl9kaXN0aW5jdD0xMDApOwogRVJST1I6ICBBTFRF UiBhY3Rpb24gQUxURVIgQ09MVU1OIC4uLiBTRVQgY2Fubm90IGJlIHBlcmZvcm1lZCBvbiByZWxh dGlvbiAiYnRyZWVfcGFydF9pZHgiCiBERVRBSUw6ICBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3Vw cG9ydGVkIGZvciBwYXJ0aXRpb25lZCBpbmRleGVzLgogRFJPUCBUQUJMRSBidHJlZV9wYXJ0Owor LS0gQWRkIHRlc3RzIHRvIGdpdmUgY292ZXJhZ2Ugb2YgdmFyaW91cyBzdWJ0bGUgaXNzdWVzLgor LS0KKy0tIFhYWCBUaGlzIG1heSBub3QgYmUgc3VpdGFibGUgZm9yIGNvbW1pdCwgZHVlIHRvIHRh a2luZyB1cCB0b28gbWFueSBjeWNsZXMuCistLQorLS0gSGVyZSB3ZSBkb24ndCByZW1lbWJlciB0 aGUgc2NhbidzIGFycmF5IGtleXMgYmVmb3JlIHByb2Nlc3NpbmcgYSBwYWdlLCBvbmx5CistLSBh ZnRlciBwcm9jZXNzaW5nIGEgcGFnZSAod2hpY2ggaXMgaW1wbGljaXQsIGl0J3MganVzdCB0aGUg c2NhbidzIGN1cnJlbnQKKy0tIGtleXMpLiAgU28gd2hlbiB3ZSBtb3ZlIHRoZSBzY2FuIGJhY2t3 YXJkcyB3ZSB0aGluayB0aGF0IHRoZSB0b3AtbGV2ZWwgc2NhbgorLS0gc2hvdWxkIHRlcm1pbmF0 ZSwgd2hlbiBpbiByZWFsaXR5IGl0IHNob3VsZCBqdW1wIGJhY2t3YXJkcyB0byB0aGUgbGVhZiBw YWdlCistLSB0aGF0IHdlIGxhc3QgdmlzaXRlZC4KK2NyZWF0ZSB0ZW1wIHRhYmxlIGJhY2t1cF93 cm9uZ190YmwgKGRpc3RyaWN0IGludDQsIHdhcmVob3VzZSBpbnQ0LCBvcmRlcmlkIGludDQsIG9y ZGVybGluZSBpbnQ0KTsKK2NyZWF0ZSBpbmRleCBiYWNrdXBfd3JvbmdfaWR4IG9uIGJhY2t1cF93 cm9uZ190YmwgKGRpc3RyaWN0LCB3YXJlaG91c2UsIG9yZGVyaWQsIG9yZGVybGluZSk7CitpbnNl cnQgaW50byBiYWNrdXBfd3JvbmdfdGJsCitzZWxlY3QgZGlzdHJpY3QsIHdhcmVob3VzZSwgb3Jk ZXJpZCwgb3JkZXJsaW5lCitmcm9tCisgIGdlbmVyYXRlX3NlcmllcygxLCAzKSBkaXN0cmljdCwK KyAgZ2VuZXJhdGVfc2VyaWVzKDEsIDIpIHdhcmVob3VzZSwKKyAgZ2VuZXJhdGVfc2VyaWVzKDEs IDUxKSBvcmRlcmlkLAorICBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIG9yZGVybGluZTsKK2JlZ2lu OworZGVjbGFyZSBiYWNrX3VwX3Rlcm1pbmF0ZV90b3BsZXZlbF93cm9uZyBjdXJzb3IgZm9yCitz ZWxlY3QgKiBmcm9tIGJhY2t1cF93cm9uZ190YmwKK3doZXJlIGRpc3RyaWN0IGluICgxLCAzKSBh bmQgd2FyZWhvdXNlIGluICgxLDIpCithbmQgb3JkZXJpZCBpbiAoNDgsIDUwKQorb3JkZXIgYnkg ZGlzdHJpY3QsIHdhcmVob3VzZSwgb3JkZXJpZCwgb3JkZXJsaW5lOworZmV0Y2ggZm9yd2FyZCA2 MCBmcm9tIGJhY2tfdXBfdGVybWluYXRlX3RvcGxldmVsX3dyb25nOworIGRpc3RyaWN0IHwgd2Fy ZWhvdXNlIHwgb3JkZXJpZCB8IG9yZGVybGluZSAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0t LS0tLS0tKy0tLS0tLS0tLS0tCisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAg ICAgICAxCisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAyCisgICAg ICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAzCisgICAgICAgIDEgfCAgICAg ICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA0CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAg IDQ4IHwgICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAg ICA2CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA3CisgICAgICAg IDEgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA4CisgICAgICAgIDEgfCAgICAgICAg IDEgfCAgICAgIDQ4IHwgICAgICAgICA5CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDQ4 IHwgICAgICAgIDEwCisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICAx CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICAyCisgICAgICAgIDEg fCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICAzCisgICAgICAgIDEgfCAgICAgICAgIDEg fCAgICAgIDUwIHwgICAgICAgICA0CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwg ICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA2Cisg ICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA3CisgICAgICAgIDEgfCAg ICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA4CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAg ICAgIDUwIHwgICAgICAgICA5CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAg ICAgIDEwCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAxCisgICAg ICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAyCisgICAgICAgIDEgfCAgICAg ICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAzCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAg IDQ4IHwgICAgICAgICA0CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAg ICA1CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA2CisgICAgICAg IDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA3CisgICAgICAgIDEgfCAgICAgICAg IDIgfCAgICAgIDQ4IHwgICAgICAgICA4CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4 IHwgICAgICAgICA5CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgIDEw CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICAxCisgICAgICAgIDEg fCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICAyCisgICAgICAgIDEgfCAgICAgICAgIDIg fCAgICAgIDUwIHwgICAgICAgICAzCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwg ICAgICAgICA0CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA1Cisg ICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA2CisgICAgICAgIDEgfCAg ICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA3CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAg ICAgIDUwIHwgICAgICAgICA4CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAg ICAgICA5CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgIDEwCisgICAg ICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAxCisgICAgICAgIDMgfCAgICAg ICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAyCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAg IDQ4IHwgICAgICAgICAzCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAg ICA0CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA1CisgICAgICAg IDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA2CisgICAgICAgIDMgfCAgICAgICAg IDEgfCAgICAgIDQ4IHwgICAgICAgICA3CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4 IHwgICAgICAgICA4CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA5 CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgIDEwCisgICAgICAgIDMg fCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICAxCisgICAgICAgIDMgfCAgICAgICAgIDEg fCAgICAgIDUwIHwgICAgICAgICAyCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDUwIHwg ICAgICAgICAzCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA0Cisg ICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA1CisgICAgICAgIDMgfCAg ICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA2CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAg ICAgIDUwIHwgICAgICAgICA3CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAg ICAgICA4CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA5CisgICAg ICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgIDEwCisoNjAgcm93cykKKworZmV0 Y2ggYmFja3dhcmQgMjkgZnJvbSBiYWNrX3VwX3Rlcm1pbmF0ZV90b3BsZXZlbF93cm9uZzsKKyBk aXN0cmljdCB8IHdhcmVob3VzZSB8IG9yZGVyaWQgfCBvcmRlcmxpbmUgCistLS0tLS0tLS0tKy0t LS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLQorICAgICAgICAzIHwgICAgICAgICAxIHwg ICAgICA1MCB8ICAgICAgICAgOQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAg ICAgICAgOAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNworICAg ICAgICAzIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNgorICAgICAgICAzIHwgICAg ICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAg ICA1MCB8ICAgICAgICAgNAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAg ICAgMworICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgMgorICAgICAg ICAzIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgMQorICAgICAgICAzIHwgICAgICAg ICAxIHwgICAgICA0OCB8ICAgICAgICAxMAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0 OCB8ICAgICAgICAgOQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAg OAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgNworICAgICAgICAz IHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgNgorICAgICAgICAzIHwgICAgICAgICAx IHwgICAgICA0OCB8ICAgICAgICAgNQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8 ICAgICAgICAgNAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMwor ICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMgorICAgICAgICAzIHwg ICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMQorICAgICAgICAxIHwgICAgICAgICAyIHwg ICAgICA1MCB8ICAgICAgICAxMAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAg ICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgOAorICAg ICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNworICAgICAgICAxIHwgICAg ICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNgorICAgICAgICAxIHwgICAgICAgICAyIHwgICAg ICA1MCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAg ICAgNAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMworICAgICAg ICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMgorICAgICAgICAxIHwgICAgICAg ICAyIHwgICAgICA1MCB8ICAgICAgICAgMQorKDI5IHJvd3MpCisKK2ZldGNoIGZvcndhcmQgMTIg ZnJvbSBiYWNrX3VwX3Rlcm1pbmF0ZV90b3BsZXZlbF93cm9uZzsKKyBkaXN0cmljdCB8IHdhcmVo b3VzZSB8IG9yZGVyaWQgfCBvcmRlcmxpbmUgCistLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0t LS0tLSstLS0tLS0tLS0tLQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAg ICAgMgorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMworICAgICAg ICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAg ICAyIHwgICAgICA1MCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1 MCB8ICAgICAgICAgNgorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAg NworICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgOAorICAgICAgICAx IHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAy IHwgICAgICA1MCB8ICAgICAgICAxMAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8 ICAgICAgICAgMQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMgor ICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMworKDEyIHJvd3MpCisK K2ZldGNoIGJhY2t3YXJkIDMwIGZyb20gYmFja191cF90ZXJtaW5hdGVfdG9wbGV2ZWxfd3Jvbmc7 CisgZGlzdHJpY3QgfCB3YXJlaG91c2UgfCBvcmRlcmlkIHwgb3JkZXJsaW5lIAorLS0tLS0tLS0t LSstLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAgICAgICAgMyB8ICAgICAgICAg MSB8ICAgICAgNDggfCAgICAgICAgIDIKKyAgICAgICAgMyB8ICAgICAgICAgMSB8ICAgICAgNDgg fCAgICAgICAgIDEKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgMTAK KyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDkKKyAgICAgICAgMSB8 ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDgKKyAgICAgICAgMSB8ICAgICAgICAgMiB8 ICAgICAgNTAgfCAgICAgICAgIDcKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAg ICAgICAgIDYKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDUKKyAg ICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDQKKyAgICAgICAgMSB8ICAg ICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDMKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAg ICAgNTAgfCAgICAgICAgIDIKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAg ICAgIDEKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgMTAKKyAgICAg ICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDkKKyAgICAgICAgMSB8ICAgICAg ICAgMiB8ICAgICAgNDggfCAgICAgICAgIDgKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAg NDggfCAgICAgICAgIDcKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAg IDYKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDUKKyAgICAgICAg MSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDQKKyAgICAgICAgMSB8ICAgICAgICAg MiB8ICAgICAgNDggfCAgICAgICAgIDMKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDgg fCAgICAgICAgIDIKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDEK KyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgMTAKKyAgICAgICAgMSB8 ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDkKKyAgICAgICAgMSB8ICAgICAgICAgMSB8 ICAgICAgNTAgfCAgICAgICAgIDgKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAg ICAgICAgIDcKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDYKKyAg ICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDUKKyAgICAgICAgMSB8ICAg ICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDQKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAg ICAgNTAgfCAgICAgICAgIDMKKygzMCByb3dzKQorCitmZXRjaCBmb3J3YXJkICAzMSBmcm9tIGJh Y2tfdXBfdGVybWluYXRlX3RvcGxldmVsX3dyb25nOworIGRpc3RyaWN0IHwgd2FyZWhvdXNlIHwg b3JkZXJpZCB8IG9yZGVybGluZSAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0t LS0tLS0tLS0tCisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA0Cisg ICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA1CisgICAgICAgIDEgfCAg ICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA2CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAg ICAgIDUwIHwgICAgICAgICA3CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAg ICAgICA4CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA5CisgICAg ICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgIDEwCisgICAgICAgIDEgfCAgICAg ICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAxCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAg IDQ4IHwgICAgICAgICAyCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAg ICAzCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA0CisgICAgICAg IDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAg IDIgfCAgICAgIDQ4IHwgICAgICAgICA2CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4 IHwgICAgICAgICA3CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA4 CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA5CisgICAgICAgIDEg fCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgIDEwCisgICAgICAgIDEgfCAgICAgICAgIDIg fCAgICAgIDUwIHwgICAgICAgICAxCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwg ICAgICAgICAyCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICAzCisg ICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA0CisgICAgICAgIDEgfCAg ICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAg ICAgIDUwIHwgICAgICAgICA2CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAg ICAgICA3CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA4CisgICAg ICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA5CisgICAgICAgIDEgfCAgICAg ICAgIDIgfCAgICAgIDUwIHwgICAgICAgIDEwCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAg IDQ4IHwgICAgICAgICAxCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAg ICAyCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAzCisgICAgICAg IDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICA0CisoMzEgcm93cykKKworZmV0Y2gg YmFja3dhcmQgMzIgZnJvbSBiYWNrX3VwX3Rlcm1pbmF0ZV90b3BsZXZlbF93cm9uZzsKKyBkaXN0 cmljdCB8IHdhcmVob3VzZSB8IG9yZGVyaWQgfCBvcmRlcmxpbmUgCistLS0tLS0tLS0tKy0tLS0t LS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAg ICA0OCB8ICAgICAgICAgMworICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAg ICAgMgorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMQorICAgICAg ICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAxMAorICAgICAgICAxIHwgICAgICAg ICAyIHwgICAgICA1MCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1 MCB8ICAgICAgICAgOAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAg NworICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNgorICAgICAgICAx IHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAy IHwgICAgICA1MCB8ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8 ICAgICAgICAgMworICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMgor ICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMQorICAgICAgICAxIHwg ICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAxMAorICAgICAgICAxIHwgICAgICAgICAyIHwg ICAgICA0OCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAg ICAgICAgOAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgNworICAg ICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgNgorICAgICAgICAxIHwgICAg ICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAg ICA0OCB8ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAg ICAgMworICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgMgorICAgICAg ICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgMQorICAgICAgICAxIHwgICAgICAg ICAxIHwgICAgICA1MCB8ICAgICAgICAxMAorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1 MCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAg OAorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNworICAgICAgICAx IHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNgorICAgICAgICAxIHwgICAgICAgICAx IHwgICAgICA1MCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8 ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgMwor ICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgMgorKDMyIHJvd3MpCisK K2ZldGNoIGZvcndhcmQgIDMzIGZyb20gYmFja191cF90ZXJtaW5hdGVfdG9wbGV2ZWxfd3Jvbmc7 CisgZGlzdHJpY3QgfCB3YXJlaG91c2UgfCBvcmRlcmlkIHwgb3JkZXJsaW5lIAorLS0tLS0tLS0t LSstLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0KKyAgICAgICAgMSB8ICAgICAgICAg MSB8ICAgICAgNTAgfCAgICAgICAgIDMKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAg fCAgICAgICAgIDQKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDUK KyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDYKKyAgICAgICAgMSB8 ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgIDcKKyAgICAgICAgMSB8ICAgICAgICAgMSB8 ICAgICAgNTAgfCAgICAgICAgIDgKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAg ICAgICAgIDkKKyAgICAgICAgMSB8ICAgICAgICAgMSB8ICAgICAgNTAgfCAgICAgICAgMTAKKyAg ICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDEKKyAgICAgICAgMSB8ICAg ICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDIKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAg ICAgNDggfCAgICAgICAgIDMKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAg ICAgIDQKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDUKKyAgICAg ICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgIDYKKyAgICAgICAgMSB8ICAgICAg ICAgMiB8ICAgICAgNDggfCAgICAgICAgIDcKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAg NDggfCAgICAgICAgIDgKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAg IDkKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNDggfCAgICAgICAgMTAKKyAgICAgICAg MSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDEKKyAgICAgICAgMSB8ICAgICAgICAg MiB8ICAgICAgNTAgfCAgICAgICAgIDIKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAg fCAgICAgICAgIDMKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDQK KyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDUKKyAgICAgICAgMSB8 ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDYKKyAgICAgICAgMSB8ICAgICAgICAgMiB8 ICAgICAgNTAgfCAgICAgICAgIDcKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAg ICAgICAgIDgKKyAgICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgIDkKKyAg ICAgICAgMSB8ICAgICAgICAgMiB8ICAgICAgNTAgfCAgICAgICAgMTAKKyAgICAgICAgMyB8ICAg ICAgICAgMSB8ICAgICAgNDggfCAgICAgICAgIDEKKyAgICAgICAgMyB8ICAgICAgICAgMSB8ICAg ICAgNDggfCAgICAgICAgIDIKKyAgICAgICAgMyB8ICAgICAgICAgMSB8ICAgICAgNDggfCAgICAg ICAgIDMKKyAgICAgICAgMyB8ICAgICAgICAgMSB8ICAgICAgNDggfCAgICAgICAgIDQKKyAgICAg ICAgMyB8ICAgICAgICAgMSB8ICAgICAgNDggfCAgICAgICAgIDUKKygzMyByb3dzKQorCitmZXRj aCBiYWNrd2FyZCAzNCBmcm9tIGJhY2tfdXBfdGVybWluYXRlX3RvcGxldmVsX3dyb25nOworIGRp c3RyaWN0IHwgd2FyZWhvdXNlIHwgb3JkZXJpZCB8IG9yZGVybGluZSAKKy0tLS0tLS0tLS0rLS0t LS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAg ICAgIDQ4IHwgICAgICAgICA0CisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAg ICAgICAzCisgICAgICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAyCisgICAg ICAgIDMgfCAgICAgICAgIDEgfCAgICAgIDQ4IHwgICAgICAgICAxCisgICAgICAgIDEgfCAgICAg ICAgIDIgfCAgICAgIDUwIHwgICAgICAgIDEwCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAg IDUwIHwgICAgICAgICA5CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAg ICA4CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA3CisgICAgICAg IDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICA2CisgICAgICAgIDEgfCAgICAgICAg IDIgfCAgICAgIDUwIHwgICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUw IHwgICAgICAgICA0CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICAz CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICAyCisgICAgICAgIDEg fCAgICAgICAgIDIgfCAgICAgIDUwIHwgICAgICAgICAxCisgICAgICAgIDEgfCAgICAgICAgIDIg fCAgICAgIDQ4IHwgICAgICAgIDEwCisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwg ICAgICAgICA5CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA4Cisg ICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA3CisgICAgICAgIDEgfCAg ICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICA2CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAg ICAgIDQ4IHwgICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAg ICAgICA0CisgICAgICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAzCisgICAg ICAgIDEgfCAgICAgICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAyCisgICAgICAgIDEgfCAgICAg ICAgIDIgfCAgICAgIDQ4IHwgICAgICAgICAxCisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAg IDUwIHwgICAgICAgIDEwCisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAg ICA5CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA4CisgICAgICAg IDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA3CisgICAgICAgIDEgfCAgICAgICAg IDEgfCAgICAgIDUwIHwgICAgICAgICA2CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUw IHwgICAgICAgICA1CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICA0 CisgICAgICAgIDEgfCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICAzCisgICAgICAgIDEg fCAgICAgICAgIDEgfCAgICAgIDUwIHwgICAgICAgICAyCisgICAgICAgIDEgfCAgICAgICAgIDEg fCAgICAgIDUwIHwgICAgICAgICAxCisoMzQgcm93cykKKworZmV0Y2ggZm9yd2FyZCAgMzUgZnJv bSBiYWNrX3VwX3Rlcm1pbmF0ZV90b3BsZXZlbF93cm9uZzsKKyBkaXN0cmljdCB8IHdhcmVob3Vz ZSB8IG9yZGVyaWQgfCBvcmRlcmxpbmUgCistLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0t LSstLS0tLS0tLS0tLQorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAg MgorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgMworICAgICAgICAx IHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAgICAx IHwgICAgICA1MCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8 ICAgICAgICAgNgorICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgNwor ICAgICAgICAxIHwgICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgOAorICAgICAgICAxIHwg ICAgICAgICAxIHwgICAgICA1MCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAxIHwg ICAgICA1MCB8ICAgICAgICAxMAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAg ICAgICAgMQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgMgorICAg ICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgMworICAgICAgICAxIHwgICAg ICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAg ICA0OCB8ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAg ICAgNgorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgNworICAgICAg ICAxIHwgICAgICAgICAyIHwgICAgICA0OCB8ICAgICAgICAgOAorICAgICAgICAxIHwgICAgICAg ICAyIHwgICAgICA0OCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA0 OCB8ICAgICAgICAxMAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAg MQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMgorICAgICAgICAx IHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgMworICAgICAgICAxIHwgICAgICAgICAy IHwgICAgICA1MCB8ICAgICAgICAgNAorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8 ICAgICAgICAgNQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNgor ICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgNworICAgICAgICAxIHwg ICAgICAgICAyIHwgICAgICA1MCB8ICAgICAgICAgOAorICAgICAgICAxIHwgICAgICAgICAyIHwg ICAgICA1MCB8ICAgICAgICAgOQorICAgICAgICAxIHwgICAgICAgICAyIHwgICAgICA1MCB8ICAg ICAgICAxMAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMQorICAg ICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMgorICAgICAgICAzIHwgICAg ICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgMworICAgICAgICAzIHwgICAgICAgICAxIHwgICAg ICA0OCB8ICAgICAgICAgNAorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAg ICAgNQorICAgICAgICAzIHwgICAgICAgICAxIHwgICAgICA0OCB8ICAgICAgICAgNgorKDM1IHJv d3MpCisKK2NvbW1pdDsKK2NyZWF0ZSB0ZW1wIHRhYmxlIG91dGVyX3RhYmxlICAgICAgICAgICAg ICAgICAgKGEgaW50LCBiIGludCk7CitjcmVhdGUgdGVtcCB0YWJsZSByZXN0b3JlX2J1Z2d5X3By aW1zY2FuX3RhYmxlICh4IGludCwgeSBpbnQpOworY3JlYXRlIGluZGV4IGJ1Z2d5X2lkeCBvbiBy ZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlICh4LCB5KSB3aXRoIChkZWR1cGxpY2F0ZV9pdGVt cz1vZmYpOworaW5zZXJ0IGludG8gb3V0ZXJfdGFibGUgICAgICAgICAgICAgICAgICBzZWxlY3Qg MSwgYl92YWxzIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEwMDYsIDE1ODApIGJfdmFsczsKK2luc2Vy dCBpbnRvIHJlc3RvcmVfYnVnZ3lfcHJpbXNjYW5fdGFibGUgc2VsZWN0IDEsIHhfdmFscyBmcm9t IGdlbmVyYXRlX3NlcmllcygxMDA2LCAxNTgwKSB4X3ZhbHM7CitpbnNlcnQgaW50byBvdXRlcl90 YWJsZSAgICAgICAgICAgICAgICAgIHNlbGVjdCAxLCAxMzcwIGZyb20gZ2VuZXJhdGVfc2VyaWVz KDEsIDkpIGo7CitpbnNlcnQgaW50byByZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlIHNlbGVj dCAxLCAxMzcxIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsIDkpIGo7CitpbnNlcnQgaW50byByZXN0 b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlIHNlbGVjdCAxLCAxMzgwIGZyb20gZ2VuZXJhdGVfc2Vy aWVzKDEsIDkpIGo7Cit2YWN1dW0gYW5hbHl6ZSBvdXRlcl90YWJsZTsKK3ZhY3V1bSBhbmFseXpl IHJlc3RvcmVfYnVnZ3lfcHJpbXNjYW5fdGFibGU7CitzZWxlY3QgY291bnQoKiksIG8uYSwgby5i CisgIGZyb20KKyAgICBvdXRlcl90YWJsZSBvCisgIGlubmVyIGpvaW4KKyAgICByZXN0b3JlX2J1 Z2d5X3ByaW1zY2FuX3RhYmxlIGJ1ZworICBvbiBvLmEgPSBidWcueCBhbmQgby5iID0gYnVnLnkK K3doZXJlCisgIGJ1Zy54ID0gMSBhbmQKKyAgYnVnLnkgPSBhbnkoYXJyYXlbKHNlbGVjdCBhcnJh eV9hZ2coaSkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMTM3MCwgMTM5MCkgaSB3aGVyZSBpICUgMTAg PSAwKV0pCitncm91cCBieSBvLmEsIG8uYjsKKyBjb3VudCB8IGEgfCAgYiAgIAorLS0tLS0tLSst LS0rLS0tLS0tCisgICAgMTAgfCAxIHwgMTM3MAorICAgIDEwIHwgMSB8IDEzODAKKyAgICAgMSB8 IDEgfCAxMzkwCisoMyByb3dzKQorCistLSBHZXQgdGVzdCBjb3ZlcmFnZSBmb3Igd2hlbiBzby0+ bmVlZFByaW1TY2FuIGlzIHNldCBhdCB0aGUgcG9pbnQgb2YgY2FsbGluZworLS0gX2J0X3Jlc3Rv cmVfYXJyYXlfa2V5cygpLiAgVGhpcyBpcyBoYW5kbGVkIGxpa2UgdGhlIGNhc2Ugd2hlcmUgdGhl IHNjYW4KKy0tIGRpcmVjdGlvbiBjaGFuZ2VzICJ3aXRoaW4iIGEgcGFnZSwgcmVseWluZyBvbiBj b2RlIGZyb20gX2J0X3JlYWRuZXh0cGFnZSgpLgorY3JlYXRlIHRlbXAgdGFibGUgb3V0ZXJfdGFi KAorICBhIGludCwKKyAgYiBpbnQKKyk7CitjcmVhdGUgaW5kZXggb3V0ZXJfdGFiX2lkeCBvbiBv dXRlcl90YWIoYSwgYikgd2l0aCAoZGVkdXBsaWNhdGVfaXRlbXMgPSBvZmYpOworY3JlYXRlIHRl bXAgdGFibGUgcHJpbXNjYW5tYXJrY292X3RhYmxlKAorICBhIGludCwKKyAgYiBpbnQKKyk7Citj cmVhdGUgaW5kZXggaW50ZXJlc3RpbmdfY292ZXJhZ2VfaWR4IG9uIHByaW1zY2FubWFya2Nvdl90 YWJsZShhLCBiKSB3aXRoIChkZWR1cGxpY2F0ZV9pdGVtcyA9IG9mZik7CitpbnNlcnQgaW50byBv dXRlcl90YWIgICAgICAgICAgICAgc2VsZWN0IDEsIGkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMTUz MCwgMTc4MCkgaTsKK2luc2VydCBpbnRvIHByaW1zY2FubWFya2Nvdl90YWJsZSBzZWxlY3QgMSwg aSBmcm9tIGdlbmVyYXRlX3NlcmllcygxNTMwLCAxNzgwKSBpOworaW5zZXJ0IGludG8gb3V0ZXJf dGFiICAgICAgICAgICAgIHNlbGVjdCAxLCAxNTUwIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsIDIw MCkgaTsKK2luc2VydCBpbnRvIHByaW1zY2FubWFya2Nvdl90YWJsZSBzZWxlY3QgMSwgMTU1MSBm cm9tIGdlbmVyYXRlX3NlcmllcygxLCAyMDApIGk7Cit2YWN1dW0gYW5hbHl6ZSBvdXRlcl90YWI7 Cit2YWN1dW0gYW5hbHl6ZSBwcmltc2Nhbm1hcmtjb3ZfdGFibGUgOword2l0aCByYW5nZV9pbnRz IGFzICggc2VsZWN0IGkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMTUzMCwgMTc4MCkgaSkKK3NlbGVj dAorICBjb3VudCgqKSwgYnVnZ3kuYSwgYnVnZ3kuYiBmcm9tCitvdXRlcl90YWIgbworICBpbm5l ciBqb2luCitwcmltc2Nhbm1hcmtjb3ZfdGFibGUgYnVnZ3kKKyAgb24gby5hID0gYnVnZ3kuYSBh bmQgby5iID0gYnVnZ3kuYgord2hlcmUKKyAgby5hID0gMSAgICAgYW5kICAgICBvLmIgPSBhbnkg KGFycmF5WyhzZWxlY3QgYXJyYXlfYWdnKGkpIGZyb20gcmFuZ2VfaW50cyB3aGVyZSBpICUgNTAg PSAwKV0pICBhbmQKKyAgYnVnZ3kuYSA9IDEgYW5kIGJ1Z2d5LmIgPSBhbnkgKGFycmF5WyhzZWxl Y3QgYXJyYXlfYWdnKGkpIGZyb20gcmFuZ2VfaW50cyB3aGVyZSBpICUgNTAgPSAwKV0pCitncm91 cCBieSBidWdneS5hLCBidWdneS5iCitvcmRlciBieSBidWdneS5hLCBidWdneS5iOworIGNvdW50 IHwgYSB8ICBiICAgCistLS0tLS0tKy0tLSstLS0tLS0KKyAgIDIwMSB8IDEgfCAxNTUwCisgICAg IDEgfCAxIHwgMTYwMAorICAgICAxIHwgMSB8IDE2NTAKKyAgICAgMSB8IDEgfCAxNzAwCisgICAg IDEgfCAxIHwgMTc1MAorKDUgcm93cykKKworLS0gR2V0IHRlc3QgY292ZXJhZ2UgZm9yIHdoZW4g c28tPm5lZWRQcmltU2NhbiBpcyBzZXQgYXQgdGhlIHBvaW50IG9mIGNhbGxpbmcKKy0tIF9idF9y ZXN0b3JlX2FycmF5X2tleXMoKSBmb3IgYmFja3dhcmRzIHNjYW5zLiAgTW9yZSBvciBsZXNzIGNv bXBhcmFibGUgdG8KKy0tIHRoZSBsYXN0IHRlc3QuCitjcmVhdGUgdGVtcCB0YWJsZSBiYWNrd2Fy ZHNfcHJpbV9vdXRlcl90YWJsZSAgICAgICAgICAgICAoYSBpbnQsIGIgaW50KTsKK2NyZWF0ZSB0 ZW1wIHRhYmxlIGJhY2t3YXJkc19yZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlICh4IGludCwg eSBpbnQpOworY3JlYXRlIGluZGV4IGJhY2t3YXJkX3ByaW1fYnVnZ3lfaWR4ICBvbiBiYWNrd2Fy ZHNfcmVzdG9yZV9idWdneV9wcmltc2Nhbl90YWJsZSAoeCwgeSkgd2l0aCAoZGVkdXBsaWNhdGVf aXRlbXM9b2ZmKTsKK2NyZWF0ZSBpbmRleCBiYWNrd2FyZHNfcHJpbV9kcml2ZV9pZHggb24gYmFj a3dhcmRzX3ByaW1fb3V0ZXJfdGFibGUgICAgICAgICAgICAgKGEsIGIpIHdpdGggKGRlZHVwbGlj YXRlX2l0ZW1zPW9mZik7CitpbnNlcnQgaW50byBiYWNrd2FyZHNfcHJpbV9vdXRlcl90YWJsZSAg ICAgICAgICAgICAgICAgIHNlbGVjdCAwLCAxMzYwOworaW5zZXJ0IGludG8gYmFja3dhcmRzX3By aW1fb3V0ZXJfdGFibGUgICAgICAgICAgICAgICAgICBzZWxlY3QgMSwgYl92YWxzIGZyb20gZ2Vu ZXJhdGVfc2VyaWVzKDEwMTIsIDE0MDYpIGJfdmFscyB3aGVyZSBiX3ZhbHMgJSAxMCA9IDA7Citp bnNlcnQgaW50byBiYWNrd2FyZHNfcHJpbV9vdXRlcl90YWJsZSAgICAgICAgICAgICAgICAgIHNl bGVjdCAxLCAxMzcwOwordmFjdXVtIGFuYWx5emUgYmFja3dhcmRzX3ByaW1fb3V0ZXJfdGFibGU7 IC0tIEJlIHRpZHkKKy0tIEZpbGwgdXAgImJhY2t3YXJkc19wcmltX2RyaXZlX2lkeCIgaW5kZXgg d2l0aCAzOTYgaXRlbXMsIGp1c3QgYWJvdXQgZml0dGluZworLS0gb250byBpdHMgb25seSBwYWdl LCB3aGljaCBpcyBhIHJvb3QgbGVhZiBwYWdlOgoraW5zZXJ0IGludG8gYmFja3dhcmRzX3Jlc3Rv cmVfYnVnZ3lfcHJpbXNjYW5fdGFibGUgc2VsZWN0IDAsIDEzNjA7CitpbnNlcnQgaW50byBiYWNr d2FyZHNfcmVzdG9yZV9idWdneV9wcmltc2Nhbl90YWJsZSBzZWxlY3QgMSwgeF92YWxzIGZyb20g Z2VuZXJhdGVfc2VyaWVzKDEwMTIsIDE0MDYpIHhfdmFsczsKK3ZhY3V1bSBhbmFseXplIGJhY2t3 YXJkc19yZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlOyAtLSBCZSB0aWR5CistLSBOb3cgY2F1 c2UgdHdvIHBhZ2Ugc3BsaXRzLCBsZWF2aW5nIDQgbGVhZiBwYWdlcyBpbiB0b3RhbDoKK2luc2Vy dCBpbnRvIGJhY2t3YXJkc19yZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlIHNlbGVjdCAxLCAx MzcwIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsMjUwKSBpOworLS0gTm93ICJidWdneSIgaW5kZXgg bG9va3MgbGlrZSB0aGlzOgorLS0KKy0tIOKUjOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU rOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU rOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUkAorLS0g4pSCIGkg4pSCIGJsa25vIOKUgiBmbGFncyDilIIgbmh0aWRzIOKU giBuaGJsa3Mg4pSCIG5kZWFkaGJsa3Mg4pSCIG5saXZlIOKUgiBuZGVhZCDilIIgbmh0aWRzY2hl Y2tzaW1wbGUg4pSCIGF2Z3NpemUg4pSCIGZyZWVzcGFjZSDilIIgICAgIGhpZ2hrZXkgICAgICDi lIIKKy0tIOKUnOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUvOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUpAorLS0g 4pSCIDEg4pSCICAgICAxIOKUgiAgICAgMSDilIIgICAgMjAzIOKUgiAgICAgIDEg4pSCICAgICAg ICAgIDAg4pSCICAgMjA0IOKUgiAgICAgMCDilIIgICAgICAgICAgICAgICAgIDAg4pSCICAgICAg MTYg4pSCICAgICA0LDA2OCDilIIgKHgsIHkpPSgxLCAxMjE0KSDilIIKKy0tIOKUgiAyIOKUgiAg ICAgNCDilIIgICAgIDEg4pSCICAgIDE1NiDilIIgICAgICAyIOKUgiAgICAgICAgICAwIOKUgiAg IDE1NyDilIIgICAgIDAg4pSCICAgICAgICAgICAgICAgICAwIOKUgiAgICAgIDE2IOKUgiAgICAg NSwwMDgg4pSCICh4LCB5KT0oMSwgMTM3MCkg4pSCCistLSDilIIgMyDilIIgICAgIDUg4pSCICAg ICAxIOKUgiAgICAyNTEg4pSCICAgICAgMiDilIIgICAgICAgICAgMCDilIIgICAyNTIg4pSCICAg ICAwIOKUgiAgICAgICAgICAgICAgICAgMCDilIIgICAgICAxNiDilIIgICAgIDMsMTA4IOKUgiAo eCwgeSk9KDEsIDEzNzEpIOKUggorLS0g4pSCIDQg4pSCICAgICAyIOKUgiAgICAgMSDilIIgICAg IDM2IOKUgiAgICAgIDEg4pSCICAgICAgICAgIDAg4pSCICAgIDM2IOKUgiAgICAgMCDilIIgICAg ICAgICAgICAgICAgIDAg4pSCICAgICAgMTYg4pSCICAgICA3LDQyOCDilIIg4oiFICAgICAgICAg ICAgICAgIOKUggorLS0g4pSU4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS0 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pS04pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSYCitzZWxlY3QgY291bnQoKiksIG8uYSwgby5iCisgIGZyb20KKyAgICBiYWNrd2FyZHNfcHJp bV9vdXRlcl90YWJsZSBvCisgIGlubmVyIGpvaW4KKyAgICBiYWNrd2FyZHNfcmVzdG9yZV9idWdn eV9wcmltc2Nhbl90YWJsZSBidWcKKyAgb24gby5hID0gYnVnLnggYW5kIG8uYiA9IGJ1Zy55Cit3 aGVyZQorICBidWcueCBpbiAoMCwgMSkgYW5kCisgIGJ1Zy55ID0gYW55KGFycmF5WyhzZWxlY3Qg YXJyYXlfYWdnKGkpIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEzNjAsIDEzNzApIGkgd2hlcmUgaSAl IDEwID0gMCldKQorZ3JvdXAgYnkgby5hLCBvLmIKK29yZGVyIGJ5IG8uYSBkZXNjLCBvLmIgZGVz YzsKKyBjb3VudCB8IGEgfCAgYiAgIAorLS0tLS0tLSstLS0rLS0tLS0tCisgICA1MDIgfCAxIHwg MTM3MAorICAgICAxIHwgMSB8IDEzNjAKKyAgICAgMSB8IDAgfCAxMzYwCisoMyByb3dzKQorCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQKaW5kZXggNDQ2Y2ZhNjc4 Li5iNTA0MDljN2YgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRl X2luZGV4Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5v dXQKQEAgLTE5MTAsNyArMTkxMCw3IEBAIFNFTEVDVCBjb3VudCgqKSBGUk9NIGR1cGluZGV4Y29s cwogKDEgcm93KQogCiAtLQotLS0gQ2hlY2sgb3JkZXJpbmcgb2YgPUFOWSBpbmRleHF1YWwgcmVz dWx0cyAoYnVnIGluIDkuMi4wKQorLS0gQ2hlY2sgdGhhdCBpbmRleCBzY2FucyB3aXRoID1BTlkg aW5kZXhxdWFscyByZXR1cm4gcm93cyBpbiBpbmRleCBvcmRlcgogLS0KIGV4cGxhaW4gKGNvc3Rz IG9mZikKIFNFTEVDVCB1bmlxdWUxIEZST00gdGVuazEKQEAgLTE5MzYsMTIgKzE5MzYsMTEgQEAg ZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsx CiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBC WSB0aG91c2FuZDsKLSAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQogIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5r MQotICAgSW5kZXggQ29uZDogKHRob3VzYW5kIDwgMikKLSAgIEZpbHRlcjogKHRlbnRob3VzID0g QU5ZICgnezEwMDEsMzAwMH0nOjppbnRlZ2VyW10pKQotKDMgcm93cykKKyAgIEluZGV4IENvbmQ6 ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5ZICgnezEwMDEsMzAwMH0nOjppbnRl Z2VyW10pKSkKKygyIHJvd3MpCiAKIFNFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5r MQogV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQpAQCAtMTk1 MiwyOSArMTk1MSwyNSBAQCBPUkRFUiBCWSB0aG91c2FuZDsKICAgICAgICAgMSB8ICAgICAxMDAx CiAoMiByb3dzKQogCi1TRVQgZW5hYmxlX2luZGV4b25seXNjYW4gPSBPRkY7CiBleHBsYWluIChj b3N0cyBvZmYpCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRo b3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKLU9SREVSIEJZIHRob3VzYW5k OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCi0gU29ydAotICAgU29ydCBLZXk6IHRob3VzYW5kCi0gICAtPiAgSW5kZXggU2NhbiB1 c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBvbiB0ZW5rMQotICAgICAgICAgSW5kZXggQ29uZDog KCh0aG91c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVn ZXJbXSkpKQotKDQgcm93cykKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRlbnRob3VzIERFU0M7 CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRl eCBPbmx5IFNjYW4gQmFja3dhcmQgdXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMgb24gdGVuazEK KyAgIEluZGV4IENvbmQ6ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRob3VzID0gQU5ZICgnezEw MDEsMzAwMH0nOjppbnRlZ2VyW10pKSkKKygyIHJvd3MpCiAKIFNFTEVDVCB0aG91c2FuZCwgdGVu dGhvdXMgRlJPTSB0ZW5rMQogV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAw MSwzMDAwKQotT1JERVIgQlkgdGhvdXNhbmQ7CitPUkRFUiBCWSB0aG91c2FuZCBERVNDLCB0ZW50 aG91cyBERVNDOwogIHRob3VzYW5kIHwgdGVudGhvdXMgCiAtLS0tLS0tLS0tKy0tLS0tLS0tLS0K LSAgICAgICAgMCB8ICAgICAzMDAwCiAgICAgICAgIDEgfCAgICAgMTAwMQorICAgICAgICAwIHwg ICAgIDMwMDAKICgyIHJvd3MpCiAKLVJFU0VUIGVuYWJsZV9pbmRleG9ubHlzY2FuOwogLS0KIC0t IENoZWNrIGVsaW1pbmF0aW9uIG9mIGNvbnN0YW50LU5VTEwgc3ViZXhwcmVzc2lvbnMKIC0tCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0IGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCAyYzczMjcwMTQuLjg2ZTU0MTc4MCAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0CkBAIC04NjgwLDEwICs4NjgwLDkgQEAgd2hlcmUg ajEuaWQxICUgMTAwMCA9IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAxIGFuZCBqMi5pZDEgPj0gYW55 IChhcnJheVsxLDVdKTsKICAgIE1lcmdlIENvbmQ6IChqMS5pZDEgPSBqMi5pZDEpCiAgICBKb2lu IEZpbHRlcjogKGoyLmlkMiA9IGoxLmlkMikKICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIGoxX2lk MV9pZHggb24gajEKLSAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajJfcGtleSBvbiBqMgor ICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgajJfaWQxX2lkeCBvbiBqMgogICAgICAgICAgSW5kZXgg Q29uZDogKGlkMSA+PSBBTlkgKCd7MSw1fSc6OmludGVnZXJbXSkpCi0gICAgICAgICBGaWx0ZXI6 ICgoaWQxICUgMTAwMCkgPSAxKQotKDcgcm93cykKKyg2IHJvd3MpCiAKIHNlbGVjdCAqIGZyb20g ajEKIGlubmVyIGpvaW4gajIgb24gajEuaWQxID0gajIuaWQxIGFuZCBqMS5pZDIgPSBqMi5pZDIK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2J0cmVlX2luZGV4LnNxbCBiL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2J0cmVlX2luZGV4LnNxbAppbmRleCBlZjg0MzU0MjMuLjMzMGVkYmIx ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvYnRyZWVfaW5kZXguc3FsCisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2J0cmVlX2luZGV4LnNxbApAQCAtMjY3LDMgKzI2NywxNTAg QEAgQ1JFQVRFIFRBQkxFIGJ0cmVlX3BhcnQgKGlkIGludDQpIFBBUlRJVElPTiBCWSBSQU5HRSAo aWQpOwogQ1JFQVRFIElOREVYIGJ0cmVlX3BhcnRfaWR4IE9OIGJ0cmVlX3BhcnQoaWQpOwogQUxU RVIgSU5ERVggYnRyZWVfcGFydF9pZHggQUxURVIgQ09MVU1OIGlkIFNFVCAobl9kaXN0aW5jdD0x MDApOwogRFJPUCBUQUJMRSBidHJlZV9wYXJ0OworCistLSBBZGQgdGVzdHMgdG8gZ2l2ZSBjb3Zl cmFnZSBvZiB2YXJpb3VzIHN1YnRsZSBpc3N1ZXMuCistLQorLS0gWFhYIFRoaXMgbWF5IG5vdCBi ZSBzdWl0YWJsZSBmb3IgY29tbWl0LCBkdWUgdG8gdGFraW5nIHVwIHRvbyBtYW55IGN5Y2xlcy4K Ky0tCistLSBIZXJlIHdlIGRvbid0IHJlbWVtYmVyIHRoZSBzY2FuJ3MgYXJyYXkga2V5cyBiZWZv cmUgcHJvY2Vzc2luZyBhIHBhZ2UsIG9ubHkKKy0tIGFmdGVyIHByb2Nlc3NpbmcgYSBwYWdlICh3 aGljaCBpcyBpbXBsaWNpdCwgaXQncyBqdXN0IHRoZSBzY2FuJ3MgY3VycmVudAorLS0ga2V5cyku ICBTbyB3aGVuIHdlIG1vdmUgdGhlIHNjYW4gYmFja3dhcmRzIHdlIHRoaW5rIHRoYXQgdGhlIHRv cC1sZXZlbCBzY2FuCistLSBzaG91bGQgdGVybWluYXRlLCB3aGVuIGluIHJlYWxpdHkgaXQgc2hv dWxkIGp1bXAgYmFja3dhcmRzIHRvIHRoZSBsZWFmIHBhZ2UKKy0tIHRoYXQgd2UgbGFzdCB2aXNp dGVkLgorY3JlYXRlIHRlbXAgdGFibGUgYmFja3VwX3dyb25nX3RibCAoZGlzdHJpY3QgaW50NCwg d2FyZWhvdXNlIGludDQsIG9yZGVyaWQgaW50NCwgb3JkZXJsaW5lIGludDQpOworY3JlYXRlIGlu ZGV4IGJhY2t1cF93cm9uZ19pZHggb24gYmFja3VwX3dyb25nX3RibCAoZGlzdHJpY3QsIHdhcmVo b3VzZSwgb3JkZXJpZCwgb3JkZXJsaW5lKTsKK2luc2VydCBpbnRvIGJhY2t1cF93cm9uZ190YmwK K3NlbGVjdCBkaXN0cmljdCwgd2FyZWhvdXNlLCBvcmRlcmlkLCBvcmRlcmxpbmUKK2Zyb20KKyAg Z2VuZXJhdGVfc2VyaWVzKDEsIDMpIGRpc3RyaWN0LAorICBnZW5lcmF0ZV9zZXJpZXMoMSwgMikg d2FyZWhvdXNlLAorICBnZW5lcmF0ZV9zZXJpZXMoMSwgNTEpIG9yZGVyaWQsCisgIGdlbmVyYXRl X3NlcmllcygxLCAxMCkgb3JkZXJsaW5lOworCitiZWdpbjsKK2RlY2xhcmUgYmFja191cF90ZXJt aW5hdGVfdG9wbGV2ZWxfd3JvbmcgY3Vyc29yIGZvcgorc2VsZWN0ICogZnJvbSBiYWNrdXBfd3Jv bmdfdGJsCit3aGVyZSBkaXN0cmljdCBpbiAoMSwgMykgYW5kIHdhcmVob3VzZSBpbiAoMSwyKQor YW5kIG9yZGVyaWQgaW4gKDQ4LCA1MCkKK29yZGVyIGJ5IGRpc3RyaWN0LCB3YXJlaG91c2UsIG9y ZGVyaWQsIG9yZGVybGluZTsKKworZmV0Y2ggZm9yd2FyZCA2MCBmcm9tIGJhY2tfdXBfdGVybWlu YXRlX3RvcGxldmVsX3dyb25nOworZmV0Y2ggYmFja3dhcmQgMjkgZnJvbSBiYWNrX3VwX3Rlcm1p bmF0ZV90b3BsZXZlbF93cm9uZzsKK2ZldGNoIGZvcndhcmQgMTIgZnJvbSBiYWNrX3VwX3Rlcm1p bmF0ZV90b3BsZXZlbF93cm9uZzsKK2ZldGNoIGJhY2t3YXJkIDMwIGZyb20gYmFja191cF90ZXJt aW5hdGVfdG9wbGV2ZWxfd3Jvbmc7CitmZXRjaCBmb3J3YXJkICAzMSBmcm9tIGJhY2tfdXBfdGVy bWluYXRlX3RvcGxldmVsX3dyb25nOworZmV0Y2ggYmFja3dhcmQgMzIgZnJvbSBiYWNrX3VwX3Rl cm1pbmF0ZV90b3BsZXZlbF93cm9uZzsKK2ZldGNoIGZvcndhcmQgIDMzIGZyb20gYmFja191cF90 ZXJtaW5hdGVfdG9wbGV2ZWxfd3Jvbmc7CitmZXRjaCBiYWNrd2FyZCAzNCBmcm9tIGJhY2tfdXBf dGVybWluYXRlX3RvcGxldmVsX3dyb25nOworZmV0Y2ggZm9yd2FyZCAgMzUgZnJvbSBiYWNrX3Vw X3Rlcm1pbmF0ZV90b3BsZXZlbF93cm9uZzsKK2NvbW1pdDsKKworY3JlYXRlIHRlbXAgdGFibGUg b3V0ZXJfdGFibGUgICAgICAgICAgICAgICAgICAoYSBpbnQsIGIgaW50KTsKK2NyZWF0ZSB0ZW1w IHRhYmxlIHJlc3RvcmVfYnVnZ3lfcHJpbXNjYW5fdGFibGUgKHggaW50LCB5IGludCk7CisKK2Ny ZWF0ZSBpbmRleCBidWdneV9pZHggb24gcmVzdG9yZV9idWdneV9wcmltc2Nhbl90YWJsZSAoeCwg eSkgd2l0aCAoZGVkdXBsaWNhdGVfaXRlbXM9b2ZmKTsKKworaW5zZXJ0IGludG8gb3V0ZXJfdGFi bGUgICAgICAgICAgICAgICAgICBzZWxlY3QgMSwgYl92YWxzIGZyb20gZ2VuZXJhdGVfc2VyaWVz KDEwMDYsIDE1ODApIGJfdmFsczsKK2luc2VydCBpbnRvIHJlc3RvcmVfYnVnZ3lfcHJpbXNjYW5f dGFibGUgc2VsZWN0IDEsIHhfdmFscyBmcm9tIGdlbmVyYXRlX3NlcmllcygxMDA2LCAxNTgwKSB4 X3ZhbHM7CisKK2luc2VydCBpbnRvIG91dGVyX3RhYmxlICAgICAgICAgICAgICAgICAgc2VsZWN0 IDEsIDEzNzAgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwgOSkgajsKK2luc2VydCBpbnRvIHJlc3Rv cmVfYnVnZ3lfcHJpbXNjYW5fdGFibGUgc2VsZWN0IDEsIDEzNzEgZnJvbSBnZW5lcmF0ZV9zZXJp ZXMoMSwgOSkgajsKK2luc2VydCBpbnRvIHJlc3RvcmVfYnVnZ3lfcHJpbXNjYW5fdGFibGUgc2Vs ZWN0IDEsIDEzODAgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwgOSkgajsKKwordmFjdXVtIGFuYWx5 emUgb3V0ZXJfdGFibGU7Cit2YWN1dW0gYW5hbHl6ZSByZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3Rh YmxlOworCitzZWxlY3QgY291bnQoKiksIG8uYSwgby5iCisgIGZyb20KKyAgICBvdXRlcl90YWJs ZSBvCisgIGlubmVyIGpvaW4KKyAgICByZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlIGJ1Zwor ICBvbiBvLmEgPSBidWcueCBhbmQgby5iID0gYnVnLnkKK3doZXJlCisgIGJ1Zy54ID0gMSBhbmQK KyAgYnVnLnkgPSBhbnkoYXJyYXlbKHNlbGVjdCBhcnJheV9hZ2coaSkgZnJvbSBnZW5lcmF0ZV9z ZXJpZXMoMTM3MCwgMTM5MCkgaSB3aGVyZSBpICUgMTAgPSAwKV0pCitncm91cCBieSBvLmEsIG8u YjsKKworLS0gR2V0IHRlc3QgY292ZXJhZ2UgZm9yIHdoZW4gc28tPm5lZWRQcmltU2NhbiBpcyBz ZXQgYXQgdGhlIHBvaW50IG9mIGNhbGxpbmcKKy0tIF9idF9yZXN0b3JlX2FycmF5X2tleXMoKS4g IFRoaXMgaXMgaGFuZGxlZCBsaWtlIHRoZSBjYXNlIHdoZXJlIHRoZSBzY2FuCistLSBkaXJlY3Rp b24gY2hhbmdlcyAid2l0aGluIiBhIHBhZ2UsIHJlbHlpbmcgb24gY29kZSBmcm9tIF9idF9yZWFk bmV4dHBhZ2UoKS4KK2NyZWF0ZSB0ZW1wIHRhYmxlIG91dGVyX3RhYigKKyAgYSBpbnQsCisgIGIg aW50CispOworY3JlYXRlIGluZGV4IG91dGVyX3RhYl9pZHggb24gb3V0ZXJfdGFiKGEsIGIpIHdp dGggKGRlZHVwbGljYXRlX2l0ZW1zID0gb2ZmKTsKKworY3JlYXRlIHRlbXAgdGFibGUgcHJpbXNj YW5tYXJrY292X3RhYmxlKAorICBhIGludCwKKyAgYiBpbnQKKyk7CitjcmVhdGUgaW5kZXggaW50 ZXJlc3RpbmdfY292ZXJhZ2VfaWR4IG9uIHByaW1zY2FubWFya2Nvdl90YWJsZShhLCBiKSB3aXRo IChkZWR1cGxpY2F0ZV9pdGVtcyA9IG9mZik7CisKK2luc2VydCBpbnRvIG91dGVyX3RhYiAgICAg ICAgICAgICBzZWxlY3QgMSwgaSBmcm9tIGdlbmVyYXRlX3NlcmllcygxNTMwLCAxNzgwKSBpOwor aW5zZXJ0IGludG8gcHJpbXNjYW5tYXJrY292X3RhYmxlIHNlbGVjdCAxLCBpIGZyb20gZ2VuZXJh dGVfc2VyaWVzKDE1MzAsIDE3ODApIGk7CisKK2luc2VydCBpbnRvIG91dGVyX3RhYiAgICAgICAg ICAgICBzZWxlY3QgMSwgMTU1MCBmcm9tIGdlbmVyYXRlX3NlcmllcygxLCAyMDApIGk7CitpbnNl cnQgaW50byBwcmltc2Nhbm1hcmtjb3ZfdGFibGUgc2VsZWN0IDEsIDE1NTEgZnJvbSBnZW5lcmF0 ZV9zZXJpZXMoMSwgMjAwKSBpOworCit2YWN1dW0gYW5hbHl6ZSBvdXRlcl90YWI7Cit2YWN1dW0g YW5hbHl6ZSBwcmltc2Nhbm1hcmtjb3ZfdGFibGUgOworCit3aXRoIHJhbmdlX2ludHMgYXMgKCBz ZWxlY3QgaSBmcm9tIGdlbmVyYXRlX3NlcmllcygxNTMwLCAxNzgwKSBpKQorCitzZWxlY3QKKyAg Y291bnQoKiksIGJ1Z2d5LmEsIGJ1Z2d5LmIgZnJvbQorb3V0ZXJfdGFiIG8KKyAgaW5uZXIgam9p bgorcHJpbXNjYW5tYXJrY292X3RhYmxlIGJ1Z2d5CisgIG9uIG8uYSA9IGJ1Z2d5LmEgYW5kIG8u YiA9IGJ1Z2d5LmIKK3doZXJlCisgIG8uYSA9IDEgICAgIGFuZCAgICAgby5iID0gYW55IChhcnJh eVsoc2VsZWN0IGFycmF5X2FnZyhpKSBmcm9tIHJhbmdlX2ludHMgd2hlcmUgaSAlIDUwID0gMCld KSAgYW5kCisgIGJ1Z2d5LmEgPSAxIGFuZCBidWdneS5iID0gYW55IChhcnJheVsoc2VsZWN0IGFy cmF5X2FnZyhpKSBmcm9tIHJhbmdlX2ludHMgd2hlcmUgaSAlIDUwID0gMCldKQorZ3JvdXAgYnkg YnVnZ3kuYSwgYnVnZ3kuYgorb3JkZXIgYnkgYnVnZ3kuYSwgYnVnZ3kuYjsKKworLS0gR2V0IHRl c3QgY292ZXJhZ2UgZm9yIHdoZW4gc28tPm5lZWRQcmltU2NhbiBpcyBzZXQgYXQgdGhlIHBvaW50 IG9mIGNhbGxpbmcKKy0tIF9idF9yZXN0b3JlX2FycmF5X2tleXMoKSBmb3IgYmFja3dhcmRzIHNj YW5zLiAgTW9yZSBvciBsZXNzIGNvbXBhcmFibGUgdG8KKy0tIHRoZSBsYXN0IHRlc3QuCitjcmVh dGUgdGVtcCB0YWJsZSBiYWNrd2FyZHNfcHJpbV9vdXRlcl90YWJsZSAgICAgICAgICAgICAoYSBp bnQsIGIgaW50KTsKK2NyZWF0ZSB0ZW1wIHRhYmxlIGJhY2t3YXJkc19yZXN0b3JlX2J1Z2d5X3By aW1zY2FuX3RhYmxlICh4IGludCwgeSBpbnQpOworCitjcmVhdGUgaW5kZXggYmFja3dhcmRfcHJp bV9idWdneV9pZHggIG9uIGJhY2t3YXJkc19yZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3RhYmxlICh4 LCB5KSB3aXRoIChkZWR1cGxpY2F0ZV9pdGVtcz1vZmYpOworY3JlYXRlIGluZGV4IGJhY2t3YXJk c19wcmltX2RyaXZlX2lkeCBvbiBiYWNrd2FyZHNfcHJpbV9vdXRlcl90YWJsZSAgICAgICAgICAg ICAoYSwgYikgd2l0aCAoZGVkdXBsaWNhdGVfaXRlbXM9b2ZmKTsKKworaW5zZXJ0IGludG8gYmFj a3dhcmRzX3ByaW1fb3V0ZXJfdGFibGUgICAgICAgICAgICAgICAgICBzZWxlY3QgMCwgMTM2MDsK K2luc2VydCBpbnRvIGJhY2t3YXJkc19wcmltX291dGVyX3RhYmxlICAgICAgICAgICAgICAgICAg c2VsZWN0IDEsIGJfdmFscyBmcm9tIGdlbmVyYXRlX3NlcmllcygxMDEyLCAxNDA2KSBiX3ZhbHMg d2hlcmUgYl92YWxzICUgMTAgPSAwOworaW5zZXJ0IGludG8gYmFja3dhcmRzX3ByaW1fb3V0ZXJf dGFibGUgICAgICAgICAgICAgICAgICBzZWxlY3QgMSwgMTM3MDsKK3ZhY3V1bSBhbmFseXplIGJh Y2t3YXJkc19wcmltX291dGVyX3RhYmxlOyAtLSBCZSB0aWR5CisKKy0tIEZpbGwgdXAgImJhY2t3 YXJkc19wcmltX2RyaXZlX2lkeCIgaW5kZXggd2l0aCAzOTYgaXRlbXMsIGp1c3QgYWJvdXQgZml0 dGluZworLS0gb250byBpdHMgb25seSBwYWdlLCB3aGljaCBpcyBhIHJvb3QgbGVhZiBwYWdlOgor aW5zZXJ0IGludG8gYmFja3dhcmRzX3Jlc3RvcmVfYnVnZ3lfcHJpbXNjYW5fdGFibGUgc2VsZWN0 IDAsIDEzNjA7CitpbnNlcnQgaW50byBiYWNrd2FyZHNfcmVzdG9yZV9idWdneV9wcmltc2Nhbl90 YWJsZSBzZWxlY3QgMSwgeF92YWxzIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEwMTIsIDE0MDYpIHhf dmFsczsKK3ZhY3V1bSBhbmFseXplIGJhY2t3YXJkc19yZXN0b3JlX2J1Z2d5X3ByaW1zY2FuX3Rh YmxlOyAtLSBCZSB0aWR5CisKKy0tIE5vdyBjYXVzZSB0d28gcGFnZSBzcGxpdHMsIGxlYXZpbmcg NCBsZWFmIHBhZ2VzIGluIHRvdGFsOgoraW5zZXJ0IGludG8gYmFja3dhcmRzX3Jlc3RvcmVfYnVn Z3lfcHJpbXNjYW5fdGFibGUgc2VsZWN0IDEsIDEzNzAgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwy NTApIGk7CisKKy0tIE5vdyAiYnVnZ3kiIGluZGV4IGxvb2tzIGxpa2UgdGhpczoKKy0tCistLSDi lIzilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDi lIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDi lKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDi lIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDi lIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilKzilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJAKKy0tIOKUgiBpIOKU giBibGtubyDilIIgZmxhZ3Mg4pSCIG5odGlkcyDilIIgbmhibGtzIOKUgiBuZGVhZGhibGtzIOKU giBubGl2ZSDilIIgbmRlYWQg4pSCIG5odGlkc2NoZWNrc2ltcGxlIOKUgiBhdmdzaXplIOKUgiBm cmVlc3BhY2Ug4pSCICAgICBoaWdoa2V5ICAgICAg4pSCCistLSDilJzilIDilIDilIDilLzilIDi lIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDi lIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDi lIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilLzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilKQKKy0tIOKUgiAxIOKUgiAgICAgMSDilIIgICAgIDEg 4pSCICAgIDIwMyDilIIgICAgICAxIOKUgiAgICAgICAgICAwIOKUgiAgIDIwNCDilIIgICAgIDAg 4pSCICAgICAgICAgICAgICAgICAwIOKUgiAgICAgIDE2IOKUgiAgICAgNCwwNjgg4pSCICh4LCB5 KT0oMSwgMTIxNCkg4pSCCistLSDilIIgMiDilIIgICAgIDQg4pSCICAgICAxIOKUgiAgICAxNTYg 4pSCICAgICAgMiDilIIgICAgICAgICAgMCDilIIgICAxNTcg4pSCICAgICAwIOKUgiAgICAgICAg ICAgICAgICAgMCDilIIgICAgICAxNiDilIIgICAgIDUsMDA4IOKUgiAoeCwgeSk9KDEsIDEzNzAp IOKUggorLS0g4pSCIDMg4pSCICAgICA1IOKUgiAgICAgMSDilIIgICAgMjUxIOKUgiAgICAgIDIg 4pSCICAgICAgICAgIDAg4pSCICAgMjUyIOKUgiAgICAgMCDilIIgICAgICAgICAgICAgICAgIDAg 4pSCICAgICAgMTYg4pSCICAgICAzLDEwOCDilIIgKHgsIHkpPSgxLCAxMzcxKSDilIIKKy0tIOKU giA0IOKUgiAgICAgMiDilIIgICAgIDEg4pSCICAgICAzNiDilIIgICAgICAxIOKUgiAgICAgICAg ICAwIOKUgiAgICAzNiDilIIgICAgIDAg4pSCICAgICAgICAgICAgICAgICAwIOKUgiAgICAgIDE2 IOKUgiAgICAgNyw0Mjgg4pSCIOKIhSAgICAgICAgICAgICAgICDilIIKKy0tIOKUlOKUgOKUgOKU gOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmAorCitzZWxlY3QgY291bnQoKiksIG8u YSwgby5iCisgIGZyb20KKyAgICBiYWNrd2FyZHNfcHJpbV9vdXRlcl90YWJsZSBvCisgIGlubmVy IGpvaW4KKyAgICBiYWNrd2FyZHNfcmVzdG9yZV9idWdneV9wcmltc2Nhbl90YWJsZSBidWcKKyAg b24gby5hID0gYnVnLnggYW5kIG8uYiA9IGJ1Zy55Cit3aGVyZQorICBidWcueCBpbiAoMCwgMSkg YW5kCisgIGJ1Zy55ID0gYW55KGFycmF5WyhzZWxlY3QgYXJyYXlfYWdnKGkpIGZyb20gZ2VuZXJh dGVfc2VyaWVzKDEzNjAsIDEzNzApIGkgd2hlcmUgaSAlIDEwID0gMCldKQorZ3JvdXAgYnkgby5h LCBvLmIKK29yZGVyIGJ5IG8uYSBkZXNjLCBvLmIgZGVzYzsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVh dGVfaW5kZXguc3FsCmluZGV4IGQ0OWNlOWYzMC4uOWQ2OGVmNjI0IDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2NyZWF0ZV9pbmRleC5zcWwKQEAgLTc1Myw3ICs3NTMsNyBAQCBTRUxFQ1QgY291bnQoKikg RlJPTSBkdXBpbmRleGNvbHMKICAgV0hFUkUgZjEgQkVUV0VFTiAnV0EnIEFORCAnWlpaJyBhbmQg aWQgPCAxMDAwIGFuZCBmMSB+PH4gJ1lYJzsKIAogLS0KLS0tIENoZWNrIG9yZGVyaW5nIG9mID1B TlkgaW5kZXhxdWFsIHJlc3VsdHMgKGJ1ZyBpbiA5LjIuMCkKKy0tIENoZWNrIHRoYXQgaW5kZXgg c2NhbnMgd2l0aCA9QU5ZIGluZGV4cXVhbHMgcmV0dXJuIHJvd3MgaW4gaW5kZXggb3JkZXIKIC0t CiAKIGV4cGxhaW4gKGNvc3RzIG9mZikKQEAgLTc3NCwxOCArNzc0LDE0IEBAIFNFTEVDVCB0aG91 c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQogV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91 cyBJTiAoMTAwMSwzMDAwKQogT1JERVIgQlkgdGhvdXNhbmQ7CiAKLVNFVCBlbmFibGVfaW5kZXhv bmx5c2NhbiA9IE9GRjsKLQogZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUIHRob3VzYW5kLCB0 ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgx MDAxLDMwMDApCi1PUkRFUiBCWSB0aG91c2FuZDsKK09SREVSIEJZIHRob3VzYW5kIERFU0MsIHRl bnRob3VzIERFU0M7CiAKIFNFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQogV0hF UkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQotT1JERVIgQlkgdGhv dXNhbmQ7Ci0KLVJFU0VUIGVuYWJsZV9pbmRleG9ubHlzY2FuOworT1JERVIgQlkgdGhvdXNhbmQg REVTQywgdGVudGhvdXMgREVTQzsKIAogLS0KIC0tIENoZWNrIGVsaW1pbmF0aW9uIG9mIGNvbnN0 YW50LU5VTEwgc3ViZXhwcmVzc2lvbnMKLS0gCjIuNDMuMAoK --0000000000001d893b060c18059d--