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 1qi1Uy-004yi3-G6 for pgsql-hackers@arkaria.postgresql.org; Sun, 17 Sep 2023 23:48:21 +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 1qi1Uw-00DLix-SW for pgsql-hackers@arkaria.postgresql.org; Sun, 17 Sep 2023 23:48:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qi1Uw-00DLif-6f for pgsql-hackers@lists.postgresql.org; Sun, 17 Sep 2023 23:48:18 +0000 Received: from mail-oo1-xc2e.google.com ([2607:f8b0:4864:20::c2e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1qi1Us-005mkE-2a for pgsql-hackers@lists.postgresql.org; Sun, 17 Sep 2023 23:48:17 +0000 Received: by mail-oo1-xc2e.google.com with SMTP id 006d021491bc7-5734f54dc44so2403143eaf.2 for ; Sun, 17 Sep 2023 16:48:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bowt-ie.20230601.gappssmtp.com; s=20230601; t=1694994492; x=1695599292; 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=OjHX2Q1D/G/bASGe2Jg9B4UZv/6EKTi+ypBlZLJ+AIA=; b=bRS8sF/igooNj9JVb18ThPuvMs9HxPNmDR24RsrdckMxqGmiDDKToc5KcBW9qV7Ffs t69Oqhz+hBJJN9QFT7gYjqCxxmWeM2IvTdeeR28qbrCnXEffZgINxOxL/XCkMMHAQm5T TiiCuyyndUSLGSIJ2QmFTgkOqtigS5pbaLpd8FLh4EYFTPS8nVBxBtyQS+9oMqvx4xKs Hd39cXawcaBVFFJqw9wZWavBKX6WAXXilLC3CfA/cUKlZDeVBABm226KnBlyp7sjNSpK i9d2zkmkPBZHyZX6dEqjYpClGsPscp0p/HCLI0dx0Iv6DGuibbgJCaVHcoBgrpYLGdsR Uj6A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1694994492; x=1695599292; 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=OjHX2Q1D/G/bASGe2Jg9B4UZv/6EKTi+ypBlZLJ+AIA=; b=bmvlt7X4yEcTa3Z6rQIo6GQ7xvwx3zSrOwNqiYSpb93na4GLDbJwp0LomTtiha/1Zn r07a8RLYaoR8MFBiETBAxU95r8Oig+V16JEaabLouK2bjxKkS99oh9WK7axZxDX6Ljd8 TCwcQnVnYGZAanhBTavBw9IHIVWM6gFd7/xiAs+g8/576yGV/NYYPGR30ZcRwIF/Q6hZ TiNCb0TLyPqI2eYQdCUxFAgEz4cEfmlNDz484Gai7skJXs1FqYixdhwBTvVfTKej93Y3 KgMqtFiRg5DwvxhOkOERdrkbAfi//EX/Ls1cB9FMTA3985AJRH8miKWakvvd8aaC6H/L 8iXg== X-Gm-Message-State: AOJu0YzqBVxyXrEQaz6eEdbnPE1qhjs/uigMP3+jSV68smHnlVOeChDc drX5VHnPS0CVC52KL6l/feJd3SU4zWa1DO/h+l/EaaJHQnHv1XBzSnoLMQ== X-Google-Smtp-Source: AGHT+IGFYAobAcj7oMBNxML73uOFVdEEzBRjoPqdNec8w41ItOnManpqaaWfjmkTkC0r1Upf2TTkAqug0YZak1swEeM= X-Received: by 2002:a05:6358:4283:b0:135:4003:784c with SMTP id s3-20020a056358428300b001354003784cmr7430449rwc.17.1694994491751; Sun, 17 Sep 2023 16:48:11 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Peter Geoghegan Date: Sun, 17 Sep 2023 16:47:45 -0700 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 Content-Type: multipart/mixed; boundary="00000000000094ab20060596a8ce" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000094ab20060596a8ce Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jul 26, 2023 at 6:41=E2=80=AFAM Peter Geoghegan wrote: > > MDAM seems to require exponential storage for "scan key operations" > > for conditions on N columns (to be precise, the product of the number > > of distinct conditions on each column); e.g. an index on mytable > > (a,b,c,d,e,f,g,h) with conditions "a IN (1, 2) AND b IN (1, 2) AND ... > > AND h IN (1, 2)" would require 2^8 entries. > What you describe is a problem in theory, but I doubt that it's a > problem in practice. You don't actually have to materialize the > predicates up-front, or at all. Plus you can skip over them using the > next index tuple. So skipping works both ways. Attached is v2, which makes all array key advancement take place using the "next index tuple" approach (using binary searches to find array keys using index tuple values). This approach was necessary for fairly mundane reasons (it limits the amount of work required while holding a buffer lock), but it also solves quite a few other problems that I find far more interesting. It's easy to imagine the state machine from v2 of the patch being extended for skip scan. My approach "abstracts away" the arrays. For skip scan, it would more or less behave as if the user had written a query "WHERE a in () AND b =3D 5 ... " -- without actually knowing what the so-called array keys for the high-order skipped column are (not up front, at least). We'd only need to track the current "array key" for the scan key on the skipped column, "a". The state machine would notice when the scan had reached the next-greatest "a" value in the index (whatever that might be), and then make that the current value. Finally, the state machine would effectively instruct its caller to consider repositioning the scan via a new descent of the index. In other words, almost everything for skip scan would work just like regular SAOPs -- and any differences would be well encapsulated. But it's not just skip scan. This approach also enables thinking of SAOP index scans (using nbtree) as just another type of indexable clause, without any special restrictions (compared to true indexable operators such as "=3D", say). Particularly in the planner. That was always the general thrust of teaching nbtree about SAOPs, from the start. But it's something that should be totally embraced IMV. That's just what the patch proposes to do. In particular, the patch now: 1. Entirely removes the long-standing restriction on generating path keys for index paths with SAOPs, even when there are inequalities on a high order column present. You can mix SAOPs together with other clause types, arbitrarily, and everything still works and works efficiently. For example, the regression test expected output for this query/test (from bugfix commit 807a40c5) is updated by the patch, as shown here: explain (costs off) SELECT thousand, tenthous FROM tenk1 WHERE thousand < 2 AND tenthous IN (1001,3000) ORDER BY thousand; - QUERY PLAN ---------------------------------------------------------------------------= ------------ - Sort - Sort Key: thousand - -> Index Scan using tenk1_thous_tenthous on tenk1 - Index Cond: ((thousand < 2) AND (tenthous =3D ANY ('{1001,3000}'::integer[]))) -(4 rows) + QUERY PLAN +--------------------------------------------------------------------------= ------ + Index Scan using tenk1_thous_tenthous on tenk1 + Index Cond: ((thousand < 2) AND (tenthous =3D ANY ('{1001,3000}'::integ= er[]))) +(2 rows) We don't need a sort node anymore -- even though the leading column here (thousand) uses an inequality, a particularly tricky case. Now it's an index scan, much like any other, with no particular restrictions caused by using a SAOP. 2. Adds an nbtree strategy for non-required equality array scan keys, which is built on the same state machine, with only minor differences to deal with column values "appearing out of key space order". 3. Simplifies the optimizer side of things by consistently avoiding filter quals (except when it's truly unavoidable). The optimizer doesn't even consider alternative index paths with filter quals for lower-order SAOP columns, because they have no possible advantage anymore. On the other hand, as we saw already, upthread, filter quals have huge disadvantages. By always using true index quals, we automatically avoid any question of getting excessive amounts of heap page accesses just to eliminate non-matching rows. AFAICT we don't need to make a trade-off here. The first version of the patch added some crufty code to the optimizer, to account for various restrictions on sort order. This revised version actually removes existing cruft from the same place (indxpath.c) instead. Items 1, 2, and 3 are all closely related. Take the query I've shown for item 1. Bugfix commit 807a40c5 (which added the test query in question) dealt with an oversight in the then-recent original nbtree SAOP patch (commit 9e8da0f7): when nbtree combines two primitive index scans with an inequality on their leading column, we cannot be sure that the output will appear in the same order as the order that one big continuous index scan returns rows in. We can only expect to maintain the illusion that we're doing one continuous index scan when individual primitive index scans access earlier columns via the equality strategy -- we need "equality constraints". In practice, the optimizer (indxpath.c) is very conservative (more conservative than it really needs to be) when it comes to trusting the index scan to output rows in index order, in the presence of SAOPs. All of that now seems totally unnecessary. Again, I don't see a need to make a trade-off here. My observation about this query (and others like it) is: why not literally perform one continuous index scan instead (not multiple primitive index scans)? That is strictly better, given all the specifics here. Once we have a way to do that (which the nbtree executor work listed under item 2 provides), it becomes safe to assume that the tuples will be output in index order -- there is no illusion left to preserve. Who needs an illusion that isn't actually helping us? We actually do less I/O by using this strategy, for the usual reasons (we can avoid repeating index page accesses). A more concrete benefit of the non-required-scankeys stuff can be seen by running Benoit Tigeot's test case [1] with v2. He had a query like this: SELECT * FROM docs WHERE status IN ('draft', 'sent') AND sender_reference IN ('Custom/1175', 'Client/362', 'Custom/280') ORDER BY sent_at DESC NULLS LAST LIMIT 20; And, his test case had an index on "sent_at DESC NULLS LAST, sender_reference, status". This variant was a weak spot for v1. v2 of the patch is vastly more efficient here, since we don't have to go to the heap to eliminate non-matching tuples -- that can happen in the index AM instead. This can easily be 2x-3x faster on a warm cache, and have *hundreds* of times fewer buffer accesses (which Benoit verified with an early version of this v2). All because we now require vastly less heap access -- the quals are fairly selective here, and we have to scan hundreds of leaf pages before the scan can terminate. Avoiding filter quals is a huge win. This particular improvement is hard to squarely attribute to any one of my 3 items. The immediate problem that the query presents us with on the master branch is the problem of filter quals that require heap accesses to do visibility checks (a problem that index quals can never have). That makes it tempting to credit my item 3. But you can't really have item 3 without also having items 1 and 2. Taken together, they eliminate all possible downsides from using index quals. That high level direction (try to have one good choice for the optimizer) seems important to me. Both for this project, and in general. Other changes in v2: * Improved costing, that takes advantage of the fact that nbtree now promises to not repeat any leaf page accesses (unless the scan is restarted or the direction of the scan changes). This makes the worst case far more predictable, and more related to selectivity estimation -- you can't scan more pages than you have in the whole index. Just like with every other sort of index scan. * Support for parallel index scans. The existing approach to array keys for parallel index scan has been adopted to work with individual primitive index scans, not individual array keys. I haven't tested this very thoroughly just yet, but it seems to work well enough already. I think that it's important to not have very much variation between parallel and serial index scans, which I seem to have mostly avoided. [1] https://gist.github.com/benoittgt/ab72dc4cfedea2a0c6a5ee809d16e04d?perm= alink_comment_id=3D4690491#gistcomment-4690491 --=20 Peter Geoghegan --00000000000094ab20060596a8ce Content-Type: application/octet-stream; name="v2-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Disposition: attachment; filename="v2-0001-Enhance-nbtree-ScalarArrayOp-execution.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lmo3hdof0 RnJvbSA3ZDgwNDFjYmY0MTczNjk4MTQzMWEwZDA2M2U1ZWNkYzU5MjQwMmVlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRhdGU6IFNh dCwgMTcgSnVuIDIwMjMgMTc6MDM6MzYgLTA3MDAKU3ViamVjdDogW1BBVENIIHYyXSBFbmhhbmNl IG5idHJlZSBTY2FsYXJBcnJheU9wIGV4ZWN1dGlvbi4KCkNvbW1pdCA5ZThkYTBmNyB0YXVnaHQg bmJ0cmVlIHRvIGhhbmRsZSBTY2FsYXJBcnJheU9wRXhwciBxdWFscwpuYXRpdmVseS4gIFRoaXMg d29ya3MgYnkgcHVzaGluZyBhZGRpdGlvbmFsIGNvbnRleHQgYWJvdXQgdGhlIGFycmF5cwpkb3du IGludG8gdGhlIG5idHJlZSBpbmRleCBBTSwgYXMgaW5kZXggcXVhbHMuICBUaGlzIGluZm9ybWF0 aW9uIGVuYWJsZWQKbmJ0cmVlIHRvIGV4ZWN1dGUgbXVsdGlwbGUgcHJpbWl0aXZlIGluZGV4IHNj YW5zIGFzIHBhcnQgb2YgYW4gaW5kZXgKc2NhbiBleGVjdXRvciBub2RlIHRoYXQgd2FzIHRyZWF0 ZWQgYXMgb25lIGNvbnRpbnVvdXMgaW5kZXggc2Nhbi4KClRoZSBtb3RpdmF0aW9uIGJlaGluZCB0 aGlzIGVhcmxpZXIgd29yayB3YXMgZW5hYmxpbmcgaW5kZXgtb25seSBzY2Fucwp3aXRoIFNjYWxh ckFycmF5T3BFeHByIGNsYXVzZXMgKFNBT1AgcXVhbHMgYXJlIHRyYWRpdGlvbmFsbHkgZXhlY3V0 ZWQKdmlhIEJpdG1hcE9yIG5vZGVzLCB3aGljaCBpcyBsYXJnZWx5IGluZGV4LUFNLWFnbm9zdGlj LCBidXQgYWx3YXlzCnJlcXVpcmVzIGhlYXAgYWNjZXNzKS4gIFRoZSBnZW5lcmFsIGlkZWEgb2Yg Z2l2aW5nIHRoZSBpbmRleCBBTSB0aGlzCmFkZGl0aW9uYWwgY29udGV4dCBjYW4gYmUgcHVzaGVk IGEgbG90IGZ1cnRoZXIsIHRob3VnaC4KClRlYWNoIG5idHJlZSBTQU9QIGluZGV4IHNjYW5zIHRv IGR5bmFtaWNhbGx5IGFkdmFuY2UgYXJyYXkgc2NhbiBrZXlzCnVzaW5nIGluZm9ybWF0aW9uIGFi b3V0IHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGluZGV4LCBkZXRlcm1pbmVkIGF0CnJ1bnRp bWUuICBUaGUgYXJyYXkga2V5IHN0YXRlIG1hY2hpbmUgYWR2YW5jZXMgdGhlIGN1cnJlbnQgYXJy YXkga2V5cwp1c2luZyB0aGUgbmV4dCBpbmRleCB0dXBsZSBpbiBsaW5lIHRvIGJlIHNjYW5uZWQs IGF0IHRoZSBwb2ludCB3aGVyZSB0aGUKc2NhbiByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGxhc3Qg c2V0IG9mIGFycmF5IGtleXMuICBUaGlzIGFwcHJvYWNoIGlzCmZhciBtb3JlIGZsZXhpYmxlLCBh bmQgY2FuIGJlIGZhciBtb3JlIGVmZmljaWVudC4gIENhc2VzIHRoYXQgcHJldmlvdXNseQpyZXF1 aXJlZCBodW5kcmVkcyAoZXZlbiB0aG91c2FuZHMpIG9mIHByaW1pdGl2ZSBpbmRleCBzY2FucyBu b3cgcmVxdWlyZQphcyBmZXcgYXMgb25lIHNpbmdsZSBwcmltaXRpdmUgaW5kZXggc2Nhbi4KCkFs c28gcmVtb3ZlIGFsbCByZXN0cmljdGlvbnMgb24gZ2VuZXJhdGluZyBwYXRoIGtleXMgZm9yIG5i dHJlZSBpbmRleApzY2FucyB0aGF0IGhhcHBlbiB0byBoYXZlIFNjYWxhckFycmF5T3BFeHByIHF1 YWxzLiAgQnVnZml4IGNvbW1pdAo4MDdhNDBjNSB0YXVnaHQgdGhlIHBsYW5uZXIgdG8gYXZvaWQg Z2VuZXJhdGluZyB1bnNhZmUgcGF0aCBrZXlzOiBwYXRoCmtleXMgb24gYSBtdWx0aWNvbHVtbiBp bmRleCBwYXRoLCB3aXRoIGEgU0FPUCBjbGF1c2Ugb24gYW55IGF0dHJpYnV0ZQpiZXlvbmQgdGhl IGZpcnN0L21vc3Qgc2lnbmlmaWNhbnQgYXR0cmlidXRlLiAgVGhlc2UgY2FzZXMgYXJlIG5vdyBz YWZlLgpOb3cgbmJ0cmVlIGluZGV4IHNjYW5zIHdpdGggYW4gaW5lcXVhbGl0eSBjbGF1c2Ugb24g YSBoaWdoIG9yZGVyIGNvbHVtbgphbmQgYSBTQU9QIGNsYXVzZSBvbiBhIGxvd2VyIG9yZGVyIGNv bHVtbiBhcmUgZXhlY3V0ZWQgYXMgb25lIHNpbmdsZQpwcmltaXRpdmUgaW5kZXggc2Nhbiwgc2lu Y2UgdGhhdCBpcyB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGRvIGl0LgpOb24tcmVxdWlyZWQg ZXF1YWxpdHkgdHlwZSBTQU9QIHF1YWxzIGFyZSBleGVjdXRlZCBieSBuYnRyZWUgdXNpbmcKYWxt b3N0IHRoZSBzYW1lIGFwcHJvYWNoIHVzZWQgZm9yIHJlcXVpcmVkIGVxdWFsaXR5IHR5cGUgU0FP UCBxdWFscy4KCm5idHJlZSBpcyBub3cgc3RyaWN0bHkgZ3VhcmFudGVlZCB0byBhdm9pZCBhbGwg cmVwZWF0IGFjY2Vzc2VzIHRvIGFueQppbmRpdmlkdWFsIGxlYWYgcGFnZSwgZXZlbiBpbiBjYXNl cyB3aXRoIGluZXF1YWxpdGllcyBvbiBoaWdoIG9yZGVyCmNvbHVtbnMgKGV4Y2VwdCB3aGVuIHRo ZSBzY2FuIGRpcmVjdGlvbiBjaGFuZ2VzLCBvciB0aGUgc2NhbiByZXN0YXJ0cykuCldlIG5vdyBo YXZlIHN0cm9uZyBndWFyYW50ZWVzIGFib3V0IHRoZSB3b3JzdCBjYXNlLCB3aGljaCBpcyB2ZXJ5 IHVzZWZ1bAp3aGVuIGNvc3RpbmcgaW5kZXggc2NhbnMgd2l0aCBTQU9QIGNsYXVzZXMuICBUaGUg Y29zdCBwcm9maWxlIG9mIGluZGV4CnBhdGhzIHdpdGggbXVsdGlwbGUgU0FPUCBjbGF1c2VzIGlz IG5vdyBhIGxvdCBjbG9zZXIgdG8gb3RoZXIgY2FzZXM7Cm1vcmUgc2VsZWN0aXZlIGluZGV4IHNj YW5zIHdpbGwgbm93IGdlbmVyYWxseSBoYXZlIGxvd2VyIGNvc3RzIHRoYW4gbGVzcwpzZWxlY3Rp dmUgaW5kZXggc2NhbnMuICBUaGUgYWRkZWQgY29zdCBmcm9tIHJlcGVhdGVkbHkgZGVzY2VuZGlu ZyB0aGUKaW5kZXggc3RpbGwgbWF0dGVycywgYnV0IGl0IGNhbiBuZXZlciBkb21pbmF0ZS4KCkFu IGltcG9ydGFudCBnb2FsIG9mIHRoaXMgd29yayBpcyB0byByZW1vdmUgYWxsIFNjYWxhckFycmF5 T3BFeHByIGNsYXVzZQpzcGVjaWFsIGNhc2VzIGZyb20gdGhlIHBsYW5uZXIgLS0gU2NhbGFyQXJy YXlPcEV4cHIgY2xhdXNlcyBjYW4gbm93IGJlCnRob3VnaHQgb2YgYSBnZW5lcmFsaXphdGlvbiBv ZiBzaW1wbGUgZXF1YWxpdHkgY2xhdXNlcyAoZXhjZXB0IHdoZW4KY29zdGluZyBpbmRleCBzY2Fu cywgcGVyaGFwcykuICBUaGUgcGxhbm5lciBubyBsb25nZXIgbmVlZHMgdG8gZ2VuZXJhdGUKYWx0 ZXJuYXRpdmUgaW5kZXggcGF0aHMgd2l0aCBmaWx0ZXIgcXVhbHMvcXBxdWFscy4gIFdlIGFzc3Vt ZSB0aGF0IHRydWUKU0FPUCBpbmRleCBxdWFscyBhcmUgc3RyaWN0bHkgYmV0dGVyIHRoYW4gZmls dGVyL3FwcXVhbHMsIHNpbmNlIHRoZSB3b3JrCmluIG5idHJlZSBndWFyYW50ZWVzIHRoYXQgdGhl eSdsbCBiZSBhdCBsZWFzdCBzbGlnaHRseSBmYXN0ZXIuCgpNYW55IG9mIHRoZSBxdWVyaWVzIHNw ZWQgdXAgYnkgdGhlIHdvcmsgZnJvbSB0aGlzIGNvbW1pdCBkb24ndCBkaXJlY3RseQpiZW5lZml0 IGZyb20gdGhlIG5idHJlZS9leGVjdXRvciBlbmhhbmNlbWVudHMuICBUaGV5IGJlbmVmaXQgaW5k aXJlY3RseS4KVGhlIHBsYW5uZXIgbm8gbG9uZ2VyIHNob3dzIGFueSByZXN0cmFpbnQgYXJvdW5k IG1ha2luZyBTQU9QIGNsYXVzZXMKaW50byB0cnVlIG5idHJlZSBpbmRleCBxdWFscywgd2hpY2gg dGVuZHMgdG8gcmVzdWx0IGluIHNpZ25pZmljYW50CnNhdmluZ3Mgb24gaGVhcCBwYWdlIGFjY2Vz c2VzLiAgSW4gZ2VuZXJhbCB3ZSBuZXZlciBuZWVkIHZpc2liaWxpdHkKY2hlY2tzIHRvIGV2YWx1 YXRlIHRydWUgaW5kZXggcXVhbHMsIHdoZXJlYXMgZmlsdGVyIHF1YWxzIG9mdGVuIG5lZWQgdG8K cGVyZm9ybSBleHRyYSBoZWFwIGFjY2Vzc2VzLCBqdXN0IHRvIGVsaW1pbmF0ZSBub24tbWF0Y2hp bmcgdHVwbGVzCihleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgb25seSBzYWZlIHdpdGgga25vd24g dmlzaWJsZSB0dXBsZXMpLgoKQXV0aG9yOiBQZXRlciBHZW9naGVnYW4gPHBnQGJvd3QuaWU+CkRp c2N1c3Npb246IGh0dHBzOi8vcG9zdGdyLmVzL20vQ0FIMi1Xej1rc3ZOX3NqY25EMStCdC1XdGlm UkE1b2s0OGFEWW5xM3BrS2h4Z01RcGN3QG1haWwuZ21haWwuY29tCi0tLQogc3JjL2luY2x1ZGUv YWNjZXNzL25idHJlZS5oICAgICAgICAgICAgICAgIHwgICAzNyArLQogc3JjL2JhY2tlbmQvYWNj ZXNzL25idHJlZS9uYnRyZWUuYyAgICAgICAgIHwgICA1OCArLQogc3JjL2JhY2tlbmQvYWNjZXNz L25idHJlZS9uYnRzZWFyY2guYyAgICAgIHwgICA3MiArLQogc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnR1dGlscy5jICAgICAgIHwgMTMxMiArKysrKysrKysrKysrKysrKystLQogc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYyAgICAgIHwgICA2NCArLQogc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgICAgICAgICAgIHwgIDEyMyArLQogc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0IHwgICA2MSArLQogc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgIHwgICAgNSArLQogc3JjL3Rlc3QvcmVncmVzcy9z cWwvY3JlYXRlX2luZGV4LnNxbCAgICAgIHwgICAyMCArLQogOSBmaWxlcyBjaGFuZ2VkLCAxNDYy IGluc2VydGlvbnMoKyksIDI5MCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9hY2Nlc3MvbmJ0cmVlLmggYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKaW5kZXggZjVj NjY5NjRjLi42YWI1YmU1NDQgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2FjY2Vzcy9uYnRyZWUu aAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvbmJ0cmVlLmgKQEAgLTEwNDUsOSArMTA0NSwxMSBA QCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5PcGFxdWVEYXRhCiAJU2NhbktleQkJYXJyYXlLZXlEYXRh OwkvKiBtb2RpZmllZCBjb3B5IG9mIHNjYW4tPmtleURhdGEgKi8KIAlpbnQJCQludW1BcnJheUtl eXM7CS8qIG51bWJlciBvZiBlcXVhbGl0eS10eXBlIGFycmF5IGtleXMgKC0xIGlmCiAJCQkJCQkJ CSAqIHRoZXJlIGFyZSBhbnkgdW5zYXRpc2ZpYWJsZSBhcnJheSBrZXlzKSAqLwotCWludAkJCWFy cmF5S2V5Q291bnQ7CS8qIGNvdW50IGluZGljYXRpbmcgbnVtYmVyIG9mIGFycmF5IHNjYW4ga2V5 cwotCQkJCQkJCQkgKiBwcm9jZXNzZWQgKi8KKwlpbnQJCQludW1QcmltU2NhbnM7CS8qIGNvdW50 IGluZGljYXRpbmcgbnVtYmVyIG9mIHByaW1pdGl2ZSBpbmRleAorCQkJCQkJCQkgKiBzY2FucyBm b3IgYXJyYXkgc2NhbiBrZXlzICovCisJYm9vbAkJbmVlZFByaW1TY2FuOwkvKiBQZXJmb3JtIGFu b3RoZXIgcHJpbWl0aXZlIHNjYW4/ICovCiAJQlRBcnJheUtleUluZm8gKmFycmF5S2V5czsJLyog aW5mbyBhYm91dCBlYWNoIGVxdWFsaXR5LXR5cGUgYXJyYXkga2V5ICovCisJRm1nckluZm8gICAq b3JkZXJQcm9jczsJCS8qIE9SREVSIHByb2NzIGZvciBlcXVhbGl0eSBjb25zdHJhaW50IGtleXMg Ki8KIAlNZW1vcnlDb250ZXh0IGFycmF5Q29udGV4dDsgLyogc2Nhbi1saWZlc3BhbiBjb250ZXh0 IGZvciBhcnJheSBkYXRhICovCiAKIAkvKiBpbmZvIGFib3V0IGtpbGxlZCBpdGVtcyBpZiBhbnkg KGtpbGxlZEl0ZW1zIGlzIE5VTEwgaWYgbmV2ZXIgdXNlZCkgKi8KQEAgLTEwNzgsNiArMTA4MCwy OSBAQCB0eXBlZGVmIHN0cnVjdCBCVFNjYW5PcGFxdWVEYXRhCiAKIHR5cGVkZWYgQlRTY2FuT3Bh cXVlRGF0YSAqQlRTY2FuT3BhcXVlOwogCisvKgorICogX2J0X3JlYWRwYWdlIHN0YXRlIHVzZWQg YWNyb3NzIF9idF9jaGVja2tleXMgY2FsbHMgZm9yIGEgcGFnZQorICoKKyAqIFdoZW4gX2J0X3Jl YWRwYWdlIGlzIGNhbGxlZCBkdXJpbmcgYSBmb3J3YXJkIHNjYW4gdGhhdCBoYXMgb25lIG9yIG1v cmUKKyAqIGVxdWFsaXR5LXR5cGUgU0tfU0VBUkNIQVJSQVkgc2NhbiBrZXlzLCBpdCBoYXMgYW4g ZXh0cmEgcmVzcG9uc2liaWxpdHk6IHRvCisgKiBzZXQgdXAgaW5mb3JtYXRpb24gYWJvdXQgdGhl IHBhZ2UgaGlnaCBrZXkuICBUaGlzIG11c3QgaGFwcGVuIGJlZm9yZSB0aGUKKyAqIGZpcnN0IGNh bGwgdG8gX2J0X2NoZWNra2V5cy4gIF9idF9jaGVja2tleXMgdXNlcyB0aGlzIGluZm9ybWF0aW9u IHRvIG1hbmFnZQorICogYWR2YW5jZW1lbnQgb2YgdGhlIHNjYW4ncyBhcnJheSBrZXlzLgorICov Cit0eXBlZGVmIHN0cnVjdCBCVFJlYWRQYWdlU3RhdGUKK3sKKwkvKiBJbnB1dCBwYXJhbWV0ZXJz LCBzZXQgYnkgX2J0X3JlYWRwYWdlICovCisJU2NhbkRpcmVjdGlvbiBkaXI7CQkJLyogY3VycmVu dCBzY2FuIGRpcmVjdGlvbiAqLworCUluZGV4VHVwbGUJaGlnaGtleTsJCS8qIHBhZ2UgaGlnaCBr ZXksIHNldCBieSBmb3J3YXJkIHNjYW5zICovCisKKwkvKiBPdXRwdXQgcGFyYW1ldGVycywgc2V0 IGJ5IF9idF9jaGVja2tleXMgKi8KKwlib29sCQljb250aW51ZXNjYW47CS8qIFRlcm1pbmF0ZSBv bmdvaW5nIChwcmltaXRpdmUpIGluZGV4IHNjYW4/ICovCisKKwkvKiBQcml2YXRlIF9idF9jaGVj a2tleXMtbWFuYWdlZCBzdGF0ZSAqLworCWJvb2wJCWhpZ2hrZXljaGVja2VkOyAvKiBoaWdoIGtl eSBjaGVja2VkIGFnYWluc3QgY3VycmVudAorCQkJCQkJCQkgKiBTS19TRUFSQ0hBUlJBWSBhcnJh eSBrZXlzPyAqLworfSBCVFJlYWRQYWdlU3RhdGU7CisKIC8qCiAgKiBXZSB1c2Ugc29tZSBwcml2 YXRlIHNrX2ZsYWdzIGJpdHMgaW4gcHJlcHJvY2Vzc2VkIHNjYW4ga2V5cy4gIFdlJ3JlIGFsbG93 ZWQKICAqIHRvIHVzZSBiaXRzIDE2LTMxIChzZWUgc2tleS5oKS4gIFRoZSB1cHBlcm1vc3QgYml0 cyBhcmUgY29waWVkIGZyb20gdGhlCkBAIC0xMTU1LDcgKzExODAsNyBAQCBleHRlcm4gYm9vbCBi dGNhbnJldHVybihSZWxhdGlvbiBpbmRleCwgaW50IGF0dG5vKTsKIGV4dGVybiBib29sIF9idF9w YXJhbGxlbF9zZWl6ZShJbmRleFNjYW5EZXNjIHNjYW4sIEJsb2NrTnVtYmVyICpwYWdlbm8pOwog ZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX3JlbGVhc2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBCbG9j a051bWJlciBzY2FuX3BhZ2UpOwogZXh0ZXJuIHZvaWQgX2J0X3BhcmFsbGVsX2RvbmUoSW5kZXhT Y2FuRGVzYyBzY2FuKTsKLWV4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKK2V4dGVybiB2b2lkIF9idF9wYXJhbGxlbF9uZXh0X3By aW1pdGl2ZV9zY2FuKEluZGV4U2NhbkRlc2Mgc2Nhbik7CiAKIC8qCiAgKiBwcm90b3R5cGVzIGZv ciBmdW5jdGlvbnMgaW4gbmJ0ZGVkdXAuYwpAQCAtMTI0OCwxMiArMTI3MywxMiBAQCBleHRlcm4g QlRTY2FuSW5zZXJ0IF9idF9ta3NjYW5rZXkoUmVsYXRpb24gcmVsLCBJbmRleFR1cGxlIGl0dXAp OwogZXh0ZXJuIHZvaWQgX2J0X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNrKTsKIGV4dGVybiB2b2lk IF9idF9wcmVwcm9jZXNzX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2 b2lkIF9idF9zdGFydF9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlv biBkaXIpOwotZXh0ZXJuIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKK2V4dGVybiBib29sIF9idF9hcnJheV9rZXlzX3Jl bWFpbihJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKTsKIGV4dGVybiB2b2lk IF9idF9tYXJrX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9i dF9yZXN0b3JlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiB2b2lkIF9i dF9wcmVwcm9jZXNzX2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKLWV4dGVybiBib29sIF9idF9j aGVja2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLAotCQkJCQkJICBp bnQgdHVwbmF0dHMsIFNjYW5EaXJlY3Rpb24gZGlyLCBib29sICpjb250aW51ZXNjYW4pOworZXh0 ZXJuIGJvb2wgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIEJUUmVhZFBhZ2VTdGF0 ZSAqcHN0YXRlLAorCQkJCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29sIGZpbmFsdHVwKTsKIGV4 dGVybiB2b2lkIF9idF9raWxsaXRlbXMoSW5kZXhTY2FuRGVzYyBzY2FuKTsKIGV4dGVybiBCVEN5 Y2xlSWQgX2J0X3ZhY3V1bV9jeWNsZWlkKFJlbGF0aW9uIHJlbCk7CiBleHRlcm4gQlRDeWNsZUlk IF9idF9zdGFydF92YWN1dW0oUmVsYXRpb24gcmVsKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2FjY2Vzcy9uYnRyZWUvbmJ0cmVlLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHJl ZS5jCmluZGV4IDYyYmM5OTE3Zi4uNWMxODQwNDM2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9h Y2Nlc3MvbmJ0cmVlL25idHJlZS5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0 cmVlLmMKQEAgLTQ4LDggKzQ4LDkgQEAKICAqIEJUUEFSQUxMRUxfSURMRSBpbmRpY2F0ZXMgdGhh dCBubyBiYWNrZW5kIGlzIGN1cnJlbnRseSBhZHZhbmNpbmcgdGhlIHNjYW4KICAqIHRvIGEgbmV3 IHBhZ2U7IHNvbWUgcHJvY2VzcyBjYW4gc3RhcnQgZG9pbmcgdGhhdC4KICAqCi0gKiBCVFBBUkFM TEVMX0RPTkUgaW5kaWNhdGVzIHRoYXQgdGhlIHNjYW4gaXMgY29tcGxldGUgKGluY2x1ZGluZyBl cnJvciBleGl0KS4KLSAqIFdlIHJlYWNoIHRoaXMgc3RhdGUgb25jZSBmb3IgZXZlcnkgZGlzdGlu Y3QgY29tYmluYXRpb24gb2YgYXJyYXkga2V5cy4KKyAqIEJUUEFSQUxMRUxfRE9ORSBpbmRpY2F0 ZXMgdGhhdCB0aGUgcHJpbWl0aXZlIGluZGV4IHNjYW4gaXMgY29tcGxldGUKKyAqIChpbmNsdWRp bmcgZXJyb3IgZXhpdCkuICBXZSByZWFjaCB0aGlzIHN0YXRlIG9uY2UgZm9yIGV2ZXJ5IGRpc3Rp bmN0CisgKiBwcmltaXRpdmUgaW5kZXggc2Nhbi4KICAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC02 OSw4ICs3MCw4IEBAIHR5cGVkZWYgc3RydWN0IEJUUGFyYWxsZWxTY2FuRGVzY0RhdGEKIAlCVFBT X1N0YXRlCWJ0cHNfcGFnZVN0YXR1czsJLyogaW5kaWNhdGVzIHdoZXRoZXIgbmV4dCBwYWdlIGlz CiAJCQkJCQkJCQkgKiBhdmFpbGFibGUgZm9yIHNjYW4uIHNlZSBhYm92ZSBmb3IKIAkJCQkJCQkJ CSAqIHBvc3NpYmxlIHN0YXRlcyBvZiBwYXJhbGxlbCBzY2FuLiAqLwotCWludAkJCWJ0cHNfYXJy YXlLZXlDb3VudDsgLyogY291bnQgaW5kaWNhdGluZyBudW1iZXIgb2YgYXJyYXkgc2NhbgotCQkJ CQkJCQkJICoga2V5cyBwcm9jZXNzZWQgYnkgcGFyYWxsZWwgc2NhbiAqLworCWludAkJCWJ0cHNf bnVtUHJpbVNjYW5zOwkvKiBjb3VudCBpbmRpY2F0aW5nIG51bWJlciBvZiBwcmltaXRpdmUKKwkJ CQkJCQkJCSAqIGluZGV4IHNjYW5zIGZvciBhcnJheSBzY2FuIGtleXMgKi8KIAlzbG9ja190CQli dHBzX211dGV4OwkJLyogcHJvdGVjdHMgYWJvdmUgdmFyaWFibGVzICovCiAJQ29uZGl0aW9uVmFy aWFibGUgYnRwc19jdjsJLyogdXNlZCB0byBzeW5jaHJvbml6ZSBwYXJhbGxlbCBzY2FuICovCiB9 CQkJQlRQYXJhbGxlbFNjYW5EZXNjRGF0YTsKQEAgLTI3Niw3ICsyNzcsNyBAQCBidGdldHR1cGxl KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJCWlmIChyZXMpCiAJCQli cmVhazsKIAkJLyogLi4uIG90aGVyd2lzZSBzZWUgaWYgd2UgaGF2ZSBtb3JlIGFycmF5IGtleXMg dG8gZGVhbCB3aXRoICovCi0JfSB3aGlsZSAoc28tPm51bUFycmF5S2V5cyAmJiBfYnRfYWR2YW5j ZV9hcnJheV9rZXlzKHNjYW4sIGRpcikpOworCX0gd2hpbGUgKHNvLT5udW1BcnJheUtleXMgJiYg X2J0X2FycmF5X2tleXNfcmVtYWluKHNjYW4sIGRpcikpOwogCiAJcmV0dXJuIHJlczsKIH0KQEAg LTMzNCw3ICszMzUsNyBAQCBidGdldGJpdG1hcChJbmRleFNjYW5EZXNjIHNjYW4sIFRJREJpdG1h cCAqdGJtKQogCQkJfQogCQl9CiAJCS8qIE5vdyBzZWUgaWYgd2UgaGF2ZSBtb3JlIGFycmF5IGtl eXMgdG8gZGVhbCB3aXRoICovCi0JfSB3aGlsZSAoc28tPm51bUFycmF5S2V5cyAmJiBfYnRfYWR2 YW5jZV9hcnJheV9rZXlzKHNjYW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uKSk7CisJfSB3aGlsZSAo c28tPm51bUFycmF5S2V5cyAmJiBfYnRfYXJyYXlfa2V5c19yZW1haW4oc2NhbiwgRm9yd2FyZFNj YW5EaXJlY3Rpb24pKTsKIAogCXJldHVybiBudGlkczsKIH0KQEAgLTM2NSw3ICszNjYsOSBAQCBi dGJlZ2luc2NhbihSZWxhdGlvbiByZWwsIGludCBua2V5cywgaW50IG5vcmRlcmJ5cykKIAogCXNv LT5hcnJheUtleURhdGEgPSBOVUxMOwkvKiBhc3N1bWUgbm8gYXJyYXkga2V5cyBmb3Igbm93ICov CiAJc28tPm51bUFycmF5S2V5cyA9IDA7CisJc28tPm5lZWRQcmltU2NhbiA9IGZhbHNlOwogCXNv LT5hcnJheUtleXMgPSBOVUxMOworCXNvLT5vcmRlclByb2NzID0gTlVMTDsKIAlzby0+YXJyYXlD b250ZXh0ID0gTlVMTDsKIAogCXNvLT5raWxsZWRJdGVtcyA9IE5VTEw7CQkvKiB1bnRpbCBuZWVk ZWQgKi8KQEAgLTQwNSw3ICs0MDgsOCBAQCBidHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4sIFNj YW5LZXkgc2NhbmtleSwgaW50IG5zY2Fua2V5cywKIAl9CiAKIAlzby0+bWFya0l0ZW1JbmRleCA9 IC0xOwotCXNvLT5hcnJheUtleUNvdW50ID0gMDsKKwlzby0+bnVtUHJpbVNjYW5zID0gMDsKKwlz by0+bmVlZFByaW1TY2FuID0gZmFsc2U7CiAJQlRTY2FuUG9zVW5waW5JZlBpbm5lZChzby0+bWFy a1Bvcyk7CiAJQlRTY2FuUG9zSW52YWxpZGF0ZShzby0+bWFya1Bvcyk7CiAKQEAgLTU4Niw3ICs1 OTAsNyBAQCBidGluaXRwYXJhbGxlbHNjYW4odm9pZCAqdGFyZ2V0KQogCVNwaW5Mb2NrSW5pdCgm YnRfdGFyZ2V0LT5idHBzX211dGV4KTsKIAlidF90YXJnZXQtPmJ0cHNfc2NhblBhZ2UgPSBJbnZh bGlkQmxvY2tOdW1iZXI7CiAJYnRfdGFyZ2V0LT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFMTEVM X05PVF9JTklUSUFMSVpFRDsKLQlidF90YXJnZXQtPmJ0cHNfYXJyYXlLZXlDb3VudCA9IDA7CisJ YnRfdGFyZ2V0LT5idHBzX251bVByaW1TY2FucyA9IDA7CiAJQ29uZGl0aW9uVmFyaWFibGVJbml0 KCZidF90YXJnZXQtPmJ0cHNfY3YpOwogfQogCkBAIC02MTIsNyArNjE2LDcgQEAgYnRwYXJhbGxl bHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4tPmJ0 cHNfbXV0ZXgpOwogCWJ0c2Nhbi0+YnRwc19zY2FuUGFnZSA9IEludmFsaWRCbG9ja051bWJlcjsK IAlidHNjYW4tPmJ0cHNfcGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfTk9UX0lOSVRJQUxJWkVEOwot CWJ0c2Nhbi0+YnRwc19hcnJheUtleUNvdW50ID0gMDsKKwlidHNjYW4tPmJ0cHNfbnVtUHJpbVNj YW5zID0gMDsKIAlTcGluTG9ja1JlbGVhc2UoJmJ0c2Nhbi0+YnRwc19tdXRleCk7CiB9CiAKQEAg LTYyMyw3ICs2MjcsMTcgQEAgYnRwYXJhbGxlbHJlc2NhbihJbmRleFNjYW5EZXNjIHNjYW4pCiAg KgogICogVGhlIHJldHVybiB2YWx1ZSBpcyB0cnVlIGlmIHdlIHN1Y2Nlc3NmdWxseSBzZWl6ZWQg dGhlIHNjYW4gYW5kIGZhbHNlCiAgKiBpZiB3ZSBkaWQgbm90LiAgVGhlIGxhdHRlciBjYXNlIG9j Y3VycyBpZiBubyBwYWdlcyByZW1haW4gZm9yIHRoZSBjdXJyZW50Ci0gKiBzZXQgb2Ygc2Nhbmtl eXMuCisgKiBwcmltaXRpdmUgaW5kZXggc2Nhbi4KKyAqCisgKiBXaGVuIGFycmF5IHNjYW4ga2V5 cyBhcmUgaW4gdXNlLCBlYWNoIHdvcmtlciBwcm9jZXNzIGluZGVwZW5kZW50bHkgYWR2YW5jZXMK KyAqIGl0cyBhcnJheSBrZXlzLiAgSXQncyBjcnVjaWFsIHRoYXQgZWFjaCB3b3JrZXIgcHJvY2Vz cyBuZXZlciBiZSBhbGxvd2VkIHRvCisgKiBzY2FuIGEgcGFnZSBmcm9tIGJlZm9yZSB0aGUgY3Vy cmVudCBzY2FuIHBvc2l0aW9uLgorICoKKyAqIFhYWCBUaGlzIHBhcnRpY3VsYXIgYXNwZWN0IG9m IHRoZSBwYXRjaCBpcyBzdGlsbCBhdCB0aGUgcHJvb2Ygb2YgY29uY2VwdAorICogc3RhZ2UuICBI YXZpbmcgdGhpcyBtdWNoIGF2YWlsYWJsZSBmb3IgcmV2aWV3IGF0IGxlYXN0IHN1Z2dlc3RzIHRo YXQgaXQnbGwKKyAqIGJlIGZlYXNpYmxlIHRvIHBvcnQgdGhlIGV4aXN0aW5nIHBhcmFsbGVsIHNj YW4gYXJyYXkgc2NhbiBrZXkgc3R1ZmYgb3ZlciB0bworICogdXNpbmcgYSBwcmltaXRpdmUgaW5k ZXggc2NhbiBjb3VudGVyIChhcyBvcHBvc2VkIHRvIGFuIGFycmF5IGtleSBjb3VudGVyKQorICog dGhlIHRvcC1sZXZlbCBzY2FuLiAgSSBoYXZlIHlldCB0byByZWFsbHkgcHV0IHRoaXMgY29kZSB0 aHJvdWdoIGl0cyBwYWNlcy4KICAqCiAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRydWUsICpw YWdlbm8gcmV0dXJucyB0aGUgbmV4dCBvciBjdXJyZW50IHBhZ2UKICAqIG9mIHRoZSBzY2FuIChk ZXBlbmRpbmcgb24gdGhlIHNjYW4gZGlyZWN0aW9uKS4gIEFuIGludmFsaWQgYmxvY2sgbnVtYmVy CkBAIC02NTQsNyArNjY4LDcgQEAgX2J0X3BhcmFsbGVsX3NlaXplKEluZGV4U2NhbkRlc2Mgc2Nh biwgQmxvY2tOdW1iZXIgKnBhZ2VubykKIAkJU3BpbkxvY2tBY3F1aXJlKCZidHNjYW4tPmJ0cHNf bXV0ZXgpOwogCQlwYWdlU3RhdHVzID0gYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXM7CiAKLQkJaWYg KHNvLT5hcnJheUtleUNvdW50IDwgYnRzY2FuLT5idHBzX2FycmF5S2V5Q291bnQpCisJCWlmIChz by0+bnVtUHJpbVNjYW5zIDwgYnRzY2FuLT5idHBzX251bVByaW1TY2FucykKIAkJewogCQkJLyog UGFyYWxsZWwgc2NhbiBoYXMgYWxyZWFkeSBhZHZhbmNlZCB0byBhIG5ldyBzZXQgb2Ygc2Nhbmtl eXMuICovCiAJCQlzdGF0dXMgPSBmYWxzZTsKQEAgLTY5NSw5ICs3MDksMTIgQEAgX2J0X3BhcmFs bGVsX3NlaXplKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgKnBhZ2VubykKIHZvaWQK IF9idF9wYXJhbGxlbF9yZWxlYXNlKEluZGV4U2NhbkRlc2Mgc2NhbiwgQmxvY2tOdW1iZXIgc2Nh bl9wYWdlKQogeworCUJUU2Nhbk9wYXF1ZSBzbyBQR19VU0VEX0ZPUl9BU1NFUlRTX09OTFkgPSAo QlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJUGFyYWxsZWxJbmRleFNjYW5EZXNjIHBhcmFs bGVsX3NjYW4gPSBzY2FuLT5wYXJhbGxlbF9zY2FuOwogCUJUUGFyYWxsZWxTY2FuRGVzYyBidHNj YW47CiAKKwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCiAJYnRzY2FuID0gKEJUUGFyYWxs ZWxTY2FuRGVzYykgT2Zmc2V0VG9Qb2ludGVyKCh2b2lkICopIHBhcmFsbGVsX3NjYW4sCiAJCQkJ CQkJCQkJCQkgIHBhcmFsbGVsX3NjYW4tPnBzX29mZnNldCk7CiAKQEAgLTczMSwxMiArNzQ4LDEx IEBAIF9idF9wYXJhbGxlbF9kb25lKEluZGV4U2NhbkRlc2Mgc2NhbikKIAkJCQkJCQkJCQkJCSAg cGFyYWxsZWxfc2Nhbi0+cHNfb2Zmc2V0KTsKIAogCS8qCi0JICogTWFyayB0aGUgcGFyYWxsZWwg c2NhbiBhcyBkb25lIGZvciB0aGlzIGNvbWJpbmF0aW9uIG9mIHNjYW4ga2V5cywKLQkgKiB1bmxl c3Mgc29tZSBvdGhlciBwcm9jZXNzIGFscmVhZHkgZGlkIHNvLiAgU2VlIGFsc28KLQkgKiBfYnRf YWR2YW5jZV9hcnJheV9rZXlzLgorCSAqIE1hcmsgdGhlIHByaW1pdGl2ZSBpbmRleCBzY2FuIGFz IGRvbmUsIHVubGVzcyBzb21lIG90aGVyIHByb2Nlc3MKKwkgKiBhbHJlYWR5IGRpZCBzby4gIFNl ZSBhbHNvIF9idF9hcnJheV9rZXlzX3JlbWFpbi4KIAkgKi8KIAlTcGluTG9ja0FjcXVpcmUoJmJ0 c2Nhbi0+YnRwc19tdXRleCk7Ci0JaWYgKHNvLT5hcnJheUtleUNvdW50ID49IGJ0c2Nhbi0+YnRw c19hcnJheUtleUNvdW50ICYmCisJaWYgKHNvLT5udW1QcmltU2NhbnMgPj0gYnRzY2FuLT5idHBz X251bVByaW1TY2FucyAmJgogCQlidHNjYW4tPmJ0cHNfcGFnZVN0YXR1cyAhPSBCVFBBUkFMTEVM X0RPTkUpCiAJewogCQlidHNjYW4tPmJ0cHNfcGFnZVN0YXR1cyA9IEJUUEFSQUxMRUxfRE9ORTsK QEAgLTc1MCwxNCArNzY2LDE0IEBAIF9idF9wYXJhbGxlbF9kb25lKEluZGV4U2NhbkRlc2Mgc2Nh bikKIH0KIAogLyoKLSAqIF9idF9wYXJhbGxlbF9hZHZhbmNlX2FycmF5X2tleXMoKSAtLSBBZHZh bmNlcyB0aGUgcGFyYWxsZWwgc2NhbiBmb3IgYXJyYXkKLSAqCQkJa2V5cy4KKyAqIF9idF9wYXJh bGxlbF9uZXh0X3ByaW1pdGl2ZV9zY2FuKCkgLS0gQWR2YW5jZXMgcGFyYWxsZWwgcHJpbWl0aXZl IHNjYW4KKyAqCQkJY291bnRlciB3aGVuIGFycmF5IGtleXMgYXJlIGluIHVzZS4KICAqCi0gKiBV cGRhdGVzIHRoZSBjb3VudCBvZiBhcnJheSBrZXlzIHByb2Nlc3NlZCBmb3IgYm90aCBsb2NhbCBh bmQgcGFyYWxsZWwKKyAqIFVwZGF0ZXMgdGhlIGNvdW50IG9mIHByaW1pdGl2ZSBpbmRleCBzY2Fu cyBmb3IgYm90aCBsb2NhbCBhbmQgcGFyYWxsZWwKICAqIHNjYW5zLgogICovCiB2b2lkCi1fYnRf cGFyYWxsZWxfYWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbikKK19idF9wYXJh bGxlbF9uZXh0X3ByaW1pdGl2ZV9zY2FuKEluZGV4U2NhbkRlc2Mgc2NhbikKIHsKIAlCVFNjYW5P cGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJUGFyYWxsZWxJbmRleFNj YW5EZXNjIHBhcmFsbGVsX3NjYW4gPSBzY2FuLT5wYXJhbGxlbF9zY2FuOwpAQCAtNzY2LDEzICs3 ODIsMTMgQEAgX2J0X3BhcmFsbGVsX2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNj YW4pCiAJYnRzY2FuID0gKEJUUGFyYWxsZWxTY2FuRGVzYykgT2Zmc2V0VG9Qb2ludGVyKCh2b2lk ICopIHBhcmFsbGVsX3NjYW4sCiAJCQkJCQkJCQkJCQkgIHBhcmFsbGVsX3NjYW4tPnBzX29mZnNl dCk7CiAKLQlzby0+YXJyYXlLZXlDb3VudCsrOworCXNvLT5udW1QcmltU2NhbnMrKzsKIAlTcGlu TG9ja0FjcXVpcmUoJmJ0c2Nhbi0+YnRwc19tdXRleCk7CiAJaWYgKGJ0c2Nhbi0+YnRwc19wYWdl U3RhdHVzID09IEJUUEFSQUxMRUxfRE9ORSkKIAl7CiAJCWJ0c2Nhbi0+YnRwc19zY2FuUGFnZSA9 IEludmFsaWRCbG9ja051bWJlcjsKIAkJYnRzY2FuLT5idHBzX3BhZ2VTdGF0dXMgPSBCVFBBUkFM TEVMX05PVF9JTklUSUFMSVpFRDsKLQkJYnRzY2FuLT5idHBzX2FycmF5S2V5Q291bnQrKzsKKwkJ YnRzY2FuLT5idHBzX251bVByaW1TY2FucysrOwogCX0KIAlTcGluTG9ja1JlbGVhc2UoJmJ0c2Nh bi0+YnRwc19tdXRleCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVl L25idHNlYXJjaC5jIGIvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJlZS9uYnRzZWFyY2guYwppbmRl eCAxN2FkODk3NDkuLmQ1MWJjNDU4YiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25i dHJlZS9uYnRzZWFyY2guYworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvbmJ0cmVlL25idHNlYXJj aC5jCkBAIC04NzksNiArODc5LDE4IEBAIF9idF9maXJzdChJbmRleFNjYW5EZXNjIHNjYW4sIFNj YW5EaXJlY3Rpb24gZGlyKQogCiAJQXNzZXJ0KCFCVFNjYW5Qb3NJc1ZhbGlkKHNvLT5jdXJyUG9z KSk7CiAKKwkvKgorCSAqIFhYWCBRdWVyaWVzIHdpdGggU0FPUHMgaGF2ZSBhbHdheXMgYWNjb3Vu dGVkIGZvciBlYWNoIGNhbGwgaGVyZSBhcyBvbmUKKwkgKiAiaW5kZXggc2NhbiIuICBUaGlzIG1l YW50IHRoYXQgdGhlIGFjY291bnRpbmcgc2hvd2VkIG9uZSBpbmRleCBzY2FuIHBlcgorCSAqIGRp c3RpbmN0IFNBT1AgY29uc3RhbnQuICBUaGlzIGFwcHJvYWNoIGlzIGNvbnNpc3RlbnQgd2l0aCBo b3cgaXQgd2FzCisJICogZG9uZSBiZWZvcmUgbmJ0cmVlIHdhcyB0YXVnaHQgdG8gaGFuZGxlIFNj YWxhckFycmF5T3BFeHByIHF1YWxzIGl0c2VsZgorCSAqIChpdCdzIGFsc28gaG93IG5vbi1hbXNl YXJjaGFycmF5IGluZGV4IEFNcyBzdGlsbCBkbyBpdCkuCisJICoKKwkgKiBSaWdodCBub3csIGVs aWRpbmcgYSBwcmltaXRpdmUgaW5kZXggc2NhbiBlbGlkZXMgYSBjYWxsIGhlcmUsIHJlc3VsdGlu ZworCSAqIGluIG9uZSBsZXNzICJpbmRleCBzY2FuIiByZWNvcmRlZCBieSBwZ3N0YXQuICBUaGlz IHNlZW1zIGRlZmVuc2libGUsCisJICogdGhvdWdoIG5vdCBuZWNlc3NhcmlseSBkZXNpcmFibGUu ICBOb3cgaW1wbGVtZW50YXRpb24gZGV0YWlscyBjYW4gaGF2ZQorCSAqIGEgc2lnbmlmaWNhbnQg aW1wYWN0IG9uIHVzZXItdmlzaWJsZSBpbmRleCBzY2FuIGNvdW50cy4KKwkgKi8KIAlwZ3N0YXRf Y291bnRfaW5kZXhfc2NhbihyZWwpOwogCiAJLyoKQEAgLTk1Miw2ICs5NjQsMTAgQEAgX2J0X2Zp cnN0KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIpCiAJICogb25lIHdlIHVz ZSAtLS0gYnkgZGVmaW5pdGlvbiwgdGhleSBhcmUgZWl0aGVyIHJlZHVuZGFudCBvcgogCSAqIGNv bnRyYWRpY3RvcnkuCiAJICoKKwkgKiBXaGVuIFNLX1NFQVJDSEFSUkFZIGtleXMgYXJlIGluIHVz ZSwgX2J0X3R1cGxlX2JlZm9yZV9hcnJheV9rZXlzIGlzCisJICogdXNlZCB0byBhdm9pZCBwcmVt YXR1cmVseSBzdG9wcGluZyB0aGUgc2NhbiB3aGVuIGFuIGFycmF5IGVxdWFsaXR5IHF1YWwKKwkg KiBoYXMgaXRzIGFycmF5IGtleXMgYWR2YW5jZWQuCisJICoKIAkgKiBBbnkgcmVndWxhciAobm90 IFNLX1NFQVJDSE5VTEwpIGtleSBpbXBsaWVzIGEgTk9UIE5VTEwgcXVhbGlmaWVyLgogCSAqIElm IHRoZSBpbmRleCBzdG9yZXMgbnVsbHMgYXQgdGhlIGVuZCBvZiB0aGUgaW5kZXggd2UnbGwgYmUg c3RhcnRpbmcKIAkgKiBmcm9tLCBhbmQgd2UgaGF2ZSBubyBib3VuZGFyeSBrZXkgZm9yIHRoZSBj b2x1bW4gKHdoaWNoIG1lYW5zIHRoZSBrZXkKQEAgLTE1MzYsOSArMTU1Miw4IEBAIF9idF9yZWFk cGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIg b2ZmbnVtKQogCUJUUGFnZU9wYXF1ZSBvcGFxdWU7CiAJT2Zmc2V0TnVtYmVyIG1pbm9mZjsKIAlP ZmZzZXROdW1iZXIgbWF4b2ZmOworCUJUUmVhZFBhZ2VTdGF0ZSBwc3RhdGU7CiAJaW50CQkJaXRl bUluZGV4OwotCWJvb2wJCWNvbnRpbnVlc2NhbjsKLQlpbnQJCQlpbmRuYXR0czsKIAogCS8qCiAJ ICogV2UgbXVzdCBoYXZlIHRoZSBidWZmZXIgcGlubmVkIGFuZCBsb2NrZWQsIGJ1dCB0aGUgdXN1 YWwgbWFjcm8gY2FuJ3QgYmUKQEAgLTE1NTgsOCArMTU3MywxMSBAQCBfYnRfcmVhZHBhZ2UoSW5k ZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkK IAkJCV9idF9wYXJhbGxlbF9yZWxlYXNlKHNjYW4sIEJ1ZmZlckdldEJsb2NrTnVtYmVyKHNvLT5j dXJyUG9zLmJ1ZikpOwogCX0KIAotCWNvbnRpbnVlc2NhbiA9IHRydWU7CQkvKiBkZWZhdWx0IGFz c3VtcHRpb24gKi8KLQlpbmRuYXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZkF0dHJpYnV0 ZXMoc2Nhbi0+aW5kZXhSZWxhdGlvbik7CisJcHN0YXRlLmRpciA9IGRpcjsKKwlwc3RhdGUuaGln aGtleSA9IE5VTEw7CisJcHN0YXRlLmNvbnRpbnVlc2NhbiA9IHRydWU7IC8qIGRlZmF1bHQgYXNz dW1wdGlvbiAqLworCXBzdGF0ZS5oaWdoa2V5Y2hlY2tlZCA9IGZhbHNlOworCiAJbWlub2ZmID0g UF9GSVJTVERBVEFLRVkob3BhcXVlKTsKIAltYXhvZmYgPSBQYWdlR2V0TWF4T2Zmc2V0TnVtYmVy KHBhZ2UpOwogCkBAIC0xNTk0LDYgKzE2MTIsMTQgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRl c2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAKIAlpZiAo U2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQogCXsKKwkJLyogU0tfU0VBUkNIQVJSQVkgc2Nh bnMgbXVzdCBwcm92aWRlIGhpZ2gga2V5IHVwIGZyb250ICovCisJCWlmIChzby0+bnVtQXJyYXlL ZXlzICYmICFQX1JJR0hUTU9TVChvcGFxdWUpKQorCQl7CisJCQlJdGVtSWQJCWlpZCA9IFBhZ2VH ZXRJdGVtSWQocGFnZSwgUF9ISUtFWSk7CisKKwkJCXBzdGF0ZS5oaWdoa2V5ID0gKEluZGV4VHVw bGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlpZCk7CisJCX0KKwogCQkvKiBsb2FkIGl0ZW1zW10gaW4g YXNjZW5kaW5nIG9yZGVyICovCiAJCWl0ZW1JbmRleCA9IDA7CiAKQEAgLTE2MTYsNyArMTY0Miw3 IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyLCBP ZmZzZXROdW1iZXIgb2ZmbnVtKQogCiAJCQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVt KHBhZ2UsIGlpZCk7CiAKLQkJCWlmIChfYnRfY2hlY2trZXlzKHNjYW4sIGl0dXAsIGluZG5hdHRz LCBkaXIsICZjb250aW51ZXNjYW4pKQorCQkJaWYgKF9idF9jaGVja2tleXMoc2NhbiwgJnBzdGF0 ZSwgaXR1cCwgZmFsc2UpKQogCQkJewogCQkJCS8qIHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBrZXkg Y29uZGl0aW9ucyAqLwogCQkJCWlmICghQlRyZWVUdXBsZUlzUG9zdGluZyhpdHVwKSkKQEAgLTE2 NDksNyArMTY3NSw3IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJl Y3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJCX0KIAkJCX0KIAkJCS8qIFdoZW4g IWNvbnRpbnVlc2NhbiwgdGhlcmUgY2FuJ3QgYmUgYW55IG1vcmUgbWF0Y2hlcywgc28gc3RvcCAq LwotCQkJaWYgKCFjb250aW51ZXNjYW4pCisJCQlpZiAoIXBzdGF0ZS5jb250aW51ZXNjYW4pCiAJ CQkJYnJlYWs7CiAKIAkJCW9mZm51bSA9IE9mZnNldE51bWJlck5leHQob2ZmbnVtKTsKQEAgLTE2 NjYsMTcgKzE2OTIsMjMgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRp cmVjdGlvbiBkaXIsIE9mZnNldE51bWJlciBvZmZudW0pCiAJCSAqIG9ubHkgYXBwZWFyIG9uIG5v bi1waXZvdCB0dXBsZXMgb24gdGhlIHJpZ2h0IHNpYmxpbmcgcGFnZSBhcmUKIAkJICogY29tbW9u LgogCQkgKi8KLQkJaWYgKGNvbnRpbnVlc2NhbiAmJiAhUF9SSUdIVE1PU1Qob3BhcXVlKSkKKwkJ aWYgKHBzdGF0ZS5jb250aW51ZXNjYW4gJiYgIVBfUklHSFRNT1NUKG9wYXF1ZSkpCiAJCXsKLQkJ CUl0ZW1JZAkJaWlkID0gUGFnZUdldEl0ZW1JZChwYWdlLCBQX0hJS0VZKTsKLQkJCUluZGV4VHVw bGUJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBpaWQpOwotCQkJaW50CQkJ dHJ1bmNhdHQ7CisJCQlJbmRleFR1cGxlCWl0dXA7CiAKLQkJCXRydW5jYXR0ID0gQlRyZWVUdXBs ZUdldE5BdHRzKGl0dXAsIHNjYW4tPmluZGV4UmVsYXRpb24pOwotCQkJX2J0X2NoZWNra2V5cyhz Y2FuLCBpdHVwLCB0cnVuY2F0dCwgZGlyLCAmY29udGludWVzY2FuKTsKKwkJCWlmIChwc3RhdGUu aGlnaGtleSkKKwkJCQlpdHVwID0gcHN0YXRlLmhpZ2hrZXk7CisJCQllbHNlCisJCQl7CisJCQkJ SXRlbUlkCQlpaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIFBfSElLRVkpOworCisJCQkJaXR1cCA9 IChJbmRleFR1cGxlKSBQYWdlR2V0SXRlbShwYWdlLCBpaWQpOworCQkJfQorCisJCQlfYnRfY2hl Y2trZXlzKHNjYW4sICZwc3RhdGUsIGl0dXAsIHRydWUpOwogCQl9CiAKLQkJaWYgKCFjb250aW51 ZXNjYW4pCisJCWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCXNvLT5jdXJyUG9zLm1vcmVS aWdodCA9IGZhbHNlOwogCiAJCUFzc2VydChpdGVtSW5kZXggPD0gTWF4VElEc1BlckJUcmVlUGFn ZSk7CkBAIC0xNjk3LDYgKzE3MjksNyBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuRGlyZWN0aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAkJCUluZGV4VHVwbGUJ aXR1cDsKIAkJCWJvb2wJCXR1cGxlX2FsaXZlOwogCQkJYm9vbAkJcGFzc2VzX3F1YWxzOworCQkJ Ym9vbAkJZmluYWx0dXAgPSAob2ZmbnVtID09IG1pbm9mZik7CiAKIAkJCS8qCiAJCQkgKiBJZiB0 aGUgc2NhbiBzcGVjaWZpZXMgbm90IHRvIHJldHVybiBraWxsZWQgdHVwbGVzLCB0aGVuIHdlCkBA IC0xNzA3LDEyICsxNzQwLDE4IEBAIF9idF9yZWFkcGFnZShJbmRleFNjYW5EZXNjIHNjYW4sIFNj YW5EaXJlY3Rpb24gZGlyLCBPZmZzZXROdW1iZXIgb2ZmbnVtKQogCQkJICogdHVwbGUgb24gdGhl IHBhZ2UsIHdlIGRvIGNoZWNrIHRoZSBpbmRleCBrZXlzLCB0byBwcmV2ZW50CiAJCQkgKiB1c2Vs ZXNzbHkgYWR2YW5jaW5nIHRvIHRoZSBwYWdlIHRvIHRoZSBsZWZ0LiAgVGhpcyBpcyBzaW1pbGFy CiAJCQkgKiB0byB0aGUgaGlnaCBrZXkgb3B0aW1pemF0aW9uIHVzZWQgYnkgZm9yd2FyZCBzY2Fu cy4KKwkJCSAqCisJCQkgKiBTZXBhcmF0ZWx5LCBfYnRfY2hlY2trZXlzIGFjdHVhbGx5IHJlcXVp cmVzIHRoYXQgd2UgY2FsbCBpdAorCQkJICogd2l0aCB0aGUgZmluYWwgbm9uLXBpdm90IHR1cGxl IGZyb20gdGhlIHBhZ2UsIGlmIHRoZXJlJ3Mgb25lCisJCQkgKiAoZmluYWwgcHJvY2Vzc2VkIHR1 cGxlLCBvciBmaXJzdCB0dXBsZSBpbiBvZmZzZXQgbnVtYmVyIHRlcm1zKS4KKwkJCSAqIFdlIG11 c3QgaW5kaWNhdGUgd2hpY2ggcGFydGljdWxhciB0dXBsZSBjb21lcyBsYXN0LCB0b28uCiAJCQkg Ki8KIAkJCWlmIChzY2FuLT5pZ25vcmVfa2lsbGVkX3R1cGxlcyAmJiBJdGVtSWRJc0RlYWQoaWlk KSkKIAkJCXsKIAkJCQlBc3NlcnQob2ZmbnVtID49IFBfRklSU1REQVRBS0VZKG9wYXF1ZSkpOwot CQkJCWlmIChvZmZudW0gPiBQX0ZJUlNUREFUQUtFWShvcGFxdWUpKQorCQkJCWlmICghZmluYWx0 dXApCiAJCQkJeworCQkJCQlBc3NlcnQob2ZmbnVtID4gbWlub2ZmKTsKIAkJCQkJb2ZmbnVtID0g T2Zmc2V0TnVtYmVyUHJldihvZmZudW0pOwogCQkJCQljb250aW51ZTsKIAkJCQl9CkBAIC0xNzI0 LDggKzE3NjMsNyBAQCBfYnRfcmVhZHBhZ2UoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0 aW9uIGRpciwgT2Zmc2V0TnVtYmVyIG9mZm51bSkKIAogCQkJaXR1cCA9IChJbmRleFR1cGxlKSBQ YWdlR2V0SXRlbShwYWdlLCBpaWQpOwogCi0JCQlwYXNzZXNfcXVhbHMgPSBfYnRfY2hlY2trZXlz KHNjYW4sIGl0dXAsIGluZG5hdHRzLCBkaXIsCi0JCQkJCQkJCQkJICZjb250aW51ZXNjYW4pOwor CQkJcGFzc2VzX3F1YWxzID0gX2J0X2NoZWNra2V5cyhzY2FuLCAmcHN0YXRlLCBpdHVwLCBmaW5h bHR1cCk7CiAJCQlpZiAocGFzc2VzX3F1YWxzICYmIHR1cGxlX2FsaXZlKQogCQkJewogCQkJCS8q IHR1cGxlIHBhc3NlcyBhbGwgc2NhbiBrZXkgY29uZGl0aW9ucyAqLwpAQCAtMTc2NCw3ICsxODAy LDcgQEAgX2J0X3JlYWRwYWdlKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbkRpcmVjdGlvbiBkaXIs IE9mZnNldE51bWJlciBvZmZudW0pCiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoIWNvbnRp bnVlc2NhbikKKwkJCWlmICghcHN0YXRlLmNvbnRpbnVlc2NhbikKIAkJCXsKIAkJCQkvKiB0aGVy ZSBjYW4ndCBiZSBhbnkgbW9yZSBtYXRjaGVzLCBzbyBzdG9wICovCiAJCQkJc28tPmN1cnJQb3Mu bW9yZUxlZnQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUv bmJ0dXRpbHMuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwppbmRleCA3 ZGE0OTljNGQuLmM5OTUxODM1MiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL25idHJl ZS9uYnR1dGlscy5jCisrKyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9uYnRyZWUvbmJ0dXRpbHMuYwpA QCAtMzMsNyArMzMsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBCVFNvcnRBcnJheUNvbnRleHQKIHsK LQlGbWdySW5mbwlmbGluZm87CisJRm1nckluZm8gICAqb3JkZXJwcm9jOwogCU9pZAkJCWNvbGxh dGlvbjsKIAlib29sCQlyZXZlcnNlOwogfSBCVFNvcnRBcnJheUNvbnRleHQ7CkBAIC00MSwxNSAr NDEsMzMgQEAgdHlwZWRlZiBzdHJ1Y3QgQlRTb3J0QXJyYXlDb250ZXh0CiBzdGF0aWMgRGF0dW0g X2J0X2ZpbmRfZXh0cmVtZV9lbGVtZW50KEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5 LAogCQkJCQkJCQkJICBTdHJhdGVneU51bWJlciBzdHJhdCwKIAkJCQkJCQkJCSAgRGF0dW0gKmVs ZW1zLCBpbnQgbmVsZW1zKTsKK3N0YXRpYyB2b2lkIF9idF9zb3J0X2NtcF9mdW5jX3NldHVwKElu ZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBza2V5KTsKIHN0YXRpYyBpbnQJX2J0X3NvcnRfYXJy YXlfZWxlbWVudHMoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuS2V5IHNrZXksCiAJCQkJCQkJCQli b29sIHJldmVyc2UsCiAJCQkJCQkJCQlEYXR1bSAqZWxlbXMsIGludCBuZWxlbXMpOwogc3RhdGlj IGludAlfYnRfY29tcGFyZV9hcnJheV9lbGVtZW50cyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lk ICpiLCB2b2lkICphcmcpOworc3RhdGljIGlubGluZSBpbnQzMiBfYnRfY29tcGFyZV9hcnJheV9z a2V5KFNjYW5LZXkgY3VyLCBGbWdySW5mbyAqb3JkZXJwcm9jLAorCQkJCQkJCQkJCSAgIERhdHVt IGRhdHVtLCBib29sIG51bGwsCisJCQkJCQkJCQkJICAgRGF0dW0gYXJyZGF0dW0pOworc3RhdGlj IGludAlfYnRfYmluc3JjaF9hcnJheV9za2V5KFNjYW5EaXJlY3Rpb24gZGlyLCBib29sIGN1cl9l bGVtX3N0YXJ0LAorCQkJCQkJCQkgICBCVEFycmF5S2V5SW5mbyAqYXJyYXksIFNjYW5LZXkgY3Vy LAorCQkJCQkJCQkgICBGbWdySW5mbyAqb3JkZXJwcm9jLCBEYXR1bSBkYXR1bSwgYm9vbCBudWxs LAorCQkJCQkJCQkgICBpbnQzMiAqZmluYWxfcmVzdWx0KTsKK3N0YXRpYyBib29sIF9idF90dXBs ZV9iZWZvcmVfYXJyYXlfc2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLAorCQkJCQkJCQkJCSBCVFJl YWRQYWdlU3RhdGUgKnBzdGF0ZSwKKwkJCQkJCQkJCQkgSW5kZXhUdXBsZSB0dXBsZSk7CitzdGF0 aWMgYm9vbCBfYnRfYWR2YW5jZV9hcnJheV9rZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFk UGFnZVN0YXRlICpwc3RhdGUsCisJCQkJCQkJCSAgIEluZGV4VHVwbGUgdHVwbGUsIGJvb2wgc2ty ZXF1aXJlZHRyaWdnZXIpOworc3RhdGljIGJvb2wgX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNy ZW1lbnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcik7CitzdGF0aWMgdm9p ZCBfYnRfYWR2YW5jZV9hcnJheV9rZXlzX3RvX2VuZChJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5E aXJlY3Rpb24gZGlyKTsKIHN0YXRpYyBib29sIF9idF9jb21wYXJlX3NjYW5rZXlfYXJncyhJbmRl eFNjYW5EZXNjIHNjYW4sIFNjYW5LZXkgb3AsCiAJCQkJCQkJCQkgU2NhbktleSBsZWZ0YXJnLCBT Y2FuS2V5IHJpZ2h0YXJnLAogCQkJCQkJCQkJIGJvb2wgKnJlc3VsdCk7CiBzdGF0aWMgYm9vbCBf YnRfZml4X3NjYW5rZXlfc3RyYXRlZ3koU2NhbktleSBza2V5LCBpbnQxNiAqaW5kb3B0aW9uKTsK IHN0YXRpYyB2b2lkIF9idF9tYXJrX3NjYW5rZXlfcmVxdWlyZWQoU2NhbktleSBza2V5KTsKK3N0 YXRpYyBib29sIF9idF9jaGVja19jb21wYXJlKFNjYW5EaXJlY3Rpb24gZGlyLCBTY2FuS2V5IGtl eURhdGEsIGludCBrZXlzeiwKKwkJCQkJCQkgIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0 cywgVHVwbGVEZXNjIHR1cGRlc2MsCisJCQkJCQkJICBib29sICpjb250aW51ZXNjYW4sIGJvb2wg KnNrcmVxdWlyZWR0cmlnZ2VyKTsKIHN0YXRpYyBib29sIF9idF9jaGVja19yb3djb21wYXJlKFNj YW5LZXkgc2tleSwKIAkJCQkJCQkJIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywgVHVw bGVEZXNjIHR1cGRlc2MsCiAJCQkJCQkJCSBTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCAqY29udGlu dWVzY2FuKTsKQEAgLTIwMiw2ICsyMjAsMjEgQEAgX2J0X2ZyZWVzdGFjayhCVFN0YWNrIHN0YWNr KQogICogYXJyYXkga2V5cywgaXQncyBzdWZmaWNpZW50IHRvIGZpbmQgdGhlIGV4dHJlbWUgZWxl bWVudCB2YWx1ZSBhbmQgcmVwbGFjZQogICogdGhlIHdob2xlIGFycmF5IHdpdGggdGhhdCBzY2Fs YXIgdmFsdWUuCiAgKgorICogSW4gdGhlIHdvcnN0IGNhc2UsIHRoZSBudW1iZXIgb2YgcHJpbWl0 aXZlIGluZGV4IHNjYW5zIHdpbGwgZXF1YWwgdGhlCisgKiBudW1iZXIgb2YgYXJyYXkgZWxlbWVu dHMgKG9yIHRoZSBwcm9kdWN0IG9mIHRoZSBudW1iZXIgb2YgYXJyYXkga2V5cyB3aGVuCisgKiB0 aGVyZSBhcmUgbXVsdGlwbGUgYXJyYXlzL2NvbHVtbnMgaW52b2x2ZWQpLiAgSXQncyBhbHNvIHBv c3NpYmxlIHRoYXQgdGhlCisgKiB0b3RhbCBudW1iZXIgb2YgcHJpbWl0aXZlIGluZGV4IHNjYW5z IHdpbGwgYmUgZmFyIGxlc3MgdGhhbiB0aGF0LgorICoKKyAqIFdlIGFsd2F5cyBzb3J0IGFuZCBk ZWR1cGxpY2F0ZSBhcnJheXMgdXAtZnJvbnQgZm9yIGVxdWFsaXR5IGFycmF5IGtleXMuCisgKiBT Y2FsYXJBcnJheU9wRXhwciBleGVjdXRpb24gbmVlZCBvbmx5IHZpc2l0IGxlYWYgcGFnZXMgdGhh dCBtaWdodCBjb250YWluCisgKiBtYXRjaGVzIGV4YWN0bHkgb25jZSwgd2hpbGUgcHJlc2Vydmlu ZyB0aGUgc29ydCBvcmRlciBvZiB0aGUgaW5kZXguICBUaGlzCisgKiBpc24ndCBqdXN0IGFib3V0 IHBlcmZvcm1hbmNlOyBpdCBhbHNvIGF2b2lkcyBuZWVkaW5nIGR1cGxpY2F0ZSBlbGltaW5hdGlv bgorICogb2YgbWF0Y2hpbmcgVElEcyAod2UgcHJlZmVyIGRlZHVwbGljYXRpbmcgc2VhcmNoIGtl eXMgb25jZSwgdXAtZnJvbnQpLgorICogRXF1YWxpdHkgU0tfU0VBUkNIQVJSQVkga2V5cyBhcmUg ZGlzanVuY3RzIHRoYXQgd2UgYWx3YXlzIHByb2Nlc3MgaW4KKyAqIGluZGV4L2tleSBzcGFjZSBv cmRlciwgd2hpY2ggbWFrZXMgdGhpcyBnZW5lcmFsIGFwcHJvYWNoIGZlYXNpYmxlLiAgRXZlcnkK KyAqIGluZGV4IHR1cGxlIHdpbGwgbWF0Y2ggbm8gbW9yZSB0aGFuIG9uZSBzaW5nbGUgZGlzdGlu Y3QgY29tYmluYXRpb24gb2YKKyAqIGVxdWFsaXR5LWNvbnN0cmFpbmVkIGtleXMgKGFycmF5IGtl eXMgYW5kIG90aGVyIGVxdWFsaXR5IGtleXMpLgorICoKICAqIE5vdGU6IHRoZSByZWFzb24gd2Ug bmVlZCBzby0+YXJyYXlLZXlEYXRhLCByYXRoZXIgdGhhbiBqdXN0IHNjcmliYmxpbmcKICAqIG9u IHNjYW4tPmtleURhdGEsIGlzIHRoYXQgY2FsbGVycyBhcmUgcGVybWl0dGVkIHRvIGNhbGwgYnRy ZXNjYW4gd2l0aG91dAogICogc3VwcGx5aW5nIGEgbmV3IHNldCBvZiBzY2Fua2V5IGRhdGEuCkBA IC0yMTIsNiArMjQ1LDcgQEAgX2J0X3ByZXByb2Nlc3NfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNj IHNjYW4pCiAJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nhbi0+b3BhcXVlOwog CWludAkJCW51bWJlck9mS2V5cyA9IHNjYW4tPm51bWJlck9mS2V5czsKIAlpbnQxNgkgICAqaW5k b3B0aW9uID0gc2Nhbi0+aW5kZXhSZWxhdGlvbi0+cmRfaW5kb3B0aW9uOworCWludDE2CQlua2V5 YXR0cyA9IEluZGV4UmVsYXRpb25HZXROdW1iZXJPZktleUF0dHJpYnV0ZXMoc2Nhbi0+aW5kZXhS ZWxhdGlvbik7CiAJaW50CQkJbnVtQXJyYXlLZXlzOwogCVNjYW5LZXkJCWN1cjsKIAlpbnQJCQlp OwpAQCAtMjY1LDYgKzI5OSw3IEBAIF9idF9wcmVwcm9jZXNzX2FycmF5X2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuKQogCiAJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHBlci1hcnJheSBkYXRhIGluIHRo ZSB3b3Jrc3BhY2UgY29udGV4dCAqLwogCXNvLT5hcnJheUtleXMgPSAoQlRBcnJheUtleUluZm8g KikgcGFsbG9jMChudW1BcnJheUtleXMgKiBzaXplb2YoQlRBcnJheUtleUluZm8pKTsKKwlzby0+ b3JkZXJQcm9jcyA9IChGbWdySW5mbyAqKSBwYWxsb2MobmtleWF0dHMgKiBzaXplb2YoRm1ncklu Zm8pKTsKIAogCS8qIE5vdyBwcm9jZXNzIGVhY2ggYXJyYXkga2V5ICovCiAJbnVtQXJyYXlLZXlz ID0gMDsKQEAgLTI4MSw2ICszMTYsMTcgQEAgX2J0X3ByZXByb2Nlc3NfYXJyYXlfa2V5cyhJbmRl eFNjYW5EZXNjIHNjYW4pCiAJCWludAkJCWo7CiAKIAkJY3VyID0gJnNvLT5hcnJheUtleURhdGFb aV07CisKKwkJLyoKKwkJICogQXR0cmlidXRlcyB3aXRoIGVxdWFsaXR5LXR5cGUgc2NhbiBrZXlz IChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkCisJCSAqIHRvIGFycmF5IHNjYW4ga2V5cykgd2ls bCBuZWVkIGEgMy13YXkgY29tcGFyaXNvbiBmdW5jdGlvbi4KKwkJICoKKwkJICogWFhYIENsZWFu IHRoaXMgdXAgc29tZSBtb3JlLiAgVGhpcyByZXBlYXRzIHNvbWUgb2YgdGhlIHNhbWUgd29yawor CQkgKiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBzY2FuIGtleXMgZm9yIHRoZSBzYW1lIGtleSBj b2x1bW4uCisJCSAqLworCQlpZiAoY3VyLT5za19zdHJhdGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lO dW1iZXIpCisJCQlfYnRfc29ydF9jbXBfZnVuY19zZXR1cChzY2FuLCBjdXIpOworCiAJCWlmICgh KGN1ci0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSkpCiAJCQljb250aW51ZTsKIApAQCAtNDM2 LDYgKzQ4Miw0MiBAQCBfYnRfZmluZF9leHRyZW1lX2VsZW1lbnQoSW5kZXhTY2FuRGVzYyBzY2Fu LCBTY2FuS2V5IHNrZXksCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorLyoKKyAqIExvb2sgdXAgdGhl IGFwcHJvcHJpYXRlIGNvbXBhcmlzb24gZnVuY3Rpb24gaW4gdGhlIG9wZmFtaWx5LgorICoKKyAq IE5vdGU6IGl0J3MgcG9zc2libGUgdGhhdCB0aGlzIHdvdWxkIGZhaWwsIGlmIHRoZSBvcGZhbWls eSBpcyBpbmNvbXBsZXRlLAorICogYnV0IGl0IHNlZW1zIHF1aXRlIHVubGlrZWx5IHRoYXQgYW4g b3BmYW1pbHkgd291bGQgb21pdCBub24tY3Jvc3MtdHlwZQorICogc3VwcG9ydCBmdW5jdGlvbnMg Zm9yIGFueSBkYXRhdHlwZSB0aGF0IGl0IHN1cHBvcnRzIGF0IGFsbC4KKyAqLworc3RhdGljIHZv aWQKK19idF9zb3J0X2NtcF9mdW5jX3NldHVwKEluZGV4U2NhbkRlc2Mgc2NhbiwgU2NhbktleSBz a2V5KQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsK KwlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJlbGF0aW9uOworCU9pZAkJCWVsZW10eXBlOwor CVJlZ1Byb2NlZHVyZSBjbXBfcHJvYzsKKwlGbWdySW5mbyAgICpvcmRlcnByb2MgPSAmc28tPm9y ZGVyUHJvY3Nbc2tleS0+c2tfYXR0bm8gLSAxXTsKKworCS8qCisJICogRGV0ZXJtaW5lIHRoZSBu b21pbmFsIGRhdGF0eXBlIG9mIHRoZSBhcnJheSBlbGVtZW50cy4gIFdlIGhhdmUgdG8KKwkgKiBz dXBwb3J0IHRoZSBjb252ZW50aW9uIHRoYXQgc2tfc3VidHlwZSA9PSBJbnZhbGlkT2lkIG1lYW5z IHRoZSBvcGNsYXNzCisJICogaW5wdXQgdHlwZTsgdGhpcyBpcyBhIGhhY2sgdG8gc2ltcGxpZnkg bGlmZSBmb3IgU2NhbktleUluaXQoKS4KKwkgKi8KKwllbGVtdHlwZSA9IHNrZXktPnNrX3N1YnR5 cGU7CisJaWYgKGVsZW10eXBlID09IEludmFsaWRPaWQpCisJCWVsZW10eXBlID0gcmVsLT5yZF9v cGNpbnR5cGVbc2tleS0+c2tfYXR0bm8gLSAxXTsKKworCWNtcF9wcm9jID0gZ2V0X29wZmFtaWx5 X3Byb2MocmVsLT5yZF9vcGZhbWlseVtza2V5LT5za19hdHRubyAtIDFdLAorCQkJCQkJCQkgcmVs LT5yZF9vcGNpbnR5cGVbc2tleS0+c2tfYXR0bm8gLSAxXSwKKwkJCQkJCQkJIGVsZW10eXBlLAor CQkJCQkJCQkgQlRPUkRFUl9QUk9DKTsKKwlpZiAoIVJlZ1Byb2NlZHVyZUlzVmFsaWQoY21wX3By b2MpKQorCQllbG9nKEVSUk9SLCAibWlzc2luZyBzdXBwb3J0IGZ1bmN0aW9uICVkKCV1LCV1KSBp biBvcGZhbWlseSAldSIsCisJCQkgQlRPUkRFUl9QUk9DLCBlbGVtdHlwZSwgZWxlbXR5cGUsCisJ CQkgcmVsLT5yZF9vcGZhbWlseVtza2V5LT5za19hdHRubyAtIDFdKTsKKwlmbWdyX2luZm9fY3h0 KGNtcF9wcm9jLCBvcmRlcnByb2MsIHNvLT5hcnJheUNvbnRleHQpOworfQorCiAvKgogICogX2J0 X3NvcnRfYXJyYXlfZWxlbWVudHMoKSAtLSBzb3J0IGFuZCBkZS1kdXAgYXJyYXkgZWxlbWVudHMK ICAqCkBAIC00NTAsNDIgKzUzMiwxNCBAQCBfYnRfc29ydF9hcnJheV9lbGVtZW50cyhJbmRleFNj YW5EZXNjIHNjYW4sIFNjYW5LZXkgc2tleSwKIAkJCQkJCWJvb2wgcmV2ZXJzZSwKIAkJCQkJCURh dHVtICplbGVtcywgaW50IG5lbGVtcykKIHsKLQlSZWxhdGlvbglyZWwgPSBzY2FuLT5pbmRleFJl bGF0aW9uOwotCU9pZAkJCWVsZW10eXBlOwotCVJlZ1Byb2NlZHVyZSBjbXBfcHJvYzsKKwlCVFNj YW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CiAJQlRTb3J0QXJyYXlD b250ZXh0IGN4dDsKIAogCWlmIChuZWxlbXMgPD0gMSkKIAkJcmV0dXJuIG5lbGVtczsJCQkvKiBu byB3b3JrIHRvIGRvICovCiAKLQkvKgotCSAqIERldGVybWluZSB0aGUgbm9taW5hbCBkYXRhdHlw ZSBvZiB0aGUgYXJyYXkgZWxlbWVudHMuICBXZSBoYXZlIHRvCi0JICogc3VwcG9ydCB0aGUgY29u dmVudGlvbiB0aGF0IHNrX3N1YnR5cGUgPT0gSW52YWxpZE9pZCBtZWFucyB0aGUgb3BjbGFzcwot CSAqIGlucHV0IHR5cGU7IHRoaXMgaXMgYSBoYWNrIHRvIHNpbXBsaWZ5IGxpZmUgZm9yIFNjYW5L ZXlJbml0KCkuCi0JICovCi0JZWxlbXR5cGUgPSBza2V5LT5za19zdWJ0eXBlOwotCWlmIChlbGVt dHlwZSA9PSBJbnZhbGlkT2lkKQotCQllbGVtdHlwZSA9IHJlbC0+cmRfb3BjaW50eXBlW3NrZXkt PnNrX2F0dG5vIC0gMV07Ci0KLQkvKgotCSAqIExvb2sgdXAgdGhlIGFwcHJvcHJpYXRlIGNvbXBh cmlzb24gZnVuY3Rpb24gaW4gdGhlIG9wZmFtaWx5LgotCSAqCi0JICogTm90ZTogaXQncyBwb3Nz aWJsZSB0aGF0IHRoaXMgd291bGQgZmFpbCwgaWYgdGhlIG9wZmFtaWx5IGlzCi0JICogaW5jb21w bGV0ZSwgYnV0IGl0IHNlZW1zIHF1aXRlIHVubGlrZWx5IHRoYXQgYW4gb3BmYW1pbHkgd291bGQg b21pdAotCSAqIG5vbi1jcm9zcy10eXBlIHN1cHBvcnQgZnVuY3Rpb25zIGZvciBhbnkgZGF0YXR5 cGUgdGhhdCBpdCBzdXBwb3J0cyBhdAotCSAqIGFsbC4KLQkgKi8KLQljbXBfcHJvYyA9IGdldF9v cGZhbWlseV9wcm9jKHJlbC0+cmRfb3BmYW1pbHlbc2tleS0+c2tfYXR0bm8gLSAxXSwKLQkJCQkJ CQkJIGVsZW10eXBlLAotCQkJCQkJCQkgZWxlbXR5cGUsCi0JCQkJCQkJCSBCVE9SREVSX1BST0Mp OwotCWlmICghUmVnUHJvY2VkdXJlSXNWYWxpZChjbXBfcHJvYykpCi0JCWVsb2coRVJST1IsICJt aXNzaW5nIHN1cHBvcnQgZnVuY3Rpb24gJWQoJXUsJXUpIGluIG9wZmFtaWx5ICV1IiwKLQkJCSBC VE9SREVSX1BST0MsIGVsZW10eXBlLCBlbGVtdHlwZSwKLQkJCSByZWwtPnJkX29wZmFtaWx5W3Nr ZXktPnNrX2F0dG5vIC0gMV0pOwotCiAJLyogU29ydCB0aGUgYXJyYXkgZWxlbWVudHMgKi8KLQlm bWdyX2luZm8oY21wX3Byb2MsICZjeHQuZmxpbmZvKTsKKwljeHQub3JkZXJwcm9jID0gJnNvLT5v cmRlclByb2NzW3NrZXktPnNrX2F0dG5vIC0gMV07CiAJY3h0LmNvbGxhdGlvbiA9IHNrZXktPnNr X2NvbGxhdGlvbjsKIAljeHQucmV2ZXJzZSA9IHJldmVyc2U7CiAJcXNvcnRfYXJnKGVsZW1zLCBu ZWxlbXMsIHNpemVvZihEYXR1bSksCkBAIC01MDcsNyArNTYxLDcgQEAgX2J0X2NvbXBhcmVfYXJy YXlfZWxlbWVudHMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgdm9pZCAqYXJnKQogCUJU U29ydEFycmF5Q29udGV4dCAqY3h0ID0gKEJUU29ydEFycmF5Q29udGV4dCAqKSBhcmc7CiAJaW50 MzIJCWNvbXBhcmU7CiAKLQljb21wYXJlID0gRGF0dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29s bCgmY3h0LT5mbGluZm8sCisJY29tcGFyZSA9IERhdHVtR2V0SW50MzIoRnVuY3Rpb25DYWxsMkNv bGwoY3h0LT5vcmRlcnByb2MsCiAJCQkJCQkJCQkJCSAgY3h0LT5jb2xsYXRpb24sCiAJCQkJCQkJ CQkJCSAgZGEsIGRiKSk7CiAJaWYgKGN4dC0+cmV2ZXJzZSkKQEAgLTUxNSw2ICs1NjksMTcxIEBA IF9idF9jb21wYXJlX2FycmF5X2VsZW1lbnRzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIs IHZvaWQgKmFyZykKIAlyZXR1cm4gY29tcGFyZTsKIH0KIAorLyoKKyAqIENvbXBhcmF0b3IgdXNl cyB0byBzZWFyY2ggZm9yIHRoZSBuZXh0IGFycmF5IGVsZW1lbnQgd2hlbiBhcnJheSBrZXlzIG5l ZWQKKyAqIHRvIGJlIGFkdmFuY2VkIHZpYSBvbmUgb3IgbW9yZSBiaW5hcnkgc2VhcmNoZXMKKyAq CisgKiBUaGlzIGNvZGUgaXMgbG9vc2VseSBiYXNlZCBvbiBfYnRfY29tcGFyZS4gIEhvd2V2ZXIs IHRoZXJlIGFyZSBzb21lCisgKiBpbXBvcnRhbnQgZGlmZmVyZW5jZXMuCisgKgorICogSXQgaXMg Y29udmVuaWVudCB0byB0aGluayBvZiBjYWxsaW5nIF9idF9jb21wYXJlIGFzIGNvbXBhcmluZyBj YWxsZXIncworICogaW5zZXJ0aW9uIHNjYW5rZXkgdG8gYW4gaW5kZXggdHVwbGUuICBCdXQgb3Vy IGNhbGxlcnMgYXJlIG5vdCBzZWFyY2hpbmcKKyAqIHRocm91Z2ggdGhlIGluZGV4IGF0IGFsbCAt LSB0aGV5J3JlIHNlYXJjaGluZyB0aHJvdWdoIGEgbG9jYWwgYXJyYXkgb2YKKyAqIGRhdHVtcyBh c3NvY2lhdGVkIHdpdGggYSBzY2FuIGtleSAodXNpbmcgdmFsdWVzIHRoZXkndmUgdGFrZW4gZnJv bSBhbiBpbmRleAorICogdHVwbGUpLiAgVGhpcyBpcyBhIGNvbXBsZXRlIHJldmVyc2FsIG9mIGhv dyB0aGluZ3MgdXN1YWxseSB3b3JrLCB3aGljaCBjYW4KKyAqIGJlIGNvbmZ1c2luZy4KKyAqCisg KiBDYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHRoaW5rIG9mIGl0IGFzIGNvbXBhcmlu ZyAiZGF0dW0iIChhcyB3ZWxsCisgKiBhcyAibnVsbCIpIHRvICJhcnJkYXR1bSIuICBUaGlzIGlz IHRoZSBzYW1lIGFwcHJvYWNoIHRoYXQgX2J0X2NvbXBhcmUgdGFrZXMKKyAqIGluIHRoYXQgYm90 aCBmdW5jdGlvbnMgY29tcGFyZSB0aGUgdmFsdWUgdGhhdCB0aGV5J3JlIHNlYXJjaGluZyBmb3Ig dG8gb25lCisgKiBwYXJ0aWN1bGFyIGl0ZW0gdXNlZCBhcyBhIGJpbmFyeSBzZWFyY2ggcGl2b3Qu ICAoQnV0IGl0J3MgdGhlIHdyb25nIHdheQorICogYXJvdW5kIGlmIHlvdSB0aGluayBvZiBpdCBh cyAidHVwbGUgdmFsdWVzIHZzIHNjYW4ga2V5IHZhbHVlcyIuICBTbyBkb24ndC4pCisqLworc3Rh dGljIGlubGluZSBpbnQzMgorX2J0X2NvbXBhcmVfYXJyYXlfc2tleShTY2FuS2V5IGN1ciwKKwkJ CQkJICAgRm1nckluZm8gKm9yZGVycHJvYywKKwkJCQkJICAgRGF0dW0gZGF0dW0sCisJCQkJCSAg IGJvb2wgbnVsbCwKKwkJCQkJICAgRGF0dW0gYXJyZGF0dW0pCit7CisJaW50MzIJCXJlc3VsdCA9 IDA7CisKKwlBc3NlcnQoY3VyLT5za19zdHJhdGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIp OworCisJaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19JU05VTEwpCS8qIGFycmF5L3NjYW4ga2V5IGlz IE5VTEwgKi8KKwl7CisJCWlmIChudWxsKQorCQkJcmVzdWx0ID0gMDsJCQkvKiBOVUxMICI9IiBO VUxMICovCisJCWVsc2UgaWYgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9OVUxMU19GSVJTVCkKKwkJ CXJlc3VsdCA9IDE7CQkJLyogTlVMTCAiPCIgTk9UX05VTEwgKi8KKwkJZWxzZQorCQkJcmVzdWx0 ID0gLTE7CQkvKiBOVUxMICI+IiBOT1RfTlVMTCAqLworCX0KKwllbHNlIGlmIChudWxsKQkJCQkv KiBhcnJheS9zY2FuIGtleSBpcyBOT1RfTlVMTCBhbmQgdHVwbGUgaXRlbQorCQkJCQkJCQkgKiBp cyBOVUxMICovCisJeworCQlpZiAoY3VyLT5za19mbGFncyAmIFNLX0JUX05VTExTX0ZJUlNUKQor CQkJcmVzdWx0ID0gLTE7CQkvKiBOT1RfTlVMTCAiPiIgTlVMTCAqLworCQllbHNlCisJCQlyZXN1 bHQgPSAxOwkJCS8qIE5PVF9OVUxMICI8IiBOVUxMICovCisJfQorCWVsc2UKKwl7CisJCS8qCisJ CSAqIExpa2UgX2J0X2NvbXBhcmUsIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBvZiBjcm9zcy10eXBl IGNvbXBhcmlzb25zLAorCQkgKiBzbyB0aGUgbGVmdCB2YWx1ZSBoYXMgdG8gYmUgdGhlIHZhbHVl IHRoYXQgY2FtZSBmcm9tIGFuIGluZGV4CisJCSAqIHR1cGxlLiAgKEFycmF5IHNjYW4ga2V5cyBj YW5ub3QgYmUgY3Jvc3MtdHlwZSwgYnV0IG90aGVyIHJlcXVpcmVkCisJCSAqIHNjYW4ga2V5cyB0 aGF0IHVzZSBhbiBlcXVhbCBvcGVyYXRvciBjYW4gYmUuKQorCQkgKi8KKwkJcmVzdWx0ID0gRGF0 dW1HZXRJbnQzMihGdW5jdGlvbkNhbGwyQ29sbChvcmRlcnByb2MsIGN1ci0+c2tfY29sbGF0aW9u LAorCQkJCQkJCQkJCQkJIGRhdHVtLCBhcnJkYXR1bSkpOworCisJCS8qCisJCSAqIFVubGlrZSBf YnRfY29tcGFyZSwgd2UgZmxpcCB0aGUgc2lnbiB3aGVuIGNvbHVtbiBpcyBhIERFU0MgY29sdW1u CisJCSAqIChhbmQgKm5vdCogd2hlbiBjb2x1bW4gaXMgQVNDKS4gIFRoaXMgbWF0Y2hlcyB0aGUg YXBwcm9hY2ggdGFrZW4gYnkKKwkJICogX2J0X2NoZWNrX3Jvd2NvbXBhcmUsIHdoaWNoIHBlcmZv cm1zIHNpbWlsYXIgdGhyZWUtd2F5IGNvbXBhcmlzb25zLgorCQkgKi8KKwkJaWYgKGN1ci0+c2tf ZmxhZ3MgJiBTS19CVF9ERVNDKQorCQkJSU5WRVJUX0NPTVBBUkVfUkVTVUxUKHJlc3VsdCk7CisJ fQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIF9idF9iaW5zcmNoX2FycmF5X3NrZXko KSAtLSBCaW5hcnkgc2VhcmNoIGZvciBuZXh0IG1hdGNoaW5nIGFycmF5IGtleQorICoKKyAqIGN1 cl9lbGVtX3N0YXJ0IGluZGljYXRlcyBpZiB0aGUgYmluYXJ5IHNlYXJjaCBzaG91bGQgYmVnaW4g YXQgdGhlIGFycmF5J3MKKyAqIGN1cnJlbnQgZWxlbWVudCAob3IgaGF2ZSB0aGUgY3VycmVudCBl bGVtZW50IGFzIGFuIHVwcGVyIGJvdW5kIGlmIGl0J3MgYQorICogYmFja3dhcmQgc2NhbikuICBU aGlzIGFsbG93cyBzZWFyY2hlcyBhZ2FpbnN0IHJlcXVpcmVkIHNjYW4ga2V5IGFycmF5cyB0bwor ICogcmV1c2UgdGhlIHdvcmsgb2YgZWFybGllciBzZWFyY2hlcywgYXQgbGVhc3QgaW4gbWFueSBp bXBvcnRhbnQgY2FzZXMuCisgKiBBcnJheSBrZXlzIGNvdmVyaW5nIGtleSBzcGFjZSB0aGF0IHRo ZSBpbmRleCBzY2FuIGFscmVhZHkgcHJvY2Vzc2VkIGNhbm5vdAorICogcG9zc2libHkgY29udGFp biBhbnkgbWF0Y2hlcy4KKyAqCisgKiBYWFggVGhlcmUgYXJlIHNldmVyYWwgZmFpcmx5IG9idmlv dXMgb3B0aW1pemF0aW9ucyB0aGF0IHdlIGNvdWxkIGFwcGx5IGhlcmUKKyAqIChlLmcuLCBwcmVj aGVjayBzZWFyY2hlcyBmb3IgZWFybGllciBzdWJzZXRzIG9mIGEgbGFyZ2VyIGFycmF5IHdvdWxk IGhlbHApLgorICogUmV2aXNpdCB0aGlzIGR1cmluZyB0aGUgbmV4dCByb3VuZCBvZiBwZXJmb3Jt YW5jZSB2YWxpZGF0aW9uLgorICoKKyAqIFJldHVybnMgYW4gaW5kZXggdG8gdGhlIGZpcnN0IGFy cmF5IGVsZW1lbnQgPj0gY2FsbGVyJ3MgZGF0dW0gYXJndW1lbnQuCisgKiBBbHNvIHNldHMgKmZp bmFsX3Jlc3VsdCB0byB3aGF0ZXZlciBfYnRfY29tcGFyZV9hcnJheV9za2V5IHJldHVybmVkIHdo ZW4gd2UKKyAqIGRpcmVjdGx5IGNvbXBhcmVkIHRoZSByZXR1cm5lZCBhcnJheSBlbGVtZW50IHRv IHNlYXJjaGVkLWZvciBkYXR1bS4KKyAqLworc3RhdGljIGludAorX2J0X2JpbnNyY2hfYXJyYXlf c2tleShTY2FuRGlyZWN0aW9uIGRpciwgYm9vbCBjdXJfZWxlbV9zdGFydCwKKwkJCQkJICAgQlRB cnJheUtleUluZm8gKmFycmF5LCBTY2FuS2V5IGN1ciwKKwkJCQkJICAgRm1nckluZm8gKm9yZGVy cHJvYywgRGF0dW0gZGF0dW0sIGJvb2wgbnVsbCwKKwkJCQkJICAgaW50MzIgKmZpbmFsX3Jlc3Vs dCkKK3sKKwlpbnQJCQlsb3dfZWxlbSwKKwkJCQloaWdoX2VsZW0sCisJCQkJZmlyc3RfZWxlbV9k aXIsCisJCQkJcmVzdWx0ID0gMDsKKwlib29sCQlrbm93bmVxdWFsID0gZmFsc2U7CisKKwlBc3Nl cnQoY3VyLT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKTsKKwlBc3NlcnQoY3VyLT5za19zdHJh dGVneSA9PSBCVEVxdWFsU3RyYXRlZ3lOdW1iZXIpOworCisJaWYgKFNjYW5EaXJlY3Rpb25Jc0Zv cndhcmQoZGlyKSkKKwl7CisJCWZpcnN0X2VsZW1fZGlyID0gMDsKKwkJbG93X2VsZW0gPSBhcnJh eS0+Y3VyX2VsZW07CisJCWhpZ2hfZWxlbSA9IGFycmF5LT5udW1fZWxlbXMgLSAxOworCQlpZiAo Y3VyX2VsZW1fc3RhcnQpCisJCQlsb3dfZWxlbSA9IDA7CisJfQorCWVsc2UKKwl7CisJCWZpcnN0 X2VsZW1fZGlyID0gYXJyYXktPm51bV9lbGVtcyAtIDE7CisJCWxvd19lbGVtID0gMDsKKwkJaGln aF9lbGVtID0gYXJyYXktPmN1cl9lbGVtOworCQlpZiAoY3VyX2VsZW1fc3RhcnQpCisJCXsKKwkJ CWxvd19lbGVtID0gMDsKKwkJCWhpZ2hfZWxlbSA9IGZpcnN0X2VsZW1fZGlyOworCQl9CisJfQor CisJd2hpbGUgKGhpZ2hfZWxlbSA+IGxvd19lbGVtKQorCXsKKwkJaW50CQkJbWlkX2VsZW0gPSBs b3dfZWxlbSArICgoaGlnaF9lbGVtIC0gbG93X2VsZW0pIC8gMik7CisJCURhdHVtCQlhcnJkYXR1 bSA9IGFycmF5LT5lbGVtX3ZhbHVlc1ttaWRfZWxlbV07CisKKwkJcmVzdWx0ID0gX2J0X2NvbXBh cmVfYXJyYXlfc2tleShjdXIsIG9yZGVycHJvYywgZGF0dW0sIG51bGwsIGFycmRhdHVtKTsKKwor CQlpZiAocmVzdWx0ID09IDApCisJCXsKKwkJCS8qCisJCQkgKiBFYWNoIGFycmF5IHdhcyBkZWR1 cGxpY2F0ZWQgZHVyaW5nIGluaXRpYWwgcHJlcHJvY2Vzc2luZywgc28KKwkJCSAqIHRoZXJlIGVh Y2ggZWxlbWVudCBpcyBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4gIFdlIGNhbiBxdWl0IGFzCisJ CQkgKiBzb29uIGFzIHdlIHNlZSBhbiBlcXVhbCBhcnJheSwgc2F2aW5nIG91cnNlbHZlcyBhbiBl eHRyYQorCQkJICogY29tcGFyaXNvbiBvciB0d28uLi4KKwkJCSAqLworCQkJbG93X2VsZW0gPSBt aWRfZWxlbTsKKwkJCWtub3duZXF1YWwgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAo cmVzdWx0ID4gMCkKKwkJCWxvd19lbGVtID0gbWlkX2VsZW0gKyAxOworCQllbHNlCisJCQloaWdo X2VsZW0gPSBtaWRfZWxlbTsKKwl9CisKKwkvKgorCSAqIC4uLiBidXQgb3VyIGNhbGxlciBhbHNv IGNhcmVzIGFib3V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc2VhcmNoZWQtZm9yCisJICogZGF0dW0g cmVsYXRpdmUgdG8gdGhlIGxvd19lbGVtIG1hdGNoIHdlJ2xsIHJldHVybi4gIE1ha2Ugc3VyZSB0 aGF0IHdlCisJICogc2V0ICpmaW5hbF9yZXN1bHQgdG8gdGhlIHJlc3VsdCB0aGF0IGNvbWVzIGZy b20gY29tcGFyaW5nIGxvd19lbGVtJ3MKKwkgKiBrZXkgdmFsdWUgdG8gdGhlIGRhdHVtIHRoYXQg Y2FsbGVyIGhhZCB1cyBzZWFyY2ggZm9yLgorCSAqLworCWlmICgha25vd25lcXVhbCkKKwkJcmVz dWx0ID0gX2J0X2NvbXBhcmVfYXJyYXlfc2tleShjdXIsIG9yZGVycHJvYywgZGF0dW0sIG51bGws CisJCQkJCQkJCQkJYXJyYXktPmVsZW1fdmFsdWVzW2xvd19lbGVtXSk7CisKKwkqZmluYWxfcmVz dWx0ID0gcmVzdWx0OworCisJcmV0dXJuIGxvd19lbGVtOworfQorCiAvKgogICogX2J0X3N0YXJ0 X2FycmF5X2tleXMoKSAtLSBJbml0aWFsaXplIGFycmF5IGtleXMgYXQgc3RhcnQgb2YgYSBzY2Fu CiAgKgpAQCAtNTQxLDcwICs3NjAsMjAgQEAgX2J0X3N0YXJ0X2FycmF5X2tleXMoSW5kZXhTY2Fu RGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKIAl9CiB9CiAKLS8qCi0gKiBfYnRfYWR2YW5j ZV9hcnJheV9rZXlzKCkgLS0gQWR2YW5jZSB0byBuZXh0IHNldCBvZiBhcnJheSBlbGVtZW50cwot ICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhbm90aGVyIHNldCBvZiB2YWx1ZXMgdG8g Y29uc2lkZXIsIGZhbHNlIGlmIG5vdC4KLSAqIE9uIHRydWUgcmVzdWx0LCB0aGUgc2NhbmtleXMg YXJlIGluaXRpYWxpemVkIHdpdGggdGhlIG5leHQgc2V0IG9mIHZhbHVlcy4KLSAqLwotYm9vbAot X2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4sIFNjYW5EaXJlY3Rpb24g ZGlyKQotewotCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1ZTsK LQlib29sCQlmb3VuZCA9IGZhbHNlOwotCWludAkJCWk7Ci0KLQkvKgotCSAqIFdlIG11c3QgYWR2 YW5jZSB0aGUgbGFzdCBhcnJheSBrZXkgbW9zdCBxdWlja2x5LCBzaW5jZSBpdCB3aWxsCi0JICog Y29ycmVzcG9uZCB0byB0aGUgbG93ZXN0LW9yZGVyIGluZGV4IGNvbHVtbiBhbW9uZyB0aGUgYXZh aWxhYmxlCi0JICogcXVhbGlmaWNhdGlvbnMuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBj b3JyZWN0IG9yZGVyaW5nIG9mIG91dHB1dAotCSAqIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGFy cmF5IGtleXMuCi0JICovCi0JZm9yIChpID0gc28tPm51bUFycmF5S2V5cyAtIDE7IGkgPj0gMDsg aS0tKQotCXsKLQkJQlRBcnJheUtleUluZm8gKmN1ckFycmF5S2V5ID0gJnNvLT5hcnJheUtleXNb aV07Ci0JCVNjYW5LZXkJCXNrZXkgPSAmc28tPmFycmF5S2V5RGF0YVtjdXJBcnJheUtleS0+c2Nh bl9rZXldOwotCQlpbnQJCQljdXJfZWxlbSA9IGN1ckFycmF5S2V5LT5jdXJfZWxlbTsKLQkJaW50 CQkJbnVtX2VsZW1zID0gY3VyQXJyYXlLZXktPm51bV9lbGVtczsKLQotCQlpZiAoU2NhbkRpcmVj dGlvbklzQmFja3dhcmQoZGlyKSkKLQkJewotCQkJaWYgKC0tY3VyX2VsZW0gPCAwKQotCQkJewot CQkJCWN1cl9lbGVtID0gbnVtX2VsZW1zIC0gMTsKLQkJCQlmb3VuZCA9IGZhbHNlOwkvKiBuZWVk IHRvIGFkdmFuY2UgbmV4dCBhcnJheSBrZXkgKi8KLQkJCX0KLQkJCWVsc2UKLQkJCQlmb3VuZCA9 IHRydWU7Ci0JCX0KLQkJZWxzZQotCQl7Ci0JCQlpZiAoKytjdXJfZWxlbSA+PSBudW1fZWxlbXMp Ci0JCQl7Ci0JCQkJY3VyX2VsZW0gPSAwOwotCQkJCWZvdW5kID0gZmFsc2U7CS8qIG5lZWQgdG8g YWR2YW5jZSBuZXh0IGFycmF5IGtleSAqLwotCQkJfQotCQkJZWxzZQotCQkJCWZvdW5kID0gdHJ1 ZTsKLQkJfQotCi0JCWN1ckFycmF5S2V5LT5jdXJfZWxlbSA9IGN1cl9lbGVtOwotCQlza2V5LT5z a19hcmd1bWVudCA9IGN1ckFycmF5S2V5LT5lbGVtX3ZhbHVlc1tjdXJfZWxlbV07Ci0JCWlmIChm b3VuZCkKLQkJCWJyZWFrOwotCX0KLQotCS8qIGFkdmFuY2UgcGFyYWxsZWwgc2NhbiAqLwotCWlm IChzY2FuLT5wYXJhbGxlbF9zY2FuICE9IE5VTEwpCi0JCV9idF9wYXJhbGxlbF9hZHZhbmNlX2Fy cmF5X2tleXMoc2Nhbik7Ci0KLQlyZXR1cm4gZm91bmQ7Ci19Ci0KIC8qCiAgKiBfYnRfbWFya19h cnJheV9rZXlzKCkgLS0gSGFuZGxlIGFycmF5IGtleXMgZHVyaW5nIGJ0bWFya3BvcwogICoKICAq IFNhdmUgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGFycmF5IGtleXMgYXMgdGhlICJtYXJrIiBw b3NpdGlvbi4KKyAqCisgKiBYWFggVGhlIGN1cnJlbnQgc2V0IG9mIGFycmF5IGtleXMgYXJlIG5v dCBpbmRlcGVuZGVudCBvZiB0aGUgY3VycmVudCBzY2FuCisgKiBwb3NpdGlvbiwgc28gd2h5IHRy ZWF0IHRoZW0gdGhhdCB3YXk/CisgKgorICogV2Ugc2hvdWxkbid0IGV2ZW4gYm90aGVyIHJlbWVt YmVyaW5nIHRoZSBjdXJyZW50IGFycmF5IGtleXMgd2hlbiBidG1hcmtwb3MKKyAqIGlzIGNhbGxl ZC4gIFRoZSBhcnJheSBrZXlzIHNob3VsZCBiZSBoYW5kbGVkIGxhemlseSBpbnN0ZWFkLiAgSWYg YW5kIHdoZW4KKyAqIGJ0cmVzdHJwb3MgaXMgY2FsbGVkLCBpdCBjYW4ganVzdCBzZXQgZXZlcnkg YXJyYXkncyBjdXJfZWxlbSB0byB0aGUgZmlyc3QKKyAqIGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50 IHNjYW4gZGlyZWN0aW9uLiAgV2hlbiBfYnRfYWR2YW5jZV9hcnJheV9rZXlzIGlzCisgKiByZWFj aGVkIChkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gX2J0X2NoZWNra2V5cyB0aGF0IGZvbGxvd3Mp LCBpdCB3aWxsCisgKiBhdXRvbWF0aWNhbGx5IHNlYXJjaCBmb3IgdGhlIHJlbGV2YW50IGFycmF5 IGtleXMgdXNpbmcgY2FsbGVyJ3MgdHVwbGUuCiAgKi8KIHZvaWQKIF9idF9tYXJrX2FycmF5X2tl eXMoSW5kZXhTY2FuRGVzYyBzY2FuKQpAQCAtNjYwLDYgKzgyOSw3NDkgQEAgX2J0X3Jlc3RvcmVf YXJyYXlfa2V5cyhJbmRleFNjYW5EZXNjIHNjYW4pCiAJfQogfQogCisvKgorICogUm91dGluZSB0 byBkZXRlcm1pbmUgaWYgYSBjb250aW51ZXNjYW49ZmFsc2UgdHVwbGUgKHNldCB0aGF0IHdheSBi eSBhbgorICogaW5pdGlhbCBjYWxsIHRvIF9idF9jaGVja19jb21wYXJlKSBtaWdodCBuZWVkIHRv IGFkdmFuY2UgdGhlIHNjYW4ncyBhcnJheQorICoga2V5cy4KKyAqCisgKiBSZXR1cm5zIHRydWUg d2hlbiBjYWxsZXIgcGFzc2VzIGEgdHVwbGUgdGhhdCBpcyA8IHRoZSBjdXJyZW50IHNldCBvZiBh cnJheQorICoga2V5cyBmb3IgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLWVxdWFsIGNvbHVtbi9z Y2FuIGtleSAob3IgPiBmb3IgYmFja3dhcmRzCisgKiBzY2FucykuICBUaGlzIG1lYW5zIHRoYXQg aXQgY2Fubm90IHBvc3NpYmx5IGJlIHRpbWUgdG8gYWR2YW5jZSB0aGUgYXJyYXkKKyAqIGtleXMg anVzdCB5ZXQuICBfYnRfY2hlY2trZXlzIGNhbGxlciBzaG91bGQgc3VwcHJlc3MgaXRzIF9idF9j aGVja19jb21wYXJlCisgKiBjYWxsLCBhbmQgcmV0dXJuIC0tIHRoZSB0dXBsZSBpcyB0cmVhdGVk IGFzIG5vdCBzYXRpc2Z5IG91ciBpbmRleHF1YWxzLgorICoKKyAqIFJldHVybnMgZmFsc2Ugd2hl biBjYWxsZXIncyB0dXBsZSBpcyA+PSB0aGUgY3VycmVudCBhcnJheSBrZXlzIChvciA8PSwgaW4K KyAqIHRoZSBjYXNlIG9mIGJhY2t3YXJkcyBzY2FucykuICBUaGlzIG1lYW5zIHRoYXQgaXQgbWln aHQgYmUgdGltZSBmb3Igb3VyCisgKiBjYWxsZXIgdG8gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyB0 byB0aGUgbmV4dCBzZXQuCisgKgorICogTm90ZTogYWR2YW5jaW5nIHRoZSBhcnJheSBrZXlzIG1h eSBiZSByZXF1aXJlZCB3aGVuIGV2ZXJ5IGF0dHJpYnV0ZSB2YWx1ZQorICogZnJvbSBjYWxsZXIn cyB0dXBsZSBpcyBlcXVhbCB0byBjb3JyZXNwb25kaW5nIHNjYW4ga2V5L2FycmF5IGRhdHVtcy4g IFNlZQorICogY29tbWVudHMgYXQgdGhlIHN0YXJ0IG9mIF9idF9hZHZhbmNlX2FycmF5X2tleXMg Zm9yIG1vcmUuCisgKi8KK3N0YXRpYyBib29sCitfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlz KEluZGV4U2NhbkRlc2Mgc2NhbiwgQlRSZWFkUGFnZVN0YXRlICpwc3RhdGUsCisJCQkJCQkJIElu ZGV4VHVwbGUgdHVwbGUpCit7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1ZSkgc2Nh bi0+b3BhcXVlOworCVJlbGF0aW9uCXJlbCA9IHNjYW4tPmluZGV4UmVsYXRpb247CisJU2NhbkRp cmVjdGlvbiBkaXIgPSBwc3RhdGUtPmRpcjsKKwlUdXBsZURlc2MJaXR1cGRlc2MgPSBSZWxhdGlv bkdldERlc2NyKHJlbCk7CisJYm9vbAkJdHVwbGVfYmVmb3JlX2FycmF5X2tleXMgPSBmYWxzZTsK KwlTY2FuS2V5CQljdXI7CisJaW50CQkJbnR1cGF0dHMgPSBCVHJlZVR1cGxlR2V0TkF0dHModHVw bGUsIHJlbCksCisJCQkJaWtleTsKKworCUFzc2VydChzby0+cXVhbF9vayk7CisJQXNzZXJ0KHNv LT5udW1BcnJheUtleXMgPiAwKTsKKwlBc3NlcnQoc28tPm51bWJlck9mS2V5cyA+IDApOworCUFz c2VydCghc28tPm5lZWRQcmltU2Nhbik7CisKKwlmb3IgKGN1ciA9IHNvLT5rZXlEYXRhLCBpa2V5 ID0gMDsgaWtleSA8IHNvLT5udW1iZXJPZktleXM7IGN1cisrLCBpa2V5KyspCisJeworCQlpbnQJ CQlhdHRudW0gPSBjdXItPnNrX2F0dG5vOworCQlGbWdySW5mbyAgICpvcmRlcnByb2M7CisJCURh dHVtCQlkYXR1bTsKKwkJYm9vbAkJbnVsbCwKKwkJCQkJc2tyZXF1aXJlZDsKKwkJaW50MzIJCXJl c3VsdDsKKworCQkvKgorCQkgKiBXZSBvbmx5IGRlYWwgd2l0aCBlcXVhbGl0eSBzdHJhdGVneSBz Y2FuIGtleXMuICBXZSBsZWF2ZSBoYW5kbGluZworCQkgKiBvZiBpbmVxdWFsaXRpZXMgdXAgdG8g X2J0X2NoZWNrX2NvbXBhcmUuCisJCSAqLworCQlpZiAoY3VyLT5za19zdHJhdGVneSAhPSBCVEVx dWFsU3RyYXRlZ3lOdW1iZXIpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBEZXRlcm1pbmUg aWYgdGhpcyBzY2FuIGtleSBpcyByZXF1aXJlZCBpbiB0aGUgY3VycmVudCBzY2FuCisJCSAqIGRp cmVjdGlvbgorCQkgKi8KKwkJc2tyZXF1aXJlZCA9ICgoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChk aXIpICYmCisJCQkJCSAgIChjdXItPnNrX2ZsYWdzICYgU0tfQlRfUkVRRldEKSkgfHwKKwkJCQkJ ICAoU2NhbkRpcmVjdGlvbklzQmFja3dhcmQoZGlyKSAmJgorCQkJCQkgICAoY3VyLT5za19mbGFn cyAmIFNLX0JUX1JFUUJLV0QpKSk7CisKKwkJLyoKKwkJICogVW5saWtlIF9idF9hZHZhbmNlX2Fy cmF5X2tleXMsIHdlIG5ldmVyIGRlYWwgd2l0aCBhbnkgbm9uLXJlcXVpcmVkCisJCSAqIGFycmF5 IGtleXMuICBDYXNlcyB3aGVyZSBza3JlcXVpcmVkdHJpZ2dlciBpcyBzZXQgdG8gZmFsc2UgYnkK KwkJICogX2J0X2NoZWNrX2NvbXBhcmUgc2hvdWxkIG5ldmVyIGNhbGwgaGVyZS4gIFdlIGFyZSBv bmx5IGNhbGxlZCBhZnRlcgorCQkgKiBfYnRfY2hlY2tfY29tcGFyZSBwcm92aXNpb25hbGx5IGlu ZGljYXRlZCB0aGF0IHRoZSBzY2FuIHNob3VsZCBiZQorCQkgKiB0ZXJtaW5hdGVkIGR1ZSB0byBh IF9yZXF1aXJlZF8gc2NhbiBrZXkgbm90IGJlaW5nIHNhdGlzZmllZC4KKwkJICoKKwkJICogV2Ug ZXhwZWN0IF9idF9jaGVja19jb21wYXJlIHRvIG5vdGljZSBhbmQgcmVwb3J0IHJlcXVpcmVkIHNj YW4ga2V5cworCQkgKiBiZWZvcmUgbm9uLXJlcXVpcmVkIG9uZXMuICBfYnRfYWR2YW5jZV9hcnJh eV9rZXlzIG1pZ2h0IHN0aWxsIGhhdmUKKwkJICogdG8gYWR2YW5jZSBub24tcmVxdWlyZWQgYXJy YXkga2V5cyBpbiBwYXNzaW5nIGZvciBhIHR1cGxlIHRoYXQgd2UKKwkJICogd2VyZSBjYWxsZWQg Zm9yLCBidXQgX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyBkb2Vzbid0IHJlbHkgb24gdXMgdG8KKwkJ ICogZ2l2ZSBpdCBhZHZhbmNlZCBub3RpY2Ugb2YgdGhhdC4KKwkJICovCisJCWlmICghc2tyZXF1 aXJlZCkKKwkJCWJyZWFrOworCisJCWlmIChhdHRudW0gPiBudHVwYXR0cykKKwkJeworCQkJLyoK KwkJCSAqIFdoZW4gd2UgcmVhY2ggYSBoaWdoIGtleSdzIHRydW5jYXRlZCBhdHRyaWJ1dGUsIGFz c3VtZSB0aGF0IHRoZQorCQkJICogdHVwbGUgYXR0cmlidXRlJ3MgdmFsdWUgaXMgPj0gdGhlIHNj YW4ncyBzZWFyY2gtdHlwZSBzY2FuIGtleXMKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKworCQlk YXR1bSA9IGluZGV4X2dldGF0dHIodHVwbGUsIGF0dG51bSwgaXR1cGRlc2MsICZudWxsKTsKKwor CQlvcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3NbYXR0bnVtIC0gMV07CisJCXJlc3VsdCA9IF9i dF9jb21wYXJlX2FycmF5X3NrZXkoY3VyLCBvcmRlcnByb2MsCisJCQkJCQkJCQkJZGF0dW0sIG51 bGwsCisJCQkJCQkJCQkJY3VyLT5za19hcmd1bWVudCk7CisKKwkJaWYgKHJlc3VsdCAhPSAwKQor CQl7CisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJCXR1cGxlX2JlZm9y ZV9hcnJheV9rZXlzID0gcmVzdWx0IDwgMDsKKwkJCWVsc2UKKwkJCQl0dXBsZV9iZWZvcmVfYXJy YXlfa2V5cyA9IHJlc3VsdCA+IDA7CisKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHR1 cGxlX2JlZm9yZV9hcnJheV9rZXlzOworfQorCisvKgorICogX2J0X2FycmF5X2tleXNfcmVtYWlu KCkgLS0gU3RhcnQgYW5vdGhlciBwcmltaXRpdmUgaW5kZXggc2Nhbj8KKyAqCisgKiBSZXR1cm5z IHRydWUgaWYgdGhlcmUgaXMgYW5vdGhlciBzZXQgb2YgdmFsdWVzIHRvIGNvbnNpZGVyLCBmYWxz ZSBpZiBub3QuCisgKi8KK2Jvb2wKK19idF9hcnJheV9rZXlzX3JlbWFpbihJbmRleFNjYW5EZXNj IHNjYW4sIFNjYW5EaXJlY3Rpb24gZGlyKQoreworCUJUU2Nhbk9wYXF1ZSBzbyA9IChCVFNjYW5P cGFxdWUpIHNjYW4tPm9wYXF1ZTsKKworCS8qCisJICogQXJyYXkga2V5cyBhcmUgYWR2YW5jZWQg d2l0aGluIF9idF9jaGVja2tleXMgd2hlbiB0aGUgc2NhbiByZWFjaGVzIHRoZQorCSAqIGxlYWYg bGV2ZWwgKG1vcmUgcHJlY2lzZWx5LCB0aGV5J3JlIGFkdmFuY2VkIHdoZW4gdGhlIHNjYW4gcmVh Y2hlcyB0aGUKKwkgKiBlbmQgb2YgZWFjaCBkaXN0aW5jdCBzZXQgb2YgYXJyYXkgZWxlbWVudHMp LiAgVGhpcyBwcm9jZXNzIGF2b2lkcworCSAqIHJlcGVhdCBhY2Nlc3MgdG8gbGVhZiBwYWdlcyAo YWNyb3NzIG11bHRpcGxlIHByaW1pdGl2ZSBpbmRleCBzY2FucykgYnkKKwkgKiBvcHBvcnR1bmlz dGljYWxseSBhZHZhbmNpbmcgdGhlIHNjYW4ncyBhcnJheSBrZXlzIHdoZW4gaXQgYWxsb3dzIHRo ZQorCSAqIHByaW1pdGl2ZSBpbmRleCBzY2FuIHRvIGZpbmQgbmVhcmJ5IG1hdGNoaW5nIHR1cGxl cyAob3IgdG8gZWxpbWluYXRlCisJICogYXJyYXkga2V5cyB3aXRoIG5vIG1hdGNoaW5nIHR1cGxl cyBmcm9tIGZ1cnRoZXIgY29uc2lkZXJhdGlvbikuCisJICoKKwkgKiBfYnRfY2hlY2trZXlzIHNl dHMgYSBzaW1wbGUgZmxhZyB2YXJpYWJsZSB0aGF0IHdlIGNoZWNrIGhlcmUuICBUaGlzCisJICog dGVsbHMgdXMgaWYgd2UgbmVlZCB0byBwZXJmb3JtIGFub3RoZXIgcHJpbWl0aXZlIGluZGV4IHNj YW4gZm9yIHRoZQorCSAqIG5vdy1jdXJyZW50IGFycmF5IGtleXMgb3Igbm90LiAgV2UnbGwgdW5z ZXQgdGhlIGZsYWcgb25jZSBhZ2FpbiB0bworCSAqIGFja25vd2xlZGdlIGhhdmluZyBzdGFydGVk IGEgbmV3IHByaW1pdGl2ZSBzY2FuIChvciB3ZSdsbCBzZWUgdGhhdCBpdAorCSAqIGlzbid0IHNl dCBhbmQgZW5kIHRoZSB0b3AtbGV2ZWwgc2NhbiByaWdodCBhd2F5KS4KKwkgKgorCSAqIFdlIGNh bm5vdCByZWx5IG9uIF9idF9maXJzdCBhbHdheXMgcmVhY2hpbmcgX2J0X2NoZWNra2V5cyBoZXJl LiAgVGhlcmUKKwkgKiBhcmUgdmFyaW91cyBzY2VuYXJpb3Mgd2hlcmUgdGhhdCB3b24ndCBoYXBw ZW4uICBGb3IgZXhhbXBsZSwgaWYgdGhlCisJICogaW5kZXggaXMgY29tcGxldGVseSBlbXB0eSwg dGhlbiBfYnRfZmlyc3Qgd29uJ3QgZ2V0IGFzIGZhciBhcyBjYWxsaW5nCisJICogX2J0X3JlYWRw YWdlL19idF9jaGVja2tleXMuCisJICoKKwkgKiBXZSBhbHNvIGRvbid0IGV4cGVjdCBfYnRfY2hl Y2trZXlzIHRvIGJlIHJlYWNoZWQgd2hlbiBzZWFyY2hpbmcgZm9yIGEKKwkgKiBub24tZXhpc3Rl bnQgdmFsdWUgdGhhdCBoYXBwZW5zIHRvIGJlIGhpZ2hlciB0aGFuIGFueSBleGlzdGluZyB2YWx1 ZSBpbgorCSAqIHRoZSBpbmRleC4gIFRoZXJlIHdvbid0IGEgaGlnaCBrZXkgY2FsbCB0byBfYnRf Y2hlY2trZXlzIGlmIHRoZSBvbmx5CisJICogY2FsbCB0byBfYnRfcmVhZHBhZ2UgaXMgZm9yIHRo ZSByaWdodG1vc3QgcGFnZSwgaWYgX2J0X2JpbnNyY2ggdG9sZAorCSAqIF9idF9yZWFkcGFnZSB0 byBzdGFydCBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIHJpZ2h0bW9zdCBwYWdlLiAgVGhlcmUgaXMK KwkgKiBhIHNpbWlsYXIgaXNzdWUgZm9yIGJhY2t3YXJkcyBzY2FucywgdG9vLgorCSAqCisJICog V2UgZG9uJ3QgYWN0dWFsbHkgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIGZvciB0aGVzZSBjYXNl cyAtLSB3ZSBkb24ndAorCSAqIG5lZWQgdG8gYmUgZXhwbGljaXRseSBpbnN0cnVjdGVkIHRvIF9u b3RfIHBlcmZvcm0gYW5vdGhlciBwcmltaXRpdmUKKwkgKiBpbmRleCBzY2FuLiBUaGlzIGlzIGNv cnJlY3QgZm9yIGFsbCBvZiB0aGUgY2FzZXMgd2UndmUgbGlzdGVkIHNvIGZhciwKKwkgKiB3aGlj aCBhbGwgaW52b2x2ZSBwcmltaXRpdmUgaW5kZXggc2NhbnMgdGhhdCBhY2Nlc3MgcGFnZXMgIm5l YXIgdGhlCisJICogYm91bmRhcmllcyBvZiB0aGUga2V5IHNwYWNlIiAodGhlIGxlZnRtb3N0IHBh Z2UsIHRoZSByaWdodG1vc3QgcGFnZSwgb3IKKwkgKiBhbiBpbWFnaW5hcnkgZW1wdHkgbGVhZiBy b290IHBhZ2UpLiAgSWYgX2J0X2NoZWNra2V5cyBjYW5ub3QgYmUgcmVhY2hlZAorCSAqIGJ5IGEg cHJpbWl0aXZlIGluZGV4IHNjYW4gZm9yIG9uZSBzZXQgb2YgYXJyYXkga2V5cywgaXQgZm9sbG93 cyB0aGF0IGl0CisJICogYWxzbyB3b24ndCBiZSByZWFjaGVkIGZvciBsYXRlciBzZXQgb2YgYXJy YXkga2V5cy4KKwkgKgorCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb24sIHRoYXQgcmVxdWlyZXMg aGFuZGxpbmcgYnkgdXMgYXMgYSBzcGVjaWFsIGNhc2U6CisJICogdGhlIGNhc2Ugd2hlcmUgX2J0 X2ZpcnN0J3MgY2FsbCB0byBfYnRfcHJlcHJvY2Vzc19rZXlzIGRldGVybWluZWQgdGhhdAorCSAq IHRoZSBzY2FuIGtleXMgZm9yIGl0cyB3b3VsZC1iZSBzY2FuIGNhbiBuZXZlciBiZSBzYXRpc2Zp ZWQuICBUaGF0IG1pZ2h0CisJICogYmUgdHJ1ZSBmb3Igb25lIHNldCBvZiBhcnJheSBrZXlzLCBi dXQgbm90IHRoZSBuZXh0IHNldC4gIFRoaXMgaXMgdGhlCisJICogb25seSBjYXNlIHdoZXJlIHdl IGFkdmFuY2UgdGhlIGFycmF5IGtleXMgZm9yIG91cnNlbHZlcywgcmF0aGVyIHRoYW4KKwkgKiBs ZWF2aW5nIGl0IHVwIHRvIF9idF9jaGVja2tleXMuCisJICovCisJaWYgKCFzby0+cXVhbF9vaykK Kwl7CisJCS8qIF9idF9maXJzdCBiYWNrZWQgb3V0OyBpbmNyZW1lbnQgYXJyYXkga2V5cywgYW5k IHRyeSBhZ2FpbiAqLworCQlzby0+bmVlZFByaW1TY2FuID0gZmFsc2U7CisJCWlmIChfYnRfYWR2 YW5jZV9hcnJheV9rZXlzX2luY3JlbWVudChzY2FuLCBkaXIpKQorCQkJcmV0dXJuIHRydWU7CisJ fQorCisJLyogVGltZSBmb3IgYW5vdGhlciBwcmltaXRpdmUgaW5kZXggc2Nhbj8gKi8KKwlpZiAo c28tPm5lZWRQcmltU2NhbikKKwl7CisJCS8qIEJlZ2luIHByaW1pdGl2ZSBpbmRleCBzY2FuICov CisJCXNvLT5uZWVkUHJpbVNjYW4gPSBmYWxzZTsKKworCQlpZiAoc2Nhbi0+cGFyYWxsZWxfc2Nh biAhPSBOVUxMKQorCQkJX2J0X3BhcmFsbGVsX25leHRfcHJpbWl0aXZlX3NjYW4oc2Nhbik7CisK KwkJcmV0dXJuIHRydWU7CisJfQorCisJLyoKKwkgKiBObyBtb3JlIHByaW1pdGl2ZSBpbmRleCBz Y2Fucy4gIEp1c3QgdGVybWluYXRlIHRoZSB0b3AtbGV2ZWwgc2Nhbi4KKwkgKi8KKwlfYnRfYWR2 YW5jZV9hcnJheV9rZXlzX3RvX2VuZChzY2FuLCBkaXIpOworCisJaWYgKHNjYW4tPnBhcmFsbGVs X3NjYW4gIT0gTlVMTCkKKwkJX2J0X3BhcmFsbGVsX2RvbmUoc2Nhbik7CisKKwlyZXR1cm4gZmFs c2U7Cit9CisKKy8qCisgKiBfYnRfYWR2YW5jZV9hcnJheV9rZXlzKCkgLS0gQWR2YW5jZSBhcnJh eSBlbGVtZW50cyB1c2luZyBhIHR1cGxlCisgKgorICogUmV0dXJucyB0cnVlIGlmIGFsbCByZXF1 aXJlZCBlcXVhbGl0eS10eXBlIHNjYW4ga2V5cyAoaW4gcGFydGljdWxhciwgdGhvc2UKKyAqIHRo YXQgYXJlIGFycmF5IGtleXMpIG5vdyBoYXZlIGV4YWN0IG1hdGNoaW5nIHZhbHVlcyB0byB0aG9z ZSBmcm9tIHR1cGxlLgorICogUmV0dXJucyBmYWxzZSB3aGVuIHRoZSB0dXBsZSBpc24ndCBhbiBl eGFjdCBtYXRjaCBpbiB0aGlzIHNlbnNlLgorICoKKyAqIFNldHMgcHN0YXRlLmNvbnRpbnVlc2Nh biBmb3IgY2FsbGVyIHdoZW4gd2UgcmV0dXJuIGZhbHNlLiAgV2hlbiB3ZSByZXR1cm4KKyAqIHRy dWUgaXQncyB1cCB0byBjYWxsZXIgdG8gY2FsbCBfYnRfY2hlY2tfY29tcGFyZSB0byByZWNoZWNr IHRoZSB0dXBsZS4gIEl0CisgKiBpcyBva2F5IHRvIGxldCB0aGUgc2Vjb25kIGNhbGwgc2V0IHBz dGF0ZS5jb250aW51ZXNjYW49ZmFsc2Ugd2l0aG91dAorICogZnVydGhlciBpbnRlcnZlbnRpb24s IHNpbmNlIHdlIGtub3cgdGhhdCBpdCBjYW4gb25seSBiZSBmb3IgYSBzY2FuIGtleSB0aGF0Cisg KiBpcyByZXF1aXJlZCBpbiBvbmUgZGlyZWN0aW9uLgorICoKKyAqIFdoZW4gY2FsbGVkIHdpdGgg c2tyZXF1aXJlZHRyaWdnZXIsIHdlIGRvbid0IGV4cGVjdCB0byBoYXZlIHRvIGFkdmFuY2UgYW55 CisgKiBub24tcmVxdWlyZWQgc2NhbiBrZXlzLiAgV2UnbGwgYWx3YXlzIHNldCBwc3RhdGUuY29u dGludWVzY2FuIGJlY2F1c2UgYQorICogbm9uLXJlcXVpcmVkIHNjYW4ga2V5IGNhbiBuZXZlciB0 ZXJtaW5hdGUgdGhlIHNjYW4uCisgKgorICogUmVxdWlyZWQgYXJyYXkga2V5cyBhcmUgYWx3YXlz IGFkdmFuY2VkIHRvIHRoZSBoaWdoZXN0IGVsZW1lbnQgPj0gdGhlCisgKiBjb3JyZXNwb25kaW5n IHR1cGxlIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIGl0cyBtb3N0IHNpZ25pZmljYW50IG5vbi1lcXVh bAorICogY29sdW1uIChvciB0aGUgbmV4dCBsb3dlc3Qgc2V0IDw9IHRoZSB0dXBsZSB2YWx1ZSBk dXJpbmcgYmFja3dhcmRzIHNjYW5zKS4KKyAqIElmIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGFy cmF5IGtleXMgZm9yIHRoZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uLCB3ZQorICogZW5kIHRoZSB0 b3AtbGV2ZWwgaW5kZXggc2Nhbi4KKyAqCisgKiBfYnRfdHVwbGVfYmVmb3JlX2FycmF5X3NrZXlz IGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyBpZiB0aGUgY3VycmVudAorICogcGxhY2Ug aW4gdGhlIHNjYW4gaXMgPj0gdGhlIGN1cnJlbnQgYXJyYXkga2V5cyAob3IgPD0gZHVyaW5nIGJh Y2t3YXJkCisgKiBzY2FucykuICBUaGlzIG11c3QgYmUgZXN0YWJsaXNoZWQgZmlyc3QsIGJlZm9y ZSBjYWxsaW5nIGhlcmUuCisgKgorICogTm90ZSB0aGF0IHdlIG1heSBzb21ldGltZXMgbmVlZCB0 byBhZHZhbmNlIHRoZSBhcnJheSBrZXlzIGluIHNwaXRlIG9mIHRoZQorICogZXhpc3RpbmcgYXJy YXkga2V5cyBhbHJlYWR5IGJlaW5nIGFuIGV4YWN0IG1hdGNoIGZvciBldmVyeSBjb3JyZXNwb25k aW5nCisgKiB2YWx1ZSBmcm9tIGNhbGxlcidzIHR1cGxlLiAgV2UgZmFsbCBiYWNrIG9uICJpbmNy ZW1lbnRhbGx5IiBhZHZhbmNpbmcgdGhlCisgKiBhcnJheSBrZXlzIGluIHRoZXNlIGNhc2VzLCB3 aGljaCBpbnZvbHZlIGluZXF1YWxpdHkgc3RyYXRlZ3kgc2NhbiBrZXlzLgorICogRm9yIGV4YW1w bGUsIHdpdGggYSBjb21wb3NpdGUgaW5kZXggb24gKGEsIGIpIGFuZCBhIHF1YWwgIldIRVJFIGEg SU4gKDMsNSkKKyAqIEFORCBiIDwgNDIiLCB3ZSdsbCBiZSBjYWxsZWQgZm9yIGJvdGggImEiIGFy cnkga2V5cyAoa2V5cyAzIGFuZCA1KSB3aGVuIHRoZQorICogc2NhbiByZWFjaGVzIHR1cGxlcyB3 aGVyZSAiYiA+PSA0MiIuICBFdmVuIHRob3VnaCAiYSIgYXJyYXkga2V5cyBjb250aW51ZQorICog dG8gaGF2ZSBleGFjdCBtYXRjaGVzIGZvciB0dXBsZXMgImIgPj0gNDIiIChmb3IgYm90aCBhcnJh eSBrZXkgZ3JvdXBpbmdzKSwKKyAqIHdlIHdpbGwgc3RpbGwgYWR2YW5jZSB0aGUgYXJyYXkgZm9y ICJhIiB2aWEgb3VyIGZhbGxiYWNrIG9uIGluY3JlbWVudGFsCisgKiBhZHZhbmNlbWVudCBlYWNo IHRpbWUgd2UncmUgY2FsbGVkLiAgVGhlIGZpcnN0IHRpbWUgd2UncmUgY2FsbGVkICh3aGVuIHRo ZQorICogc2NhbiByZWFjaGVzIGEgdHVwbGUgPj0gIigzLCA0MikiKSwgd2UgYWR2YW5jZSB0aGUg YXJyYXkga2V5IChmcm9tIDMgdG8gNSkuCisgKiBUaGlzIGdpdmVzIG91ciBjYWxsZXIgdGhlIG9w dGlvbiBvZiBzdGFydGluZyBhIG5ldyBwcmltaXRpdmUgaW5kZXggc2NhbgorICogdGhhdCBxdWlj a2x5IGxvY2F0ZXMgdGhlIHN0YXJ0IG9mIHR1cGxlcyA+ICIoNSwgLWluZikiLiAgVGhlIHNlY29u ZCB0aW1lCisgKiB3ZSdyZSBjYWxsZWQgKHdoZW4gdGhlIHNjYW4gcmVhY2hlcyBhIHR1cGxlID49 ICIoNSwgNDIpIiksIHdlIGluY3JlbWVudGFsbHkKKyAqIGFkdmFuY2UgdGhlIGtleXMgYSBzZWNv bmQgdGltZS4gIFRoaXMgc2Vjb25kIGNhbGwgZW5kcyB0aGUgdG9wLWxldmVsIHNjYW4uCisgKgor ICogTm90ZSBhbHNvIHRoYXQgd2UgZGVhbCB3aXRoIGFsbCByZXF1aXJlZCBlcXVhbGl0eS10eXBl IHNjYW4ga2V5cyBoZXJlOyBpdCdzCisgKiBub3QgbGltaXRlZCB0byBhcnJheSBzY2FuIGtleXMu ICBXZSBuZWVkIHRvIGhhbmRsZSBub24tYXJyYXkgZXF1YWxpdHkgY2FzZXMKKyAqIGhlcmUgYmVj YXVzZSB0aGV5J3JlIGVxdWFsaXR5IGNvbnN0cmFpbnRzIGZvciB0aGUgc2NhbiwgaW4gdGhlIHNh bWUgd2F5CisgKiB0aGF0IGFycmF5IHNjYW4ga2V5cyBhcmUuICBXZSBtdXN0IG5vdCBzdXBwcmVz cyBjYXNlcyB3aGVyZSBhIGNhbGwgdG8KKyAqIF9idF9jaGVja19jb21wYXJlIHNldHMgY29udGlu dWVzY2FuPWZhbHNlIGZvciBhIHJlcXVpcmVkIHNjYW4ga2V5IHRoYXQgdXNlcworICogdGhlIGVx dWFsaXR5IHN0cmF0ZWd5IChvbmx5IGluZXF1YWxpdHktdHlwZSBzY2FuIGtleXMgZ2V0IHRoYXQg dHJlYXRtZW50KS4KKyAqIFdlIGRvbid0IHdhbnQgdG8gc3VwcHJlc3MgdGhlIHNjYW4ncyB0ZXJt aW5hdGlvbiB3aGVuIGl0J3MgaW5hcHByb3ByaWF0ZS4KKyAqLworc3RhdGljIGJvb2wKK19idF9h ZHZhbmNlX2FycmF5X2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBCVFJlYWRQYWdlU3RhdGUgKnBz dGF0ZSwKKwkJCQkJICAgSW5kZXhUdXBsZSB0dXBsZSwgYm9vbCBza3JlcXVpcmVkdHJpZ2dlcikK K3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJUmVs YXRpb24JcmVsID0gc2Nhbi0+aW5kZXhSZWxhdGlvbjsKKwlTY2FuRGlyZWN0aW9uIGRpciA9IHBz dGF0ZS0+ZGlyOworCVR1cGxlRGVzYwlpdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3IocmVsKTsK KwlTY2FuS2V5CQljdXI7CisJaW50CQkJaWtleSwKKwkJCQlhcnJheWlkeCA9IDAsCisJCQkJbnR1 cGF0dHMgPSBCVHJlZVR1cGxlR2V0TkF0dHModHVwbGUsIHJlbCk7CisJYm9vbAkJYXJyYXlzX2Fk dmFuY2VkID0gZmFsc2UsCisJCQkJYXJyYXlzX2RvbmUgPSBmYWxzZSwKKwkJCQlhbGxfc2tyZXF1 aXJlZF9hdHRzX3dyYXBwZWQgPSBza3JlcXVpcmVkdHJpZ2dlciwKKwkJCQlhbGxfYXR0c19lcXVh bCA9IHRydWU7CisKKwlBc3NlcnQoc28tPm51bWJlck9mS2V5cyA+IDApOworCUFzc2VydChzby0+ bnVtQXJyYXlLZXlzID4gMCk7CisJQXNzZXJ0KHNvLT5xdWFsX29rKTsKKworCS8qCisJICogVHJ5 IHRvIGFkdmFuY2UgYXJyYXkga2V5cyB2aWEgYSBzZXJpZXMgb2YgYmluYXJ5IHNlYXJjaGVzLiAg V2UnbGwKKwkgKiBwZXJmb3JtIG9uZSBzZWFyY2ggZm9yIGVhY2ggU0tfU0VBUkNIQVJSQVkgc2Nh biBrZXkgKGV4Y2x1ZGluZyBhcnJheQorCSAqIHF1YWxzIHRoYXQgZG9uJ3QgdXNlIGFuIGVxdWFs aXR5IHR5cGUgb3BlcmF0b3Ivc3RyYXRlZ3ksIHdoaWNoIGFyZW4ndAorCSAqIGJhY2tlZCBieSBh biBhcnJheSBhdCBhbGwpLgorCSAqLworCWZvciAoY3VyID0gc28tPmtleURhdGEsIGlrZXkgPSAw OyBpa2V5IDwgc28tPm51bWJlck9mS2V5czsgY3VyKyssIGlrZXkrKykKKwl7CisJCUJUQXJyYXlL ZXlJbmZvICphcnJheSA9IE5VTEw7CisJCVNjYW5LZXkJCXNrZXlhcnJheSA9IE5VTEw7CisJCUZt Z3JJbmZvICAgKm9yZGVycHJvYzsKKwkJaW50CQkJYXR0bnVtID0gY3VyLT5za19hdHRubywKKwkJ CQkJZmlyc3RfZWxlbV9kaXIsCisJCQkJCWZpbmFsX2VsZW1fZGlyLAorCQkJCQlzZXRfZWxlbTsK KwkJRGF0dW0JCWRhdHVtOworCQlib29sCQlza3JlcXVpcmVkLAorCQkJCQludWxsOworCQlpbnQz MgkJcmVzdWx0OworCisJCS8qCisJCSAqIFdlIG9ubHkgZGVhbCB3aXRoIGVxdWFsaXR5IHN0cmF0 ZWd5IHNjYW4ga2V5cy4gIFdlIGxlYXZlIGhhbmRsaW5nCisJCSAqIG9mIGluZXF1YWxpdGllcyB1 cCB0byBfYnRfY2hlY2tfY29tcGFyZS4KKwkJICovCisJCWlmIChjdXItPnNrX3N0cmF0ZWd5ICE9 IEJURXF1YWxTdHJhdGVneU51bWJlcikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIERldGVy bWluZSBpZiB0aGlzIHNjYW4ga2V5IGlzIHJlcXVpcmVkIGluIHRoZSBjdXJyZW50IHNjYW4KKwkJ ICogZGlyZWN0aW9uCisJCSAqLworCQlza3JlcXVpcmVkID0gKChTY2FuRGlyZWN0aW9uSXNGb3J3 YXJkKGRpcikgJiYKKwkJCQkJICAgKGN1ci0+c2tfZmxhZ3MgJiBTS19CVF9SRVFGV0QpKSB8fAor CQkJCQkgIChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpICYmCisJCQkJCSAgIChjdXItPnNr X2ZsYWdzICYgU0tfQlRfUkVRQktXRCkpKTsKKworCQkvKgorCQkgKiBPcHRpbWl6YXRpb246IHdl IGRvbid0IGhhdmUgdG8gYWR2YW5jZSByZW1haW5pbmcgbm9uLXJlcXVpcmVkIGFycmF5CisJCSAq IGtleXMgd2hlbiB3ZSBhbHJlYWR5IGtub3cgdGhhdCB0dXBsZSB3b24ndCBiZSByZXR1cm5lZCBi eSB0aGUgc2Nhbi4KKwkJICoKKwkJICogRGVsaWJlcmF0ZWx5IGNoZWNrIHRoaXMgYm90aCBoZXJl IGFuZCBhZnRlciB0aGUgYmluYXJ5IHNlYXJjaC4KKwkJICovCisJCWlmICghc2tyZXF1aXJlZCAm JiAhYWxsX2F0dHNfZXF1YWwpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGNo ZWNrIHJlcXVpcmVkIG5vbi1hcnJheSBzY2FuIGtleXMgKHRoYXQgdXNlIHRoZSBlcXVhbAorCQkg KiBzdHJhdGVneSksIGFzIHdlbGwgYXMgcmVxdWlyZWQgYW5kIG5vbi1yZXF1aXJlZCBhcnJheSBz Y2FuIGtleXMKKwkJICogKGFsc28gbGltaXRlZCB0byB0aG9zZSB0aGF0IHVzZSB0aGUgZXF1YWwg c3RyYXRlZ3ksIHNpbmNlIGFycmF5CisJCSAqIGluZXF1YWxpdGllcyBkZWdlbmVyYXRlIGludG8g YSBzaW1wbGUgY29tcGFyaXNvbikuCisJCSAqCisJCSAqIFBlcmZvcm0gaW5pdGlhbCBzZXQgdXAg Zm9yIHRoaXMgc2NhbiBrZXkuICBJZiBpdCBpcyBiYWNrZWQgYnkgYW4KKwkJICogYXJyYXkgdGhl biB3ZSBuZWVkIHRvIHNldCB2YXJpYWJsZXMgZGVzY3JpYmluZyB0aGUgY3VycmVudCBwb3NpdGlv bgorCQkgKiBpbiB0aGUgYXJyYXkuCisJCSAqCisJCSAqIFRoaXMgbG9vcCBpdGVyYXRlcyB0aHJv dWdoIHRoZSBjdXJyZW50IHNjYW5rZXlzIChzby0+a2V5RGF0YSwgd2hpY2gKKwkJICogd2VyZSBv dXRwdXQgYnkgX2J0X3ByZXByb2Nlc3Nfa2V5cyBlYXJsaWVyKSBhbmQgdGhlbiBzZXRzIGlucHV0 CisJCSAqIHNjYW4ga2V5cyAoc28tPmFycmF5S2V5RGF0YSBzY2FuIGtleXMpIHRvIG5ldyBhcnJh eSB2YWx1ZXMuICBUaGlzCisJCSAqIHNldHMgdGhpbmdzIHVwIGZvciB0aGUgbmV4dCBfYnRfcHJl cHJvY2Vzc19rZXlzIGNhbGwuCisJCSAqLworCQlvcmRlcnByb2MgPSAmc28tPm9yZGVyUHJvY3Nb YXR0bnVtIC0gMV07CisJCWZpcnN0X2VsZW1fZGlyID0gMDsJCS8qIGtlZXAgY29tcGlsZXIgcXVp ZXQgKi8KKwkJZmluYWxfZWxlbV9kaXIgPSAwOwkJLyoga2VlcCBjb21waWxlciBxdWlldCAqLwor CQlpZiAoY3VyLT5za19mbGFncyAmIFNLX1NFQVJDSEFSUkFZKQorCQl7CisJCQkvKiBTZXQgdXAg YXJyYXkgY29tcGFyaXNvbiBmdW5jdGlvbiAqLworCQkJQXNzZXJ0KGFycmF5aWR4IDwgc28tPm51 bUFycmF5S2V5cyk7CisJCQlhcnJheSA9ICZzby0+YXJyYXlLZXlzW2FycmF5aWR4KytdOworCQkJ c2tleWFycmF5ID0gJnNvLT5hcnJheUtleURhdGFbYXJyYXktPnNjYW5fa2V5XTsKKworCQkJLyoK KwkJCSAqIEl0J3MgcG9zc2libGUgdGhhdCBfYnRfcHJlcHJvY2Vzc19rZXlzIGRldGVybWluZWQg dGhhdCBhbgorCQkJICogaW5kaXZpZHVhbCBhcnJheSBzY2FuIGtleSB3YXNuJ3QgcmVxdWlyZWQg aW4gc28tPmtleURhdGEgZm9yCisJCQkgKiB0aGUgb25nb2luZyBwcmltaXRpdmUgaW5kZXggc2Nh biBkdWUgdG8gaXQgYmVpbmcgcmVkdW5kYW50IG9yCisJCQkgKiBjb250cmFkaWN0b3J5ICh0aGUg Y3VycmVudCBhcnJheSB2YWx1ZSBtaWdodCBiZSByZWR1bmRhbnQgbmV4dAorCQkJICogdG8gc29t ZSBvdGhlciBzY2FuIGtleSBvbiB0aGUgc2FtZSBhdHRyaWJ1dGUpLiAgRGVhbCB3aXRoIHRoYXQu CisJCQkgKi8KKwkJCWlmICh1bmxpa2VseShza2V5YXJyYXktPnNrX2F0dG5vICE9IGF0dG51bSkp CisJCQl7CisJCQkJYm9vbAkJZm91bmQgUEdfVVNFRF9GT1JfQVNTRVJUU19PTkxZID0gZmFsc2U7 CisKKwkJCQlmb3IgKDsgYXJyYXlpZHggPCBzby0+bnVtQXJyYXlLZXlzOyBhcnJheWlkeCsrKQor CQkJCXsKKwkJCQkJYXJyYXkgPSAmc28tPmFycmF5S2V5c1thcnJheWlkeF07CisJCQkJCXNrZXlh cnJheSA9ICZzby0+YXJyYXlLZXlEYXRhW2FycmF5LT5zY2FuX2tleV07CisJCQkJCWlmIChza2V5 YXJyYXktPnNrX2F0dG5vID09IGF0dG51bSkKKwkJCQkJeworCQkJCQkJZm91bmQgPSB0cnVlOwor CQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlBc3NlcnQoZm91bmQpOworCQkJfQor CisJCQlpZiAoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChkaXIpKQorCQkJeworCQkJCWZpcnN0X2Vs ZW1fZGlyID0gMDsKKwkJCQlmaW5hbF9lbGVtX2RpciA9IGFycmF5LT5udW1fZWxlbXMgLSAxOwor CQkJfQorCQkJZWxzZQorCQkJeworCQkJCWZpcnN0X2VsZW1fZGlyID0gYXJyYXktPm51bV9lbGVt cyAtIDE7CisJCQkJZmluYWxfZWxlbV9kaXIgPSAwOworCQkJfQorCQl9CisJCWVsc2UgaWYgKGF0 dG51bSA+IG50dXBhdHRzKQorCQl7CisJCQkvKgorCQkJICogTm90aGluZyBuZWVkcyB0byBiZSBk b25lIHdoZW4gd2UgaGF2ZSBhIHRydW5jYXRlZCBhdHRyaWJ1dGUKKwkJCSAqIChwb3NzaWJsZSB3 aGVuIGNhbGxlcidzIHR1cGxlIGlzIGEgcGFnZSBoaWdoIGtleSkgYW5kIGEKKwkJCSAqIG5vbi1h cnJheSBzY2FuIGtleQorCQkJICovCisJCQlBc3NlcnQoU2NhbkRpcmVjdGlvbklzRm9yd2FyZChk aXIpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogSGVyZSB3ZSBwZXJmb3JtIHN0 ZXBzIGZvciBhbnkgcmVxdWlyZWQgc2NhbiBrZXlzIGFmdGVyIHRoZSBmaXJzdAorCQkgKiBub24t ZXF1YWwgcmVxdWlyZWQgc2NhbiBrZXkuICBUaGUgZmlyc3Qgc2NhbiBrZXkgbXVzdCBoYXZlIGJl ZW4gc2V0CisJCSAqIHRvIGEgdmFsdWUgPiB0aGUgdmFsdWUgZnJvbSB0aGUgdHVwbGUgYmFjayB3 aGVuIHdlIGRlYWx0IHdpdGggaXQKKwkJICogKG9yLCBmb3IgYSBiYWNrd2FyZHMgc2NhbiwgdG8g YSB2YWx1ZSA8IHRoZSB2YWx1ZSBmcm9tIHRoZSB0dXBsZSkuCisJCSAqIFRoYXQgbmVlZHMgdG8g ImNhc2NhZGUiIHRvIGxvd2VyLW9yZGVyIGFycmF5IHNjYW4ga2V5cy4gIFRoZXkgbXVzdAorCQkg KiBiZSBzZXQgdG8gdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgZm9yIHRoZSBjdXJyZW50IHNjYW4g ZGlyZWN0aW9uLgorCQkgKgorCQkgKiBXZSdyZSBzdGlsbCBzZXR0aW5nIHRoZSBrZXlzIHRvIHZh bHVlcyA+PSB0aGUgdHVwbGUgaGVyZSAtLSBpdCBqdXN0CisJCSAqIG5lZWRzIHRvIHdvcmsgZm9y IHRoZSB0dXBsZSBhcyBhIHdob2xlLiAgRm9yIGV4YW1wbGUsIHdoZW4gYSB0dXBsZQorCQkgKiAi KGEsIGIpID0gKDQyLCA1KSIgYWR2YW5jZXMgdGhlIGFycmF5IGtleXMgb24gImEiIGZyb20gNDAg dG8gNDUsIHdlCisJCSAqIG11c3QgYWxzbyBzZXQgImIiIHRvIHdoYXRldmVyIHRoZSBmaXJzdCBh cnJheSBlbGVtZW50IGZvciAiYiIgaXMuCisJCSAqIEl0IHdvdWxkIGJlIHdyb25nIHRvIGFsbG93 ICJiIiB0byBiZSBzZXQgdG8gYSB2YWx1ZSBmcm9tIHRoZSB0dXBsZSwKKwkJICogc2luY2UgdGhl IHZhbHVlIGlzIGFjdHVhbGx5IGZyb20gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUga2V5IHNwYWNl LgorCQkgKgorCQkgKiBBbHNvIGRlZmVuc2l2ZWx5IGRvIHRoaXMgd2l0aCB0cnVuY2F0ZWQgYXR0 cmlidXRlcyB3aGVuIGNhbGxlcidzCisJCSAqIHR1cGxlIGlzIGEgcGFnZSBoaWdoIGtleS4KKwkJ ICovCisJCWlmIChhcnJheSAmJiAoKGFycmF5c19hZHZhbmNlZCAmJiAhYWxsX2F0dHNfZXF1YWwp IHx8CisJCQkJCSAgYXR0bnVtID4gbnR1cGF0dHMpKQorCQl7CisJCQkvKiBTaG91bGRuJ3QgcmVh Y2ggdGhpcyBmYXIgZm9yIGEgbm9uLXJlcXVpcmVkIHNjYW4ga2V5ICovCisJCQlBc3NlcnQoc2ty ZXF1aXJlZCAmJiBza3JlcXVpcmVkdHJpZ2dlciAmJiBhdHRudW0gPiAxKTsKKworCQkJLyoKKwkJ CSAqIFdlIHNldCB0aGUgYXJyYXkgdG8gdGhlIGZpcnN0IGVsZW1lbnQgKGlmIG5lZWRlZCkgaGVy ZSwgYW5kIHdlCisJCQkgKiBkb24ndCB1bnNldCBhbGxfcmVxdWlyZWRfYXR0c193cmFwcGVkLiAg VGhpcyBhcnJheSB0aGVyZWZvcmUKKwkJCSAqIGNvdW50cyBhcyBhIHdyYXBwZWQgYXJyYXkgd2hl biB3ZSBnbyBvbiB0byBkZXRlcm1pbmUgaWYgYWxsIG9mCisJCQkgKiB0aGUgcmVxdWlyZWQgYXJy YXlzIGhhdmUgd3JhcHBlZCAoYWZ0ZXIgdGhpcyBsb29wKS4KKwkJCSAqLworCQkJaWYgKGFycmF5 LT5jdXJfZWxlbSAhPSBmaXJzdF9lbGVtX2RpcikKKwkJCXsKKwkJCQlhcnJheS0+Y3VyX2VsZW0g PSBmaXJzdF9lbGVtX2RpcjsKKwkJCQlza2V5YXJyYXktPnNrX2FyZ3VtZW50ID0gYXJyYXktPmVs ZW1fdmFsdWVzW2ZpcnN0X2VsZW1fZGlyXTsKKwkJCQlhcnJheXNfYWR2YW5jZWQgPSB0cnVlOwor CQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEdvaW5nIHRvIGNvbXBhcmUg c2NhbiBrZXkgdG8gY29ycmVzcG9uZGluZyB0dXBsZSBhdHRyaWJ1dGUgdmFsdWUKKwkJICovCisJ CWRhdHVtID0gaW5kZXhfZ2V0YXR0cih0dXBsZSwgYXR0bnVtLCBpdHVwZGVzYywgJm51bGwpOwor CisJCWlmICghYXJyYXkpCisJCXsKKwkJCWlmICghc2tyZXF1aXJlZCB8fCAhYWxsX2F0dHNfZXF1 YWwpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBUaGlzIGlzIGEgcmVxdWlyZWQgbm9u LWFycmF5IHNjYW4ga2V5IHRoYXQgdXNlcyB0aGUgZXF1YWwKKwkJCSAqIHN0cmF0ZWd5LiAgU2Vl IGhlYWRlciBjb21tZW50cyBmb3IgYW4gZXhwbGFuYXRpb24gb2Ygd2h5IHdlCisJCQkgKiBuZWVk IHRvIGRvIHRoaXMuCisJCQkgKi8KKwkJCXJlc3VsdCA9IF9idF9jb21wYXJlX2FycmF5X3NrZXko Y3VyLCBvcmRlcnByb2MsIGRhdHVtLCBudWxsLAorCQkJCQkJCQkJCQljdXItPnNrX2FyZ3VtZW50 KTsKKworCQkJLyoKKwkJCSAqIF9idF90dXBsZV9iZWZvcmVfYXJyYXlfc2tleXMgc2hvdWxkIGFs d2F5cyBwcmV2ZW50IHVzIGZyb20KKwkJCSAqIGJlaW5nIGNhbGxlZCB3aGVuIHRoZSBjdXJyZW50 IHR1cGxlIGluZGljYXRlcyB0aGF0IHRoZSBzY2FuCisJCQkgKiBpc24ndCB5ZXQgcmVhZHkgdG8g aGF2ZSBpdHMgYXJyYXkga2V5cyBhZHZhbmNlZC4gIENoZWNrIHdpdGggYW4KKwkJCSAqIGFzc2Vy dC4KKwkJCSAqLworCQkJQXNzZXJ0KChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikgJiYgcmVz dWx0ID49IDApIHx8CisJCQkJICAgKFNjYW5EaXJlY3Rpb25Jc0JhY2t3YXJkKGRpcikgJiYgcmVz dWx0IDw9IDApKTsKKworCQkJaWYgKHJlc3VsdCAhPSAwKQorCQkJeworCQkJCS8qCisJCQkJICog dHVwbGUgYXR0cmlidXRlIHZhbHVlIGlzID4gc2NhbiBrZXkgdmFsdWUgKG9yIDwgc2NhbiBrZXkK KwkJCQkgKiB2YWx1ZSBpbiB0aGUgYmFja3dhcmQgc2NhbiBjYXNlKS4KKwkJCQkgKi8KKwkJCQlh bGxfYXR0c19lcXVhbCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCisJCQljb250aW51ZTsK KwkJfQorCisJCS8qCisJCSAqIEJpbmFyeSBzZWFyY2ggZm9yIGFuIGFycmF5IGtleSA+PSB0aGUg dHVwbGUgdmFsdWUsIHdoaWNoIHdlJ2xsIHRoZW4KKwkJICogc2V0IGFzIG91ciBjdXJyZW50IGFy cmF5IGtleSAob3IgPD0gdGhlIHR1cGxlIHZhbHVlIGlmIHRoaXMgaXMgYQorCQkgKiBiYWNrd2Fy ZCBzY2FuKS4KKwkJICoKKwkJICogVGhlIGJpbmFyeSBzZWFyY2ggZXhjbHVkZXMgYXJyYXkga2V5 cyB0aGF0IHdlJ3ZlIGFscmVhZHkgcHJvY2Vzc2VkCisJCSAqIGZyb20gY29uc2lkZXJhdGlvbiwg ZXhjZXB0IHdpdGggYSBub24tcmVxdWlyZWQgc2NhbiBrZXkncyBhcnJheS4KKwkJICogVGhpcyBp cyBub3QganVzdCBhbiBvcHRpbWl6YXRpb24gLS0gaXQncyBpbXBvcnRhbnQgZm9yIGNvcnJlY3Ru ZXNzLgorCQkgKiBJdCBpcyBjcnVjaWFsIHRoYXQgcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXlzIG9u bHkgaGF2ZSB0aGVpciBhcnJheQorCQkgKiBrZXlzIGFkdmFuY2VkIGluIHRoZSBjdXJyZW50IHNj YW4gZGlyZWN0aW9uLiAgV2UgbmVlZCB0byBhZHZhbmNlCisJCSAqIHJlcXVpcmVkIGFycmF5IGtl eXMgaW4gbG9jayBzdGVwIHdpdGggdGhlIGluZGV4IHNjYW4uCisJCSAqCisJCSAqIE5vdGUgaW4g cGFydGljdWxhciB0aGF0IGFycmF5c19hZHZhbmNlZCBtdXN0IG9ubHkgYmUgc2V0IHdoZW4gdGhl CisJCSAqIGFycmF5IGlzIGFkdmFuY2VkIHRvIGEga2V5ID49IHRoZSBleGlzdGluZyBrZXksIG9y IDw9IGZvciBhCisJCSAqIGJhY2t3YXJkcyBzY2FuLiAgKFRob3VnaCBzZWUgbm90ZXMgYWJvdXQg d3JhcGFyb3VuZCBiZWxvdy4pCisJCSAqLworCQlzZXRfZWxlbSA9IF9idF9iaW5zcmNoX2FycmF5 X3NrZXkoZGlyLCAoIXNrcmVxdWlyZWQgfHwgYXJyYXlzX2FkdmFuY2VkKSwKKwkJCQkJCQkJCQkg IGFycmF5LCBjdXIsIG9yZGVycHJvYywgZGF0dW0sIG51bGwsCisJCQkJCQkJCQkJICAmcmVzdWx0 KTsKKworCQkvKgorCQkgKiBNYWludGFpbiB0aGUgc3RhdGUgdGhhdCB0cmFja3Mgd2hldGhlciBh bGwgYXR0cmlidXRlIGZyb20gdGhlIHR1cGxlCisJCSAqIGFyZSBlcXVhbCB0byB0aGUgYXJyYXkg a2V5cyB0aGF0IHdlJ3ZlIHNldCBhcyBjdXJyZW50IChvciBleGlzdGluZworCQkgKiBhcnJheSBr ZXlzIHNldCBkdXJpbmcgZWFybGllciBjYWxscyBoZXJlKS4KKwkJICovCisJCWlmIChyZXN1bHQg IT0gMCkKKwkJCWFsbF9hdHRzX2VxdWFsID0gZmFsc2U7CisKKwkJLyoKKwkJICogT3B0aW1pemF0 aW9uOiB3ZSBkb24ndCBoYXZlIHRvIGFkdmFuY2UgcmVtYWluaW5nIG5vbi1yZXF1aXJlZCBhcnJh eQorCQkgKiBrZXlzIHdoZW4gd2UgYWxyZWFkeSBrbm93IHRoYXQgdHVwbGUgd29uJ3QgYmUgcmV0 dXJuZWQgYnkgdGhlIHNjYW4uCisJCSAqIFF1aXQgYmVmb3JlIHNldHRpbmcgdGhlIGFycmF5IGtl eXMgdG8gYXZvaWQgX2J0X3ByZXByb2Nlc3Nfa2V5cy4KKwkJICoKKwkJICogRGVsaWJlcmF0ZWx5 IGNoZWNrIHRoaXMgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBiaW5hcnkgc2VhcmNoLgorCQkg Ki8KKwkJaWYgKCFza3JlcXVpcmVkICYmICFhbGxfYXR0c19lcXVhbCkKKwkJCWJyZWFrOworCisJ CS8qCisJCSAqIElmIHRoZSBiaW5hcnkgc2VhcmNoIGluZGljYXRlcyB0aGF0IHRoZSBrZXkgc3Bh Y2UgZm9yIHRoaXMgdHVwbGUKKwkJICogYXR0cmlidXRlIHZhbHVlIGlzID4gdGhlIGtleSB2YWx1 ZSBmcm9tIHRoZSBmaW5hbCBlbGVtZW50IGluIHRoZQorCQkgKiBhcnJheSAoZmluYWwgZm9yIHRo ZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uKSwgd2UgaGFuZGxlIGl0IGJ5CisJCSAqIHdyYXBwaW5n IGFyb3VuZCB0byB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkuCisJCSAqCisJCSAqIFdy YXBwaW5nIGFyb3VuZCBzaW1wbGlmaWVzIGFkdmFuY2VtZW50IHdpdGggYSBtdWx0aS1jb2x1bW4g aW5kZXggYnkKKwkJICogYWxsb3dpbmcgdXMgdG8gdHJlYXQgd3JhcHBpbmcgYSBjb2x1bW4gYXMg YWR2YW5jaW5nIHRoZSBjb2x1bW4uICBXZQorCQkgKiBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50IHRo YXQgYSByZXF1aXJlZCBzY2FuIGtleSdzIGFycmF5IG1heSBvbmx5IGJlCisJCSAqIHJhdGNoZXRl ZCBmb3J3YXJkIChiYWNrd2FyZHMgd2hlbiB0aGUgc2NhbiBkaXJlY3Rpb24gaXMgYmFja3dhcmRz KSwKKwkJICogd2hpbGUgc3RpbGwgYWx3YXlzIGJlaW5nIGFibGUgdG8gImFkdmFuY2UiIHRoZSBh cnJheSBhdCB0aGlzIHBvaW50LgorCQkgKi8KKwkJaWYgKHNldF9lbGVtID09IGZpbmFsX2VsZW1f ZGlyICYmCisJCQkoKFNjYW5EaXJlY3Rpb25Jc0ZvcndhcmQoZGlyKSAmJiByZXN1bHQgPiAwKSB8 fAorCQkJIChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpICYmIHJlc3VsdCA8IDApKSkKKwkJ eworCQkJLyogUGVyZm9ybSB3cmFwYXJvdW5kICovCisJCQlzZXRfZWxlbSA9IGZpcnN0X2VsZW1f ZGlyOworCQl9CisJCWVsc2UgaWYgKHNrcmVxdWlyZWQpCisJCXsKKwkJCS8qIFdvbid0IGNhbGwg X2J0X2FkdmFuY2VfYXJyYXlfa2V5c190b19lbmQgbGF0ZXIgKi8KKwkJCWFsbF9za3JlcXVpcmVk X2F0dHNfd3JhcHBlZCA9IGZhbHNlOworCQl9CisKKwkJQXNzZXJ0KHNldF9lbGVtID49IDAgJiYg c2V0X2VsZW0gPCBhcnJheS0+bnVtX2VsZW1zKTsKKwkJaWYgKGFycmF5LT5jdXJfZWxlbSAhPSBz ZXRfZWxlbSkKKwkJeworCQkJYXJyYXktPmN1cl9lbGVtID0gc2V0X2VsZW07CisJCQlza2V5YXJy YXktPnNrX2FyZ3VtZW50ID0gYXJyYXktPmVsZW1fdmFsdWVzW3NldF9lbGVtXTsKKwkJCWFycmF5 c19hZHZhbmNlZCA9IHRydWU7CisKKwkJCS8qCisJCQkgKiBXZSBzaG91bGRuJ3QgaGF2ZSB0byBh ZHZhbmNlIGEgcmVxdWlyZWQgYXJyYXkgd2hlbiBjYWxsZWQgZHVlCisJCQkgKiB0byBfYnRfY2hl Y2tfY29tcGFyZSBkZXRlcm1pbmluZyB0aGF0IGEgbm9uLXJlcXVpcmVkIGFycmF5CisJCQkgKiBu ZWVkcyB0byBiZSBhZHZhbmNlZC4gIFdlIGV4cGVjdCBfYnRfY2hlY2tfY29tcGFyZSB0byBub3Rp Y2UKKwkJCSAqIGFuZCByZXBvcnQgcmVxdWlyZWQgc2NhbiBrZXlzIGJlZm9yZSBub24tcmVxdWly ZWQgb25lcy4KKwkJCSAqLworCQkJQXNzZXJ0KHNrcmVxdWlyZWR0cmlnZ2VyIHx8ICFza3JlcXVp cmVkKTsKKwkJfQorCX0KKworCWlmICghc2tyZXF1aXJlZHRyaWdnZXIpCisJeworCQkvKgorCQkg KiBGYWlsaW5nIHRvIHNhdGlzZnkgYSBub24tcmVxdWlyZWQgYXJyYXkgc2NhbiBrZXkgc2hvdWxk bid0IGV2ZXIKKwkJICogcmVzdWx0IGluIHRlcm1pbmF0aW5nIHRoZSAocHJpbWl0aXZlKSBpbmRl eCBzY2FuCisJCSAqLworCX0KKwllbHNlIGlmIChhbGxfc2tyZXF1aXJlZF9hdHRzX3dyYXBwZWQp CisJeworCQkvKgorCQkgKiBUaGUgYmluYXJ5IHNlYXJjaGVzIGZvciBlYWNoIHR1cGxlJ3MgYXR0 cmlidXRlIHZhbHVlIGluIHRoZSBzY2FuCisJCSAqIGtleSdzIGNvcnJlc3BvbmRpbmcgU0tfU0VB UkNIQVJSQVkgYXJyYXkgYWxsIGZvdW5kIHRoYXQgdGhlIHR1cGxlJ3MKKwkJICogdmFsdWUgYXJl ICJwYXN0IHRoZSBlbmQiIG9mIHRoZSBrZXkgc3BhY2UgY292ZXJlZCBieSBlYWNoIGFycmF5CisJ CSAqLworCQlfYnRfYWR2YW5jZV9hcnJheV9rZXlzX3RvX2VuZChzY2FuLCBkaXIpOworCQlhcnJh eXNfZG9uZSA9IHRydWU7CisJCWFsbF9hdHRzX2VxdWFsID0gZmFsc2U7IC8qIGF0IGxlYXN0IG5v dCBub3cgKi8KKwl9CisJZWxzZSBpZiAoIWFycmF5c19hZHZhbmNlZCkKKwl7CisJCS8qCisJCSAq IFdlIG11c3QgYWx3YXlzIGFkdmFuY2UgdGhlIGFycmF5IGtleXMgYnkgYXQgbGVhc3Qgb25lIGlu Y3JlbWVudAorCQkgKiAoZXhjZXB0IHdoZW4gY2FsbGVkIHRvIGFkdmFuY2UgYSBub24tcmVxdWly ZWQgc2NhbiBrZXkncyBhcnJheSkuCisJCSAqCisJCSAqIFdlIG5lZWQgdGhpcyBmYWxsYmFjayBm b3IgY2FzZXMgd2hlcmUgdGhlIGV4aXN0aW5nIGFycmF5IGtleXMgYW5kCisJCSAqIGV4aXN0aW5n IHJlcXVpcmVkIGVxdWFsLXN0cmF0ZWd5IHNjYW4ga2V5cyB3ZXJlIGZ1bGx5IGVxdWFsIHRvIHRo ZQorCQkgKiB0dXBsZS4gIF9idF9jaGVja19jb21wYXJlIG1heSBoYXZlIHNldCBjb250aW51ZXNj YW49ZmFsc2UgZHVlIHRvIGFuCisJCSAqIGluZXF1YWxpdHkgdGVybWluYXRpbmcgdGhlIHNjYW4s IHdoaWNoIHdlIGRvbid0IGRlYWwgd2l0aCBkaXJlY3RseS4KKwkJICogKFNlZSBmdW5jdGlvbidz IGhlYWRlciBjb21tZW50cyBmb3IgYW4gZXhhbXBsZS4pCisJCSAqLworCQlpZiAoX2J0X2FkdmFu Y2VfYXJyYXlfa2V5c19pbmNyZW1lbnQoc2NhbiwgZGlyKSkKKwkJCWFycmF5c19hZHZhbmNlZCA9 IHRydWU7CisJCWVsc2UKKwkJCWFycmF5c19kb25lID0gdHJ1ZTsKKwkJYWxsX2F0dHNfZXF1YWwg PSBmYWxzZTsgLyogYXQgbGVhc3Qgbm90IG5vdyAqLworCX0KKworCS8qCisJICogTWlnaHQgbWFr ZSBzZW5zZSB0byByZWNoZWNrIHRoZSBoaWdoIGtleSBsYXRlciBvbiBpbiBjYXNlcyB3aGVyZSB3 ZQorCSAqIGp1c3QgYWR2YW5jZWQgdGhlIGtleXMgKHVubGVzcyB3ZSB3ZXJlIGp1c3QgY2FsbGVk IHRvIGFkdmFuY2UgdGhlCisJICogc2NhbidzIG5vbi1yZXF1aXJlZCBhcnJheSBrZXlzKQorCSAq LworCWlmIChhcnJheXNfYWR2YW5jZWQgJiYgc2tyZXF1aXJlZHRyaWdnZXIpCisJCXBzdGF0ZS0+ aGlnaGtleWNoZWNrZWQgPSBmYWxzZTsKKworCS8qCisJICogSWYgd2UgY2hhbmdlZCB0aGUgYXJy YXkga2V5cyB3aXRob3V0IGV4aGF1c3RpbmcgYWxsIGFycmF5IGtleXMgdGhlbiB3ZQorCSAqIG5l ZWQgdG8gcHJlcHJvY2VzcyBvdXIgc2VhcmNoLXR5cGUgc2NhbiBrZXlzIG9uY2UgbW9yZQorCSAq LworCUFzc2VydChza3JlcXVpcmVkdHJpZ2dlciB8fCAhYXJyYXlzX2RvbmUpOworCWlmIChhcnJh eXNfYWR2YW5jZWQgJiYgIWFycmF5c19kb25lKQorCXsKKwkJLyoKKwkJICogWFhYIFRoaW5rIGFi b3V0IGJ1ZmZlci1sb2NrLWhlbGQgaGF6YXJkcyBoZXJlIHNvbWUgbW9yZS4KKwkJICoKKwkJICog SW4gYWxtb3N0IGFsbCBpbnRlcmVzdGluZyBjYXNlcyB3ZSBvbmx5IHJlYWxseSBuZWVkIHRvIGNv cHkgb3ZlcgorCQkgKiB0aGUgYXJyYXkgdmFsdWVzIChmcm9tICJzby0+YXJyYXlLZXlEYXRhIiB0 byAic28tPmtleURhdGEiKS4gIEJ1dAorCQkgKiB0aGVyZSBhcmUgYXQgbGVhc3Qgc29tZSBjYXNl cyB3aGVyZSBwcmVwcm9jZXNzaW5nIHNjYW4ga2V5cyB0bworCQkgKiBub3RpY2UgcmVkdW5kYW50 IGFuZCBjb250cmFkaWN0b3J5IGtleXMgbWlnaHQgYmUgaW50ZXJlc3RpbmcgaGVyZS4KKwkJICov CisJCV9idF9wcmVwcm9jZXNzX2tleXMoc2Nhbik7CisJfQorCisJLyogQXJlIHdlIG5vdyBkb25l IHdpdGggdGhlIHRvcC1sZXZlbCBzY2FuIChiYXJyaW5nIGEgYnRyZXNjYW4pPyAqLworCUFzc2Vy dCghc28tPm5lZWRQcmltU2Nhbik7CisJaWYgKCFzby0+cXVhbF9vaykKKwl7CisJCS8qIE5vdCB3 aGVuIHdlIGhhdmUgdW5zYXRpc2ZpYWJsZSBxdWFscyBmb3IgbmV3IGFycmF5IGtleXMsIGV2ZXIg Ki8KKwkJQXNzZXJ0KHNrcmVxdWlyZWR0cmlnZ2VyKTsKKworCQlwc3RhdGUtPmNvbnRpbnVlc2Nh biA9IGZhbHNlOworCQlwc3RhdGUtPmhpZ2hrZXljaGVja2VkID0gdHJ1ZTsKKwkJYWxsX2F0dHNf ZXF1YWwgPSBmYWxzZTsgLyogYXQgbGVhc3Qgbm90IG5vdyAqLworCisJCWlmIChfYnRfYWR2YW5j ZV9hcnJheV9rZXlzX2luY3JlbWVudChzY2FuLCBkaXIpKQorCQkJc28tPm5lZWRQcmltU2NhbiA9 IHRydWU7CisJfQorCWVsc2UgaWYgKCFza3JlcXVpcmVkdHJpZ2dlcikKKwl7CisJCS8qIE5vdCB3 aGVuIHdlIGZhaWxlZCB0byBzYXRpc2Z5IGEgbm9uLXJlcXVpcmVkIHNjYW4ga2V5LCBldmVyICov CisJCUFzc2VydCghYXJyYXlzX2RvbmUpOworCQlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IHRydWU7 CisJfQorCWVsc2UgaWYgKGFycmF5c19kb25lKQorCXsKKwkJLyoKKwkJICogWWVwIC0tIHRoaXMg cHJpbWl0aXZlIHNjYW4gd2FzIG91ciBsYXN0CisJCSAqLworCQlBc3NlcnQoIWFsbF9hdHRzX2Vx dWFsKTsKKwkJcHN0YXRlLT5jb250aW51ZXNjYW4gPSBmYWxzZTsKKwl9CisJZWxzZSBpZiAoIWFs bF9hdHRzX2VxdWFsKQorCXsKKwkJLyoKKwkJICogTm90IGRvbmUuICBUaGUgdG9wLWxldmVsIGlu ZGV4IHNjYW4gKGFuZCBwcmltaXRpdmUgaW5kZXggc2Nhbikgd2lsbAorCQkgKiBjb250aW51ZSwg c2luY2UgdGhlIGFycmF5IGtleXMgYWR2YW5jZWQuCisJCSAqLworCQlBc3NlcnQoYXJyYXlzX2Fk dmFuY2VkKTsKKwkJcHN0YXRlLT5jb250aW51ZXNjYW4gPSB0cnVlOworCisJCS8qCisJCSAqIFNv bWUgcmVxdWlyZWQgYXJyYXkga2V5cyBtaWdodCBoYXZlIHdyYXBwZWQgYXJvdW5kIGR1cmluZyB0 aGlzCisJCSAqIGNhbGwsIGJ1dCBpdCBjYW4ndCBoYXZlIGJlZW4gdGhlIG1vc3Qgc2lnbmlmaWNh bnQgYXJyYXkgc2NhbiBrZXkuCisJCSAqLworCQlBc3NlcnQoIWFsbF9za3JlcXVpcmVkX2F0dHNf d3JhcHBlZCk7CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIE5vdCBkb25lLiAgQSBzZWNvbmQg Y2FsbCB0byBfYnRfY2hlY2tfY29tcGFyZSBtdXN0IG5vdyB0YWtlIHBsYWNlLgorCQkgKiBJdCB3 aWxsIG1ha2UgdGhlIGZpbmFsIGRlY2lzaW9uIG9uIHNldHRpbmcgY29udGludWVzY2FuLgorCQkg Ki8KKwl9CisKKwlyZXR1cm4gYWxsX2F0dHNfZXF1YWw7Cit9CisKKy8qCisgKiBBZHZhbmNlIHRo ZSBhcnJheSBrZXlzIGJ5IGEgc2luZ2xlIGluY3JlbWVudCBpbiB0aGUgY3VycmVudCBzY2FuIGRp cmVjdGlvbgorICovCitzdGF0aWMgYm9vbAorX2J0X2FkdmFuY2VfYXJyYXlfa2V5c19pbmNyZW1l bnQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9uIGRpcikKK3sKKwlCVFNjYW5PcGFx dWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7CisJYm9vbAkJZm91bmQgPSBmYWxz ZTsKKwlpbnQJCQlpOworCisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2FuKTsKKworCS8qCisJICog V2UgbXVzdCBhZHZhbmNlIHRoZSBsYXN0IGFycmF5IGtleSBtb3N0IHF1aWNrbHksIHNpbmNlIGl0 IHdpbGwKKwkgKiBjb3JyZXNwb25kIHRvIHRoZSBsb3dlc3Qtb3JkZXIgaW5kZXggY29sdW1uIGFt b25nIHRoZSBhdmFpbGFibGUKKwkgKiBxdWFsaWZpY2F0aW9ucy4gVGhpcyBpcyBuZWNlc3Nhcnkg dG8gZW5zdXJlIGNvcnJlY3Qgb3JkZXJpbmcgb2Ygb3V0cHV0CisJICogd2hlbiB0aGVyZSBhcmUg bXVsdGlwbGUgYXJyYXkga2V5cy4KKwkgKi8KKwlmb3IgKGkgPSBzby0+bnVtQXJyYXlLZXlzIC0g MTsgaSA+PSAwOyBpLS0pCisJeworCQlCVEFycmF5S2V5SW5mbyAqY3VyQXJyYXlLZXkgPSAmc28t PmFycmF5S2V5c1tpXTsKKwkJU2NhbktleQkJc2tleSA9ICZzby0+YXJyYXlLZXlEYXRhW2N1ckFy cmF5S2V5LT5zY2FuX2tleV07CisJCWludAkJCWN1cl9lbGVtID0gY3VyQXJyYXlLZXktPmN1cl9l bGVtOworCQlpbnQJCQludW1fZWxlbXMgPSBjdXJBcnJheUtleS0+bnVtX2VsZW1zOworCisJCWlm IChTY2FuRGlyZWN0aW9uSXNCYWNrd2FyZChkaXIpKQorCQl7CisJCQlpZiAoLS1jdXJfZWxlbSA8 IDApCisJCQl7CisJCQkJY3VyX2VsZW0gPSBudW1fZWxlbXMgLSAxOworCQkJCWZvdW5kID0gZmFs c2U7CS8qIG5lZWQgdG8gYWR2YW5jZSBuZXh0IGFycmF5IGtleSAqLworCQkJfQorCQkJZWxzZQor CQkJCWZvdW5kID0gdHJ1ZTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmICgrK2N1cl9lbGVtID49 IG51bV9lbGVtcykKKwkJCXsKKwkJCQljdXJfZWxlbSA9IDA7CisJCQkJZm91bmQgPSBmYWxzZTsJ LyogbmVlZCB0byBhZHZhbmNlIG5leHQgYXJyYXkga2V5ICovCisJCQl9CisJCQllbHNlCisJCQkJ Zm91bmQgPSB0cnVlOworCQl9CisKKwkJY3VyQXJyYXlLZXktPmN1cl9lbGVtID0gY3VyX2VsZW07 CisJCXNrZXktPnNrX2FyZ3VtZW50ID0gY3VyQXJyYXlLZXktPmVsZW1fdmFsdWVzW2N1cl9lbGVt XTsKKwkJaWYgKGZvdW5kKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGZvdW5kOworfQorCisv KgorICogUGVyZm9ybSBmaW5hbCBzdGVwcyB3aGVuIHRoZSAiZW5kIHBvaW50IiBpcyByZWFjaGVk IG9uIHRoZSBsZWFmIGxldmVsCisgKiB3aXRob3V0IGFueSBjYWxsIHRvIF9idF9jaGVja2tleXMg c2V0dGluZyAqY29udGludWVzY2FuIHRvIGZhbHNlLgorICovCitzdGF0aWMgdm9pZAorX2J0X2Fk dmFuY2VfYXJyYXlfa2V5c190b19lbmQoSW5kZXhTY2FuRGVzYyBzY2FuLCBTY2FuRGlyZWN0aW9u IGRpcikKK3sKKwlCVFNjYW5PcGFxdWUgc28gPSAoQlRTY2FuT3BhcXVlKSBzY2FuLT5vcGFxdWU7 CisKKwlBc3NlcnQoc28tPm51bUFycmF5S2V5cyk7CisJQXNzZXJ0KCFzby0+bmVlZFByaW1TY2Fu KTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgc28tPm51bUFycmF5S2V5czsgaSsrKQorCXsKKwkJ QlRBcnJheUtleUluZm8gKmN1ckFycmF5S2V5ID0gJnNvLT5hcnJheUtleXNbaV07CisJCVNjYW5L ZXkJCXNrZXkgPSAmc28tPmFycmF5S2V5RGF0YVtjdXJBcnJheUtleS0+c2Nhbl9rZXldOworCQlp bnQJCQlyZXNldF9lbGVtOworCisJCWlmIChTY2FuRGlyZWN0aW9uSXNGb3J3YXJkKGRpcikpCisJ CQlyZXNldF9lbGVtID0gY3VyQXJyYXlLZXktPm51bV9lbGVtcyAtIDE7CisJCWVsc2UKKwkJCXJl c2V0X2VsZW0gPSAwOworCisJCWlmIChjdXJBcnJheUtleS0+Y3VyX2VsZW0gIT0gcmVzZXRfZWxl bSkKKwkJeworCQkJY3VyQXJyYXlLZXktPmN1cl9lbGVtID0gcmVzZXRfZWxlbTsKKwkJCXNrZXkt PnNrX2FyZ3VtZW50ID0gY3VyQXJyYXlLZXktPmVsZW1fdmFsdWVzW3Jlc2V0X2VsZW1dOworCQl9 CisJfQorfQogCiAvKgogICoJX2J0X3ByZXByb2Nlc3Nfa2V5cygpIC0tIFByZXByb2Nlc3Mgc2Nh biBrZXlzCkBAIC0xMzQ1LDM4ICsyMjU3LDIwMiBAQCBfYnRfbWFya19zY2Fua2V5X3JlcXVpcmVk KFNjYW5LZXkgc2tleSkKICAqCiAgKiBSZXR1cm4gdHJ1ZSBpZiBzbywgZmFsc2UgaWYgbm90LiAg SWYgdGhlIHR1cGxlIGZhaWxzIHRvIHBhc3MgdGhlIHF1YWwsCiAgKiB3ZSBhbHNvIGRldGVybWlu ZSB3aGV0aGVyIHRoZXJlJ3MgYW55IG5lZWQgdG8gY29udGludWUgdGhlIHNjYW4gYmV5b25kCi0g KiB0aGlzIHR1cGxlLCBhbmQgc2V0ICpjb250aW51ZXNjYW4gYWNjb3JkaW5nbHkuICBTZWUgY29t bWVudHMgZm9yCisgKiB0aGlzIHR1cGxlLCBhbmQgc2V0IHBzdGF0ZS5jb250aW51ZXNjYW4gYWNj b3JkaW5nbHkuICBTZWUgY29tbWVudHMgZm9yCiAgKiBfYnRfcHJlcHJvY2Vzc19rZXlzKCksIGFi b3ZlLCBhYm91dCBob3cgdGhpcyBpcyBkb25lLgogICoKLSAqIEZvcndhcmQgc2NhbiBjYWxsZXJz IGNhbiBwYXNzIGEgaGlnaCBrZXkgdHVwbGUgaW4gdGhlIGhvcGVzIG9mIGhhdmluZwotICogdXMg c2V0ICpjb250aW51ZXNjYW4gdG8gZmFsc2UsIGFuZCBhdm9pZGluZyBhbiB1bm5lY2Vzc2FyeSB2 aXNpdCB0bwotICogdGhlIHBhZ2UgdG8gdGhlIHJpZ2h0LgorICogRm9yd2FyZCBzY2FuIGNhbGxl cnMgY2FuIHBhc3MgYSBoaWdoIGtleSB0dXBsZSBpbiB0aGUgaG9wZXMgb2YgaGF2aW5nIHVzCisg KiBzZXQgcHN0YXRlLmNvbnRpbnVlc2NhbiB0byBmYWxzZSwgYW5kIGF2b2lkaW5nIGFuIHVubmVj ZXNzYXJ5IHZpc2l0IHRvIHRoZQorICogcGFnZSB0byB0aGUgcmlnaHQuCisgKgorICogRm9yd2Fy ZHMgc2NhbiBjYWxsZXJzIHdpdGggZXF1YWxpdHkgdHlwZSBhcnJheSBzY2FuIGtleXMgYXJlIG9i bGlnYXRlZCB0bworICogc2V0IHVwIHBhZ2Ugc3RhdGUgaW4gYSB3YXkgdGhhdCBtYWtlcyBpdCBw b3NzaWJsZSBmb3IgdXMgdG8gY2hlY2sgdGhlIGhpZ2gKKyAqIGtleSBlYXJseSwgYmVmb3JlIHdl J3ZlIGV4cGVuZGVkIHRvbyBtdWNoIGVmZm9ydCBvbiBjb21wYXJpbmcgdHVwbGVzIHRoYXQKKyAq IGNhbm5vdCBwb3NzaWJseSBiZSBtYXRjaGVzIGZvciBhbnkgc2V0IG9mIGFycmF5IGtleXMuICBU aGlzIGlzIGp1c3QgYW4KKyAqIG9wdGltaXphdGlvbi4KKyAqCisgKiBBZHZhbmNlcyB0aGUgY3Vy cmVudCBzZXQgb2YgYXJyYXkga2V5cyBmb3IgU0tfU0VBUkNIQVJSQVkgc2NhbnMgd2hlcmUKKyAq IGFwcHJvcHJpYXRlLiAgVGhlc2UgY2FsbGVycyBhcmUgcmVxdWlyZWQgdG8gaW5pdGlhbGl6ZSB0 aGUgcGFnZSBsZXZlbCBoaWdoCisgKiBrZXkgaW4gcHN0YXRlIGJlZm9yZSB0aGUgZmlyc3QgY2Fs bCBoZXJlIGZvciB0aGUgcGFnZSAod2hlbiB0aGUgc2NhbgorICogZGlyZWN0aW9uIGlzIGZvcndh cmRzKS4gIE5vdGUgdGhhdCB3ZSByZWx5IG9uIF9idF9yZWFkcGFnZSBjYWxsaW5nIGhlcmUgaW4K KyAqIHBhZ2Ugb2Zmc2V0IG51bWJlciBvcmRlciAoZm9yIGl0cyBzY2FuIGRpcmVjdGlvbikuICBB bnkgb3RoZXIgb3JkZXIgd2lsbAorICogbGVhZCB0byBpbmNvbnNpc3RlbnQgYXJyYXkga2V5IHN0 YXRlLgogICoKICAqIHNjYW46IGluZGV4IHNjYW4gZGVzY3JpcHRvciAoY29udGFpbmluZyBhIHNl YXJjaC10eXBlIHNjYW5rZXkpCisgKiBwc3RhdGU6IFBhZ2UgbGV2ZWwgaW5wdXQgYW5kIG91dHB1 dCBwYXJhbWV0ZXJzCiAgKiB0dXBsZTogaW5kZXggdHVwbGUgdG8gdGVzdAotICogdHVwbmF0dHM6 IG51bWJlciBvZiBhdHRyaWJ1dGVzIGluIHR1cG5hdHRzIChoaWdoIGtleSBtYXkgYmUgdHJ1bmNh dGVkKQotICogZGlyOiBkaXJlY3Rpb24gd2UgYXJlIHNjYW5uaW5nIGluCi0gKiBjb250aW51ZXNj YW46IG91dHB1dCBwYXJhbWV0ZXIgKHdpbGwgYmUgc2V0IGNvcnJlY3RseSBpbiBhbGwgY2FzZXMp CisgKiBmaW5hbHR1cDogSXMgdHVwbGUgdGhlIGZpbmFsIG9uZSB3ZSdsbCBiZSBjYWxsZWQgd2l0 aCBmb3IgdGhpcyBwYWdlPwogICovCiBib29sCi1fYnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mg c2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1cG5hdHRzLAotCQkJICBTY2FuRGlyZWN0aW9u IGRpciwgYm9vbCAqY29udGludWVzY2FuKQorX2J0X2NoZWNra2V5cyhJbmRleFNjYW5EZXNjIHNj YW4sIEJUUmVhZFBhZ2VTdGF0ZSAqcHN0YXRlLAorCQkJICBJbmRleFR1cGxlIHR1cGxlLCBib29s IGZpbmFsdHVwKQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihzY2Fu LT5pbmRleFJlbGF0aW9uKTsKKwlpbnQJCQluYXR0cyA9IEJUcmVlVHVwbGVHZXROQXR0cyh0dXBs ZSwgc2Nhbi0+aW5kZXhSZWxhdGlvbik7CisJQlRTY2FuT3BhcXVlIHNvID0gKEJUU2Nhbk9wYXF1 ZSkgc2Nhbi0+b3BhcXVlOworCWJvb2wJCXJlczsKKwlib29sCQlza3JlcXVpcmVkdHJpZ2dlcjsK KworCUFzc2VydChzby0+cXVhbF9vayk7CisJQXNzZXJ0KHBzdGF0ZS0+Y29udGludWVzY2FuKTsK KwlBc3NlcnQoIXNvLT5uZWVkUHJpbVNjYW4pOworCisJcmVzID0gX2J0X2NoZWNrX2NvbXBhcmUo cHN0YXRlLT5kaXIsIHNvLT5rZXlEYXRhLCBzby0+bnVtYmVyT2ZLZXlzLAorCQkJCQkJCXR1cGxl LCBuYXR0cywgdHVwZGVzYywKKwkJCQkJCQkmcHN0YXRlLT5jb250aW51ZXNjYW4sICZza3JlcXVp cmVkdHJpZ2dlcik7CisKKwkvKgorCSAqIE9ubHkgb25lIF9idF9jaGVja19jb21wYXJlIGNhbGwg aXMgcmVxdWlyZWQgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlCisJICogdGhlcmUgYXJlIG5vIGVx dWFsaXR5LXR5cGUgYXJyYXkgc2NhbiBrZXlzLgorCSAqCisJICogV2hlbiB0aGVyZSBhcmUgYXJy YXkgc2NhbiBrZXlzIHRoZW4gd2UgY2FuIHN0aWxsIGFjY2VwdCB0aGUgZmlyc3QKKwkgKiBhbnN3 ZXIgd2UgZ2V0IGZyb20gX2J0X2NoZWNrX2NvbXBhcmUgd2hlbiBjb250aW51ZXNjYW4gd2Fzbid0 IHVuc2V0LgorCSAqLworCWlmICghc28tPm51bUFycmF5S2V5cyB8fCBwc3RhdGUtPmNvbnRpbnVl c2NhbikKKwkJcmV0dXJuIHJlczsKKworCS8qCisJICogX2J0X2NoZWNrX2NvbXBhcmUgc2V0IGNv bnRpbnVlc2Nhbj1mYWxzZSBpbiB0aGUgcHJlc2VuY2Ugb2YgZXF1YWxpdHkKKwkgKiB0eXBlIGFy cmF5IGtleXMuICBJdCdzIHBvc3NpYmxlIHRoYXQgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBzdGFy dCBvZgorCSAqIHRoZSBhcnJheSBrZXlzIGp1c3QgeWV0LiAgSXQncyBhbHNvIHBvc3NpYmxlIHRo YXQgd2UgbmVlZCB0byBhZHZhbmNlCisJICogdGhlIGFycmF5IGtleXMgbm93LiAgKE9yIHBlcmhh cHMgd2UgcmVhbGx5IGRvIG5lZWQgdG8gdGVybWluYXRlIHRoZQorCSAqIHRvcC1sZXZlbCBzY2Fu LikKKwkgKi8KKwlwc3RhdGUtPmNvbnRpbnVlc2NhbiA9IHRydWU7CS8qIG5ldyBpbml0aWFsIGFz c3VtcHRpb24gKi8KKworCWlmIChza3JlcXVpcmVkdHJpZ2dlciAmJiBfYnRfdHVwbGVfYmVmb3Jl X2FycmF5X3NrZXlzKHNjYW4sIHBzdGF0ZSwgdHVwbGUpKQorCXsKKwkJLyoKKwkJICogVHVwbGUg aXMgc3RpbGwgPCB0aGUgY3VycmVudCBhcnJheSBzY2FuIGtleSB2YWx1ZXMgKGFzIHdlbGwgYXMK KwkJICogb3RoZXIgZXF1YWxpdHkgdHlwZSBzY2FuIGtleXMpIGlmIHRoaXMgaXMgYSBmb3J3YXJk IHNjYW4uCisJCSAqIChCYWNrd2FyZHMgc2NhbnMgcmVhY2ggaGVyZSB3aXRoIGEgdHVwbGUgPiBl cXVhbGl0eSBjb25zdHJhaW50cy4pCisJCSAqIFdlIG11c3Qgbm93IGNvbnNpZGVyIGhvdyB0byBw cm9jZWVkIHdpdGggdGhlIG9uZ29pbmcgcHJpbWl0aXZlCisJCSAqIGluZGV4IHNjYW4uCisJCSAq CisJCSAqIFNob3VsZCBfYnRfcmVhZHBhZ2UgY29udGludWUgd2l0aCB0aGlzIHBhZ2UgZm9yIG5v dywgaW4gdGhlIGhvcGUgb2YKKwkJICogZmluZGluZyB0dXBsZXMgd2hvc2Uga2V5IHNwYWNlIGlz IGNvdmVyZWQgYnkgdGhlIGN1cnJlbnQgYXJyYXkga2V5cworCQkgKiBiZWZvcmUgdG9vIGxvbmc/ ICBPciwgc2hvdWxkIGl0IGdpdmUgdXAgYW5kIHN0YXJ0IGEgbmV3IHByaW1pdGl2ZQorCQkgKiBp bmRleCBzY2FuIGluc3RlYWQ/CisJCSAqCisJCSAqIE91ciBwb2xpY3kgaXMgdG8gdGVybWluYXRl IHRoZSBwcmltaXRpdmUgaW5kZXggc2NhbiBhdCB0aGUgZW5kIG9mCisJCSAqIHRoZSBjdXJyZW50 IHBhZ2UgaWYgdGhlIGN1cnJlbnQgKG1vc3QgcmVjZW50bHkgYWR2YW5jZWQpIGFycmF5IGtleXMK KwkJICogZG9uJ3QgY292ZXIgdGhlIGZpbmFsIHR1cGxlIGZyb20gdGhlIHBhZ2UuICBUaGlzIHBv bGljeSBpcyBmYWlybHkKKwkJICogY29uc2VydmF0aXZlLgorCQkgKgorCQkgKiBOb3RlOiBJbiBz b21lIGNhc2VzIHdlJ3JlIGVmZmVjdGl2ZWx5IHNwZWN1bGF0aW5nIHRoYXQgdGhlIG5leHQKKwkJ ICogc2libGluZyBsZWFmIHBhZ2Ugd2lsbCBoYXZlIHR1cGxlcyB0aGF0IGFyZSBjb3ZlcmVkIGJ5 IHRoZSBrZXkKKwkJICogc3BhY2Ugb2Ygb3VyIGFycmF5IGtleXMgKHRoZSBjdXJyZW50IHNldCBv ciBzb21lIG5lYXJieSBzZXQpLCBiYXNlZAorCQkgKiBvbiBhIGN1ZSBmcm9tIHRoZSBjdXJyZW50 IHBhZ2UncyBmaW5hbCB0dXBsZS4gIFRoZXJlIGlzIGF0IGxlYXN0IGEKKwkJICogbm9uLXplcm8g cmlzayBvZiB3YXN0aW5nIGEgcGFnZSBhY2Nlc3MgLS0gd2UgY291bGQgZ2FtYmxlIGFuZCBsb3Nl LgorCQkgKiBUaGUgZGV0YWlscyBvZiBhbGwgdGhpcyBhcmUgaGFuZGxlZCB3aXRoaW4gX2J0X2Fk dmFuY2VfYXJyYXlfa2V5cy4KKwkJICovCisJCWlmIChmaW5hbHR1cCB8fCAoIXBzdGF0ZS0+aGln aGtleWNoZWNrZWQgJiYgcHN0YXRlLT5oaWdoa2V5ICYmCisJCQkJCQkgX2J0X3R1cGxlX2JlZm9y ZV9hcnJheV9za2V5cyhzY2FuLCBwc3RhdGUsCisJCQkJCQkJCQkJCQkJICBwc3RhdGUtPmhpZ2hr ZXkpKSkKKwkJeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgdGhlIGZpbmFsIHR1cGxlICh0aGUgaGln aCBrZXkgZm9yIGEgZm9yd2FyZCBzY2FuLCBvcgorCQkJICogdGhlIG5vbi1waXZvdCB0dXBsZSBh dCB0aGUgZmlyc3Qgb2Zmc2V0IG51bWJlciBmb3IgYSBiYWNrd2FyZAorCQkJICogc2NhbiksIGFu ZCBpdHMgc3RpbGwgYmVmb3JlIHRoZSBhcnJheSBrZXlzLiAgR2l2ZSB1cCBub3cgYnkKKwkJCSAq IHN0YXJ0aW5nIGEgbmV3IHByaW1pdGl2ZSBpbmRleCBzY2FuLgorCQkJICoKKwkJCSAqIEhhdmUg X2J0X3JlYWRwYWdlIHN0b3AgdGhlIHNjYW4gb2YgdGhpcyBwYWdlIGltbWVkaWF0ZWx5LAorCQkJ ICogc3RhcnRpbmcgYSBuZXcgcHJpbWl0aXZlIGluZGV4IHNjYW4uICBBbm90aGVyIHByaW1pdGl2 ZSBpbmRleAorCQkJICogc2NhbiBtdXN0IGJlIHJlcXVpcmVkIChpZiB0aGUgdG9wLWxldmVsIHNj YW4gY291bGQgYmUKKwkJCSAqIHRlcm1pbmF0ZWQgdGhlbiB3ZSdkIGhhdmUgZG9uZSBzbyBieSBu b3cpLgorCQkJICoKKwkJCSAqIE5vdGU6IF9idF9yZWFkcGFnZSBzdGFzaGVzIHRoZSBwYWdlIGhp Z2gga2V5LCBlbmFibGluZyB1cyB0bworCQkJICogbWFrZSB0aGlzIGNoZWNrIGVhcmx5IGluIHRo ZSBjYXNlIG9mIGZvcndhcmQgc2NhbnMuICBXZSB0aGVyZWJ5CisJCQkgKiBhdm9pZCBzY2Fubmlu ZyB2ZXJ5IG1hbnkgZXh0cmEgdHVwbGVzIG9uIHRoZSBwYWdlLiAgVGhpcyBpcworCQkJICogcHVy ZWx5IGFuIG9wdGltaXphdGlvbiAtLSBpdCBkb2Vzbid0IGFmZmVjdCB0aGUgYmVoYXZpb3Igb2Yg dGhlCisJCQkgKiBzY2FuIChub3QgaW4gYSB3YXkgdGhhdCBjYW4gYmUgb2JzZXJ2ZWQgb3V0c2lk ZSBvZgorCQkJICogX2J0X3JlYWRwYWdlLCBhdCBsZWFzdCkuCisJCQkgKi8KKwkJCXBzdGF0ZS0+ Y29udGludWVzY2FuID0gZmFsc2U7CisJCQlzby0+bmVlZFByaW1TY2FuID0gdHJ1ZTsKKwkJfQor CQllbHNlIGlmICghZmluYWx0dXAgJiYgcHN0YXRlLT5oaWdoa2V5KQorCQl7CisJCQkvKgorCQkJ ICogUmVtZW1iZXIgdGhhdCB0aGUgaGlnaCBrZXkgaGFzIGJlZW4gY2hlY2tlZCB3aXRoIHRoaXMK KwkJCSAqIHBhcnRpY3VsYXIgc2V0IG9mIGFycmF5IGtleXMuCisJCQkgKgorCQkJICogSXQgbWln aHQgbWFrZSBzZW5zZSB0byBjaGVjayB0aGUgc2FtZSBoaWdoIGtleSBhZ2FpbiBhdCBzb21lCisJ CQkgKiBwb2ludCBkdXJpbmcgdGhlIG9uZ29pbmcgX2J0X3JlYWRwYWdlLXdpc2Ugc2NhbiBvZiB0 aGlzIHBhZ2UuCisJCQkgKiBCdXQgaXQgaXMgZGVmaW5pdGVseSB3YXN0ZWZ1bCB0byByZXBlYXQg dGhlIHNhbWUgaGlnaCBrZXkgY2hlY2sKKwkJCSAqIGJlZm9yZSB0aGUgYXJyYXkga2V5cyBhcmUg YWR2YW5jZWQgYnkgc29tZSBsYXRlciB0dXBsZS4KKwkJCSAqLworCQkJcHN0YXRlLT5oaWdoa2V5 Y2hlY2tlZCA9IHRydWU7CisJCX0KKworCQkvKgorCQkgKiBJbiBhbnkgY2FzZSwgdGhpcyBpbmRl eHR1cGxlIGRvZXNuJ3QgbWF0Y2ggdGhlIHF1YWwKKwkJICovCisJCXJldHVybiBmYWxzZTsKKwl9 CisKKwkvKgorCSAqIENhbGxlcidzIHR1cGxlIGlzID49IHRoZSBjdXJyZW50IHNldCBvZiBhcnJh eSBrZXlzIGFuZCBvdGhlciBlcXVhbGl0eQorCSAqIGNvbnN0cmFpbnQgc2NhbiBrZXlzIChvciA8 PSBpZiB0aGlzIGlzIGEgYmFja3dhcmRzIHNjYW5zKS4KKwkgKgorCSAqIEl0IG1pZ2h0IGJlIHRp bWUgdG8gYWR2YW5jZSB0aGUgYXJyYXkga2V5cyB0byB0aGUgbmV4dCBzZXQuICBUcnkgZG9pbmcK KwkgKiB0aGF0IG5vdywgd2hpbGUgZGV0ZXJtaW5pbmcgaW4gcGFzc2luZyBpZiB0aGUgdHVwbGUg bWF0Y2hlcyB0aGUgbmV3bHkKKwkgKiBhZHZhbmNlZCBzZXQgb2YgYXJyYXkga2V5cyAoaWYgd2Un dmUgYW55IGxlZnQpLgorCSAqCisJICogVGhpcyBjYWxsIHdpbGwgYWxzbyBzZXQgY29udGludWVz Y2FuIGZvciB1cyAob3IgdGVsbHMgdXMgdG8gcGVyZm9ybQorCSAqIGFub3RoZXIgX2J0X2NoZWNr X2NvbXBhcmUgY2FsbCwgd2hpY2ggdGhlbiBzZXRzIGNvbnRpbnVlc2NhbiBmb3IgdXMpLgorCSAq LworCWlmICghX2J0X2FkdmFuY2VfYXJyYXlfa2V5cyhzY2FuLCBwc3RhdGUsIHR1cGxlLCBza3Jl cXVpcmVkdHJpZ2dlcikpCisJeworCQkvKgorCQkgKiBUdXBsZSBkb2Vzbid0IG1hdGNoIGFueSBs YXRlciBhcnJheSBrZXlzLCBlaXRoZXIgKGZvciBvbmUgb3IgbW9yZQorCQkgKiBhcnJheSB0eXBl IHNjYW4ga2V5cyBtYXJrZWQgYXMgcmVxdWlyZWQpLiAgR2l2ZSB1cCBvbiB0aGlzIHR1cGxlCisJ CSAqIGJlaW5nIGEgbWF0Y2guICAoQ2FsbCBtYXkgYWxzbyBoYXZlIHRlcm1pbmF0ZWQgdGhlIHBy aW1pdGl2ZSBzY2FuLAorCQkgKiBvciB0aGUgdG9wLWxldmVsIHNjYW4uKQorCQkgKi8KKwkJcmV0 dXJuIGZhbHNlOworCX0KKworCS8qCisJICogQWR2YW5jZWQgYXJyYXkga2V5cyB0byB2YWx1ZXMg dGhhdCBhcmUgZXhhY3QgbWF0Y2hlcyBmb3IgY29ycmVzcG9uZGluZworCSAqIGF0dHJpYnV0ZSB2 YWx1ZXMgZnJvbSB0aGUgdHVwbGUuCisJICoKKwkgKiBJdCdzIGZhaXJseSBsaWtlbHkgdGhhdCB0 aGUgdHVwbGUgc2F0aXNmaWVzIGFsbCBpbmRleCBzY2FuIGNvbmRpdGlvbnMKKwkgKiBhdCB0aGlz IHBvaW50LCBidXQgd2UgbmVlZCBjb25maXJtYXRpb24gb2YgdGhhdC4gIFdlIGFsc28gbmVlZCB0 byBnaXZlCisJICogX2J0X2NoZWNrX2NvbXBhcmUgYSByZWFsIG9wcG9ydHVuaXR5IHRvIGVuZCB0 aGUgdG9wLWxldmVsIGluZGV4IHNjYW4gYnkKKwkgKiBzZXR0aW5nIGNvbnRpbnVlc2Nhbj1mYWxz ZS4gIChfYnRfYWR2YW5jZV9hcnJheV9rZXlzIGNhbm5vdCBkZWFsIHdpdGgKKwkgKiBpbmVxdWFs aXR5IHN0cmF0ZWd5IHNjYW4ga2V5czsgd2UgbmVlZCBfYnRfY2hlY2tfY29tcGFyZSBmb3IgdGhv c2UuKQorCSAqLworCXJldHVybiBfYnRfY2hlY2tfY29tcGFyZShwc3RhdGUtPmRpciwgc28tPmtl eURhdGEsIHNvLT5udW1iZXJPZktleXMsCisJCQkJCQkJIHR1cGxlLCBuYXR0cywgdHVwZGVzYywK KwkJCQkJCQkgJnBzdGF0ZS0+Y29udGludWVzY2FuLCAmc2tyZXF1aXJlZHRyaWdnZXIpOworfQor CisvKgorICogVGVzdCB3aGV0aGVyIGFuIGluZGV4dHVwbGUgc2F0aXNmaWVzIGN1cnJlbnQgc2Nh biBjb25kaXRpb24uCisgKgorICogUmV0dXJuIHRydWUgaWYgc28sIGZhbHNlIGlmIG5vdC4gIElm IG5vdCwgYWxzbyBjbGVhciAqY29udGludWVzY2FuIGlmCisgKiBpdCdzIG5vdCBwb3NzaWJsZSBm b3IgYW55IGZ1dHVyZSB0dXBsZXMgaW4gdGhlIGN1cnJlbnQgc2NhbiBkaXJlY3Rpb24gdG8KKyAq IHBhc3MgdGhlIHF1YWwgd2l0aCB0aGUgY3VycmVudCBzZXQgb2YgYXJyYXkga2V5cy4KKyAqCisg KiBUaGlzIGlzIGEgc3Vicm91dGluZSBmb3IgX2J0X2NoZWNra2V5cy4gIEl0IGlzIHdyaXR0ZW4g d2l0aCB0aGUgYXNzdW1wdGlvbgorICogdGhhdCByZWFjaGluZyB0aGUgZW5kIG9mIGVhY2ggZGlz dGluY3Qgc2V0IG9mIGFycmF5IGtleXMgdGVybWluYXRlcyB0aGUKKyAqIG9uZ29pbmcgcHJpbWl0 aXZlIGluZGV4IHNjYW4uICBJdCBpcyB1cCB0byBvdXIgY2FsbGVyICh0aGF0IGhhcyBtb3JlCisg KiBjb250ZXh0IHRoYW4gd2UgaGF2ZSBhdmFpbGFibGUgaGVyZSkgdG8gb3ZlcnJpZGUgdGhhdCBp bml0aWFsIGRldGVybWluYXRpb24KKyAqIHdoZW4gaXQgbWFrZXMgbW9yZSBzZW5zZSB0byBhZHZh bmNlIHRoZSBhcnJheSBrZXlzIGFuZCBjb250aW51ZSB3aXRoCisgKiBmdXJ0aGVyIHR1cGxlcyBm cm9tIHRoZSBzYW1lIGxlYWYgcGFnZS4KKyAqLworc3RhdGljIGJvb2wKK19idF9jaGVja19jb21w YXJlKFNjYW5EaXJlY3Rpb24gZGlyLCBTY2FuS2V5IGtleURhdGEsIGludCBrZXlzeiwKKwkJCQkg IEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywgVHVwbGVEZXNjIHR1cGRlc2MsCisJCQkJ ICBib29sICpjb250aW51ZXNjYW4sIGJvb2wgKnNrcmVxdWlyZWR0cmlnZ2VyKQogewotCVR1cGxl RGVzYwl0dXBkZXNjOwotCUJUU2Nhbk9wYXF1ZSBzbzsKLQlpbnQJCQlrZXlzejsKIAlpbnQJCQlp a2V5OwogCVNjYW5LZXkJCWtleTsKIAotCUFzc2VydChCVHJlZVR1cGxlR2V0TkF0dHModHVwbGUs IHNjYW4tPmluZGV4UmVsYXRpb24pID09IHR1cG5hdHRzKTsKLQogCSpjb250aW51ZXNjYW4gPSB0 cnVlOwkJLyogZGVmYXVsdCBhc3N1bXB0aW9uICovCisJKnNrcmVxdWlyZWR0cmlnZ2VyID0gdHJ1 ZTsJLyogZGVmYXVsdCBhc3N1bXB0aW9uICovCiAKLQl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNj cihzY2FuLT5pbmRleFJlbGF0aW9uKTsKLQlzbyA9IChCVFNjYW5PcGFxdWUpIHNjYW4tPm9wYXF1 ZTsKLQlrZXlzeiA9IHNvLT5udW1iZXJPZktleXM7Ci0KLQlmb3IgKGtleSA9IHNvLT5rZXlEYXRh LCBpa2V5ID0gMDsgaWtleSA8IGtleXN6OyBrZXkrKywgaWtleSsrKQorCWZvciAoa2V5ID0ga2V5 RGF0YSwgaWtleSA9IDA7IGlrZXkgPCBrZXlzejsga2V5KyssIGlrZXkrKykKIAl7CiAJCURhdHVt CQlkYXR1bTsKIAkJYm9vbAkJaXNOdWxsOwpAQCAtMTQ5Nyw2ICsyNTczLDEwIEBAIF9idF9jaGVj a2tleXMoSW5kZXhTY2FuRGVzYyBzY2FuLCBJbmRleFR1cGxlIHR1cGxlLCBpbnQgdHVwbmF0dHMs CiAJCQkgKiBxdWFsIGZhaWxzLCBpdCBpcyBjcml0aWNhbCB0aGF0IGVxdWFsaXR5IHF1YWxzIGJl IHVzZWQgZm9yIHRoZQogCQkJICogaW5pdGlhbCBwb3NpdGlvbmluZyBpbiBfYnRfZmlyc3QoKSB3 aGVuIHRoZXkgYXJlIGF2YWlsYWJsZS4gU2VlCiAJCQkgKiBjb21tZW50cyBpbiBfYnRfZmlyc3Qo KS4KKwkJCSAqCisJCQkgKiBTY2FucyB3aXRoIGVxdWFsaXR5LXR5cGUgYXJyYXkgc2NhbiBrZXlz IHJ1biBpbnRvIGEgc2ltaWxhcgorCQkJICogcHJvYmxlbSB3aGVuZXZlciB0aGV5IGFkdmFuY2Ug dGhlIGFycmF5IGtleXMuICBPdXIgY2FsbGVyIHVzZXMKKwkJCSAqIF9idF90dXBsZV9iZWZvcmVf YXJyYXlfc2tleXMgdG8gYXZvaWQgdGhlIHByb2JsZW0gdGhlcmUuCiAJCQkgKi8KIAkJCWlmICgo a2V5LT5za19mbGFncyAmIFNLX0JUX1JFUUZXRCkgJiYKIAkJCQlTY2FuRGlyZWN0aW9uSXNGb3J3 YXJkKGRpcikpCkBAIC0xNTA1LDYgKzI1ODUsMTQgQEAgX2J0X2NoZWNra2V5cyhJbmRleFNjYW5E ZXNjIHNjYW4sIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKIAkJCQkJIFNjYW5EaXJl Y3Rpb25Jc0JhY2t3YXJkKGRpcikpCiAJCQkJKmNvbnRpbnVlc2NhbiA9IGZhbHNlOwogCisJCQlp ZiAoKGtleS0+c2tfZmxhZ3MgJiBTS19TRUFSQ0hBUlJBWSkgJiYKKwkJCQlrZXktPnNrX3N0cmF0 ZWd5ID09IEJURXF1YWxTdHJhdGVneU51bWJlcikKKwkJCXsKKwkJCQlpZiAoKmNvbnRpbnVlc2Nh bikKKwkJCQkJKnNrcmVxdWlyZWR0cmlnZ2VyID0gZmFsc2U7CisJCQkJKmNvbnRpbnVlc2NhbiA9 IGZhbHNlOworCQkJfQorCiAJCQkvKgogCQkJICogSW4gYW55IGNhc2UsIHRoaXMgaW5kZXh0dXBs ZSBkb2Vzbid0IG1hdGNoIHRoZSBxdWFsLgogCQkJICovCkBAIC0xNTIzLDcgKzI2MTEsNyBAQCBf YnRfY2hlY2trZXlzKEluZGV4U2NhbkRlc2Mgc2NhbiwgSW5kZXhUdXBsZSB0dXBsZSwgaW50IHR1 cG5hdHRzLAogICogaXQncyBub3QgcG9zc2libGUgZm9yIGFueSBmdXR1cmUgdHVwbGVzIGluIHRo ZSBjdXJyZW50IHNjYW4gZGlyZWN0aW9uCiAgKiB0byBwYXNzIHRoZSBxdWFsLgogICoKLSAqIFRo aXMgaXMgYSBzdWJyb3V0aW5lIGZvciBfYnRfY2hlY2trZXlzLCB3aGljaCBzZWUgZm9yIG1vcmUg aW5mby4KKyAqIFRoaXMgaXMgYSBzdWJyb3V0aW5lIGZvciBfYnRfY2hlY2tfY29tcGFyZS9fYnRf Y2hlY2trZXlzX2NvbXBhcmUuCiAgKi8KIHN0YXRpYyBib29sCiBfYnRfY2hlY2tfcm93Y29tcGFy ZShTY2FuS2V5IHNrZXksIEluZGV4VHVwbGUgdHVwbGUsIGludCB0dXBuYXR0cywKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgYi9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCmluZGV4IDZhOTNkNzY3YS4uZjA0Y2ExZWU5IDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCisrKyBiL3NyYy9i YWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKQEAgLTEwNiw4ICsxMDYsNyBAQCBzdGF0 aWMgTGlzdCAqYnVpbGRfaW5kZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKIAkJCQkJCQkgICBJbmRleE9wdEluZm8gKmluZGV4LCBJbmRleENsYXVzZVNldCAqY2xh dXNlcywKIAkJCQkJCQkgICBib29sIHVzZWZ1bF9wcmVkaWNhdGUsCiAJCQkJCQkJICAgU2NhblR5 cGVDb250cm9sIHNjYW50eXBlLAotCQkJCQkJCSAgIGJvb2wgKnNraXBfbm9ubmF0aXZlX3Nhb3As Ci0JCQkJCQkJICAgYm9vbCAqc2tpcF9sb3dlcl9zYW9wKTsKKwkJCQkJCQkgICBib29sICpza2lw X25vbm5hdGl2ZV9zYW9wKTsKIHN0YXRpYyBMaXN0ICpidWlsZF9wYXRoc19mb3JfT1IoUGxhbm5l ckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJTGlzdCAqY2xhdXNlcywgTGlz dCAqb3RoZXJfY2xhdXNlcyk7CiBzdGF0aWMgTGlzdCAqZ2VuZXJhdGVfYml0bWFwX29yX3BhdGhz KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCkBAIC03MDYsOCArNzA1LDYgQEAg ZWNsYXNzX2FscmVhZHlfdXNlZChFcXVpdmFsZW5jZUNsYXNzICpwYXJlbnRfZWMsIFJlbGlkcyBv bGRyZWxpZHMsCiAgKiBpbmRleCBBTSBzdXBwb3J0cyB0aGVtIG5hdGl2ZWx5LCB3ZSBzaG91bGQg anVzdCBpbmNsdWRlIHRoZW0gaW4gc2ltcGxlCiAgKiBpbmRleCBwYXRocy4gIElmIG5vdCwgd2Ug c2hvdWxkIGV4Y2x1ZGUgdGhlbSB3aGlsZSBidWlsZGluZyBzaW1wbGUgaW5kZXgKICAqIHBhdGhz LCBhbmQgdGhlbiBtYWtlIGEgc2VwYXJhdGUgYXR0ZW1wdCB0byBpbmNsdWRlIHRoZW0gaW4gYml0 bWFwIHBhdGhzLgotICogRnVydGhlcm1vcmUsIHdlIHNob3VsZCBjb25zaWRlciBleGNsdWRpbmcg bG93ZXItb3JkZXIgU2NhbGFyQXJyYXlPcEV4cHIKLSAqIHF1YWxzIHNvIGFzIHRvIGNyZWF0ZSBv cmRlcmVkIHBhdGhzLgogICovCiBzdGF0aWMgdm9pZAogZ2V0X2luZGV4X3BhdGhzKFBsYW5uZXJJ bmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCkBAIC03MTYsMzcgKzcxMywxNyBAQCBnZXRfaW5k ZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIHsKIAlMaXN0CSAg ICppbmRleHBhdGhzOwogCWJvb2wJCXNraXBfbm9ubmF0aXZlX3Nhb3AgPSBmYWxzZTsKLQlib29s CQlza2lwX2xvd2VyX3Nhb3AgPSBmYWxzZTsKIAlMaXN0Q2VsbCAgICpsYzsKIAogCS8qCiAJICog QnVpbGQgc2ltcGxlIGluZGV4IHBhdGhzIHVzaW5nIHRoZSBjbGF1c2VzLiAgQWxsb3cgU2NhbGFy QXJyYXlPcEV4cHIKLQkgKiBjbGF1c2VzIG9ubHkgaWYgdGhlIGluZGV4IEFNIHN1cHBvcnRzIHRo ZW0gbmF0aXZlbHksIGFuZCBza2lwIGFueSBzdWNoCi0JICogY2xhdXNlcyBmb3IgaW5kZXggY29s dW1ucyBhZnRlciB0aGUgZmlyc3QgKHNvIHRoYXQgd2UgcHJvZHVjZSBvcmRlcmVkCi0JICogcGF0 aHMgaWYgcG9zc2libGUpLgorCSAqIGNsYXVzZXMgb25seSBpZiB0aGUgaW5kZXggQU0gc3VwcG9y dHMgdGhlbSBuYXRpdmVseS4KIAkgKi8KIAlpbmRleHBhdGhzID0gYnVpbGRfaW5kZXhfcGF0aHMo cm9vdCwgcmVsLAogCQkJCQkJCQkgICBpbmRleCwgY2xhdXNlcywKIAkJCQkJCQkJICAgaW5kZXgt PnByZWRPSywKIAkJCQkJCQkJICAgU1RfQU5ZU0NBTiwKLQkJCQkJCQkJICAgJnNraXBfbm9ubmF0 aXZlX3Nhb3AsCi0JCQkJCQkJCSAgICZza2lwX2xvd2VyX3Nhb3ApOwotCi0JLyoKLQkgKiBJZiB3 ZSBza2lwcGVkIGFueSBsb3dlci1vcmRlciBTY2FsYXJBcnJheU9wRXhwcnMgb24gYW4gaW5kZXgg d2l0aCBhbiBBTQotCSAqIHRoYXQgc3VwcG9ydHMgdGhlbSwgdGhlbiB0cnkgYWdhaW4gaW5jbHVk aW5nIHRob3NlIGNsYXVzZXMuICBUaGlzIHdpbGwKLQkgKiBwcm9kdWNlIHBhdGhzIHdpdGggbW9y ZSBzZWxlY3Rpdml0eSBidXQgbm8gb3JkZXJpbmcuCi0JICovCi0JaWYgKHNraXBfbG93ZXJfc2Fv cCkKLQl7Ci0JCWluZGV4cGF0aHMgPSBsaXN0X2NvbmNhdChpbmRleHBhdGhzLAotCQkJCQkJCQkg YnVpbGRfaW5kZXhfcGF0aHMocm9vdCwgcmVsLAotCQkJCQkJCQkJCQkJICAgaW5kZXgsIGNsYXVz ZXMsCi0JCQkJCQkJCQkJCQkgICBpbmRleC0+cHJlZE9LLAotCQkJCQkJCQkJCQkJICAgU1RfQU5Z U0NBTiwKLQkJCQkJCQkJCQkJCSAgICZza2lwX25vbm5hdGl2ZV9zYW9wLAotCQkJCQkJCQkJCQkJ ICAgTlVMTCkpOwotCX0KKwkJCQkJCQkJICAgJnNraXBfbm9ubmF0aXZlX3Nhb3ApOwogCiAJLyoK IAkgKiBTdWJtaXQgYWxsIHRoZSBvbmVzIHRoYXQgY2FuIGZvcm0gcGxhaW4gSW5kZXhTY2FuIHBs YW5zIHRvIGFkZF9wYXRoLiAoQQpAQCAtNzg0LDcgKzc2MSw2IEBAIGdldF9pbmRleF9wYXRocyhQ bGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJICAgaW5kZXgsIGNs YXVzZXMsCiAJCQkJCQkJCQkgICBmYWxzZSwKIAkJCQkJCQkJCSAgIFNUX0JJVE1BUFNDQU4sCi0J CQkJCQkJCQkgICBOVUxMLAogCQkJCQkJCQkJICAgTlVMTCk7CiAJCSpiaXRpbmRleHBhdGhzID0g bGlzdF9jb25jYXQoKmJpdGluZGV4cGF0aHMsIGluZGV4cGF0aHMpOwogCX0KQEAgLTgxNywyNyAr NzkzLDE5IEBAIGdldF9pbmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAq cmVsLAogICogdG8gdHJ1ZSBpZiB3ZSBmb3VuZCBhbnkgc3VjaCBjbGF1c2VzIChjYWxsZXIgbXVz dCBpbml0aWFsaXplIHRoZSB2YXJpYWJsZQogICogdG8gZmFsc2UpLiAgSWYgaXQncyBOVUxMLCB3 ZSBkbyBub3QgaWdub3JlIFNjYWxhckFycmF5T3BFeHByIGNsYXVzZXMuCiAgKgotICogSWYgc2tp cF9sb3dlcl9zYW9wIGlzIG5vbi1OVUxMLCB3ZSBpZ25vcmUgU2NhbGFyQXJyYXlPcEV4cHIgY2xh dXNlcyBmb3IKLSAqIG5vbi1maXJzdCBpbmRleCBjb2x1bW5zLCBhbmQgd2Ugc2V0ICpza2lwX2xv d2VyX3Nhb3AgdG8gdHJ1ZSBpZiB3ZSBmb3VuZAotICogYW55IHN1Y2ggY2xhdXNlcyAoY2FsbGVy IG11c3QgaW5pdGlhbGl6ZSB0aGUgdmFyaWFibGUgdG8gZmFsc2UpLiAgSWYgaXQncwotICogTlVM TCwgd2UgZG8gbm90IGlnbm9yZSBub24tZmlyc3QgU2NhbGFyQXJyYXlPcEV4cHIgY2xhdXNlcywg YnV0IHRoZXkgd2lsbAotICogcmVzdWx0IGluIGNvbnNpZGVyaW5nIHRoZSBzY2FuJ3Mgb3V0cHV0 IHRvIGJlIHVub3JkZXJlZC4KLSAqCiAgKiAncmVsJyBpcyB0aGUgaW5kZXgncyBoZWFwIHJlbGF0 aW9uCiAgKiAnaW5kZXgnIGlzIHRoZSBpbmRleCBmb3Igd2hpY2ggd2Ugd2FudCB0byBnZW5lcmF0 ZSBwYXRocwogICogJ2NsYXVzZXMnIGlzIHRoZSBjb2xsZWN0aW9uIG9mIGluZGV4YWJsZSBjbGF1 c2VzIChJbmRleENsYXVzZSBub2RlcykKICAqICd1c2VmdWxfcHJlZGljYXRlJyBpbmRpY2F0ZXMg d2hldGhlciB0aGUgaW5kZXggaGFzIGEgdXNlZnVsIHByZWRpY2F0ZQogICogJ3NjYW50eXBlJyBp bmRpY2F0ZXMgd2hldGhlciB3ZSBuZWVkIHBsYWluIG9yIGJpdG1hcCBzY2FuIHN1cHBvcnQKICAq ICdza2lwX25vbm5hdGl2ZV9zYW9wJyBpbmRpY2F0ZXMgd2hldGhlciB0byBhY2NlcHQgU0FPUCBp ZiBpbmRleCBBTSBkb2Vzbid0Ci0gKiAnc2tpcF9sb3dlcl9zYW9wJyBpbmRpY2F0ZXMgd2hldGhl ciB0byBhY2NlcHQgbm9uLWZpcnN0LWNvbHVtbiBTQU9QCiAgKi8KIHN0YXRpYyBMaXN0ICoKIGJ1 aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJCQkJ ICBJbmRleE9wdEluZm8gKmluZGV4LCBJbmRleENsYXVzZVNldCAqY2xhdXNlcywKIAkJCQkgIGJv b2wgdXNlZnVsX3ByZWRpY2F0ZSwKIAkJCQkgIFNjYW5UeXBlQ29udHJvbCBzY2FudHlwZSwKLQkJ CQkgIGJvb2wgKnNraXBfbm9ubmF0aXZlX3Nhb3AsCi0JCQkJICBib29sICpza2lwX2xvd2VyX3Nh b3ApCisJCQkJICBib29sICpza2lwX25vbm5hdGl2ZV9zYW9wKQogewogCUxpc3QJICAgKnJlc3Vs dCA9IE5JTDsKIAlJbmRleFBhdGggICppcGF0aDsKQEAgLTg0OCw3ICs4MTYsNiBAQCBidWlsZF9p bmRleF9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCUxpc3QJICAg Km9yZGVyYnljbGF1c2Vjb2xzOwogCUxpc3QJICAgKmluZGV4X3BhdGhrZXlzOwogCUxpc3QJICAg KnVzZWZ1bF9wYXRoa2V5czsKLQlib29sCQlmb3VuZF9sb3dlcl9zYW9wX2NsYXVzZTsKIAlib29s CQlwYXRoa2V5c19wb3NzaWJseV91c2VmdWw7CiAJYm9vbAkJaW5kZXhfaXNfb3JkZXJlZDsKIAli b29sCQlpbmRleF9vbmx5X3NjYW47CkBAIC04ODAsMTkgKzg0NywxMSBAQCBidWlsZF9pbmRleF9w YXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCSAqIG9uIGJ5IGJ0cmVl IGFuZCBwb3NzaWJseSBvdGhlciBwbGFjZXMuKSAgVGhlIGxpc3QgY2FuIGJlIGVtcHR5LCBpZiB0 aGUKIAkgKiBpbmRleCBBTSBhbGxvd3MgdGhhdC4KIAkgKgotCSAqIGZvdW5kX2xvd2VyX3Nhb3Bf Y2xhdXNlIGlzIHNldCB0cnVlIGlmIHdlIGFjY2VwdCBhIFNjYWxhckFycmF5T3BFeHByCi0JICog aW5kZXggY2xhdXNlIGZvciBhIG5vbi1maXJzdCBpbmRleCBjb2x1bW4uICBUaGlzIHByZXZlbnRz IHVzIGZyb20KLQkgKiBhc3N1bWluZyB0aGF0IHRoZSBzY2FuIHJlc3VsdCBpcyBvcmRlcmVkLiAg KEFjdHVhbGx5LCB0aGUgcmVzdWx0IGlzCi0JICogc3RpbGwgb3JkZXJlZCBpZiB0aGVyZSBhcmUg ZXF1YWxpdHkgY29uc3RyYWludHMgZm9yIGFsbCBlYXJsaWVyCi0JICogY29sdW1ucywgYnV0IGl0 IHNlZW1zIHRvbyBleHBlbnNpdmUgYW5kIG5vbi1tb2R1bGFyIGZvciB0aGlzIGNvZGUgdG8gYmUK LQkgKiBhd2FyZSBvZiB0aGF0IHJlZmluZW1lbnQuKQotCSAqCiAJICogV2UgYWxzbyBidWlsZCBh IFJlbGlkcyBzZXQgc2hvd2luZyB3aGljaCBvdXRlciByZWxzIGFyZSByZXF1aXJlZCBieSB0aGUK IAkgKiBzZWxlY3RlZCBjbGF1c2VzLiAgQW55IGxhdGVyYWxfcmVsaWRzIGFyZSBpbmNsdWRlZCBp biB0aGF0LCBidXQgbm90CiAJICogb3RoZXJ3aXNlIGFjY291bnRlZCBmb3IuCiAJICovCiAJaW5k ZXhfY2xhdXNlcyA9IE5JTDsKLQlmb3VuZF9sb3dlcl9zYW9wX2NsYXVzZSA9IGZhbHNlOwogCW91 dGVyX3JlbGlkcyA9IGJtc19jb3B5KHJlbC0+bGF0ZXJhbF9yZWxpZHMpOwogCWZvciAoaW5kZXhj b2wgPSAwOyBpbmRleGNvbCA8IGluZGV4LT5ua2V5Y29sdW1uczsgaW5kZXhjb2wrKykKIAl7CkBA IC05MTcsMTYgKzg3Niw2IEBAIGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwsCiAJCQkJCS8qIENhbGxlciBoYWQgYmV0dGVyIGludGVuZCB0aGlzIG9u bHkgZm9yIGJpdG1hcCBzY2FuICovCiAJCQkJCUFzc2VydChzY2FudHlwZSA9PSBTVF9CSVRNQVBT Q0FOKTsKIAkJCQl9Ci0JCQkJaWYgKGluZGV4Y29sID4gMCkKLQkJCQl7Ci0JCQkJCWlmIChza2lw X2xvd2VyX3Nhb3ApCi0JCQkJCXsKLQkJCQkJCS8qIENhbGxlciBkb2Vzbid0IHdhbnQgdG8gbG9z ZSBpbmRleCBvcmRlcmluZyAqLwotCQkJCQkJKnNraXBfbG93ZXJfc2FvcCA9IHRydWU7Ci0JCQkJ CQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlmb3VuZF9sb3dlcl9zYW9wX2NsYXVzZSA9IHRydWU7 Ci0JCQkJfQogCQkJfQogCiAJCQkvKiBPSyB0byBpbmNsdWRlIHRoaXMgY2xhdXNlICovCkBAIC05 NTYsMTEgKzkwNSw5IEBAIGJ1aWxkX2luZGV4X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwsCiAJLyoKIAkgKiAyLiBDb21wdXRlIHBhdGhrZXlzIGRlc2NyaWJpbmcgaW5k ZXgncyBvcmRlcmluZywgaWYgYW55LCB0aGVuIHNlZSBob3cKIAkgKiBtYW55IG9mIHRoZW0gYXJl IGFjdHVhbGx5IHVzZWZ1bCBmb3IgdGhpcyBxdWVyeS4gIFRoaXMgaXMgbm90IHJlbGV2YW50Ci0J ICogaWYgd2UgYXJlIG9ubHkgdHJ5aW5nIHRvIGJ1aWxkIGJpdG1hcCBpbmRleHNjYW5zLCBub3Ig aWYgd2UgaGF2ZSB0bwotCSAqIGFzc3VtZSB0aGUgc2NhbiBpcyB1bm9yZGVyZWQuCisJICogaWYg d2UgYXJlIG9ubHkgdHJ5aW5nIHRvIGJ1aWxkIGJpdG1hcCBpbmRleHNjYW5zLgogCSAqLwogCXBh dGhrZXlzX3Bvc3NpYmx5X3VzZWZ1bCA9IChzY2FudHlwZSAhPSBTVF9CSVRNQVBTQ0FOICYmCi0J CQkJCQkJCSFmb3VuZF9sb3dlcl9zYW9wX2NsYXVzZSAmJgogCQkJCQkJCQloYXNfdXNlZnVsX3Bh dGhrZXlzKHJvb3QsIHJlbCkpOwogCWluZGV4X2lzX29yZGVyZWQgPSAoaW5kZXgtPnNvcnRvcGZh bWlseSAhPSBOVUxMKTsKIAlpZiAoaW5kZXhfaXNfb3JkZXJlZCAmJiBwYXRoa2V5c19wb3NzaWJs eV91c2VmdWwpCkBAIC0xMjEyLDcgKzExNTksNiBAQCBidWlsZF9wYXRoc19mb3JfT1IoUGxhbm5l ckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCSAgIGluZGV4LCAmY2xhdXNl c2V0LAogCQkJCQkJCQkJICAgdXNlZnVsX3ByZWRpY2F0ZSwKIAkJCQkJCQkJCSAgIFNUX0JJVE1B UFNDQU4sCi0JCQkJCQkJCQkgICBOVUxMLAogCQkJCQkJCQkJICAgTlVMTCk7CiAJCXJlc3VsdCA9 IGxpc3RfY29uY2F0KHJlc3VsdCwgaW5kZXhwYXRocyk7CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvc2VsZnVu Y3MuYwppbmRleCBjNGZjZDAwNzYuLmM3OTZiNTNhNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNz LmMKQEAgLTY0NDQsOCArNjQ0NCw2IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8g KnJvb3QsCiAJZG91YmxlCQludW1JbmRleFR1cGxlczsKIAlkb3VibGUJCXNwY19yYW5kb21fcGFn ZV9jb3N0OwogCWRvdWJsZQkJbnVtX3NhX3NjYW5zOwotCWRvdWJsZQkJbnVtX291dGVyX3NjYW5z OwotCWRvdWJsZQkJbnVtX3NjYW5zOwogCWRvdWJsZQkJcXVhbF9vcF9jb3N0OwogCWRvdWJsZQkJ cXVhbF9hcmdfY29zdDsKIAlMaXN0CSAgICpzZWxlY3Rpdml0eVF1YWxzOwpAQCAtNjQ2MCw3ICs2 NDU4LDcgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAogCS8qCiAJ ICogQ2hlY2sgZm9yIFNjYWxhckFycmF5T3BFeHByIGluZGV4IHF1YWxzLCBhbmQgZXN0aW1hdGUg dGhlIG51bWJlciBvZgotCSAqIGluZGV4IHNjYW5zIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQuCisJ ICogcHJpbWl0aXZlIGluZGV4IHNjYW5zIHRoYXQgd2lsbCBiZSBwZXJmb3JtZWQgZm9yIGNhbGxl cgogCSAqLwogCW51bV9zYV9zY2FucyA9IDE7CiAJZm9yZWFjaChsLCBpbmRleFF1YWxzKQpAQCAt NjQ5MCwxOSArNjQ4OCw4IEBAIGdlbmVyaWNjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3Qs CiAJICovCiAJbnVtSW5kZXhUdXBsZXMgPSBjb3N0cy0+bnVtSW5kZXhUdXBsZXM7CiAJaWYgKG51 bUluZGV4VHVwbGVzIDw9IDAuMCkKLQl7CiAJCW51bUluZGV4VHVwbGVzID0gaW5kZXhTZWxlY3Rp dml0eSAqIGluZGV4LT5yZWwtPnR1cGxlczsKIAotCQkvKgotCQkgKiBUaGUgYWJvdmUgY2FsY3Vs YXRpb24gY291bnRzIGFsbCB0aGUgdHVwbGVzIHZpc2l0ZWQgYWNyb3NzIGFsbAotCQkgKiBzY2Fu cyBpbmR1Y2VkIGJ5IFNjYWxhckFycmF5T3BFeHByIG5vZGVzLiAgV2Ugd2FudCB0byBjb25zaWRl ciB0aGUKLQkJICogYXZlcmFnZSBwZXItaW5kZXhzY2FuIG51bWJlciwgc28gYWRqdXN0LiAgVGhp cyBpcyBhIGhhbmR5IHBsYWNlIHRvCi0JCSAqIHJvdW5kIHRvIGludGVnZXIsIHRvby4gIChJZiBj YWxsZXIgc3VwcGxpZWQgdHVwbGUgZXN0aW1hdGUsIGl0J3MKLQkJICogcmVzcG9uc2libGUgZm9y IGhhbmRsaW5nIHRoZXNlIGNvbnNpZGVyYXRpb25zLikKLQkJICovCi0JCW51bUluZGV4VHVwbGVz ID0gcmludChudW1JbmRleFR1cGxlcyAvIG51bV9zYV9zY2Fucyk7Ci0JfQotCiAJLyoKIAkgKiBX ZSBjYW4gYm91bmQgdGhlIG51bWJlciBvZiB0dXBsZXMgYnkgdGhlIGluZGV4IHNpemUgaW4gYW55 IGNhc2UuIEFsc28sCiAJICogYWx3YXlzIGVzdGltYXRlIGF0IGxlYXN0IG9uZSB0dXBsZSBpcyB0 b3VjaGVkLCBldmVuIHdoZW4KQEAgLTY1NDAsMjcgKzY1MjcsMzEgQEAgZ2VuZXJpY2Nvc3Rlc3Rp bWF0ZShQbGFubmVySW5mbyAqcm9vdCwKIAkgKgogCSAqIFRoZSBhYm92ZSBjYWxjdWxhdGlvbnMg YXJlIGFsbCBwZXItaW5kZXgtc2Nhbi4gIEhvd2V2ZXIsIGlmIHdlIGFyZSBpbiBhCiAJICogbmVz dGxvb3AgaW5uZXIgc2Nhbiwgd2UgY2FuIGV4cGVjdCB0aGUgc2NhbiB0byBiZSByZXBlYXRlZCAo d2l0aAotCSAqIGRpZmZlcmVudCBzZWFyY2gga2V5cykgZm9yIGVhY2ggcm93IG9mIHRoZSBvdXRl ciByZWxhdGlvbi4gIExpa2V3aXNlLAotCSAqIFNjYWxhckFycmF5T3BFeHByIHF1YWxzIHJlc3Vs dCBpbiBtdWx0aXBsZSBpbmRleCBzY2Fucy4gIFRoaXMgY3JlYXRlcwotCSAqIHRoZSBwb3RlbnRp YWwgZm9yIGNhY2hlIGVmZmVjdHMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZGlzayBwYWdlCi0J ICogZmV0Y2hlcyBuZWVkZWQuICBXZSB3YW50IHRvIGVzdGltYXRlIHRoZSBhdmVyYWdlIHBlci1z Y2FuIEkvTyBjb3N0IGluCi0JICogdGhlIHByZXNlbmNlIG9mIGNhY2hpbmcuCisJICogZGlmZmVy ZW50IHNlYXJjaCBrZXlzKSBmb3IgZWFjaCByb3cgb2YgdGhlIG91dGVyIHJlbGF0aW9uLiAgVGhp cworCSAqIGNyZWF0ZXMgdGhlIHBvdGVudGlhbCBmb3IgY2FjaGUgZWZmZWN0cyB0byByZWR1Y2Ug dGhlIG51bWJlciBvZiBkaXNrCisJICogcGFnZSBmZXRjaGVzIG5lZWRlZC4gIFdlIHdhbnQgdG8g ZXN0aW1hdGUgdGhlIGF2ZXJhZ2UgcGVyLXNjYW4gSS9PIGNvc3QKKwkgKiBpbiB0aGUgcHJlc2Vu Y2Ugb2YgY2FjaGluZy4KIAkgKgogCSAqIFdlIHVzZSB0aGUgTWFja2VydC1Mb2htYW4gZm9ybXVs YSAoc2VlIGNvc3RzaXplLmMgZm9yIGRldGFpbHMpIHRvCiAJICogZXN0aW1hdGUgdGhlIHRvdGFs IG51bWJlciBvZiBwYWdlIGZldGNoZXMgdGhhdCBvY2N1ci4gIFdoaWxlIHRoaXMKIAkgKiB3YXNu J3Qgd2hhdCBpdCB3YXMgZGVzaWduZWQgZm9yLCBpdCBzZWVtcyBhIHJlYXNvbmFibGUgbW9kZWwg YW55d2F5LgogCSAqIE5vdGUgdGhhdCB3ZSBhcmUgY291bnRpbmcgcGFnZXMgbm90IHR1cGxlcyBh bnltb3JlLCBzbyB3ZSB0YWtlIE4gPSBUID0KIAkgKiBpbmRleCBzaXplLCBhcyBpZiB0aGVyZSB3 ZXJlIG9uZSAidHVwbGUiIHBlciBwYWdlLgorCSAqCisJICogTm90ZTogd2UgYXNzdW1lIHRoYXQg dGhlcmUgd2lsbCBiZSBubyByZXBlYXQgaW5kZXggcGFnZSBmZXRjaGVzIGFjcm9zcworCSAqIFNj YWxhckFycmF5T3BFeHByIHByaW1pdGl2ZSBzY2FucyBmcm9tIHRoZSBzYW1lIGxvZ2ljYWwgaW5k ZXggc2Nhbi4KKwkgKiBUaGlzIGlzIGd1YXJhbnRlZWQgdG8gYmUgdHJ1ZSBmb3IgYnRyZWUgaW5k ZXhlcywgYnV0IGlzIHZlcnkgb3B0aW1pc3RpYworCSAqIHdpdGggaW5kZXggQU1zIHRoYXQgY2Fu bm90IG5hdGl2ZWx5IGV4ZWN1dGUgU2NhbGFyQXJyYXlPcEV4cHIgcXVhbHMuCisJICogSG93ZXZl ciwgdGhlc2Ugc2FtZSBpbmRleCBBTXMgYWxzbyBhY2NlcHQgb3VyIGRlZmF1bHQgcGVzc2ltaXN0 aWMKKwkgKiBhcHByb2FjaCB0byBjb3VudGluZyBudW1fc2Ffc2NhbnMgKGJ0cmVlIGNhbGxlciBj YXBzIHRoaXMpLCBzbyB3ZSBkb24ndAorCSAqIGV4cGVjdCB0aGUgZmluYWwgaW5kZXhUb3RhbENv c3QgdG8gYmUgd2lsZGx5IG92ZXItb3B0aW1pc3RpYy4KIAkgKi8KLQludW1fb3V0ZXJfc2NhbnMg PSBsb29wX2NvdW50OwotCW51bV9zY2FucyA9IG51bV9zYV9zY2FucyAqIG51bV9vdXRlcl9zY2Fu czsKLQotCWlmIChudW1fc2NhbnMgPiAxKQorCWlmIChsb29wX2NvdW50ID4gMSkKIAl7CiAJCWRv dWJsZQkJcGFnZXNfZmV0Y2hlZDsKIAogCQkvKiB0b3RhbCBwYWdlIGZldGNoZXMgaWdub3Jpbmcg Y2FjaGUgZWZmZWN0cyAqLwotCQlwYWdlc19mZXRjaGVkID0gbnVtSW5kZXhQYWdlcyAqIG51bV9z Y2FuczsKKwkJcGFnZXNfZmV0Y2hlZCA9IG51bUluZGV4UGFnZXMgKiBsb29wX2NvdW50OwogCiAJ CS8qIHVzZSBNYWNrZXJ0IGFuZCBMb2htYW4gZm9ybXVsYSB0byBhZGp1c3QgZm9yIGNhY2hlIGVm ZmVjdHMgKi8KIAkJcGFnZXNfZmV0Y2hlZCA9IGluZGV4X3BhZ2VzX2ZldGNoZWQocGFnZXNfZmV0 Y2hlZCwKQEAgLTY1NzAsMTEgKzY1NjEsOSBAQCBnZW5lcmljY29zdGVzdGltYXRlKFBsYW5uZXJJ bmZvICpyb290LAogCiAJCS8qCiAJCSAqIE5vdyBjb21wdXRlIHRoZSB0b3RhbCBkaXNrIGFjY2Vz cyBjb3N0LCBhbmQgdGhlbiByZXBvcnQgYSBwcm8tcmF0ZWQKLQkJICogc2hhcmUgZm9yIGVhY2gg b3V0ZXIgc2Nhbi4gIChEb24ndCBwcm8tcmF0ZSBmb3IgU2NhbGFyQXJyYXlPcEV4cHIsCi0JCSAq IHNpbmNlIHRoYXQncyBpbnRlcm5hbCB0byB0aGUgaW5kZXhzY2FuLikKKwkJICogc2hhcmUgZm9y IGVhY2ggb3V0ZXIgc2NhbgogCQkgKi8KLQkJaW5kZXhUb3RhbENvc3QgPSAocGFnZXNfZmV0Y2hl ZCAqIHNwY19yYW5kb21fcGFnZV9jb3N0KQotCQkJLyBudW1fb3V0ZXJfc2NhbnM7CisJCWluZGV4 VG90YWxDb3N0ID0gKHBhZ2VzX2ZldGNoZWQgKiBzcGNfcmFuZG9tX3BhZ2VfY29zdCkgLyBsb29w X2NvdW50OwogCX0KIAllbHNlCiAJewpAQCAtNjU5MCwxMCArNjU3OSw4IEBAIGdlbmVyaWNjb3N0 ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsCiAJICogZXZhbHVhdGVkIG9uY2UgYXQgdGhlIHN0 YXJ0IG9mIHRoZSBzY2FuIHRvIHJlZHVjZSB0aGVtIHRvIHJ1bnRpbWUga2V5cwogCSAqIHRvIHBh c3MgdG8gdGhlIGluZGV4IEFNIChzZWUgbm9kZUluZGV4c2Nhbi5jKS4gIFdlIG1vZGVsIHRoZSBw ZXItdHVwbGUKIAkgKiBDUFUgY29zdHMgYXMgY3B1X2luZGV4X3R1cGxlX2Nvc3QgcGx1cyBvbmUg Y3B1X29wZXJhdG9yX2Nvc3QgcGVyCi0JICogaW5kZXhxdWFsIG9wZXJhdG9yLiAgQmVjYXVzZSB3 ZSBoYXZlIG51bUluZGV4VHVwbGVzIGFzIGEgcGVyLXNjYW4KLQkgKiBudW1iZXIsIHdlIGhhdmUg dG8gbXVsdGlwbHkgYnkgbnVtX3NhX3NjYW5zIHRvIGdldCB0aGUgY29ycmVjdCByZXN1bHQKLQkg KiBmb3IgU2NhbGFyQXJyYXlPcEV4cHIgY2FzZXMuICBTaW1pbGFybHkgYWRkIGluIGNvc3RzIGZv ciBhbnkgaW5kZXgKLQkgKiBPUkRFUiBCWSBleHByZXNzaW9ucy4KKwkgKiBpbmRleHF1YWwgb3Bl cmF0b3IuICBTaW1pbGFybHkgYWRkIGluIGNvc3RzIGZvciBhbnkgaW5kZXggT1JERVIgQlkKKwkg KiBleHByZXNzaW9ucy4KIAkgKgogCSAqIE5vdGU6IHRoaXMgbmVnbGVjdHMgdGhlIHBvc3NpYmxl IGNvc3RzIG9mIHJlY2hlY2tpbmcgbG9zc3kgb3BlcmF0b3JzLgogCSAqIERldGVjdGluZyB0aGF0 IHRoYXQgbWlnaHQgYmUgbmVlZGVkIHNlZW1zIG1vcmUgZXhwZW5zaXZlIHRoYW4gaXQncwpAQCAt NjYwNiw3ICs2NTkzLDcgQEAgZ2VuZXJpY2Nvc3Rlc3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwK IAogCWluZGV4U3RhcnR1cENvc3QgPSBxdWFsX2FyZ19jb3N0OwogCWluZGV4VG90YWxDb3N0ICs9 IHF1YWxfYXJnX2Nvc3Q7Ci0JaW5kZXhUb3RhbENvc3QgKz0gbnVtSW5kZXhUdXBsZXMgKiBudW1f c2Ffc2NhbnMgKiAoY3B1X2luZGV4X3R1cGxlX2Nvc3QgKyBxdWFsX29wX2Nvc3QpOworCWluZGV4 VG90YWxDb3N0ICs9IG51bUluZGV4VHVwbGVzICogKGNwdV9pbmRleF90dXBsZV9jb3N0ICsgcXVh bF9vcF9jb3N0KTsKIAogCS8qCiAJICogR2VuZXJpYyBhc3N1bXB0aW9uIGFib3V0IGluZGV4IGNv cnJlbGF0aW9uOiB0aGVyZSBpc24ndCBhbnkuCkBAIC02Njg0LDcgKzY2NzEsNiBAQCBidGNvc3Rl c3RpbWF0ZShQbGFubmVySW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9j b3VudCwKIAlib29sCQllcVF1YWxIZXJlOwogCWJvb2wJCWZvdW5kX3Nhb3A7CiAJYm9vbAkJZm91 bmRfaXNfbnVsbF9vcDsKLQlkb3VibGUJCW51bV9zYV9zY2FuczsKIAlMaXN0Q2VsbCAgICpsYzsK IAogCS8qCkBAIC02Njk5LDE3ICs2Njg1LDEyIEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZv ICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCSAqCiAJICogRm9y IGEgUm93Q29tcGFyZUV4cHIsIHdlIGNvbnNpZGVyIG9ubHkgdGhlIGZpcnN0IGNvbHVtbiwganVz dCBhcwogCSAqIHJvd2NvbXBhcmVzZWwoKSBkb2VzLgotCSAqCi0JICogSWYgdGhlcmUncyBhIFNj YWxhckFycmF5T3BFeHByIGluIHRoZSBxdWFscywgd2UnbGwgYWN0dWFsbHkgcGVyZm9ybSBOCi0J ICogaW5kZXggc2NhbnMgbm90IG9uZSwgYnV0IHRoZSBTY2FsYXJBcnJheU9wRXhwcidzIG9wZXJh dG9yIGNhbiBiZQotCSAqIGNvbnNpZGVyZWQgdG8gYWN0IHRoZSBzYW1lIGFzIGl0IG5vcm1hbGx5 IGRvZXMuCiAJICovCiAJaW5kZXhCb3VuZFF1YWxzID0gTklMOwogCWluZGV4Y29sID0gMDsKIAll cVF1YWxIZXJlID0gZmFsc2U7CiAJZm91bmRfc2FvcCA9IGZhbHNlOwogCWZvdW5kX2lzX251bGxf b3AgPSBmYWxzZTsKLQludW1fc2Ffc2NhbnMgPSAxOwogCWZvcmVhY2gobGMsIHBhdGgtPmluZGV4 Y2xhdXNlcykKIAl7CiAJCUluZGV4Q2xhdXNlICppY2xhdXNlID0gbGZpcnN0X25vZGUoSW5kZXhD bGF1c2UsIGxjKTsKQEAgLTY3NDksMTQgKzY3MzAsOSBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVy SW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAkJCWVsc2Ug aWYgKElzQShjbGF1c2UsIFNjYWxhckFycmF5T3BFeHByKSkKIAkJCXsKIAkJCQlTY2FsYXJBcnJh eU9wRXhwciAqc2FvcCA9IChTY2FsYXJBcnJheU9wRXhwciAqKSBjbGF1c2U7Ci0JCQkJTm9kZQkg ICAqb3RoZXJfb3BlcmFuZCA9IChOb2RlICopIGxzZWNvbmQoc2FvcC0+YXJncyk7Ci0JCQkJaW50 CQkJYWxlbmd0aCA9IGVzdGltYXRlX2FycmF5X2xlbmd0aChvdGhlcl9vcGVyYW5kKTsKIAogCQkJ CWNsYXVzZV9vcCA9IHNhb3AtPm9wbm87CiAJCQkJZm91bmRfc2FvcCA9IHRydWU7Ci0JCQkJLyog Y291bnQgbnVtYmVyIG9mIFNBIHNjYW5zIGluZHVjZWQgYnkgaW5kZXhCb3VuZFF1YWxzIG9ubHkg Ki8KLQkJCQlpZiAoYWxlbmd0aCA+IDEpCi0JCQkJCW51bV9zYV9zY2FucyAqPSBhbGVuZ3RoOwog CQkJfQogCQkJZWxzZSBpZiAoSXNBKGNsYXVzZSwgTnVsbFRlc3QpKQogCQkJewpAQCAtNjgwNSw5 ICs2NzgxLDkgQEAgYnRjb3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAq cGF0aCwgZG91YmxlIGxvb3BfY291bnQsCiAJCVNlbGVjdGl2aXR5IGJ0cmVlU2VsZWN0aXZpdHk7 CiAKIAkJLyoKLQkJICogSWYgdGhlIGluZGV4IGlzIHBhcnRpYWwsIEFORCB0aGUgaW5kZXggcHJl ZGljYXRlIHdpdGggdGhlCi0JCSAqIGluZGV4LWJvdW5kIHF1YWxzIHRvIHByb2R1Y2UgYSBtb3Jl IGFjY3VyYXRlIGlkZWEgb2YgdGhlIG51bWJlciBvZgotCQkgKiByb3dzIGNvdmVyZWQgYnkgdGhl IGJvdW5kIGNvbmRpdGlvbnMuCisJCSAqIEFORCB0aGUgaW5kZXggcHJlZGljYXRlIHdpdGggdGhl IGluZGV4LWJvdW5kIHF1YWxzIHRvIHByb2R1Y2UgYQorCQkgKiBtb3JlIGFjY3VyYXRlIGlkZWEg b2YgdGhlIG51bWJlciBvZiByb3dzIGNvdmVyZWQgYnkgdGhlIGJvdW5kCisJCSAqIGNvbmRpdGlv bnMKIAkJICovCiAJCXNlbGVjdGl2aXR5UXVhbHMgPSBhZGRfcHJlZGljYXRlX3RvX2luZGV4X3F1 YWxzKGluZGV4LCBpbmRleEJvdW5kUXVhbHMpOwogCkBAIC02ODE2LDEzICs2NzkyLDYgQEAgYnRj b3N0ZXN0aW1hdGUoUGxhbm5lckluZm8gKnJvb3QsIEluZGV4UGF0aCAqcGF0aCwgZG91YmxlIGxv b3BfY291bnQsCiAJCQkJCQkJCQkJCQkgIEpPSU5fSU5ORVIsCiAJCQkJCQkJCQkJCQkgIE5VTEwp OwogCQludW1JbmRleFR1cGxlcyA9IGJ0cmVlU2VsZWN0aXZpdHkgKiBpbmRleC0+cmVsLT50dXBs ZXM7Ci0KLQkJLyoKLQkJICogQXMgaW4gZ2VuZXJpY2Nvc3Rlc3RpbWF0ZSgpLCB3ZSBoYXZlIHRv IGFkanVzdCBmb3IgYW55Ci0JCSAqIFNjYWxhckFycmF5T3BFeHByIHF1YWxzIGluY2x1ZGVkIGlu IGluZGV4Qm91bmRRdWFscywgYW5kIHRoZW4gcm91bmQKLQkJICogdG8gaW50ZWdlci4KLQkJICov Ci0JCW51bUluZGV4VHVwbGVzID0gcmludChudW1JbmRleFR1cGxlcyAvIG51bV9zYV9zY2Fucyk7 CiAJfQogCiAJLyoKQEAgLTY4MzIsNiArNjgwMSw0MyBAQCBidGNvc3Rlc3RpbWF0ZShQbGFubmVy SW5mbyAqcm9vdCwgSW5kZXhQYXRoICpwYXRoLCBkb3VibGUgbG9vcF9jb3VudCwKIAogCWdlbmVy aWNjb3N0ZXN0aW1hdGUocm9vdCwgcGF0aCwgbG9vcF9jb3VudCwgJmNvc3RzKTsKIAorCS8qCisJ ICogTm93IGNvbXBlbnNhdGUgZm9yIGJ0cmVlJ3MgYWJpbGl0eSB0byBlZmZpY2llbnRseSBleGVj dXRlIHNjYW5zIHdpdGgKKwkgKiBTQU9QIGNsYXVzZXMuCisJICoKKwkgKiBidHJlZSBhdXRvbWF0 aWNhbGx5IGNvbWJpbmVzIGluZGl2aWR1YWwgU2NhbGFyQXJyYXlPcEV4cHIgcHJpbWl0aXZlCisJ ICogaW5kZXggc2NhbnMgd2hlbmV2ZXIgdGhlIHR1cGxlcyBjb3ZlcmVkIGJ5IHRoZSBuZXh0IHNl dCBvZiBhcnJheSBrZXlzCisJICogYXJlIGNsb3NlIHRvIHR1cGxlcyBjb3ZlcmVkIGJ5IHRoZSBj dXJyZW50IHNldC4gIFRoaXMgbWFrZXMgdGhlIGZpbmFsCisJICogbnVtYmVyIG9mIGRlc2NlbnRz IHBhcnRpY3VsYXJseSBkaWZmaWN1bHQgdG8gZXN0aW1hdGUuICBIb3dldmVyLCBidHJlZQorCSAq IHNjYW5zIG5ldmVyIHZpc2l0IGFueSBzaW5nbGUgbGVhZiBwYWdlIG1vcmUgdGhhbiBvbmNlLiAg VGhhdCBwdXRzIGEKKwkgKiBuYXR1cmFsIGZsb29yIHVuZGVyIHRoZSB3b3JzdCBjYXNlIG51bWJl ciBvZiBkZXNjZW50cy4KKwkgKgorCSAqIEl0J3MgcGFydGljdWxhcmx5IGltcG9ydGFudCB0aGF0 IHdlIG5vdCB3aWxkbHkgb3ZlcmVzdGltYXRlIHRoZSBudW1iZXIKKwkgKiBvZiBkZXNjZW50cyBu ZWVkZWQgZm9yIGEgY2xhdXNlIGxpc3Qgd2l0aCBzZXZlcmFsIFNBT1BzIC0tIHRoZSBjb3N0cwor CSAqIHJlYWxseSBhcmVuJ3QgbXVsdGlwbGljYXRpdmUgaW4gdGhlIHdheSBnZW5lcmljY29zdGVz dGltYXRlIGV4cGVjdHMuIEluCisJICogZ2VuZXJhbCwgbW9zdCBkaXN0aW5jdCBjb21iaW5hdGlv bnMgb2YgU0FPUCBrZXlzIHdpbGwgdGVuZCB0byBub3QgZmluZAorCSAqIGFueSBtYXRjaGluZyB0 dXBsZXMuICBGdXJ0aGVybW9yZSwgYnRyZWUgc2NhbnMgc2VhcmNoIGZvciB0aGUgbmV4dCBzZXQK KwkgKiBvZiBhcnJheSBrZXlzIHVzaW5nIHRoZSBuZXh0IHR1cGxlIGluIGxpbmUsIGFuZCBzbyB3 b24ndCBldmVuIG5lZWQgYQorCSAqIGRpcmVjdCBjb21wYXJpc29uIHRvIGVsaW1pbmF0ZSBtb3N0 IG5vbi1tYXRjaGluZyBzZXRzIG9mIGFycmF5IGtleXMuCisJICoKKwkgKiBDbGFtcCB0aGUgbnVt YmVyIG9mIGRlc2NlbnRzIHRvIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGxlYWYgcGFnZQorCSAq IHZpc2l0cy4gIFRoaXMgaXMgc3RpbGwgZmFpcmx5IHBlc3NpbWlzdGljLCBidXQgdGVuZHMgdG8g cmVzdWx0IGluIG1vcmUKKwkgKiBhY2N1cmF0ZSBjb3N0aW5nIG9mIHNjYW5zIHdpdGggc2V2ZXJh bCBTQU9QIGNsYXVzZXMgLS0gZXNwZWNpYWxseSB3aGVuCisJICogZWFjaCBhcnJheSBoYXMgbW9y ZSB0aGFuIGEgZmV3IGVsZW1lbnRzLiAgVGhlIGNvc3Qgb2YgYWRkaW5nIGFkZGl0aW9uYWwKKwkg KiBhcnJheSBjb25zdGFudHMgdG8gYSBsb3ctb3JkZXIgU0FPUCBjb2x1bW4gc2hvdWxkIHNhdHVy YXRlIHBhc3QgYQorCSAqIGNlcnRhaW4gcG9pbnQgKGV4Y2VwdCB3aGVyZSBzZWxlY3Rpdml0eSBl c3RpbWF0ZXMgY29udGludWUgdG8gc2hpZnQpLgorCSAqCisJICogQWxzbyBjbGFtcCB0aGUgbnVt YmVyIG9mIGRlc2NlbnRzIHRvIDEvMyB0aGUgbnVtYmVyIG9mIGluZGV4IHBhZ2VzLgorCSAqIFRo aXMgYXZvaWRzIGltcGxhdXNpYmx5IGhpZ2ggZXN0aW1hdGVzIHdpdGggbG93IHNlbGVjdGl2aXR5 IHBhdGhzLAorCSAqIHdoZXJlIHNjYW5zIGZyZXF1ZW50bHkgcmVxdWlyZSBubyBtb3JlIHRoYW4g b25lIG9yIHR3byBkZXNjZW50cy4KKwkgKi8KKwlpZiAoY29zdHMubnVtX3NhX3NjYW5zID4gMSkK Kwl7CisJCWNvc3RzLm51bV9zYV9zY2FucyA9IE1pbihjb3N0cy5udW1fc2Ffc2NhbnMsIGNvc3Rz Lm51bUluZGV4UGFnZXMpOworCQljb3N0cy5udW1fc2Ffc2NhbnMgPSBNaW4oY29zdHMubnVtX3Nh X3NjYW5zLCBpbmRleC0+cGFnZXMgLyAzKTsKKwkJY29zdHMubnVtX3NhX3NjYW5zID0gTWF4KGNv c3RzLm51bV9zYV9zY2FucywgMSk7CisJfQorCiAJLyoKIAkgKiBBZGQgYSBDUFUtY29zdCBjb21w b25lbnQgdG8gcmVwcmVzZW50IHRoZSBjb3N0cyBvZiBpbml0aWFsIGJ0cmVlCiAJICogZGVzY2Vu dC4gIFdlIGRvbid0IGNoYXJnZSBhbnkgSS9PIGNvc3QgZm9yIHRvdWNoaW5nIHVwcGVyIGJ0cmVl IGxldmVscywKQEAgLTY4MzksOSArNjg0NSw5IEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5uZXJJbmZv ICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCSAqIGNvbXBhcmlz b25zIHRvIGRlc2NlbmQgYSBidHJlZSBvZiBOIGxlYWYgdHVwbGVzLiAgV2UgY2hhcmdlIG9uZQog CSAqIGNwdV9vcGVyYXRvcl9jb3N0IHBlciBjb21wYXJpc29uLgogCSAqCi0JICogSWYgdGhlcmUg YXJlIFNjYWxhckFycmF5T3BFeHBycywgY2hhcmdlIHRoaXMgb25jZSBwZXIgU0Egc2Nhbi4gIFRo ZQotCSAqIG9uZXMgYWZ0ZXIgdGhlIGZpcnN0IG9uZSBhcmUgbm90IHN0YXJ0dXAgY29zdCBzbyBm YXIgYXMgdGhlIG92ZXJhbGwKLQkgKiBwbGFuIGlzIGNvbmNlcm5lZCwgc28gYWRkIHRoZW0gb25s eSB0byAidG90YWwiIGNvc3QuCisJICogSWYgdGhlcmUgYXJlIFNjYWxhckFycmF5T3BFeHBycywg Y2hhcmdlIHRoaXMgb25jZSBwZXIgZXN0aW1hdGVkCisJICogcHJpbWl0aXZlIFNBIHNjYW4uICBU aGUgb25lcyBhZnRlciB0aGUgZmlyc3Qgb25lIGFyZSBub3Qgc3RhcnR1cCBjb3N0CisJICogc28g ZmFyIGFzIHRoZSBvdmVyYWxsIHBsYW4gZ29lcywgc28ganVzdCBhZGQgdGhlbSB0byAidG90YWwi IGNvc3QuCiAJICovCiAJaWYgKGluZGV4LT50dXBsZXMgPiAxKQkJLyogYXZvaWQgY29tcHV0aW5n IGxvZygwKSAqLwogCXsKQEAgLTY4NTgsNyArNjg2NCw4IEBAIGJ0Y29zdGVzdGltYXRlKFBsYW5u ZXJJbmZvICpyb290LCBJbmRleFBhdGggKnBhdGgsIGRvdWJsZSBsb29wX2NvdW50LAogCSAqIGlu IGNhc2VzIHdoZXJlIG9ubHkgYSBzaW5nbGUgbGVhZiBwYWdlIGlzIGV4cGVjdGVkIHRvIGJlIHZp c2l0ZWQuICBUaGlzCiAJICogY29zdCBpcyBzb21ld2hhdCBhcmJpdHJhcmlseSBzZXQgYXQgNTB4 IGNwdV9vcGVyYXRvcl9jb3N0IHBlciBwYWdlCiAJICogdG91Y2hlZC4gIFRoZSBudW1iZXIgb2Yg c3VjaCBwYWdlcyBpcyBidHJlZSB0cmVlIGhlaWdodCBwbHVzIG9uZSAoaWUsCi0JICogd2UgY2hh cmdlIGZvciB0aGUgbGVhZiBwYWdlIHRvbykuICBBcyBhYm92ZSwgY2hhcmdlIG9uY2UgcGVyIFNB IHNjYW4uCisJICogd2UgY2hhcmdlIGZvciB0aGUgbGVhZiBwYWdlIHRvbykuICBBcyBhYm92ZSwg Y2hhcmdlIG9uY2UgcGVyIGVzdGltYXRlZAorCSAqIHByaW1pdGl2ZSBTQSBzY2FuLgogCSAqLwog CWRlc2NlbnRDb3N0ID0gKGluZGV4LT50cmVlX2hlaWdodCArIDEpICogREVGQVVMVF9QQUdFX0NQ VV9NVUxUSVBMSUVSICogY3B1X29wZXJhdG9yX2Nvc3Q7CiAJY29zdHMuaW5kZXhTdGFydHVwQ29z dCArPSBkZXNjZW50Q29zdDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv Y3JlYXRlX2luZGV4Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY3JlYXRlX2luZGV4 Lm91dAppbmRleCBhY2ZkOWQxZjQuLjBkZGUyMWNhMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVn cmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvY3JlYXRlX2luZGV4Lm91dApAQCAtMTkxMCw3ICsxOTEwLDcgQEAgU0VMRUNUIGNvdW50 KCopIEZST00gZHVwaW5kZXhjb2xzCiAoMSByb3cpCiAKIC0tCi0tLSBDaGVjayBvcmRlcmluZyBv ZiA9QU5ZIGluZGV4cXVhbCByZXN1bHRzIChidWcgaW4gOS4yLjApCistLSBDaGVjayB0aGF0IGlu ZGV4IHNjYW5zIHdpdGggPUFOWSBpbmRleHF1YWxzIHJldHVybiByb3dzIGluIGluZGV4IG9yZGVy CiAtLQogZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUIHVuaXF1ZTEgRlJPTSB0ZW5rMQpAQCAt MTkzNiwxMiArMTkzNiwxMSBAQCBleHBsYWluIChjb3N0cyBvZmYpCiBTRUxFQ1QgdGhvdXNhbmQs IHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4g KDEwMDEsMzAwMCkKIE9SREVSIEJZIHRob3VzYW5kOwotICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgIAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRlbmsxX3Ro b3VzX3RlbnRob3VzIG9uIHRlbmsxCi0gICBJbmRleCBDb25kOiAodGhvdXNhbmQgPCAyKQotICAg RmlsdGVyOiAodGVudGhvdXMgPSBBTlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpCi0oMyBy b3dzKQorICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBBTlkg KCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpKQorKDIgcm93cykKIAogU0VMRUNUIHRob3VzYW5k LCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElO ICgxMDAxLDMwMDApCkBAIC0xOTUyLDE4ICsxOTUxLDM1IEBAIE9SREVSIEJZIHRob3VzYW5kOwog ICAgICAgICAxIHwgICAgIDEwMDEKICgyIHJvd3MpCiAKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NF TEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJPTSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFO RCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQorT1JERVIgQlkgdGhvdXNhbmQgZGVzYywgdGVudGhv dXMgZGVzYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEluZGV4IE9ubHkgU2NhbiBCYWNrd2FyZCB1c2luZyB0ZW5rMV90aG91c190ZW50aG91cyBv biB0ZW5rMQorICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA8IDIpIEFORCAodGVudGhvdXMgPSBB TlkgKCd7MTAwMSwzMDAwfSc6OmludGVnZXJbXSkpKQorKDIgcm93cykKKworU0VMRUNUIHRob3Vz YW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCitXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3Vz IElOICgxMDAxLDMwMDApCitPUkRFUiBCWSB0aG91c2FuZCBkZXNjLCB0ZW50aG91cyBkZXNjOwor IHRob3VzYW5kIHwgdGVudGhvdXMgCistLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAgICAgICAgMSB8 ICAgICAxMDAxCisgICAgICAgIDAgfCAgICAgMzAwMAorKDIgcm93cykKKwogU0VUIGVuYWJsZV9p bmRleG9ubHlzY2FuID0gT0ZGOwogZXhwbGFpbiAoY29zdHMgb2ZmKQogU0VMRUNUIHRob3VzYW5k LCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRlbnRob3VzIElO ICgxMDAxLDMwMDApCiBPUkRFUiBCWSB0aG91c2FuZDsKLSAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFNvcnQKLSAgIFNvcnQgS2V5 OiB0aG91c2FuZAotICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGVuazFfdGhvdXNfdGVudGhvdXMg b24gdGVuazEKLSAgICAgICAgIEluZGV4IENvbmQ6ICgodGhvdXNhbmQgPCAyKSBBTkQgKHRlbnRo b3VzID0gQU5ZICgnezEwMDEsMzAwMH0nOjppbnRlZ2VyW10pKSkKLSg0IHJvd3MpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIHVz aW5nIHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3Vz YW5kIDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkp CisoMiByb3dzKQogCiBTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJF IHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKQEAgLTE5NzQsNiArMTk5 MCwyNSBAQCBPUkRFUiBCWSB0aG91c2FuZDsKICAgICAgICAgMSB8ICAgICAxMDAxCiAoMiByb3dz KQogCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00g dGVuazEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09S REVSIEJZIHRob3VzYW5kIGRlc2MsIHRlbnRob3VzIGRlc2M7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIEJhY2t3YXJkIHVzaW5n IHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3VzYW5k IDwgMikgQU5EICh0ZW50aG91cyA9IEFOWSAoJ3sxMDAxLDMwMDB9Jzo6aW50ZWdlcltdKSkpCiso MiByb3dzKQorCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJFIHRo b3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3VzYW5k IGRlc2MsIHRlbnRob3VzIGRlc2M7CisgdGhvdXNhbmQgfCB0ZW50aG91cyAKKy0tLS0tLS0tLS0r LS0tLS0tLS0tLQorICAgICAgICAxIHwgICAgIDEwMDEKKyAgICAgICAgMCB8ICAgICAzMDAwCiso MiByb3dzKQorCiBSRVNFVCBlbmFibGVfaW5kZXhvbmx5c2NhbjsKIC0tCiAtLSBDaGVjayBlbGlt aW5hdGlvbiBvZiBjb25zdGFudC1OVUxMIHN1YmV4cHJlc3Npb25zCmRpZmYgLS1naXQgYS9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9qb2luLm91dAppbmRleCA5Yjg2MzhmMjguLjIwYjY5ZmY4NyAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2pvaW4ub3V0CkBAIC03Nzk3LDEwICs3Nzk3LDkgQEAgd2hlcmUgajEuaWQxICUgMTAwMCA9 IDEgYW5kIGoyLmlkMSAlIDEwMDAgPSAxIGFuZCBqMi5pZDEgPj0gYW55IChhcnJheVsxLDVdKTsK ICAgIE1lcmdlIENvbmQ6IChqMS5pZDEgPSBqMi5pZDEpCiAgICBKb2luIEZpbHRlcjogKGoyLmlk MiA9IGoxLmlkMikKICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIGoxX2lkMV9pZHggb24gajEKLSAg IC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgajJfcGtleSBvbiBqMgorICAgLT4gIEluZGV4IFNj YW4gdXNpbmcgajJfaWQxX2lkeCBvbiBqMgogICAgICAgICAgSW5kZXggQ29uZDogKGlkMSA+PSBB TlkgKCd7MSw1fSc6OmludGVnZXJbXSkpCi0gICAgICAgICBGaWx0ZXI6ICgoaWQxICUgMTAwMCkg PSAxKQotKDcgcm93cykKKyg2IHJvd3MpCiAKIHNlbGVjdCAqIGZyb20gajEKIGlubmVyIGpvaW4g ajIgb24gajEuaWQxID0gajIuaWQxIGFuZCBqMS5pZDIgPSBqMi5pZDIKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9jcmVhdGVfaW5kZXguc3FsCmluZGV4IGQ0OWNlOWYzMC4uNGYxOWZhYzU0IDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jcmVhdGVfaW5kZXguc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwKQEAgLTc1Myw3ICs3NTMsNyBAQCBTRUxFQ1QgY291 bnQoKikgRlJPTSBkdXBpbmRleGNvbHMKICAgV0hFUkUgZjEgQkVUV0VFTiAnV0EnIEFORCAnWlpa JyBhbmQgaWQgPCAxMDAwIGFuZCBmMSB+PH4gJ1lYJzsKIAogLS0KLS0tIENoZWNrIG9yZGVyaW5n IG9mID1BTlkgaW5kZXhxdWFsIHJlc3VsdHMgKGJ1ZyBpbiA5LjIuMCkKKy0tIENoZWNrIHRoYXQg aW5kZXggc2NhbnMgd2l0aCA9QU5ZIGluZGV4cXVhbHMgcmV0dXJuIHJvd3MgaW4gaW5kZXggb3Jk ZXIKIC0tCiAKIGV4cGxhaW4gKGNvc3RzIG9mZikKQEAgLTc3NCw2ICs3NzQsMTUgQEAgU0VMRUNU IHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCiBXSEVSRSB0aG91c2FuZCA8IDIgQU5EIHRl bnRob3VzIElOICgxMDAxLDMwMDApCiBPUkRFUiBCWSB0aG91c2FuZDsKIAorZXhwbGFpbiAoY29z dHMgb2ZmKQorU0VMRUNUIHRob3VzYW5kLCB0ZW50aG91cyBGUk9NIHRlbmsxCitXSEVSRSB0aG91 c2FuZCA8IDIgQU5EIHRlbnRob3VzIElOICgxMDAxLDMwMDApCitPUkRFUiBCWSB0aG91c2FuZCBk ZXNjLCB0ZW50aG91cyBkZXNjOworCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVu azEKK1dIRVJFIHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVS IEJZIHRob3VzYW5kIGRlc2MsIHRlbnRob3VzIGRlc2M7CisKIFNFVCBlbmFibGVfaW5kZXhvbmx5 c2NhbiA9IE9GRjsKIAogZXhwbGFpbiAoY29zdHMgb2ZmKQpAQCAtNzg1LDYgKzc5NCwxNSBAQCBT RUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKIFdIRVJFIHRob3VzYW5kIDwgMiBB TkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKIE9SREVSIEJZIHRob3VzYW5kOwogCitleHBsYWlu IChjb3N0cyBvZmYpCitTRUxFQ1QgdGhvdXNhbmQsIHRlbnRob3VzIEZST00gdGVuazEKK1dIRVJF IHRob3VzYW5kIDwgMiBBTkQgdGVudGhvdXMgSU4gKDEwMDEsMzAwMCkKK09SREVSIEJZIHRob3Vz YW5kIGRlc2MsIHRlbnRob3VzIGRlc2M7CisKK1NFTEVDVCB0aG91c2FuZCwgdGVudGhvdXMgRlJP TSB0ZW5rMQorV0hFUkUgdGhvdXNhbmQgPCAyIEFORCB0ZW50aG91cyBJTiAoMTAwMSwzMDAwKQor T1JERVIgQlkgdGhvdXNhbmQgZGVzYywgdGVudGhvdXMgZGVzYzsKKwogUkVTRVQgZW5hYmxlX2lu ZGV4b25seXNjYW47CiAKIC0tCi0tIAoyLjQwLjEKCg== --00000000000094ab20060596a8ce--